비트코인 백서 톺아보기- 3편

초급7분 소요2022-02-11

사토시 나카모토는 P2P 분산 네트워크에서 타임스탬프 서버를 구현하기 위해 ‘작업증명(PoW, Proof-of-Work)’을 만들었습니다. 즉, 네트워크 참여자들 간의 합의를 달성하기 위한 방법으로 작업증명 프로토콜을 만든 것인데요. 이를 통해 이중지불 문제를 방지하고자 한 것이죠. 그런데 도대체 무엇을 합의한다는 것일까요? 이에 대해 이해하기 위해서는 먼저 ‘합의 알고리즘’에 대해 알아보겠습니다.



합의 알고리즘(consensus algorithm)

먼저 합의와 알고리즘의 사전적 의미에 대해 살펴볼까요?

합의는 ‘서로의 의견이 일치함 또는 둘 이상의 당사자의 의사가 일치함’, 알고리즘은 어떤 문제의 해결을 위해 입력된 자료를 토대로 하여 원하는 출력을 유도하여 내는 규칙의 집합이라고 정의하고 있습니다. 즉, 문제를 해결하기 위한 방법인 것이죠.

블록체인의 핵심기술이라 할 수 있는 ‘합의 알고리즘’은 컴퓨터 세계에서 다수의 참여자들이 통일된 의사결정을 하기 위해 사용하는 알고리즘을 말하는데요. 비트코인 백서에서 말하는 ‘작업증명’은 블록체인에 적용되어 있는 전형적인 합의 알고리즘이라 할 수 있습니다. 한 마디로 말해, 해시함수를 해독해 ‘해시값’을 찾아 검증하는 것입니다. 조금 쉽게 설명해 보겠습니다.

 

예를 들어, 만 개의 상자 중에 오직 한 상자에만 금이 들어있다고 해볼게요. 가장 먼저 금이 든 상자를 찾은 사람이 금을 가질 수 있다고 한다면 금이 든 상자를 찾기 위해 랜덤하게 상자를 하나하나 다 열어보겠죠? 그리고 가장 먼저 금이 든 상자를 찾은 사람은 보상으로 금을 받을 것입니다. ‘작업증명’은 이처럼 만 개의 상자 속 하나의 금이 든 상자를 찾는 것과 비슷하다고 할 수 있습니다.

정리하면, 블록 해시가 설정한 어떤 값보다 작은 값이 나오게 하는 임시값(nonce)을 찾아 작업증명을 실행하는 것인데요. 여기서 nonce는 계산되는 해시값이 특정 숫자보다 작아지게 하는 값입니다.

블록 내에 설정된 해시값이 ‘ 6CAF0E …’라고 하면 이 값보다 작은 값이 나오게 하기 위해 무작위로 nonce  값을 바꾸면서 해시값을 구하는 것입니다. 이 작업증명을 통해 해당 거래가 이중으로 지불되지 않은 정상적인 거래임을 증명하는 것입니다.

가장 먼저 암호화 문제를 푼 사람이 승자가 되어 ‘블록’을 생성할 수 있는데요. 이 때, 암호화 문제를 푸는 데 참여한 모든 참가자들 즉 노드의 51%가 맞다고 인정해야 블록을 생성할 수 있습니다. 

쉽게 말해 우리가 반장을 뽑거나 대통령을 뽑을 때 1인 1투표권이 주어지는 것과 마찬가지로 CPU 즉, 하나의 컴퓨터에 단 하나의 투표권이 주어진다는 것입니다. 투표권을 가진 컴퓨터가 해당 작업증명이 정당하다고 검증하여 50% 이상 동의하면 블록을 생성할 수 있는데요. 이렇게 생성된 블록은 체인형태로 연결되기 때문에 가장 긴 체인이 가장 큰 작업증명의 노력이 반영된 것이라 하는 것입니다.

만약 동시에 블록의 암호를 풀었다면 어떻게 될까요? 이 경우에는 가장 긴 체인이 참인 것으로 인정되어 파란색 블록의 거래만 인정되고 빨간색 블록의 거래는 없는 거래가 되는 것입니다. 

그래서 누군가 블록을 공격하고자 한다면 해당 블록 말고 그 뒤에 생성되는 블록까지 모두 작업증명을 다시 수행해야 하는데요. 공격을 하는 중에도 계속해서 블록이 생성되기 때문에 이 속도를 따라잡아야만 블록을 변경할 수 있는 것입니다.


앞서 암호를 풀어야 블록을 생성할 수 있다고 하였는데요. 이 문제를 푸는 속도가 점점 빨라진다면 어떻게 될까요? 맞습니다. 블록이 생성되는 속도가 점점 빨라져 비트코인이 발행되는 속도가 빨라질 텐데요. 사토시는 이 부분도 고려하여 블록이 빠르게 생성된다면 작업증명 난이도가 증가하게 된다고 말하고 있습니다.

 


이것만 기억하자!

1) 작업증명은 SHA-256과 같은 알고리즘으로 다수의 0비트로 시작하는 암호화를 해독하는 과정을 포함한다.

2) 기존에 생성된 블록을 변경하기 위해서는 현재 존재하는 블록은 물론 이후에 생성되는 블록에 대한 작업증명을 해야 한다.

3) 만약 공격자가 블록을 변경하고자 한다면 해당 블록과 그 이후의 모든 블록의 작업증명을 다시 해야 하기 때문에 정직한 노드들의 작업증명 속도를 추월해야 한다.

4) 블록이 빠르게 생성된다면 작업증명 난이도도 증가한다.