비트코인 거래와 블록에 저장과정 Bitcoin Tx and block store process

in #kr6 years ago (edited)

오늘 포스팅은

비트코인의 거래가 발생한 시점부터 블록에 저장되기까지의 과정을 살펴보도록 하겠다.

지금까지 설명 후 정리하는 방식으로 포스팅을 진행했으나, 오늘은 미리 과정을 요약한 후 하나하나 살펴보도록 하겠다. 음, 조금더 이해가 쉽도록 시나리오를 짜서 설명하는 것이 좋을 것 같다.

나의 시나리오에는 제임스 하든과 카이리 어빙 두명의 비트코인 지갑 사용자와 스테판 커리라는 이름의 채굴자가 등장한다. 커리가 거의 주인공이다. 

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노드(지갑)에서 트랜잭션이 발생 
(제임스 하든 지갑 -> 카이리 어빙지갑으로 BTC전달)

제임스 하든 지갑주소 : 1MMMMSUb1piy2ufrSguNUdFmAcvqrQF8M5

카이리 어빙 지갑주소 : 1KKKK6N21XKo48zWKuQKXdvSsCf95ibHFa

제임스 하든이 카이리 어빙에게 0.00091234 BTC를 전달한다.
(이 때 수수료 0.0001BTC, 총 0.00101234 BTC) 

이 경우 제임스 하든은 자신의 모바일에 설치 된 Bitcoin Wallet을 통해 어빙의 주소와 0.00003 BTC를 입력한 후 SEND 버튼을 누를 것이다.

하든이 자신의 wallet(이하 SPV노드)을 통해 트랜잭션을 생성하였다.

tx : 3f285f083de7c0acabd9f106a43ec42687ab0bebe2e6f0d529db696794540fea



위 그림을 보자. 왼쪽 하단의  턱수염이 아저씨가 제임스 하든이다.

2. 제임스 하든의 SPV노드와 이웃관계인 노드들부터 순차적으로 트랜잭션이 공유되며 몇 초안에 모든 노드로 해당 트랜잭션이 공유된다.

tx는 아직 pending 상태로 승인이 나지 않은 상태이다.  하든의 SPV노드는 자신과 peer로 연결되어있는 이웃에게 tx를 전달한다.

이를 전달받은 peer Full node는 네트워크를 통해 받은 tx를 먼저 검증할 것이다.

검증할 내용은 꽤 여러가지가 있지만 중요한 부분만 나열한다.

- 출력값 금액과 노드의 총 금액이 허용된 가치 범위내에 있는지 ( 0~2100만BTC )
- input값에 대해 참조 출력값이 존재하는지 (하든이 쓸려는 0.00101234BTC가 진짜 존재하는 BTC인지)
- input UTXO결과값이 out의 결과값보다 큰지 ( 하든이 가진 BTC크기가 0.00101234BTC보다 큰지 )
- 하든의 서명이 올바른 서명인지 (지난 포스팅 참조)

정도가 중요한 검증이다. 이외에 구문 syntax확인 등 여러가지의 검증을 한다.

자, 그래서 이 모든 검증중 하나라도 FALSE라면 바로 폐기가 된다. 이웃 노드에 전파가 되지 않는다.

TRUE로 판명이된다면 해당 tx를 노드의 MEMPOOL에 저장한다. 이는 tx들이 쌓여있는 곳으로 이해하면된다. 이후 해당 노드는 또다시 자신과 peer로 연결된 노드에게 tx를 전달한다. 참고로, 한 노드당 약 8개정도의 peer를 유지하고있다. 이렇게 연쇄적으로 tx를 전달하다 보면 결국 비트코인 p2p네트워크의 노드들은 해당 tx를 검증하고 자신의 MEMPOOL에 저장하고 있을 것이다.

이중에 물론 악의적인 노드가 있어서 해당 tx의 검증이 true였지만, 폐기를 하고 전달을 하지 않았다고 치자. 상관없다. 해당 노드를 제외한 훨씬 많은 비율의 노드들은 이 트랜잭션을 인정하고 블록에 저장할 준비를 하고있기 때문이다. 아직 아리송 하다면 이후 나올 채굴까지 보도록하자.

3. BLOCKCHAIN 네트워크의 모든 Miner들이 트랜잭션을 저장할 블록을 채굴

위의 p2p네트워크를 통해 전파된 tx가 어느덧 스테판 커피의 노드까지 전달이 되었다.
이때 전달받은 tx는 앞서 채굴작업을 하는동안 wait상태로 MEMPOOL에 대기한다. 이 과정에서 더 높은 tx Fee의 tx가 등장하면 이 대기 우선순위에서 밀릴수도 있다. (첫 50kbyte만)
채굴자들은 자신이 더 높은 채굴보상을 위해 해당 MEMPOOL의 높은 수수료들만을 우선적으로 블록에 넣어 줄 것이기 때문이다. (야속한 커리...)


여튼 커리는 자신의 노드에서 tx Fee우선순위가 높은 것들중 블록 총 크기가 약 1MByte 이내가 되도록 모아서 이를 통해 블록 Hash값을 찾는다. 정확히는 Hash를 구할 nonce값을 찾는다.
( 이전에 포스팅했던 블록 Hash구하기 URL 첨부한다  https://steemit.com/kr/@niipoong/create-bitcoin-block-hash-value )

하든의 tx가 전달될때는 이미 커리는 이전 tx들로 Hash를 구하는 중일 것이다.

커리가 hash값을 구하기를 포기하는 순간은 언제일까? 바로 p2p네트워크를 통해, 누군가가 찾은 블록이 자신의 노드로 전달되는 시점이다. 이 시점은 이미 커리는 채굴 경쟁에서 졌다는 것을 의미한다. 커리가 할 일은 방금 전달받은 블록을 검증하여 자신의 블록체인에 새로 추가를 하고 해당 블록을 또다시 주변 이웃에게 전달해주는 일이다.

이 작업이 끝나면 커리는 멈추지 않고 그다음 트랜잭션들을 모아 Hash를 만든다. 이 때 마침 커리가 모은 tx들 중 하든의 tx가 포함되어 있다.

4. 몇 분후 채굴자인 스테판 커리의 노드가 채굴경쟁에서 승리하여 블록을 생성

다시 약 10분정도의 경쟁에서 결국 커리는 Hash값을 찾게되었고 이 블록안에는 하든의 tx가 포함되어 있다. 커리는 방금 채굴경쟁에서 승리한 대가로 하든의 tx Fee = 0.0001BTC를 포함한 총 25.10416723BTC를 채굴보상으로 받게되었다. ( 블록생성 25BTC + Total tx Fee = 0.10416723BTC )

이곳에서 확인 가능하다. https://blockchain.info/ko/block-index/341440

커리가 찾은 블록
번호  = #279068
Hash = 0000000000000001a27b1d6eb8c405410398ece796e742da3b3e35363c2219ee


5. 커리의 노드 내부에 존재하는 Block-Chain에 새로 생긴 블록을 연결

커리는 자신의 노드에 존재하는 Block-Chain 데이터베이스에 방금 찾은 #279068번 블록을 연결한후, 자신의 거래풀에서 279068번 블록안에 넣었던 트랜잭션을 자신의 MEMPOOL에서 제거한후 이웃 노드에게 자신이 찾은 블록을 전달한다. 그리고 이어서 다시 또 그 다음 블록Hash를 찾기위해 고군분투 할것이다.

6. 커리의 노드와 이웃관계인 노드들부터 순차적으로 해당 블록이 전달되며, 결국 모든 노드들의 Block-Chain에 해당 블록이 저장된다.

커리가 만든 블록을 전달받은 이웃노드는 자신이 채굴경쟁에서 졌다는 사실을 인정하고, 새로 전달받은 블록을 검증한다. 검증에 대한 내용은 Hash값이 정해진 난이도에 만족하는 값인지를 검증하고, 블록 내부의 트랜잭션을 모두 확인한다. 그리고 블록안에 포함된 tx들을 자신의 MEMPOOL에서 삭제하고 자신의 노드에 추가하고 다시 또 이웃에게 전파한다.

이렇게 모든 노드들이 커리가 찾은 블록을 자신의 Block-Chain에 동기화를 하면 커리가 찾은 #279068블록은 일단 유효하다고 판단되어진다. 비트코인 블록체인에서 완전 승인 단계는 커리의 블록이후 6개의 블록이 더 연결되었을때 이다. confirmation : 6 인 상태일때 완전한 블록이라고 인정한다. (하지만 최근에는 6개의 승인까지 되지 않더라도 해당 UTXO를 사용할 수 있도록 약간의 수정을 한 것으로 안다. 너무 오래걸리기 때문)

정리 Transaction이 Block에 저장되고 전파되는 과정을 설명하였다.
디테일한 부분은 많이 빠져있는데, 중간중간에 첨부된 이전 포스팅을 참고하기 바란다.

이 포스팅은 전체적인 흐름을 쉽게 이해하기위해 쓴 글이며 쓰다보니 카이리 어빙은 등장하지도 않았다. 다음 포스팅에서 어빙이 등장할 것이다. SPV노드의 블룸필터를 포스팅 할 예정이다.

또한 조만간 블록체인의 분기에 대해서도 자세히 포스팅 하도록하겠다. 이 부분도 매우 중요하다. 블록체인의 분기에 대해서 간략히 설명하면, 채굴에 성공한 노드가 커리 말고도 존재할 확률이 있다. 거의 동시 다발적으로 Hash를 찾기 때문에 무리가 아니다. 이 경우 어떤 블록을 메인체인에 넣을지에 대한 내용이 바로 블록체인의 분기이다.

다음 포스팅을 통해 알아보도록 하자.

혹시 위 내용에 대해 질문이나 오류가 있다면 댓글바란다.

Sort:  

your post is very good, I follow you, I hope can improve my rank.

thanks have a nice day~

어려운 내용이지만 천천히 읽어보니 조금은 이해가 가는 듯 합니다 ㅎ
좋은 글 감사합니다^^

감사합니다. 시작한지얼마 되지않았는데 이전 글들은 너무 독자를 배려하지못했던것같아요. 블록체인 지식 전파에 대한 목적으로 시작한만큼 많은 도움이되셨으면 좋겠습니다. 궁금하신점 피드백 자주 부탁드릴게요 ^^