비트코인 블록체인 (Block-Chain) 구조 (Bitcoin Block-Chain structure)
이전 포스팅을 통해 비트코인 블록체인 시스템의 노드들의 종류와 그에 따른 특징에 대해 이야기를 해보았다.
( https://steemit.com/kr/@niipoong/block-chain-nodes-and-roles )
URL을 첨부했으니 읽고 오길 바란다.
이전 포스팅에서 비트코인 블록체인은 4가지로 구분되는 기능에 대해서 설명했다. 4가지 기능으로는 Wallet, Miner, Network, Block-Chain 데이터베이스 가 있으며 이 기능을 서포트 하기 위해 Stratum 과 Pool이라는 프로토콜이 존재한다.
노드들의 P2p네트워크 전체를 아우르는 블록체인 시스템 과 노드 내부의 4가지 기능 중 Block-Chain 데이터베이스와 단가 같기 때문에 노드 내부의 Block-Chain 의 경우는 앞글자만 대문자로 표기할 것이고 전체 블록체인 시스템을 칭하는 경우는 BLOCKCHAIN 이라고 표기 하도록 하겠다. 혼동하지 않기 바란다.
오늘 설명할 주제는 Block-Chain 의 구조이다.
노드 내부의 Block-Chain 데이터 베이스는 위의 그림과 같이 선형적으로 연결이 되어있다. 최초의 블록 (Genesis Block) 이 생성된 2009년 1월 3일 18시 15분 05초 부터 방금전 조회 했던 511597블록까지 끊임없이 연결이 되어있다.
Block 0은 Block 1 보다 먼저 생긴 블록이다. 따라서 Block 0 을 Block 1 의 부모블록 (Parent Block)이라고 한다. 반대로 Block 1은 Block 0의 자식블록 (Child Block)이라고 한다.
자식은 부모님의 DNA를 물려받고 태어나는데, Block들 또한 부모블록의 정보를 참조하고 있다. 자식블록은 부모블록의 Hash 값을 가지고 있는데 이를 알아보기 위해 Block1을 자세히 들여다 보도록 하자.
https://blockchain.info 를 통해 블록 1 번의 포함된 정보를 확인할 수 있다.
(확인하는 방법 링크참조 https://steemit.com/bitcoin/@niipoong/blockchain-info)
사이트에서 확인한 정보는 블록내부의 모든 정보를 포함하지 않기에 직접 API를 통해 확인해 보겠다.
위의 왼쪽은 Block1의 구조를 보기 쉽게 그린 것이고 오른쪽은 실제 BlockChin.info 에서 제공하는 API를 통해 Block1 의 정보를 가져온 데이터이다.
편의상 Header와 Body라고 표현하며 포함 데이터는 각각 다르다.
Header라고 불리는 이유는 위에 나열한 6가지 Header정보들은 블록의 요약이라고 할수있는 항목들이며 Header안의 데이터를 통해 블록의 Hash값을 만들기 때문이다. 우리가 흔히알고있는 블록의 Hash는 Header정보들을 Hash한 값이다.
Header안에는 PrevBlock이라고 하는 부모블록 해쉬를 가지고 있고 이 부모 블록의 Hash를 이용하여 현재 자식블록의 Hash를 만들수 있다. 위에서 자식은 부모의 DNA를 물려받았다 라고 비유를 했는데, 블록체인에서는 부모의 Hash를 물려받았다고 생각하면 쉽다.
오른쪽 API를 통해 받아온 데이터를 보자.
prev_block이라는 정보가 있으며
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
이 값은 Block 0 의 Hash값과 일치한다.
Body에는 블록에 담긴 Tx모두가 포함되어있다. Header에는 이 모든 Tx정보를 요약한 데이터를 가지고 있는데 이를 MerkelRoot라고 한다. 트랜잭션을 MerkleTree 데이터 자료구조를 이용하여 MerkelRoot를 생성하는데 나의 지난 포스팅 을 참조하기 바란다. (https://steemit.com/bitcoin/@niipoong/let-s-take-a-look-at-merkle-tree )
Timestamp란 블록이 생성된 시간을 의미한다. 오른쪽 실제 데이터에는 1231469665 라는 숫자가 나오는데 Timestamp란 1970년 1월 1일 0시 0분 0초 이후부터 진행된 초를 의미한다. 1231469665 초가 지난 시점에 블록이 생성 되었다고 해석하면 된다.
Body라고 불리는 부분의 데이터를 확인해보자.
Tx[] 를 확인해 보면 Block1 에는 1개의 tx가 존재한다. 해당 coinbase거래라고 불리는 채굴에 대한 보상이다.
블록의 구조를 설명하는 포스팅이지만, tx구조도 살펴보도록하자.
tx 안에도 Hash정보가 있으며 Block1의 경우에는 1개밖에 없는 tx의 Hash값과 Header의 MerkleRoot값이 일치하는 것을 볼 수 있다. MerkleRoot값은 Tx의 Hash값들을 조합하여 만드는데 tx값이 1개밖에 없기 때문에 같은 것이다.
또한 in[] 값과 out[] 값이 존재하며 이는 UTXO의 input, output에 대한 데이터이다.
UTXO에 대한 정보는 나의 이전 포스팅 ( https://steemit.com/blockchain/@niipoong/utxo-bitcoin-trading-and-utxo ) 을 참조하길 바란다.
Block-Chain 의 Block구조를 확인해 보았다.
위의 포스팅 내용은
1. Block들은 각각 선형적으로 연결되어있다.
2. 부모 Block과 자식Block은 연결되어 있으며 부모Block의 Hash는 자식 Block을 만드는데 사용된다.
3. Block의 Header는 Block전체의 요약본이라고 할 수 있다.
4. Block의 Header에는 Block의 모든 tx내용을 조합한 MerkleRoot라는 데이터를 가지고 있다.
정도로 요약을 할 수 있겠다.
Header정보를 통해 실제 Hash를 구하는 방법을 알고싶다면 아래 포스팅을 참고하면 되겠다.
https://steemit.com/kr/@niipoong/create-bitcoin-block-hash-value
궁금한점이나 내용에 오류가 있다면 댓글바란다.