비트코인은 2009년, 전설적이고 수수께끼 같은 인물 사토시 나카모토가 제시한 디지털 화폐 개념으로, 블록체인 기술을 기반 삼아 중앙 기관 없이 개인 대 개인으로 작동합니다. 나카모토가 이 개념을 설명하기 위해 쓴 백서(Whitepaper)는 비트코인과 암호화폐 전반을 이해하고 싶은 사람이라면 반드시 읽어야 할 문서입니다. 이 백서는 비트코인이라는 개념을 설명할 뿐 아니라, 비잔틴 장애 허용 시스템이 탈중앙화된 환경에서 어떻게 작동할 수 있는지도 보여 줍니다.
비트코인에 관심 있는 사람이라면 무엇보다, 비트코인이라는 개념이 실제로 구현될 수 있었던 가장 큰 바탕이 블록체인 기술이라는 점을 알고 이 기술의 작동 방식을 이해해야 합니다.
블록체인이란?
블록체인은 저마다 데이터를 담고 있는 블록들의 사슬로, 어떤 중앙 기관의 감독이나 관리도 받지 않습니다. 이 정보의 사슬은 암호학적으로 보호되며, 탈중앙화된 구조 덕분에 누구도 함부로 건드릴 수 없습니다. 블록체인은 기본적으로 두 가지 자료구조를 사용합니다. 포인터(Pointer)와 연결 리스트(Linked List)입니다.
포인터
포인터는 다른 변수가 어디에 있는지를 가리키는 변수입니다. 보통 프로그래밍에서 변수는 데이터를 담습니다(int a = 10이라는 예에서 정수형 변수 a는 10이라는 값을 가집니다). 반면 포인터는 데이터로서 값을 담는 대신, 그 데이터를 가진 변수의 위치를 가리킵니다.
연결 리스트
연결 리스트는 자료구조에서 가장 중요한 단위 중 하나로, 대략 다음과 같은 모습입니다.
각 블록이 특정한 데이터를 담고 포인터를 통해 다음 블록과 이어지는 블록들의 나열입니다. 포인터 변수는 다음 노드의 주소를 담아 연결을 만들어 줍니다. 끝 노드에서 볼 수 있듯이, 마지막 포인터는 아무 데이터도 담고 있지 않습니다.
여기서 중요한 점은 각 포인터가 다음 블록의 주소를 담고 있다는 것입니다. 그렇다면 첫 번째 블록을 가리키는 포인터는 어디에 있을까요? 첫 번째 블록은 제네시스 블록이라고 부르며, 그 포인터는 시스템 안에 있습니다.
해시 포인터는 앞 블록의 해시값을 담고 있는 포인터입니다.
해시(Hash)란 길이에 상관없이 데이터를 입력받아, 내용과 무관하게 항상 같은 길이의 결과를 특정 함수로 만들어 내는 과정입니다. 비트코인의 경우 이체 내역을 데이터로 삼아 SHA-256 알고리즘으로 섞어 고정 길이의 결과를 만듭니다. 입력한 데이터의 길이가 어떻든 SHA-256 알고리즘은 언제나 256비트 길이의 결과를 내놓습니다.
가장 단순한 형태의 블록체인은 아래에서 보듯 하나의 연결 리스트입니다.
블록체인은 각 블록이 데이터와 함께, 앞선 블록을 가리키는 해시 포인터를 담고 있는 연결 리스트입니다. 그렇다면 해시 포인터란 무엇일까요? 해시 포인터는 일반 포인터와 매우 비슷하지만, 앞 블록의 주소 정보만 담는 것이 아니라 앞 블록에 담긴 데이터의 해시 결과까지 함께 담습니다. 이 작은 설계 차이가 블록체인 기술을 그토록 안전하게 만드는 비결입니다.
공격자가 3번 블록을 공격해 그 안의 데이터를 바꾸려 한다고 잠시 가정해 봅시다. 해시 함수의 특성상 데이터의 아주 작은 변화도 결과에는 엄청나게 큰 차이로 반영됩니다. 3번 블록의 데이터를 조금만 바꿔도 2번 블록에 저장된 해시 결과가 달라지고, 2번 블록의 변화는 1번 블록의 해시 결과에 영향을 주므로 결국 체인 전체를 바꿔야 하는데, 이는 불가능합니다. 이것이 블록체인을 조작할 수 없게 만드는 방법입니다.
채굴이란?
채굴(마이닝)은 새 비트코인을 만들어 내기 위해 필요한 과정입니다. 비트코인 채굴은 작업증명(Proof of Work, POW) 원리로 작동합니다. 간단히 말해, 문제를 푸는 것은 매우 어려워야 하지만 일단 풀고 나면 그 답이 맞는지는 매우 쉽게 증명할 수 있어야 합니다.
비트코인이 왜 POW라는 개념을 필요로 했는지, 암호화폐에 이런 시스템이 왜 필요한지 먼저 이해해 봅시다.
비트코인 이전에도 여러 디지털 화폐가 만들어졌지만, 디지털 환경에서 중앙 없는 개인 대 개인 네트워크를 만들 때 가장 큰 걸림돌은 '비잔틴 장군 문제'라 불리는 논리적 문제입니다. 나카모토는 비트코인에서 POW로 이 문제를 극복해 냈고, 그 덕분에 비트코인은 세상에 나올 수 있었으며 지금도 힘차게 이어지고 있습니다.
비잔틴 장군 문제
학술 연구에서도 자주 등장하는 비잔틴 장군 문제를 설명해 보겠습니다. 적의 도시를 공격하려는 비잔틴 장군들에게는 두 가지 문제가 있습니다.
장군들은 서로 아주 멀리 떨어져 있어서, 중앙의 지휘부가 포위 작전을 통솔하는 것이 불가능합니다.
적군 역시 강력한 군대를 갖고 있으므로, 성공하려면 모든 장군이 동시에 공격해야 합니다.
포위군은 도시를 둘러싼 채, 각 부대가 오른쪽 부대에게서 받은 명령 메시지를 왼쪽 부대로 전달하는 식으로 소통을 이어 갑니다. 그런데 문제가 있습니다. '수요일에 공격한다'는 명령이 도착했을 때 어떤 부대는 준비가 안 되어 '아니, 금요일에 공격하자'는 답신을 보낼 수도 있습니다. 또 메시지를 나르는 병사가 적에게 붙잡히거나, 그가 지닌 메시지 내용이 바뀔 수도 있습니다. 이렇게 신뢰할 수 없는 환경에서는 완전한 조율이 이루어지지 않으면 어떤 공격도 실패하게 됩니다.
비트코인 같은 암호화폐의 기반인 블록체인 네트워크에도 똑같은 논리적 문제가 적용됩니다. 이 네트워크는 어마어마하게 크기 때문에, 네트워크의 모든 참여자를 어떻게 일일이 신뢰할 수 있을까요? 누군가에게 4이더를 보내고 싶은데, 악의적인 누군가가 그 금액을 40이더로 바꾸지 않으리라고 어떻게 믿을 수 있을까요?
사토시 나카모토는 작업증명 프로토콜을 도입해 이 논리 문제를 극복해 냈습니다. 어떻게 작동하는지 살펴봅시다.
포위군의 한 부대가 '월요일에 공격한다'는 메시지를 왼쪽 부대에 전달하려면 다음 단계를 따라야 합니다.
먼저 원래 메시지에 '논스(nonce)'라 불리는, 무작위로 한 번만 생성되는 값을 붙입니다. 논스는 16진수 체계의 어떤 값이든 될 수 있습니다.
그다음 논스가 붙은 메시지 본문을 해시 함수에 넣어 결과를 얻습니다. 우리가 상상하는 이 가상의 공격에서, 지휘관들은 해시 함수 결과의 앞 5자리가 0인 결과만 서로 안전하게 공유하기로 정했다고 가정해 봅시다.
해시 함수의 결과가 원하는 조건을 만족하면 메시지를 다음 장군에게 전달합니다. 결과가 조건에 맞지 않으면, 붙였던 논스 값을 무작위로 바꿔 가며 앞 5자리가 0인 결과가 나올 때까지 과정을 반복해야 합니다. 이 시스템에는 엄청나게 오랜 연산 시간이 필요합니다.
메시지를 나르는 병사가 붙잡히거나 메시지 내용이 바뀌면, 해시 함수의 특성상 해시 결과가 크게 달라집니다. 메시지를 검토한 장군들은 해시 결과의 앞 5자리가 0이 아님을 알아채고 공격을 철회하게 됩니다.
다만 가능성은 매우 낮지만, 모든 해시 함수에는 충돌하는 결과가 있을 수 있습니다. 이론적으로는 서로 다른 두 입력 A와 B에 대해 H(A) = H(B)가 될 확률이 없어야 하지만, 실제 응용에서 충돌로부터 완전히 자유로운 해시 함수는 없습니다.
그렇다면 이 낮은 확률로, 메시지를 나르던 병사가 붙잡히고 메시지가 바뀌었는데도 해시 결과가 장군들이 원하는 대로 나오는 공격이 벌어지면 어떻게 될까요? 물론 시간이 많이 드는 일이겠지만 불가능하지는 않습니다. 이에 맞서 장군들은 수적 우위를 활용합니다.
이 문제는 장군 한 명이 오른쪽에서 받은 메시지를 차례로 왼쪽에 전달하는 대신, 세 명의 장군이 동시에 왼쪽으로 메시지를 보내는 방식으로 극복할 수 있습니다. 각자 메시지를 만든 장군들이 이를 합쳐 하나의 누적 메시지를 만들고, 이 메시지를 해시 함수에 통과시킨 뒤 그 결과에 논스 값을 붙여 다시 해시 함수에 넣습니다. 이번에는 결과의 앞 6자리가 0이어야 합니다.
이 단계에 이르면, 이 메시지의 논스 값을 찾아내고 메시지 내용을 바꾸는 일은 심각한 시간 낭비가 됩니다.
반면 메시지를 받는 장군들의 일은 쉽습니다. 전달받은 논스 값을 해시 결과에 붙여 결과를 비교하기만 하면 됩니다. 이 단계는 매우 빠르고 간단한 과정입니다. 이 아이디어가 바로 작업증명 원리의 작동 방식입니다.
조건에 맞는 해시의 논스 값을 찾는 데는 막대한 연산력과 시간이 필요합니다.
그러나 결과를 검토해 악의적인 시도가 있었는지 확인하는 데는 아주 짧은 시간이면 충분합니다.
비트코인 채굴에서 채굴자들이 작업증명 프로토콜을 구현하는 방식이 바로 이렇습니다. 이들은 자신의 연산력으로 눈앞의 암호학 문제를 풀어 다음 블록을 만들어 냅니다. 비트코인 블록체인에서 블록은 10분마다 하나씩 생성됩니다.
비트코인 네트워크에서 전송은 어떻게 이루어질까?
존이 데이브에게 비트코인을 조금 보내고 싶다고 해 봅시다. 이 전송은 어떻게 이루어질까요? 비트코인 전송은 법정화폐 이체와 매우 다르게 작동합니다. 존이 데이브에게 10달러를 주고 싶다면 지갑에서 10달러 지폐를 꺼내 데이브에게 건네면 이체가 끝납니다. 하지만 비트코인은 다릅니다. 비트코인은 우리가 물리적으로 소유하는 것이 아니기 때문입니다. 우리가 가진 것은 비트코인을 갖고 있다는 증명입니다.
우리가 알고 유의해야 할 것이 두 가지 있습니다.
채굴자들은 자신이 만드는 블록에 넣는 데이터로 이체 거래를 확인하고 보호합니다. 그리고 이 서비스에 대한 수수료를 받습니다.
법정화폐의 경우, 우리는 수중의 지폐가 그 전에 어디를 거쳐 왔는지 알지 못하고 추적하지도 않습니다. 현실적으로 그렇게 할 방법이 없습니다. 그러나 비트코인은 모든 이체 거래가 비트코인 네트워크에 기록됩니다.
이 사실을 바탕으로 존과 데이브 사이의 비트코인 이체를 들여다봅시다. 이 이체는 입력과 출력(input-output)이라는 두 부분으로 이루어집니다.
존이 이 이체를 실행하려면 이전 이체들로 받은 비트코인을 갖고 있어야 합니다. 앞서 말했듯 모든 이체는 비트코인 네트워크에 기록되어 있습니다.
존은 이전에 받았던 TR(0), TR(1), TR(2)라는 이체들의 비트코인을 모아 TR(INPUT)이라는 새 이체를 만들어 데이브에게 보내야 합니다. 여기서 TR(INPUT)이 새 이체의 입력 데이터가 됩니다.
입력에 의한 비트코인 이체는 대략 이런 모습입니다.
출력 데이터에는 단순히 새 이체 후 데이브가 가져야 할 비트코인 수량과 남은 거스름돈이 담기며, 이 거스름돈은 존에게 되돌아가 존의 다음 이체에서 TR(INPUT) 값이 됩니다.
거스름돈 부분을 빼면 이 과정의 출력 결과는 하나지만, 출력 결과가 여러 개인 이체도 가능합니다. 이 설명은 비트코인 네트워크에서 이체가 이루어지는 과정을 단순화해 보여 줄 뿐이며, 이체가 성공하려면 몇 가지 조건이 충족되어야 합니다.
이체가 지켜야 할 조건:
TR(INPUT) > TR(OUTPUT). 입력 이체는 항상 출력 이체보다 커야 합니다. 각 이체에서 입력과 출력(출력 + 거스름돈)의 차액은 수수료로 채굴자에게 지급됩니다. 즉, 채굴 수수료 = TR(INPUT) - (TR(OUTPUT) + 거스름돈)입니다.
입력 쪽에서는 TR(0)+TR(1)+TR(2)=TR(INPUT)이 성립해야 합니다. 다시 말해 존은 데이브에게 보낼 만큼 충분한 비트코인을 갖고 있어야 합니다. 거래를 처리할 만큼 비트코인이 충분하지 않으면 채굴자들은 그 이체를 거부합니다.
이제 데이브는 자신에게 전송된 비트코인의 주인이 자신임을 증명해야 합니다. 존은 데이브의 공개 키로 비트코인 이체를 암호화했습니다. 데이브는 자신의 개인 키로만 이 암호를 열 수 있습니다.
한편 존은 데이브에게 보낼 만큼 충분한 비트코인이 있음을 증명해야 합니다. 이는 실행하려는 이체에 자신의 개인 키로 서명하는 방식으로 이루어집니다. 누구나 존의 공개 키로 이를 열어, 실제로 필요한 수량의 비트코인을 갖고 있는지 검증할 수 있습니다. 이 증거를 서명 데이터라고 부릅니다.
입력 데이터(서명 데이터 포함)와 출력 데이터는 하나로 합쳐져 SHA-256 해시 알고리즘을 통과합니다. 이 알고리즘의 출력이 곧 이체가 됩니다.
한 가지 유념할 점이 있습니다. 비트코인 이체가 성립하려면 블록을 채굴한 채굴자가 그 이체를 블록에 실제로 넣어야 합니다. 블록을 채굴한 채굴자는 그 블록에 넣은 모든 이체에 대해 수수료를 받을 수 있습니다. 시간이 지나 이체량이 늘어나면 블록이 가득 차서 이체들은 새 블록이 나올 때까지 기다려야 합니다. 그래서 기다리기 싫은 사람들은 채굴 수수료를 더 내서 자신의 이체를 돋보이게 만들고 채굴자들에게 더 매력적으로 보이게 합니다.
여기서 수수료 대체(replace-by-fee) 원칙이 등장했습니다. 간단히 이렇게 작동합니다. 존이 데이브에게 5 BTC를 보냈더라도 채굴 수수료를 낮게 잡았다면 그 이체는 블록에 포함되지 못한 채 대기 상태로 남습니다. 이미 쓴 비트코인은 되찾을 수 없으므로 이 거래를 되돌리거나 취소할 방법은 없습니다. 그러나 존이 같은 주소로 같은 수량의 BTC를 다시 이체하면서 채굴 수수료를 더 높게 잡으면, 이전 이체는 무효로 간주되고 새 이체가 처리를 기다리게 됩니다.
비트코인, 나아가 암호화폐 전반의 미래는 무한한 가능성으로 가득합니다. 블록체인의 응용에는 경계가 없고, 이 분야의 프로젝트들은 날이 갈수록 더 성공적이고 안전해지고 있습니다.
물물교환 화폐에서 금·은 같은 귀금속의 사용으로, 다시 종이돈과 명목화폐로 이어져 온 여정에서, 가상 환경 속 화폐라는 아이디어 자체는 그리 새로운 것이 아니지만 그것이 실제로 구현 가능해진 것은 최근의 일입니다.
어떤 이들은 사토시 나카모토가 CIA 내부의 그룹이라 하고, 어떤 이들은 외계인이라 하고, 어쩌면 정말 사이버펑크일지도 모릅니다. 그가 누구든, 그는 우리의 자산을 바라보고 보관하는 방식을 완전히 바꿔 놓을 아이디어와 실천을 남긴 채, 다음에 무엇을 할지는 우리 스스로 정하도록 떠났습니다. 그는 자신의 것보다 더 발전된 아이디어들이 태어날 길을 열었고, 세상이 완전히 다른 관점을 가지도록 설득해 냈습니다.

사토시는 하드코드로 직접 작성한 제네시스(시작) 블록에 메시지를 숨겨 두는 일도 잊지 않았습니다. 2009년 1월 3일이라는 날짜와 함께, 그는 전 세계 경제 위기의 책임이 있는 은행들에 관한 그날 영국 타임스의 헤드라인을 새겨 넣었습니다. "재무장관, 은행에 대한 2차 구제금융 임박(Minister is on the verge of second bailout for banks)". 아마도 이 문구로 연방준비제도식 은행 시스템을 조롱한 것이겠지요. 사토시가 시작 블록에 이 사용 불가능한 주소를 왜 만들었는지는 알려져 있지 않습니다. 지금까지 이 주소로 16 BTC가 익명으로 전송되었고, 그 결과 2,100만 비트코인이라는 총공급량은 실제로는 영원히 채워지지 않게 되었습니다.
비트코인이 세계 중앙은행들을 두렵게 할 수준에 이르기까지는 겨우 9년이 걸렸고, 아직 갈 길은 멀리 남아 있습니다.
