비트코인 네트워크는 여러 노드(참여자)들이 서로 연결된 형태로 구성되어 있습니다. 즉 다음과 같이 새로운 거래가 발생하게 되면 최대한 많은 노드들에게 거래가 브로드캐스트 됩니다.
이렇게 거래를 받은 노드들은 각자 작업증명을 시작합니다.
만약 어떤 노드가 작업증명에 성공해 블록을 찾는다면 해당 노드는 다른 노드에게 작업증명된 블록을 브로드캐스트 합니다.
블록을 받은 노드들은 블록 내의 거래를 검증합니다. 예를 들어 공개키를 이용해 디지털 서명을 확인하고 거래가 유효한지 확인합니다. 만약 블록이 유효하다면 노드들은 해당 블록을 자신의 체인에 연결해 거래를 승인합니다.
이 과정에서 두 노드가 동시에 다른 종류의 작업증명된 블록을 전송하는 경우가 발생할 수 있습니다. 즉, 이중 지불되는 상황이 발생할 수 있습니다. 예를 들어 A와 B라는 블록을 두 노드가 동시에 전송했다고 가정하면 다음과 같은 상황이 발생할 것입니다.
어떤 노드는 A블록을 먼저 받고, 어떤 블록을 B를 먼저 받아서 체인에 연결합니다. 이후 다른 블록이 추가로 들어온다면 다음과 같이 분기에 저장합니다. 그리고 우선 먼저 들어온 블록에 이어서 체인을 연결합니다.
이후 다음 작업증명이 발견되면 둘 중 하나의 체인이 끊어지고 하나의 가장 긴 체인만 남게 됩니다. 이 과정에서 다른 블록을 작업하던 노드들은 가장 긴 체인의 블록의 체인으로 전환합니다.
하나의 체인만 남아있는 이유는 비트코인 네트워크에서 가장 긴 체인만을 유효한 체인으로 간주하기 때문입니다.
가장 긴 체인을 유효한 체인으로 간주하는 이유는 작업증명의 방식에 있습니다. 작업증명은 하드웨어의 연산을 통해 블록을 연결하는 방법입니다. 즉, 가장 긴 체인은 가장 연산을 많이 해서 얻어낸 결과라는 뜻입니다. 공격자의 연산량이 다른 네트워크 노드들 보다 크지 않다면 유효한 체인이 계속해서 가장 길어질 것입니다.
예를 들어 보겠습니다. 다음과 같이 공격자가 기존의 거래내역을 변경해 정상적인 체인을 따라잡으려고 시도하는 상황을 가정해 보겠습니다.
블록체인은 가장 긴 체인만을 정상적인 체인으로 인정합니다. 따라서 이 경우 공격자의 체인과 정상적인 체인은 계속되는 작업증명을 통해 격차를 늘리거나 줄이며 경주를 하게됩니다. 비트코인 개발자인 사토시는 이 상황을 도박꾼의 파산 문제와 유사하다고 말합니다. 도박꾼의 파산 문제란 유한한 자산을 가진 도박꾼이 무한한 자본을 가진 카지노를 상대로 도박을 한다면 결국 파산하게 된다는 이론입니다. 이와 비슷하게 공격자가 정상적인 체인보다 자신의 체인을 더 길게 만들기 위해 무한대로 시도한다면 결국 실패할 것이라는 내용입니다.
물론 실패 확률은 정상체인과 공격자의 체인이 얼마 만큼의 차이가 있는지에 따라 바뀝니다. 두 체인간의 블록 차가 한 개라면 공격자가 성공할 확률은 높은 편이지만, 블록 차이의 수가 증가한다면 확률은 지수적으로 감소합니다. 예를 들어 공격자가 다음 블록을 발견할 확률이 10%라면(네트워크 점유율이 대략 10%라면), 두 체인간의 블록 차이가 5개만 발생해도 공격자가 정상체인을 따라잡아 자신의 체인을 유효한 체인으로 만들 확률은 0.1% 미만입니다.
결론적으로 비트코인은 노드들이 거래 정보를 나눠갖고, 작업증명을 하고, 그 결과를 나눠갖는 과정을 통해 가장 긴 체인만을 인정합니다. 이 과정을 통해 단 하나의 거래기록, 즉 단 하나의 체인만 남게 되므로 여러 거래가 동시에 이루어져 어떤 체인이 올바른 체인인지 파악하지 못해 발생하는 이중 지불 문제가 해결됩니다. 또한 작업증명이라는 방식을 통해 공격자가 기존 자신의 거래내역을 변경하는 것을 어렵게 만들었습니다.(공격자가 타인의 개인키를 알아내지 않는 이상 타인의 거래내역을 변경하는 것은 불가능합니다. 비트코인 내의 거래는 공개키 암호화 방식으로 보호되기 때문입니다.)
다음 글에서는 네트워크 참여자가 작업증명을 하고 보상을 받는 과정인 채굴에 대해 알아보겠습니다.
'비트코인 > 비트코인 기본 구조' 카테고리의 다른 글
[비트코인 기본 구조] 6. 머클 트리와 SPV(Merkle Tree & SPV) (0) | 2022.06.29 |
---|---|
[비트코인 기본 구조] 5. 채굴(Mining) (0) | 2022.06.29 |
[비트코인 기본 구조] 3. 작업증명(Proof-of-Work) (0) | 2022.06.27 |
[비트코인 기본 구조] 2. 타임스탬프(Timestamp) (0) | 2022.06.27 |
[비트코인 기본 구조] 1. 이중 지불 문제(Double spending problem) (0) | 2022.06.27 |