비트코인 블록체인의 분기 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값 모두 정상적인 값이라고 한다면, 주변이웃들은 검증후 각각 자신의 블록에 새로운 블록을 연결할 것이다. 이런식으로 전파가 되다보면 2개의 진영으로 나눠질 것이다.





커리의 새로운 블럭은 빨간색으로 표시했고 레너드의 새로운 블럭은 녹색으로 표시 했으니 구분해서 보도록하자. 비트코인의 전체 노드는 위처럼 총 10개 (A~H , 커리, 레너드) 만이 존재한다고 가정해보자.

커리는 본인 포함 6개의 노드가 자신과 동일하게 유지되고 있다. 레너드는 본인 포함 총 4개의 노드가 유지되고 있음을 알 수있다. 

정확히 표현하면 이 상태에서는 아직 분기가 발생하지 않았다. 위는 매우 정상적인 상황인것이다. A~H까지 각자의 노드는 아무런 문제없이 본인 노드에 전달된 블록을 검증하고 그것을 인정하여 자신의 Block-Chain에 추가했을 뿐이다. 

위에서 보면 H와 C노드를 살펴보자. H노드는 레너드의 녹색블록을 인정하여 이미 자신의 Block-Chain에 추가했고 C는 빨간색의 커리의 블록을 자신의 Block-Chain에 추가했다. 

이때 H는 C에게 받은 빨간색 노드를 무시할 것이며, C 또한 H에게 전달받은 노드를 무시할 것이다. 이유는 블록이 두개의 블록은 내부에 279067 (부모 Hash) 를 가지고 있을것인데, H의 경우는 이미 녹색이 자리잡고 있고 C의 경우는 이미 빨간색 블록이 자리 잡고 있다. 각자 서로의 블록을 전파하는 과정에서 이미 부모Hash값이 일치 하지 않으므로 서로의 블록은 거부되며 , 새로운 블록이 채굴될 때 까지 위의 상태로 유지가 될 것이다.  

(더 자세히 알고싶다면 나의 이전 블록구조 포스팅을 보고 오길 바란다 https://steemit.com/kr/@niipoong/block-chain-bitcoin-block-chain-structure)



약 10분 후...

이번에는 커리와 레너드도 아닌 G노드에서 새로운 블록인 #279069번 블록 (검정색)이 생성 되었다고 한다. 



G노드는 자신이 #279069번의 블록 Hash를 찾자마자 자신의 이웃에게 자신의 블록을 전파한다. 이때 이미 H나 F처럼 부모가 G처럼 녹색인 노드들은 그대로 자신의 Block-Chain에 추가를 하면 된다. 

다만, 커리의 노드를 포함한 A,B,C,E,D 6개의 노드는 더이상 만약 빨간색 블록을 부모 노드로 Hash를 찾고 있었다면, 그 상태로 작업을 중단하여야한다.

그리고 기존에 빨간색 체인을 2차체인으로 변경하고 더 높은 길이의 녹색-검정색 블록을 메인체인으로 연결하게 된다. 이 작업을 체인 재수렴 (recovergence) 라고 한다. 그리고 이 상황을 블록체인의 분기가 발생했다고 말한다. 


위의 그림이 발생했을 때 Main Chain을 선택하는 것은 작업증명을 가장 많이한 체인을 기준으로 선택한다. 

작업체인을 가장 많이했다 
= 블록의 길이가 길다 
= 누적 난이도의 값이 크다. SUM(Difficulty 0~ Recent Block)

레너드가 최종적인 채굴 승리자가 되었다. 첫번째 전파작업에서 커리는 6개 노드가 공유되었지만 레너드는 4개의 노드였다. 초기 전파한 개수도 물론 영향을 줄 수 있으나 꼭 그렇지는 않다는 점을 말하고 싶어서 일부러 레너드를 최종 승자로 만든 이유이다. (사실 샌안토니오 스퍼스를 더 좋아한다.)

그리고 2차 체인으로 분류된 빨간색 블록은 고아블록 (Orphan Block)이라고 하며, 한마디로 낙동강 오리알이 되버린다. 빨간색 블록을 채굴한 사람은 당연히, 채굴보상을 받을 수 없다. 기록은 있으나 메인체인에 유지되지 않은 기록은 아무 의미 없기 때문이다. 

그렇다면, 저 빨간 블록안에 존재하는 트랜잭션들은 어떻게 될까? 저 블록안에 기록은 없어지게 될까? 아마 녹색과 검정색 블럭에 골고루 분포되어 있을 것이다. 만약 빠진것이있다면, 검정색 이후에 추가 될것이니 조금 기다려 보라.


확인해보자. 

https://blockchain.info/orphaned-blocks 을 통해 고아 블록을 확인해볼 수 있다. 지금껏 발생한 고아블록을 모두 볼 수 있으니 참고하기 바란다. 아래와 같은 꼴로 표시가 된다. 릴레이 된 곳을 보면 어떤 채굴자가 낙동강오리알인지 아닌지 확인해볼 수 있다.




BLOCKCHAIN 네트워크는 고아블록이 자주 발생하는 상황을 막기위해 난이도 조절을 하고있다. 주기는 2016개의 블록이 생성되는 시기이며, 비트코인은 블록 생성간격을 약 10분으로 정하고있다. 신속한 승인시간과 블록분기가 발생한 가능성과의 절충 시간이다. 

만약 채굴자가 갑자기 늘어난다면, 이 또한 분기가 발생할 확률이 높아질 것이다. 이때는 난이도를 높이는 작업을 한다. 

채굴자는 그대로지만 난이도가 높아서 하나의 블록을 생성하는데 평균 10분 이상이 발생했을때는 난이도를 다시 낮출 것이다. 이렇게 BLOCKCHAIN 유기적으로 내부 생태계를 조절하면서 잘 유지되고 있다는 사실이 중요하다.


다음 포스팅은 
https://steemit.com/kr/@niipoong/bitcoin-tx-and-block-store-process 포스팅 말미에 언급했던 
블룸필터와 SPV노드에 대해 설명하도록 하겠다. 

질문이나 내용에 오류가 있다면 댓글바란다.

댓글

이 블로그의 인기 게시물

비트코인 스크립트 scriptSig, scriptPubKey

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

비트코인 지갑주소를 잘못입력하여 전달하면 어떻게될까?