이 글은 Stoshi Nakamoto의 "Bitcoin: A Peer-to-Peer Electronic Cash System"을 이해하기 쉽게 재해석한 글입니다.
전제 지식: P2P, Hash
인터넷에서 우리가 거래를 하려면 전자 결제를 대신 처리해주는 "신뢰할 수 있는" 기관이 필요합니다. 이 기관의 역할은 보통 은행의 온라인 시스템이 그 역할을 대신하고 있고, 경우에 따라 중개 어플리케이션이 수수료를 받기도 하죠.
이런 기존의 시스템들은 아무런 문제가 없을 것 같지만, 사실 고유한 약점이 있는데요. 바로 기관이 "얼마나 신뢰할 수 있는가"에 대한 문제입니다.
우리가 온라인 은행 시스템을 이용하여 쿠X에서 샤프심 하나를 구매하더라도, 그를 위해 얼마나 많은 개인정보(기본적으로 이름, 전화번호, 주민등록번호 등은 사실 은행이 당연시 알고 있습니다)가 은행에게 전달되었을까요?
이렇게 많은 개인 정보를 필요로 하는 이유는 너무나 명확한 단 하나의 문제 "이중 지불"의 문제 때문입니다.
이중 지불
현실에서 샤프심을 사기 위해 천원짜리 지폐를 문구점에 내고, 샤프심을 받아왔습니다. 이 거래가 정당함은 어떻게 증명할 수 있죠? 여기서 말하는 정당함이란, 그 화폐가 "이전에 사용되지 않았음"을, 즉 "이중 지불되지 않았음"을 어떻게 증명할 수 있죠?
당연한 이유죠? 전에 썼으면 지금 그 사람 손에 없겠죠. 이처럼 현실에서는 이중 지불이라는 문제 자체가 발생하지 않습니다. 사용한 화폐는 당연히 사용되는 즉시 구매자에게서 판매자에게로 영구히 이동하게 되니까요. 화폐는 대체 불가능하고 전달 가능한 고유한 토큰입니다.
그런데 온라인은 어떤까요? 화폐의 가치를 지닌 파일이 있다고 가정해 봅시다. 내가 그림 그림 파일을 구매자의 화폐 파일과 교환하려고 해요. 그 화폐 파일이 이전에 사용되지 않았음을 어떻게 증명할 수 있죠?
온라인에서는 안타깝게도 아직까지 그 파일이 사용되지 않았음을 확실하게 증명할 알려진 방법이 없습니다. 파일은 복사하면 그만이니까요. "신뢰할 수 없는 개인"은 온라인 시스템에서 화폐의 주인이 될 수 없습니다.
그렇기 때문에 "신뢰 가능한" 온라인 전자 금융 서비스들이, 우리의 화폐를 대신 저장하고 있고, 그런 거래를 "중계"하게 됩니다. 전자 금융 서비스들은 우리의 자산을 최대한 안전하게 보관하고, 그런 거래의 참여자가 자산의 주인임을 증명하기 위한 대가로 우리의 개인정보를 탈탈 털어 본인들의 데이터베이스를 구축하였죠.
이 가정에서 적어도 은행은 신뢰할 수 있기 때문에, 은행을 통한 두 개인의 거래는 안전하다고 인정받게 됩니다. 이것이 현재 기본적인 전자상 거래입니다.
비트코인은 신뢰할 수 있는 기관 대신 암호화 증명을 사용한 전자 결제 시스템의 구축을 목표로 하였습니다. 계산적으로 되돌릴 수 없는 거래와, 그 거래 기록의 전파는 신뢰 기관 없이도 전자상 거래를 가능하게 할 수 있겠죠.
비트코인은 이러한 문제를 해결하기 위해 P2P 시스템을 채용하고, 이중 지불 문제를 해결하였습니다. 이 시스템은 여태껏 비트코인을 이용한 사람들이 사용한 전력량보다 더 많은 전력과 컴퓨팅 파워를 투자하여 공격하지 않는 이상은 적어도 안전하다는 것이 증명되어 있습니다.
심지어 공격자가 그런 공격을 수행한다고 하더라도, 공격하는 동안 정상적인 이용자들이 서비스를 이용하며 그 과정에서 보안이 더욱 견고해지기 때문에, 현 시점에서 비트코인을 파괴하고 장악하는 것은 거의 불가능하다는 것이 중론이죠.
우선 비트코인은, 코인을 "디지털 서명의 체인"이라고 정의합니다. 각 코인의 소유자는 과거 거래의 해시와 다음 소유자(즉 전달할 사람)의 공개 키에 대해 디지털 서명을 진행하고 이를 코인 끝에 추가하여 코인을 다음 거래로 전송하게 됩니다.
물론 이것만으로는 이중 지불 문제가 해결되지 않습니다. 같은 이전 거래에 대해, 서로 다른 서명을 한 후 서로 다른 다음 소유자에게 전달하게 된다면, 이중 지불 문제가 발생하기 마련이죠.
여태까지는 전자 거래 서비스가 이러한 이중 지출 문제를 대신해서 증명하였지만, 지금 우리의 목표는 탈중앙화 즉, 그러한 기관이 없이 작동하는 거래 시스템입니다. 비트코인은 목적상, 최초의 거래를 유효하게 증명하여 그 이후 이중 지불 시도를 무효화하는 것을 목표로 합니다.
기존의 모델(중앙 기관)에서는 서비스가 모든 거래를 인지하고 있으며, 먼저 도착한 거래에 위배되는 거래 시도는 모두 인정하지 않았죠. 비트코인은 서비스 기관없이 목표를 달성하기 위해 거래를 모든 사람에게 알리는 방법을 택하게 됩니다. 또한 모든 참가자가 동일한 거래 기록을 갖고, 그에 동의할 수 있는 시스템 역시 필요하죠.
즉, 다음 소유자는 내가 코인을 받는 시점에 대다수의 다른 참여자가 기존 소유자의 코인이 정당하다는 것을 인정한다는 사실을 바탕으로 거래를 진행하게 됩니다.
이를 위해 비트코인은 타임스탬프 서버라는 개념을 이용하는데요. 타임스탬프를 블록에 등록함으로서, 데이터를 해시할 당시의 시간을 증명해줍니다. 각 타임스탬프는 해시될 때, 이전 타임스탬프를 포함한 체인을 형성하며, 이렇게 연계된 체인은 각 블록의 증명에 사용됩니다.
P2P를 사용하여 분산 타임스탬프 서버를 구현하기 위해 PoW(작업증명)이라는 방식이 사용됩니다. 작업증명은 SHA-256과 같은 단일 해시 함수를 선정, 사용하여, 해시 값이 비트 단위로 몇개의 0으로 시작하는 지 스캔하며 시작합니다.
타임스탬프 네트워크는 블록의 해시 결과가 요구하는 0비트의 수를 만족할 때까지 블록의 nonce라는 값을 변화시키며 계산하고, 작업증명을 충족하면, 블록이 생성됩니다.
해당 시점에서 다른 PC가 작업을 다시 실행하여 다른 블록을 만들 수도 있지만, 블록은 생성된 뒤 체인에 연결되어 전파되기에, 블록을 변경하기 위해서는 해당 시점 이후의 모든 블록을 다시 증명해야만 합니다.
이러한 작업 증명은 다수결을 사용할 때 문제를 해결하는데 도움이 되는데요. IP당 하나의 투표권을 상정한다면, 많은 IP를 가진 사람이 더 많은 힘을 가지게 되는데에 반해, 작업증명은 일종의 CPU당 하나의 투표를 구현하게 됩니다.(본문은 CPU라고 작성하였지만, 현재는 GPU라고 생각하는 것이 더 타당할 듯 합니다)
노드가 취하는 다수결의 규칙은 가장 많은 작업 증명이 완료된 가장 긴 체인을 선택하는 것인데, CPU 전력의 대부분이 이미 완성된 체인을 연장하는데 사용되는 평범한 네트워크의 경우, 가장 빠르게 성장하는 체인은 "올바른" 체인이 될 것이고, 이 경우 공격자의 체인은 다수결에 의해 전파되지 못합니다.
공격자가 과거 블록을 조작하고 자신의 이득을 취하려면 공격자는 모든 블록의 작업증명을 원하는 시점부터 모두 실행하여 현재의 메인 체인을 능가해야 하는데, 이는 원하는 시점부터의 후속 블록의 길이가 길면 길수록 공격 성공률이 기하급수적으로 떨어지게 됩니다.
작업 증명의 난이도가 너무 낮으면 공격의 위험성이 커지므로, 난이도는 시간당 평균 블록 수를 이용한 이동 평균 값으로 결정되게 됩니다. 즉, 블록 생성이 활발하면, 난이도가 올라간다는 의미죠.
네트워크를 실행하는 단계는 다음과 같습니다.
1. 새로운 거래가 모든 노드에 브로드캐스트됩니다.
2. 각 노드는 새로운 거래를 블록으로 수집합니다.
3. 각 노드는 해당 블록에 대한 작업 증명을 수행합니다.
4. 노드가 작업 증명에 성공하면 블록을 모든 노드에 브로드캐스트합니다.
5. 노드는 블록의 모든 거래가 유효하고, 블록이 이전에 사용되지 않은 경우에만 블록을 수락합니다.
6. 노드는 수락된 블록의 해시를 다음 블럭을 위한 이전 해시로 사용하고, 체인에서 다음 블록을 생성하는 작업을 통해 블록을 받아들입니다.
즉, 노드는 항상 가장 긴 체인을 올바른 체인으로 간주하고, 이를 확장하기 위해 계속 노력하게 됩니다. 두 노드가 서로 다른 버전의 다음 블록을 동시에 전파한다면, 당연히 노드는 둘 중 한 블럭을 먼저 수신하게 되고, 이 경우 먼저 받은 블록에서 블록을 연장하게 됩니다. 하지만, 다른 노드는 두번째 블록을 기점으로 작업을 진행할 수도 있기에, 다른 블록도 저장은 합니다.
누군가 만약 두 블록 중 한 블록에서 연장되는 그 다음 블록을 작업하여 어느 한 분기가 더 길어지게 된다면, 그 정보를 받은 즉시 다른 블록에서 작업하던 노드도 기존 작업을 버리고, 더 긴 블록의 분기로 갈아타게 됩니다.
관례에 따라, 블록의 첫 거래 기록은 블록 채굴자가 소유하게 될 새 코인으로 시작하는 특수 기록입니다. 이걸로 시스템은 블록 채굴자에게 일종의 "인센티브"를 제공하게 됩니다.
코인을 발행할 중앙 기관이 없는 시스템에서 블록을 채굴하는 사람은 인센티브로서 코인을 받게 되고, 이걸로 초기 코인의 생성과, 네트워크에 꾸준히 코인을 추가하는 방법을 제공합니다.
CPU와 전기를 소모하여 생성된 인센티브는 거래 수수료의 역할도 하게 됩니다. 어떤 거래의 출력 값이 입력 값보다 작다면(즉, 거래 과정에서 돈이 사라진다면), 그 차액은 거래가 포함된 블록의 인센티브 값에 추가되는 일종의 거래 수수료로 사용된 것 입니다.
네트워크 전역적으로 정해진 수의 코인이 생성된다면, 인센티브는 모두 거래 수수료로 전환되고, 인플레이션은 종료됩니다. 즉 블록을 채굴해도 네트워크에는 더이상 새로운 코인이 생성되지 않고, 기존 거래자들의 수수료를 채굴자에게 제공하게 됩니다.
이러한 인센티브 제도는 노드가 정직하게 활동하도록 도움이 되는데, 공격자가 만약 엄청난 컴퓨터로 체인을 지배할 수 있더라도, 그는 자신의 CPU와 전기를 써서 1. 아무런 이득도 없이 겨우 정직한 사람들을 속이는데 사용하거나, 2. 새로운 코인을 생성하여 돈을 버는데 사용할 수 있으니까요.
대부분의 경우 아무런 이득없이 그런 일을 하여 제도를 망치기 보다는, 기존 인원보다 더 많은 코인을 생성할 수 있는 능력으로 기존의 규칙에 따라 움직이며 부를 따를 가능성이 높다는 이야기입니다.
코인의 거래 기록이 포함된 블록이 충분한 후속 블록으로 안전해지면, 이전에 사용된 거래 기록은 디스크 공간을 위해 삭제할 수 있습니다. 블록의 해시를 망가뜨리지 않으며 이러한 기술의 구현을 위해 비트코인은 머클 트리라는 기술을 활용하여 해시되며, 블록의 해시에는 머클 트리의 루트만 포함되게 됩니다.
머클 트리
일종의 상향식 해시 트리로서, 트리의 모든 구성 요소(리프 값)들은 해시되어 형제 노드와 더해지고, 또 해시되어 형제 노드와 더해지고... 를 반복하여 하나의 헤더를 남길 때까지 이를 반복하게 됩니다.
연쇄된 해시의 특성상 이러한 구조는 하나의 구성 요소라도 바뀌게 되면 전체 헤더 값이 변경되므로, 거래가 존재했음을 입증하는데 유용해집니다.
오래된 블록의 경우 트리를 잘라서 압축할 수 있게되고, 내부 해시는 모두 저장할 필요가 없어집니다. 대충 계산해봐도, 거래 기록이 없는 순수한 블록 헤더는 80B 내외이므로, 스토리지 문제는 발생하지 않습니다(라고 주장합니다).
전체 노드가 실행되지 않더라도 거래를 확인 가능한데, 노드는 가장 거대한 체인(즉 올바른 체인)의 블록 헤더 사본을 보관하면 되며, 이는 네트워크에서 다른 노드를 통해 검색 가능합니다.
거래 기록을 블록에서 직접 확인할 수는 없지만, 체인의 한 블록에 속한 머클 트리에 거래 기록을 연결하면 거래 기록이 블록에 포함되었다는 사실을 확인할 수 있으며, 네트워크 전체에서 블록이 추가 되었는 지도 확인한 후, 다음 추가된 블록을 확인할 수 있습니다.
이는 올바른 상황에서는 유용하지만, 네트워크가 공격자에게 잠식당했다면 공격에 더 취약해지게 만들기도 합니다. 공격자가 네트워크를 압도한다면, 노드는 조작된 거래 내역에 속을 수도 있다는 의미입니다.
한가지 전략은 뭔가 이상함을 감지하면 사용자는 전체 블록을 다운로드하도록 네트워크에 요청하여 다시 확인하는 것인데, 빈번한 거래가 발생하는 기업은 더 빠른 검증과 보안을 위해 올바른 자체 체인을 보관할 것이기 때문입니다.
또한 모든 거래 기록을 별도로 저장하기는 힘드므로, 트랜잭션은 여러 입력과 출력이 포함되게 되는데, 거대한 단일 입력 또는 작은 금액들을 결합한 여러 입력이 존재하며, 결과는 수신자에게 보내는 결과와, 변경 사항이 있다면 송신자에게 다시 반환하는 두개의 출력으로 이루어집니다.
기존의 전자 은행은 접근에 대한 사용자를 인증하기 위해 많은 개인 정보를 필요로 하지만, 그에 반해 모든 거래를 공개적으로 발표하는 비트코인은 개별 공개 키를 익명으로 유지하여 사용함으로서 개인정보를 필요로 하지 않습니다.
사람들은 공개 키 간의 거래를 통해, "거래 자체"는 알 수는 있지만, 누가 누구에게 보내는지는 알 수 없다는 특징이 생깁니다.
하지만 그럼에도 만약 키의 소유자가 공개된다면, 자연스레 동일한 소유자의 다른 거래는 드러날 수 있죠.
쓰다보니 담아야 할 내용이 한둘이 아니더라구요... 후에 내용을 더 쉽게 풀어 그림과 함께 다시 설명해보도록 할께요.
재미있고 유용하셨다면 다음에도 찾아주세요! 그럼 안녕~