비트코인 블록체인의 분기 Bitcoin Blockchain Branch

이미지
지난 포스팅을 통해  https://steemit.com/kr/@niipoong/bitcoin-tx-and-block-store-process tx가 블록에 저장되고, 모든 노드에 전파되는 과정을 알아보았다.  지난 포스팅을 보면 이미 언급을 했으나, 블록체인 시스템은 BLOCKCHAIN 이라고 모두 대문자로 표기 할 것이며, 블록체인 데이터베이스는 Block-Chain 이라고 표기하도록 하겠다. 오해가 없길 바란다. 이번 시간에는 지난 포스팅 말미에 언급한 Block-Chain 분기에 대해서 설명하겠다. Block-Chain의 분기란? 먼저 Block-Chain에 연결한 새로운 블록이 거의 동시에 2개 혹은 여러개가 생길 때 발생한다.    (사실 여러개가 발생하지 않도록 BLOCKCHAIN 네트워크에서는 고유한 Main Chain을 유지하기 위해 2016번 블록이 생성될때마다 난이도 조절을 통해 분기가 생기지 않도록 최대한 조절을 하고 있으나, 여러개가 생기지 않는다는 보장도 없다는 점다는 점은 인지하고 있어야 한다)  거의 동시에 2개의 새로운 블록이 생성 되었다고 생각하고 아래 포스팅을 진행하도록 하겠다. 그리고 지난 포스팅의 주인공인 채굴자 스테판커리가 다시 등장할 예정이다. 그리고 또다른 채굴자가 한명 더 등장할 것이다. 이름은 카와이 레너드다. 커리는 자신이 찾은 Hash값이 고유한 값인 줄 알고 주변 이웃에 전파를 하고 있었다.  그러나 우연히도 채굴자 레너드가 동시에 #279068번 블록에 Hash값을 찾아 주변에 전파하고 있었다. 자 그렇다면, BLOCKCHAIN 네트워크는 이 두개의 블록 중 어느 것을 선택해야 할까? 더 빨리 채굴된 것? 아니면 더 잘생긴 사람의 것? 어떤 것을 채굴 하게 될지는 P2P네트워크 만이 알수 있다.  커리와 레너드중 누가 진정한 채굴 경쟁의 승리자가 될지 알아보도록 하자. 만약 커리와 레너드 두개의 Hash

비트코인 거래가 블록에 저장되기까지의 과정

이미지
오늘 포스팅은 비트코인의 거래가 발생한 시점부터 블록에 저장되기까지의 과정을 살펴보도록 하겠다. 지금까지 설명 후 정리하는 방식으로 포스팅을 진행했으나, 오늘은 미리 과정을 요약한 후 하나하나 살펴보도록 하겠다. 음, 조금더 이해가 쉽도록 시나리오를 짜서 설명하는 것이 좋을 것 같다. 나의 시나리오에는 제임스 하든과 카이리 어빙 두명의 비트코인 지갑 사용자와 스테판 커리라는 이름의 채굴자가 등장한다. 커리가 거의 주인공이다.  1. 제임스 하든의 SPV노드(지갑)에서 트랜잭션이 발생  (제임스 하든 지갑 -> 카이리 어빙지갑으로 BTC전달) 2. 제임스 하든의 SPV노드와 이웃관계인 노드들부터 순차적으로 트랜잭션이 공유되며 몇 초안에 모든 노드로 해당 트랜잭션이 공유된다. 3. BLOCKCHAIN 네트워크의 모든 Miner들이 트랜잭션을 저장할 블록을 채굴 4. 몇 분후 채굴자인 스테판 커리의 노드가 채굴경쟁에서 승리하여 블록을 생성 5. 커리의 노드 내부에 존재하는 Block-Chain에 새로 생긴 블록을 연결 6. 커리의 노드와 이웃관계인 노드들부터 순차적으로 해당 블록이 전달되며, 결국 모든 노드들의 Block-Chain에 해당 블록이 저장된다. 위의 과정이 전부다. 전체적인 흐름을 이해하는데 어렵지 않을것이다. 이제부터는 위의 1~6번 과정을 조금 깊에 들어가 보도록 하겠다.  아래에 나와있는 예시는 실제발생한 거래이며, 제임스하든과 카이리 어빙과는 전혀 관련이 없음을 미리 밝힌다. 지난 포스팅 ( https://steemit.com/kr/@niipoong/scriptsig-scriptpubkey ) 에 나온 tx1의 내용을 조금 사용할 것이다. 사실 이번 포스팅은 트랜잭션이 블록에 저장되기 까지의 큰 Flow에 대한 내용이므로 사실 굳이 데이터단위로 비교할 필요는 없다. 1. 제임스 하든의 SPV노드(지갑)에서 트랜잭션이 발생  (제임스

비트코인 스크립트 scriptSig, scriptPubKey

이미지
만약 비트코인 스크립트가 무엇인지 알고싶은 사람이라면 어느정도 p2p네트워크에 대해서는 이해를 하고있을것이라 짐작이된다.  만약 본인이 비트코인 거래를 해본적이 있다면, blockchin.info 를 통해 자신이 생성한 txid를 검색해 보기도 했을것이다. 자신의 트랜잭션이 블록에 잘 저장되는 것을 확인하고 승인이 이루어 진 것을 확인한후 거래가 잘 이루어졌다고 안심하기도 했을 것이다.  smartbit.com의 API를 통해 tx를 확인해보면 아래와 같은 데이터를 볼수있다.  success : true 라는 정보와 transaction의 confirmations : 512215 라는 트랜잭션을 저장한 블록정보도 확인할 수 있다. 그리고 coinbase : true라는 정보로 채굴자에게 주어지는 보상 트랜잭션이란 것을 알 수 있겠다. 채굴 보상에 대한 트랜잭션이기에 당연히 이중지불도 되지 않았을 것이다. 그러나 위와같은 정보를 가지고 안심할 수 있을까?  지난 포스팅 (https://steemit.com/kr/@niipoong/id-create-bitcoin-txid )을 통해 트랜잭션을 직접 만들어 보기도 했다. 아래는 트랜잭션을 만드는데 필요한 아이템들이다. ver : 소프트웨어 버전 정보 input_count : 입력값 개수 prevout_hash : 이전 트랜잭션 Hash Hash sequence : 현재 장애가 있는 Tx-대체기능, 0xffffffff로 설정 lockTime : 잠금시간 scriptSig : 해제 스크립트 value : BTC가치 scriptPubKey : 잠금 스크립트 위 아이템들만 있으면 우리는 트랜잭션을 인위적으로 생성할 수 있다. 하지만 저 아이템들 중  scriptSig 는 우리가 인위적으로 만들어 낼 수 없다. 트랜잭션 발생자의 개인키가 필요한 서명이 존재하기 때문이며, scriptPubKey를 통해 우리는 트랜잭션을 검증하고 서명을 확인한다. 지난

비트코인 트랜잭션 ID 만들기 Create Bitcoin TXID

이미지
지난 포스팅을 통해 우리는 Block의 Hash를 직접 생성해보았다. ( https://steemit.com/kr/@niipoong/create-bitcoin-block-hash-value ) 그리고 Block 내부를 확인해보니 편의상 Header와 Body로 구분할수 있으며 Header의 6가지 정보를 조합하여 Block의 Hash값을 만들어냈다. 추가로 Body정보를 확인해 보니 여러가지 항목들이 존재하는데 그중 Transaction 목록들이 리스트로 존재하고 있었다. 그리고 Transaction에는 각각의 Hash로된 ID가 존재했다. Transaction 이라는 단어만 놓고 보면 꽤 여러가지의 의미가 존재한다. 거래, 처리, 업무 등 다양한 의미가 있는데 비트코인에서 Transaction이란 거래를 의미한다. 따라서 Transaction ID (하위부터 TXID로 표기) 는 비트코인 거래 단위의 식별값이라고 할 수 있겠다. A라는 사람이 B라는 사람에게 BTC를 전송할때, 이 거래에 대한 Transaction이 발생하게 되고, 이 거래에 필요한 몇가지 항목들을 통해 TXID가 구해지게된다. 이번 포스팅을 통해 TXID를 직접 구해보자. 대상 트랜잭션은 Genesis Block인  #0번 Block의 거래로 정했다. Blockchain.info 를 통해 블록의 정보를 확인해보자. 맨 하단에 거래 목록을 보면 0번 Block에는 단 하나의 거래만 존재한다. 이전 포스팅에서 언급했듯 2009년 1월 3일 생선된 최초의 블록이다.  거래를 보면  4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b  을 확인할 수 있을텐데, 이것이 바로 TXID이며 오늘 우리가 구해 볼 값이다. 이어서 해당 TXID를 찾아가보자. 아래와 같은 정보를 확인 할 수 있는데, 이 HTML화면에서는 Transaction 항목들이 모두 표현되어

비트코인 블록 해쉬 구하기 Create BItcoin Block Hash Value

이미지
앞선 포스팅에서 비트코인 블록체인 구조를 살펴보았다. (참조 https://steemit.com/kr/@niipoong/block-chain-bitcoin-block-chain-structure ) 블록은 Header와 Body로 나뉘며 , Header에는 이전 블록의 Hash값이 포함된다고 하였다. 또한 Header의 내용을 바탕으로 블록의  Hash가 산출되며 Header의 내용으로는 version, preBlockHash, merkleRoot, timestamp, nonce, bits 총 6가지 이다. 지금부터 간단히 파이썬 코드로 이 6가지 항목으로 Hash값을 구해보자. 현재 ( 2018-03-02 11:15:36 ) 가장 최신 블록인   # 511618  번 블록으로 정했다. 이 블록의 Hash를 구해보도록 하자. 먼저  https://blockchain.info  의 API 를 통해 511618블록의 정보를 가져와서, 필요한 헤더정보만을 추려보자. 아래와 같은 정보를 얻을 수 있다. 그 다음 할일은 현재 Hex값이 아닌 version, bits, nonce, time 네개를 Hex값으로 변환해준다. Hex값으로의 변환이 잘됐으면 모든 값들을 Reverse Byte ordering 해준다.  이후 version + preHash + merkleRoot + time + bits + nonce 순서로 byte를 하나로 이어준다. 마지막으로 이렇게 합쳐진 headerItems 를  1. Hex 디코딩 2. SHA256 + digest() 를 더블 해쉬를 해준다. 3. Hex 인코딩 이 과정이 지나고 의 마지막 줄을 print 해주면 아래와 같은 Hash값이 나오게 되는데 Blockchain.info를 통해 블록 해쉬를 확인해보자. 실제 Header의 값들로 511618블록의 Hash를 산출해

비트코인 블록체인 (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 번의 포함된 정보를 확인할 수 있다. (확인하는 방법 링크참조