지난달 31일 비트코인은 탄생 14주년을 맞았다. 2008년 그날 사토시 나카모토가 작성한 백서를 읽어보자.
[목차]
-
서론
-
트랜잭션
-
타임스탬프 서버
-
작업증명(Proof-of-Work)
1. 서론
전자 거래를 위해선 제 3자의 개입(trusted third parties)이 필수적입니다.
제 3자는 거래 참여자들의 신뢰(trust)를 확보하고, 이들의 거래 기록을 장부로 남깁니다.
이를 통해, 거래 참여자들은 서로 직접적인 신뢰 관계가 없더라도 제 3자가 보증해 주는 신뢰를 통해 안전하게 거래를 할 수 있게 되죠(the trust-based model).
전자거래에 참여하는 사람들은 ‘내가 누구랑 거래할지는 모르지만 장부는 믿을 수 있다’라는 사실에 동의한다는 겁니다.
이러한 신뢰의 밑바탕엔 거래를 강제할 수 있는 수단이 있습니다.
국가한텐 법이 있듯 결국 이 ‘수단’에 대한 믿음 때문에 모르는 사람과 거래할 수 있게 되는 거죠.
이처럼 신뢰와 제 3자의 권력은 동전의 양면과 같은 존재입니다.
이 ‘수단’은 권력이면서 의무이기도 합니다.
제 3자는 이를 이용해서 거래 당사자 간 분쟁이 발생했을 시 중재하는 역할을 수행해야 하며,
그 과정에서 거래 비용(transaction costs)을 발생시킵니다.
또한, 거래를 중재하기 위해 이미 발생한 거래를 되돌릴 수 있다는 점에서 거래는 가역적(reversible)이게 됩니다.
카드사의 예를 들자면, 문제 발생 방지를 위해 구매자의 지급 능력을 평가하는 것부터,
카드 분실 시 지급을 정지하고 카드를 재발급 하는 것, 분쟁이 발생했을 경우 조정 결과에 따라 지불을 유보하거나
진행 시키는 것 등 카드시스템 구축을 위해 다양한 비용이 발생하게 됩니다.
이처럼 실제 중재를 하기 위해 비용이 발생하기도 하지만, 실제 문제가 발생하지 않았는데도 비용이 발생합니다.
그리고 이렇게 발생한 금전적·사회적 비용은 결국 거래 당사자들에게 전가되고요.
이러한 거래 비용의 증가는 거래 비용 미만의 작은 거래(small casual transcations)를 어렵게 합니다.
아프리카 같은 개발도상국가를 예로 들 수 있습니다.
카드사나 은행 입장에서 보면, 거래 당사자들의 거래에서 얻어지는 수수료보다 금융 시스템을 구축을 위해
들어가는 비용이 더 클 것이기 때문에 적자가 예상되어 금융 시스템 구축을 할 경제적 동기가 생기지 않습니다.
또한, 가역적인 결제 시스템은 비가역적인 용역(non-reversible services)에 본질적으로 맞지 않는 시스템입니다.
넷플릭스를 예로 들 수 있을 텐데요. 악의를 가진 고객이 서비스를 이용한 후 교묘하게 환불을 받더라도,
넷플릭스에서 이미 제공한 서비스는 되돌릴 수가 없습니다.
이를 방지하기 위해 고객의 정보를 필요 이상으로 수집해야 하고, 대응할 절차와 인력도 필요합니다.
그렇게 하더라도 발생하는 손실 분(이미 사용해서 되돌릴 수 없는 서비스)은 금전적·사회적 비용을 초래하게 됩니다.
백서의 요약
한 마디로 요약하자면, 현재 전자 결제 시스템엔 제 3자의 개입이 필수적이고,
이러한 개입 때문에 금전적·사회적 비용이 발생한다는 겁니다.
또한, 거래 금액이 커지는 만큼 제 3자가 책임지고 관리할 범위가 늘어나면서, 그만큼 권력도 중앙화됩니다.
도시가 커지는 만큼 관공서 크기도 커지는 것과 같다고 생각하시면 될 것 같습니다.
여기서 모든 문제의 원인이 되는 ‘신뢰 기반’이라는 연결 고리를 끊어,
비용과 중앙화의 문제를 해결하고자 하는 것이 비트코인의 목표입니다.
비트코인은 앞서 설명한 ‘신뢰’를 거래 참여자들에 의한 암호학적 증명(cryptographic proof)으로 전환한 거래 체계를 말합니다.
거래 참여자들 모두가 스스로 장부를 작성했는데 그 장부가 무결하다면, 신뢰도 필요 없을 것이고,
이러한 신뢰를 담보했던 제 3자의 권력과 의무도 사라질 겁니다.
그리고 당연히 이를 대가로 치렀던 비용도 사라지겠죠.
거래 참여자들이 만드는 장부는 어떻게 믿을 수 있을까요? 먼저, 거래 참여자들의 악의를 제거할 수 있는 방법이 있어야 하고,
그들의 기록 과정이 무결해야 하며, 기록된 장부의 수정이 불가능해야 합니다.
이 세 가지 조건을 달성하기 위해 ‘암호학적 증명’이라는 도구를 사용하는 것이지요.
거래를 시간 순서대로 배열하고, 거래 참여자들이 이를 정직하게 기록하여
보상받고, 암호학적인 방식을 활용해 비가역적인 형태로 구성할 수 있는
공유 장부 시스템(peer-to-peer distributed timestamp server)이 바로 신뢰를 대체할 암호학적 증명, 다시 말해 비트코인입니다.
2. 트랜잭션
전자 화폐란 전자 서명 체인(a chain of digital signatures)입니다.전자 화폐는 전자 서명으로 지불을 할 수 있으며,
이러한 전자 서명이 연결된 구조라는 겁니다. 그렇다면 전자 서명으로 어떻게 지불을 한다는 걸까요?
연결된 구조라는 건 무슨 의미일까요?
물리적인 세계에선 지갑에 보유하고 있는 화폐를 내가 상대방에게 건넴으로써 지불 행위가 이뤄집니다.
전자 화폐는 물리적인 존재가 없으므로, 지불을 위해선 두 가지가 충족되어야 합니다.
이해를 위해 물리적인 화폐 지불 상황과 대칭 시켜 보겠습니다.
-
내가 상대방에게 건넴: 거래가 나에 의해 만들어졌다는 인증이 필요
-
지갑에 보유: 전자 화폐를 내가 보유하고 있었다는 소유권이 있음
비대칭 암호 방식의 원리
인증의 경우, 비대칭 암호 방식을 활용한 전자 서명을 통해 가능합니다.
비대칭 암호 방식의 원리에 대해 간단하게 설명드리자면:
-
비공개키-공개키가 쌍으로 존재한다(a-a’).
-
비공개키(a), 공개키(a’)로 각각 문서를 암호화할 수 있다.
-
비공개키(a)로 암호화된 문서는 공개키(a’)로, 공개키(a’)로 암호화된 문서는 비공개키(a)로 복호화 할 수 있다.
-
비공개키(a)는 소유자 본인만 알고 있으며, 공개키(a’)는 모든 사람이 알 수 있도록 공유된다.
자 이런 비대칭 암호 방식을 이해한 채로 A가 B에게 송금을 하는 상황을 가정해 보겠습니다:
-
A는 거래 내역(‘A가 B에게 n을 보냄’)을 본인의 비공개키(a)로 암호화한다.
-
B는 거래 내역을 받아 A의 공개키(a’)로 복호화 한다.
2에서 거래 내역이 A의 공개키로 복호화가 된다면, 해당 거래 내역은 A에 의해서 만들어진 것임을 알 수 있습니다.
A의 공개키가 아닌 다른 공개키로는 해당 거래 내역 복호화가 불가능하기 때문이죠.
그렇다면 애당초 A의 소유권은 어떻게 증명할까요? A가 타인으로부터 받았던 거래 내역이 곧 소유권이 됩니다.
수많은 거래가 기록된 가상의 장부엔 ‘X가 A에게 n만큼을 보냄’이라는 기록이 있을 것이고,
이후 A가 n을 소비하지 않았다면 A는 장부에 기록된 거래 중 n만큼의 소유권을 주장할 수 있는 겁니다.
그런데 앞에서 거래 내역은 어떻게 생성된다고 했죠? 바로 전자 서명을 통해 생성됩니다.
A는 B에게 n만큼을 보낸 후 전자 서명을 하고, B는 C에게 m만큼을 보낸 후 전자 서명을 하고, 이러한 거래 내역들이 연결된 구조가 바로 전자 서명 체인(a chain of digital signatures)이라는 겁니다.
재밌는 건, 여기서 전자 화폐 자체는 실제 화폐처럼 움직이지 않았다는 겁니다.
장부 상에 소유권만 움직인 것이죠.
한 마디로, 전자 화폐에서 지불이란 ‘장부 상에서 내가 소유권을 가진 부분을 타인에게 넘기는 과정’입니다.
이중지불에 대해서
그런데 이러한 전자 화폐 시스템에서 A가 n만큼의 전자 화폐에 대해 ‘A가 B에게’, ‘A가 C에게’, ‘A가 D에게’ 등 여러 사람에게 지불을 한다면 어떻게 될까요?
해당 메세지를 받은 B, C, D 모두 자기가 돈을 받았다고 할 건데 누구의 손을 들어줘야 할까요?
이처럼 송신자가 악의를 갖고 여러 사람에게 지불하는 것을 이중지불(double-spend)이라 합니다.
이와 같은 이중지불 문제를 해결하기 중앙화된 주체가 거래를 검증하는 과정을 추가할 순 있습니다.
좀 더 자세히 단계 별로 설명하자면:
-
A가 거래 내역에 전자 서명한 후 중앙 기관에 거래 내역을 송신
-
중앙 기관은 A의 공개키로 소유권을 확인
-
새롭게 생성된 거래 내역과 장부에 기록된 거래 내역 전체를 대조하여 이중 지불이 발생하지 않았는지 확인
-
B에게 송금
이중지불을 막는 가장 확실한 방법은, 가장 빠르게 들어온 거래(the earliest transaction)만 인정하고 나머지는 무시하는 것입니다.
‘A가 B에게’, ‘A가 C에게’, ‘A가 D에게’라는 거래가 들어온다면, 시간 상 가장 앞선 하나의 거래를 인정한다는 것이죠.
이를 위해선 모든 거래가 기록에 남아야 합니다.
그런데, 이 과정을 중앙화된 주체에 맡기면 결국 기존 시스템과 다를 게 없습니다.
거래를 기록하고, 검증하는 과정을 탈중앙화 하려면, 몇 가지 해결 과제가 있습니다.
먼저, 모든 거래 내역이 공개적으로 알려져야 하고(publicly announced),
해당 시스템의 참여자들 다수가 무결한 하나의 기록에 동의(agree on a single history) 해야 합니다.
기존 시스템은 거래 내역이 비공개되어 있으며, 중앙화된 기관에 의해서만 기록되었죠?
여기서부터 탈중앙화가 시작되는 겁니다.
3. 타임스탬프 서버
앞서 탈중앙화 된 장부를 만들기 위해선 모든 거래 내역이 공개적으로 알려져야 하고(publicly announced),
해당 시스템의 참여자들 다수가 무결한 하나의 기록에 동의(agree on a single history) 해야 한다고 설명드린 바 있습니다.
이를 달성하기 위한 솔루션으로 먼저 Timestamp Server가 나옵니다.
Timestamp Server 설명에 앞서 해싱에 대한 이해가 필요할 것 같습니다.
해싱은 암호화 방식이자 데이터 처리 방식이기도 합니다. 일단 용어 정리부터 하자면:
-
해싱: 데이터를 암호화 처리하여 해시(값)를 추출하는 과정
-
해시(값): 데이터가 암호화 처리되어 나온 결과
-
해싱함수: 해싱을 하기 위해 사용한 함수
그리고 해시에는 몇 가지 특징이 있습니다:
-
어떤 데이터든 특정 길이의 문자열로 치환됨
-
데이터가 변하면 해시값은 무작위로 변한다(눈사태 효과)
-
해시로부터 원본 데이터를 복원하는 것은 불가능하다(비가역성)
1번의 특징 때문에 해시는 데이터 처리 방식으로 용이하며, 2번, 3번 특징 때문에 데이터를 보호할 수 있는 암호화 처리 방식이 될 수 있습니다.
암호화 처리 방식
여기까지 이해가 되셨나요? 이제 앞선 챕터에서 나왔던 그림을 완전히 이해할 수 있게 되었습니다.
전자 화폐에서 지불을 한다는 건,
이전 거래의 해시(Hash)와 수신인의 주소(Public Key)를 해싱하여 비공개키로 서명하는 행위인 겁니다!
그렇다면, 이러한 데이터에 시간(Timestamp)을 포함 시키면 어떻게 될까요?
데이터와 시간이 해싱 되어 나온 해시가 다음 데이터에 포함되는 방식이 앞으로 계속 반복될 겁니다.
앞서 데이터가 변하면 해시값이 무작위로 변한다고 설명드렸었는데요.
만약 누군가가 장부에 기록된 특정 데이터의 Timestamp를 바꾼다면 이후 생성된 모든 해시값이 다 변할 겁니다.
추후에 설명드릴 테지만, 이렇게 변조된 내역은 장부에서 탈락됩니다.
Timestamp Server는 거래 내역들의 묶음(Block)을 Timestamp와 함께 해싱하여 기록한 공간입니다.
그리고 이 공간은 신문처럼 누구나 열람할 수 있습니다.
누군가 신문에 어떤 내용을 싣는다는 가정을 해보겠습니다.
신문에 정보를 올리는 사람은 시간과 비용을 들이면서 정보를 올렸을 것이고,
그 사실을 아는 독자들은 해당 정보가 충분히 믿을만한 것으로 간주할 겁니다.
해당 정보를 접한 구독자들(구성원)끼리는 그 정보를 이제 서로 아는 정보로 생각하고 얘기할 겁니다.
‘XXX가 파산했다더라’, ‘부동산 담보 대출이 힘들어진 대더라’라는 식으로 말이죠.
이처럼 공개적인 공간에 기록되는 정보는 누구나 열람할 수 있기 때문에 조작이 어렵고,
공표되는 순간 구성원 전체가 본다는 전제가 있기 때문에 사후에 수정하기가 매우 어렵습니다.
해싱 기술을 활용한 정보를 공개된 공간에 기록하여 비가역적이고 탈중앙화 된 장부를 만들었습니다.
하지만 누군가 처음부터 악의를 갖고 잘못된 정보를 올린다면요?
공개된 공간이라고 한들, 잘못된 정보가 올라가는 순간 해당 장부는 아무도 택하지 않을 겁니다.
4. 작업증명(Proof-of-Work)
장부를 탈중앙화 하기 위한 두 가지 조건이 있습니다.
첫 번째는 장부가 신문처럼 공개되어야 한다는 것, 두 번째는 그 기록 과정이 무결해야 한다는 것입니다.
앞서 우리는 장부를 어떻게 공개하는지, 어떤 이점이 있는지 살펴봤습니다.
그렇다면 장부의 무결성은 어떻게 달성할 수 있을까요?
장부가 무결하다는 것은 두 가지를 의미로 쪼개 볼 수 있습니다.
첫 번째는 기록하는 사람의 악의가 없다는 것, 두 번째는 그러한 기록에 참여자 다수가 동의해야 한다는 것입니다.
논스(Nonce)의 역할부터 얘기를 시작해 볼까 합니다.
글을 다 읽고 논스가 왜 필요한 지 이해가 되신다면, PoW에 대해 충분히 이해했다고 볼 수 있을 것 같습니다.
앞서 Timestamp Server(이하 ‘블록체인’)는 Timestamp가 포함된 거래 내역들(이하 ‘블록’)을 해싱 한 후 엮은 구조란 것을 설명드렸습니다.
그런데 이 블록에 왜 논스를 집어넣을까요? 거래 기록만 넣어도 아까운 용량일 텐데 말이죠.
블록에는 논스가 포함되어 있습니다.
자, 우리는 앞서 해싱에 대해 간단히 살펴봤습니다.
원본 데이터가 변하면 해싱 후의 해싱값도 무작위로 변한다는 것도 알고 있죠(산사태 효과).
그렇다면, 블록(데이터)에 포함되어 있는 논스가 변하면요?
해당 블록을 해싱한 해싱값도 무작위로 변할 겁니다.
이 블록에 포함되어 있는 논스를 하나씩 바꿔가면서(incrementing a nonce in the block) 특정 해시값을 추출하는 게 바로 Proof-of-Work(이하 ‘PoW’)입니다
구체적으로 노드(node)는 논스를 하나씩 올리면서(1, 2, 3, 4…)
특정 해시(예: 앞자리 수 10개가 0으로 시작하는 해시)를 만들어야 합니다.
해시를 찾아내는 데에 성공하면, 블록체인으로 올라가고,
해당 블록의 해시값은 다시 다음 블록의 일부가 되고, 위의 과정이 반복됩니다.
개별 노드의 입장에서 보자면, 이렇게 논스를 계속 바꿔가면서 만들어진 블록을 바꾸는 것은 거의 불가능합니다.
먼저, 해당 블록만 바꾸려고 해도, 사용된 CPU 파워(CPU effort) 만큼의 비용과 시간을 다시 투여해야 합니다.
그런데 그 작업을 하는 사이에 해당 블록이 다음 블록과 이어져 체인을 형성하면,
블록은 이전 블록의 해시를 포함하기 때문에, 해당 블록 이후의 모든 블록들(all the blocks after it)을 다 바꿔야 합니다.
이번엔 다수의 노드들을 상정해 봅시다.
노드들이 PoW에 열심히 참여해서 체인이 만들어지고 있습니다.
그런데, 모종의 이유로 블록의 기록이 나눠질 수가 있습니다(동시에 논스를 찾았을 때).
이렇게 분기가 생기게 되면, 노드들은 어떤 쪽으로 이어나갈지 투표를 해야 할 텐데요.
만약 투표의 기준이 IP 당 한 개(one-IP-address-one-vote)라면, 너무나 조작이 쉬울 겁니다.
하지만 PoW에선 컴퓨팅 파워에 비례하여 투표권(one-CPU-one-vote)을 행사할 수 있습니다.
컴퓨팅 파워가 많을수록 더 빨리 블록을 만들 수 있기 때문이죠.
이를 통해, 많은 컴퓨팅 파워를 가진 쪽이 체인을 계속 이어나가게 되고,
선택되지 않은 체인(컴퓨팅 파워가 부족한 체인)은 더 이상 블록이 이어지지 않아 자동으로 폐기가 됩니다.
이를 통해 가장 긴 체인엔 가장 많은 컴퓨팅 파워가 투입되었음을 유추할 수 있습니다.
다시 말해, ‘가장 긴 체인=다수에 의해 선택된 장부’라는 것이죠.
그리고 정직한 기록을 하려는 노드들(honest nodes)이 이러한 컴퓨팅 파워의 대다수를 차지한다면,
정직한 체인(the honest chain)이 가장 빠르게 성장하고 유일하게 살아남을 겁니다.
여기까지 이해한 내용들을 정리해 보겠습니다:
요약
-
PoW 시스템에선 블록 생성을 위해 컴퓨팅 파워를 소모한다.
-
블록이 동시에 생성되어 체인이 갈라질 경우, 결국 더 빨리 블록이 이어지는 체인 하나만 살아남는다.
-
가장 긴 체인은 가장 많은 컴퓨팅 파워가 소모되었음을 의미한다.
-
해당 체인의 기록을 바꾸는 것은 사실상 불가능하다.
여기서 ‘컴퓨팅 파워’만 ‘투표권’으로 바꾸면, ‘가장 긴 체인=가장 많은 투표를 받은 유일한 장부’라는 것을 알 수 있습니다.
서두에 말씀드렸던 ‘다수에 의한 단일한 장부’는 이처럼 PoW라는 기록 방식을 통해 구현이 가능합니다.
PoW의 기능은 여기서 그치지 않습니다.
비트코인은 블록 생성 시간을 상수로 두고, 컴퓨팅 파워의 변화에 따라 난이도를 조절 시킵니다.
컴퓨팅 파워는 세월이 지나면 점점 증가할 것이기 때문에, 자연스럽게 난이도도 증가하게 됩니다.
이를 통해 목표한 비트코인 발행량을 유지할 수 있게 되죠.
다른 문제들과 마찬가지로, PoW도 역시 특정 해시를 찾는 난이도(문제)와 논스(답)가 핵심입니다.
이제 논스가 왜 필요한지 이해가 되셨나요?
그런데 아직 해결하지 못 한 과제가 있습니다.
정직한 노드들이 컴퓨팅 파워의 대부분을 차지하게 하려면 어떻게 해야 할까요?
다시 말해서, 노드들의 악의를 어떻게 제거할 수 있을까요?
(하)편에서 이어 설명드리겠습니다.