원글 : How does blockchain really work? I built an app to show you.
How does blockchain really work? I built an app to show you.
by Sean Han How does blockchain really work? I built an app to show you. According to Wikipedia, a blockchain is: > A distributed database that is used to maintain a continuously growing list of records, called blocks. That sounds nice, but how does it wor
www.freecodecamp.org
블록체인을 쉽게 설명한 글이 있어 옮겨 왔습니다. 원글의 내용이 어렵지 않고, 내용 중 일부 오역이 포함되어 있을 수 있으니, 가능하면 원문을 참조하시는 걸 추천드립니다.
블록체인이 어떻게 동작하냐구요? 보여드릴께요.
위키피디아에 보면, 블록체인을 다음과 같이 설명합니다.
블록이라고 칭하는 계속해서 증가하는 레코드의 목록을 관리하는데 사용하는 분산 데이터베이스
참 근사한 말입니다. 근데, 그게 어떻게 동작하는거죠?
블록체인을 설명하기 위해서, 블록체인 CLI라는 오픈소스를 사용하겠습니다. 브라우저에서 동작하는 버전도 만들었어요.
Command-Line 버전 설치하기.
Node.js를 설치하지 않았으면 설치하시고 터미널에 다음과 같이 입력하세요.
$ npm install blockchain-cli -g
$ blockchain
"👋 Welcome to Blockchain CLI" 라는 메시지와 함께 프롬프트가 "blockchain →"로 변경되어 명령을 실행할 준비가 된 것을 볼 것입니다.
블록은 어떻게 생겼을까요?
현재가지고 있는 블록체인을 확인하려면, blockchain 또는 bc 를 프롬프트에 입력하세요. 아래 그림과 같은 블록 정보를 볼 것입니다.
- index( Block # ) : 어떤 블록인가 ( 기원블록은 0 인덱스를 가진다 )
- Hash : 블록이 유효한가 확인하는데 사용하는 값
- Previous Hash : 이전 블록이 가지고 있는 hash
- Timestamp : 블록 생성 시각
- Data : 블록에 저장된 데이터
- Nonce : 유효한 블록을 발견하기까지 얼마나 많이 순회했는가?
Genesis Block ( 기원블록 )
모든 블록체인은 기원블록에서 시작합니다. 나중에 보겠지만 블록체인의 각 블록은 이전 블록과 연관되어 있습니다. 그래서 처음 블록을 생성하기 위해 기원블록은 반드시 있어야 합니다.
새로운 블록을 만들 때, 어떤 일들이 일어나는가?
이제 첫번째 블록을 만들어봅시다. 프롬프트에 ︎ "mine freeCodeCamp♥︎" 라고 입력합니다.
블록체인은 가장 마지막 블록의 인덱스와 이전 Hash를 확인합니다. 이 경우에 가장 마지막 블록은 기원 블록입니다.
- Index : 0 + 1 => 1
- Previous Hash : 0000018035a828da0…
- Timestamp: 블록이 생성된 시각
- Data: freeCodeCamp❤
- Hash: ??
- Nonce: ??
Hash는 어떻게 계산하나?
Hash 값은 유일함을 나타내는 고정된 길이의 숫자 값입니다. Hash 는 index, 이전 블록의 Hash, timestamp, 블록 data, Nonce 값을 가지고 계산합니다.
CryptoJS.SHA256(index + previousHash + timestamp + data + nonce)
SHA256 알고리즘은 주어진 입력으로 유일한 Hash를 계산합니다. 같은 입력에 대해서는 항상 같은 Hash값을 결과를 나타냅니다.
혹시 블록 Hash에서 '0' 4개로 시작하는것을 아셨나요?
맨 처음에 '0' 4개로 시작하는것은 유효한 Hash의 최소 요건입니다. 시작하는 '0'의 갯수를 difficulty라고 부릅니다.
function isValidHashDifficulty(hash, difficulty) {
for (var i = 0, b = hash.length; i < b; i ++) {
if (hash[i] !== '0') {
break;
}
}
return i >= difficulty;
}
이것은 Proof-of-Work system 이라고도 알려져있습니다.
nonce란 무엇인가?
nonce는 유효한 Hash를 찾는데 이용하는 숫자입니다.
let nonce = 0;
let hash;
let input;
while(!isValidHashDifficulty(hash)) {
nonce = nonce + 1;
input = index + previousHash + timestamp + data + nonce;
hash = CryptoJS.SHA256(input)
}
nonce는 유효한 Hash를 찾을 때까지 반복합니다. 위의 경우에서 유효한 Hash는 맨 앞에 최소한 4개의 '0'을 가지고 있습니다. 유효한 Hash찾아가는 과정이 mining입니다. 유효한 hash를 찾기 위해서는 많은 연산능력이 필요합니다
왜 이게 중요할까?
블록체인을 수정할 수 없도록 해주기 때문에 중요합니다.
만약 블록체인 A->B->C를 가지고 있을때, 누군가 블록A의 데이터를 변경하려고 할때, 다음과 같은 일이 일어납니다.
- 블록A의 데이터를 변경한다.
- 데이터가 변경되었으므로 블록A의 hash가 변경된다.
- 블록A의 hash는 더이상 '0' 4개로 시작하지 않게 되므로 블록A는 유효하지 않게된다.
- 블록A의 hash가 변경되었으므로 블록B의 hash가 변경된다.
- 블록B의 hash는 더이상 '0' 4개로 시작하지 않게 되므로 블록B는 유효하지 않게된다.
- 블록B의 hash가 변경되었으므로 블록C의 hash가 변경된다.
- 블록C의 hash는 더이상 '0' 4개로 시작하지 않게 되므로 블록C는 유효하지 않게된다.
블록의 값을 변경하는 방법은 블록, 그리고 그 이후에 연결된 모든 블록을 다시 마이닝하는 방법 밖에 없습니다. 그런데 블록체인에는 새로운 블록이 계속해서 추가되기 때문에 블록체인을 변경하는 것은 거의 불가능합니다.
웹 버전의 데모를 보고 싶다면 다음 링크에서 확인하세요.
Blockchain Demo
A visual demo of the blockchain data structure
blockchaindemo.io