합의(Consensus)
이전의 글들을 통해 거래의 구조와 검증방식, 블록의 구조를 살펴보았다.
거래는 각각의 검증을 거쳐 풀에 저장이 되고 채굴자들에 의해 블록에 담기게 되는데, 이 과정에서는 블록은 어떠한 검증을 거치며 어떠한 규칙에 의해 블록체인에 최종적으로 저장이 될까?
먼저 블록 채굴에 성공한 채굴자는 해당 블록을 주변에 전파하게 된다. 중요한 사실은, 이때 전파하는 블록은 채굴에 성공했다고 확신할 수 없는 블록이며 검증을 거쳐 블록체인에 연결되어야 한다. 거래는 노드들에게 전파되며 검증의 과정을 거치듯, 블록 또한 검증을 거치게 되며 검증의 조건은 다음과 같다.
블록 검증 조건 (일부)
블록 크기 및 문법
블록 안에 담긴 거래
첫 거래가 coinbase Tx 인지
Timestamp가 향후 2시간 이내인지
채굴 검증
블록을 전파 받은 후, 헤더의 해시를 통해 채굴 검증이 이루어진다. '채굴'시 목표값보다 낮은 해시값을 만들기 위해 nonce값을 바꿔보는 무수히 많은 시도를 하는 반면, '검증'시 정해진 nonce값을 포함한 헤더의 해시와 목표값을 비교하여 검증하는 과정은 매우 단순하므로 쉽게 검증할 수 있다.
하지만 전파된 이후 블록체인에 연결이 되었더라도 안심할 수 없다. 다음 질문에 대한 답을 고려해볼 때 이유를 짐작 할 수 있다.
탈중앙화된 환경에서 모든 노드들이 같은 블록체인을 유지할 수 있을까?
네트워크를 통해 거래와 블록의 전파가 이루어지고 블록체인이 형성되는 과정에서 각 노드들은 다른 정보를 가지고 있을 수 있다. 이는 네트워크를 통한 합의가 어렵기 때문이다. 이러한 경우에 모든 노드들이 같은 블록체인을 형성할 수 있도록 설정한 합의과정을 컨센서스(Consensus)라 한다. 이러한 과정을 위해 노드들은 한가지의 종류의 블록, 블록체인만을 보관하고 있지 않다. 네트워크의 특성을 고려하여 여러가지 보조장치를 형성하고 있다.
예시를 통해 컨센서스를 확인해 보자.
편의를 위해 현재 블록체인이 2번까지 형성되어 있다고 가정해보자.
X라는 채굴자는 다음 블록인 3번을 채굴하여 주변에 해당 블록을 전파하기 시작한다.
반면, X가 채굴한 사실을 아직 전달받지 못한 A는 같은 높이의 3번 블록 채굴에 성공하여 전파하기 시작한다.
중요한 사실은 같은 높이의 3번 블록이더라 하더라도, 블록의 구성요소인 거래들이 채굴자에 따라 다르게 담기므로 그에 따라 해당 블록 헤더 해시(4번 블록을 채굴할때 사용), 머클 루트 등이 다른 블록일 것이다.
X의 인접한 노드인 Y는, 전달받은 X의 3번 블록을 기존 본인의 블록체인에 연결할 것이다. 반면 A의 인접한 노드인 B의 경우, A가 채굴한 3번 블록을 본인의 블록체인에 연결할 것이다. 이러한 현상은 Y는 A가 채굴한 블록을 받기 전, B 또한 X가 채굴한 블록을 받기전에 다음과 같은 현상이 발생한다.
하지만 네트워크의 전파 속도에 의한 일시적인 현상이므로 결국 B와 Y는 각각 X와 A가 채굴한 3번블록을 둘다 전파 받게 된 상태가 될 것이다. 결국 어떤 것이 진짜 체인인지 모르는 형태가 된다. 이러한 문제점을 해결하는 과정은 바로 이어지는 다음 현상에 의해 결정지어지게 된다.
4번 블록을 채굴한 C의 채굴자가 채굴한 블록을 주변에 전파하게 된다. 여기서 3번 블록이 결정지어지게 된다. 기존의 블록을 연결하여 채굴한 4번블록이 A가 채굴한 3번블록을 참고하여 채굴하였다면, 결국 A가 채굴한 3번 블록에 이어 C가 채굴한 4번 블록이 연결된 블록체인이 메인 체인이 되게 된다.
이는 비트코인 프로토콜에 의해 '누적 난이도가 제일 높은 체인'을 "메인 체인"으로 정해지며, 대게 길이가 길 수록 누적 난이도가 제일 높기 때문에 '가장 긴 체인'을 메인체인으로 설정한다고 이해해도 좋다.
중요한 사실은, 이와 같은 현상을 대비하여 노드들은 한 개의 블록체인만 가지고 있지 않으며 "서브 체인(Secondary Chain)" 또한 형성하고 있음을 알고 있어야 한다. (메인 체인과 반대 개념으로 서브 체인이라 칭했으며, secondary chain이란 용어로 쓰이기도 한다.)
이러한 과정을 마스터링 비트코인에서는 다음과 같은 그림으로 설명한다.
참고로 위 예시에서 'C가 채굴한 블록에 있어서 3번 블록과 같은 현상이 발생한다면?'과 같은 의문이 들 수 있다. 블록이 채굴되어 모든 노드들에 전파되기 전, 다른 노드에 의해 같은 높이의 블록이 채굴되는 것을 '동시에 채굴된다'라고 흔히 말하며, 동시에 블록을 채굴하는 경우는 드물게 일어나므로 해당 프로토콜로 해결이 될 수 있다.
이러한 컨센서스를 위해 서브 체인(secondary chain)과 메인 체인(Main chain)을 보관하게 되며 이를 대비하여 블록의 종류 또한 구분지어지게 된다.
고아거래와 같이 네트워크 속도차로 인해 이전 블록을 찾을 수 없는 블록이 발생하며 이를 고아블록이라 부른다.
블록체인은 단 하나의 체인으로 이루어져있지 않다. 네트워크 전파의 속도 차이로 인해 메인체인의 다른 경우를 고려하여 서브 체인(Secondary chain)을 보유하고 있다.
흔히 메인 체인은 '가장 긴 체인'이라고 언급을 한다. 하지만 정확한 기준은 "누적 난이도가 제일 높은 체인(the most cumulative PoW)"이며 대게 가장 긴 체인일 수록 누적 난이도가 높기에 흔히 긴 체인이라고 표현한다.
네트워크 전파 속도 차이로 인해 하나의 체인으로 수렴하기 전에 같은 블록을 채굴하는 경우가 종종 발생하며 이는 분기, 즉 포크(Fork)를 유발한다. '동시 채굴'이라는 용어는 정확히 같은 순간에 채굴을 성공한다는 개념이 아니며, 모든 노드들에게 블록이 전파되기 전, 같은 블록에 있어서 다른 노드에 의해 채굴이 완성되면 포크가 생겼다고 볼 수 있다. 이러한 포크(Fork)와 유사한 의미이지만 다른 쓰임새로 쓰이고 있는 두가지 용어(하드 포크, 소프트 포크)에 대해 정리를 하며 이 글을 마치도록 하겠다.
모든 채굴자(miner)와 사용자가 반드시 업데이트(업그레이드)를 필수적으로 진행해야 하는 포크를 의미한다. 대표적인 예시로 비트코인 캐시의 '난이도 조절'과 '블록사이즈 8MB 확장' 등이 있으며, 다수의 노드들의 반발로 새로운 암호화폐를 만든 케이스로는 비트코인에서 비트코인 캐시의 탄생, 이더리움에서 이더리움 클래식 탄생이 있다.
사용자의 경우 업데이트를 진행하지 않아도 호환이 가능하지만, 채굴자들의 업데이트(업그레이드)를 진행해야 적용이 되는 포크이다. 이에 대표적인 예시로 Segwit(Segregated Witness)이 있다.
다음글을 통해 세그윗이 왜 하드포크가 아닌 소프트포크인지 이해를 하게된다면, 포크의 개념과 세그윗의 개념을 확실히 짚고 넘어갈 수 있을 것이다.
참고
Antonopoulos, Andreas M. Mastering Bitcoin: Unlocking Digital Crypto-Currencies. OReilly, 2016.
https://www.blockchain.com/ko/pools
손동하/ sohn@skkrypto.io