비트코인 백서: Peer-to-peer 전자 화폐 시스템의 시작
2008년 사토시 나카모토는 혜성처럼 비트코인 백서를 가지고 나타났다. 이러한 비트코인 백서는 현재 4차 산업혁명의 핵심기술인 ‘블록체인’과 뜨거운 감자인 암호화폐인 비트코인의 구조의 핵심을 설명하는데 있어 시작점이며 가장 기초가 되는 문서라고 할 수 있다.
따라서 블록체인, 비트코인을 제대로 이해하기 위해서는 가장 근본적이고 기본적인 개념을 담은 백서부터 정독하며 그 의미를 파악하는 것부터 시작해보고자 한다.
물론 한글본도 있지만, 잘 읽히지 않는 딱딱한 문장과 이해하기 어려운 개념들이 많이 나오기 때문에 처음부터 완벽히 이해하기는 어려울 수는 있지만 차근차근 좀 더 쉽게 풀어 정리해보았다.
1. 기술의 탄생
기존의 인터넷 기반 상거래는 신뢰할 만한 제 3자 역할이 필요했고, 그 역할은 금융기관이 맡아왔다.
하지만, 이러한 신뢰기반모델의 약점은 분쟁 중재(사기, 불법 투자 등)를 피할 수 없었기 때문에 완전한 비가역 거래 가 불가하다는 점이다.
또한, 중재비용에 따른 거래비용 증가, 소액의 일상적 거래 가능성 가로 막음 등의 더 큰 비용의 지출이 불가피했다.
비가역(되돌릴 수 없는) 거래: 한번 이루어지면 절대 되돌릴 수 없는 완벽한 시스템이라는 뜻
즉,
1) 가역성으로 인한 신뢰결핍
2) 분쟁 중재 비용(ex. 사기의 일정 비율 비용, 결제 불확실성 등)
으로 인해 통신 채널로 신뢰받는 제 3자 없이 결제 수행 방법 백서가 나오기 전까지는 존재하지 않았다.
따라서, 신뢰대신 암호학적 증명에 기반한 제 3자 없는 두 당사자가 직접 거래하게 해주는 전자 화폐 시스템 필요하다고 생각한 나카모토는 분산 타인스탬프 서버를 사용한 이중지불 문제 솔루션을 제안하고 있는데, 이 솔루션이 비트코인과 블록체인의 기술이다.
2. 트렌젝션(거래)
전자코인 = 디지털 서명들의 체인
해당 개념을 이해하기 위해서는 디지털 서명이 무엇이고, 공유키-비공유키가 무엇인지 알아야 한다.
디지털 서명
디지털 데이터를 이용해 송금자(돈을 보내는 사람)의 신원을 증명하는 방법
공유키-비공유키(=키 페어)
암호화하고 싶은 평문을 공개키(비대칭키)로 암호화하면 암호문을 만드는데, 복호화화기 위해서는 반드시 비공개키로만 할 수 있다.
(반대로 비공개키로 암호화 시, 공개키로만 복호화 가능)
여기서 주목해야 할 것은,
왜 디지털 서명, 키페어를 알아야 하는데?
화폐를 송금할 때에는 누가 누구에게 얼마를 보냈다는 거래 내역만 공개가 되는데,
만약 누가 A에 해당하는 송금자가 아닌 B라는 다른 사람이 A가 자신(B)에게 100만원을 보냈다는 암호문을 만들고 싶다고 한다면? 너도 나도 다 거짓으로 기록하려고 할 것이다.
따라서, 해당 거래는 내가 직접! 적었다라고 하는 것이 증명되야 하는데, 비공개키로 먼저 서명을 해놓은 당사자가 공유키로 복구화 했을 때 제대로 된 평문을 볼 수 있으면 거래가 맞다고 증명이 되는 것이므로 공유키-비공유키라는 키페어 개념이 필수적이다.
하지만, 문제점이 있는데 이중지불이 되지 않다는 것은 어떻게 증명할 것인가?
(일반적으로 제 3자기반의 신뢰기반모델에서는 중앙통제기관, 조폐국이 이를 담당해왔었다.)
가장 빠르게 도착한 거래만 인정하겠다 > 이를 알기 위해서는 모든 거래 내역을 알아야 할 수 밖에 없다
즉,
1) 모든 거래가 다 기록되어 공개되어야 하고,
2) 그중 어떤 거래가 가장 먼저인지 결정할 수 있는 시스템이 필요하다
* 해당 시스템이 ‘타임스탬프서버‘이다.
3. 타임스탬프 서버
모든 거래에 타임 스탬프를 찍어 순서를 비교할 수 있다. (물리적인 시간 개념이 아니라, 어떤 게 먼저인지가 중요)
각 타임스태프는 이전의 타임스탬프를 해시에 포함시켜서 이전의 타임스탬프에 대한 정보를 담아 하나씩 연장하며 체인을 형성하게 된다.
여기서 중요한 개념인 해시를 알아보자.
해시: 암호학에 쓰이는 함수 > 고정된 길이의 암호화된 문자열로 바꿔 해시값을 갖는다.
아무리 분석해도 새로운 해시값 왔을 때는 패턴이 완전 달라지기 때문에 하늘의 별따기보다도 랜덤으로 알아내지 못할 확률을 가졌다고 한다..
좀 더 아래에서 해시에 대해 자세히 설명해보겠다.
4. 작업증명(PoW, Proof-of-Work)
작업증명은 이런 Peer-to-peer 기반의 1) 분산 타임스탬프 서버 구현을 위해 필요한 작업이다.
이러한 작업증명은 아담백의 해시캐시에서 아이디어를 차용했다고 볼 수 있다.
해시캐시: 아담백이 스팸메일과 서비스 거부(DoS) 공격을 제한하기 위해 사용한 작업증명 시스템
* 해시캐시? 암호화 해시 기능인 SHA-1을 사용하여 전자 메일이 스팸이 아님을 받는 사람에게 확인하는 데 도움이 되는 스탬프
* 즉, 메일발송자가 작업증명을 수행해야만 해시캐시 스탬프를 받을 수 있도록 하여 스탬프가 찍히지 않은 메일은 보낼 수 없게 함
* 메일 발송하기 위해서는 무조건 PoW를 위한 연산작업과 시간을 투입해야 했기 때문에 대량의 정크메일을 보내려면 돈, 시간 등 비용이 많이 발생하게 끔 함
해시캐시 – 해시넷 (hash.kr)
그럼 작업증명은 어떤 원리로 이루어지는가?
해시 연산을 거친 결과가 0 비트(zero bits) 여러 개로 시작할, 특정 값을 찾는 작업을 해야 하는데, 블록의 해시에 필요한 0 비트를 주는 값이 발견될 때까지 블록 안에 임시값(nonce)을 증분(incrementing a nonce)하는 것으로 작업증명을 구현한다.
그림에 나오는 앞블록 해시와 임시값 개념에 대해 보충하자면,
앞블록 해시: 작업증명에서 원하는 0 개수 찾는 숫자 찾아 해당 앞블록 해시에 넣음(타임스탬프 개념)
-> 나중에, 다른 노드들이 이 사용자가 제대로 검증했는지 확인할 때 사용
-> 확인 후, 맞으면 전세계로 브로트캐스트 됨
임시값: 계산되는 해시값이 특정숫자보다 작아지게 하는 값
이말은 즉, 블록내 설정된 해시값이 ‘6CAF0..’일 때, 이 값보다 작은 값이 나오게 하기 위해 무작위로 임의값을 바꾸면서 해시값을 구한다는 말이다.
즉, 작업증명은 해시함수를 해독하는 해시값을 찾아 검증하는 것
이러한 작업증명은 2) 다수결의 대표성 문제도 해결할 수 있다.
CPU당 1표(하나의 컴퓨터에 단 하나의 투표권)를 갖게 되며, 다수 CPU 파워가 정직한 노드에 의해 통제된다면, 가장 정직한 사슬이 가장 빠르게 늘어나 다른 경쟁 사슬을 압도(outpace)할 수 있다.
=> 이말은 가장 긴 사슬만 살아남는 다는 말로 공격자를 defense하는데에도 유용하다.
즉, 이전 해시값을 담고 있는 블록으로 체인을 연장시키기 때문에, 중간에 한 블록에 대한 내용을 수정하려고하면, 뒤의 연장되어 있는 해시값 역시 하나씩 일일이 바꿔야 하는데 가장 정직한(긴) 체인이 살아남는 환경에서 거의 성공할 수 없다.
왜 여기서 가장 긴 사슬인게 정직하다고 할까?
그 이유는 이중 지불 문제를 해결하고, 해커가 길면길수록 더 해킹하기 어렵기 때문이다.
5. 네트워크
-
노드는 항상 가장 긴 사슬을 정확한 것으로 간주하고 그걸 잇는 작업을 지속한다.
-
만일 두 노드가 동시에 다음 블록의 서로 다른 버전을 브로드캐스트(암호풀면)하면, 어떤 노드는 그 중 하나 또는 다른 것을 먼저 받을 수 있다.
-
만약 동시에 암호 풀었다면? 이 경우에는 가장 긴 체인이 참인 것으로 인정한다.
-
새로운 거래 브로드캐스트가 반드시 모든 노드에 도달할 필요는 없다.
-
투표권을 가진 컴퓨터가 해당 작업증명이 정당하다고 검증하여 51% 이상 동의하면 블록 생성할 수 있다.
6.인센티브
노드가 네트워크를 계속해서 지원할 수 있도록 인센티브를 더해줘야 한다.
=> 노드들의 CPU 시간, 전기 소비에 대한 대가이며, 노드가 계속 정직하게 행동하길 유도하는 데 도움을 주기 때문이다.
탐욕스러운 공격자가 모든 정직한 노드보다 더 많은 CPU 파워를 모을 수 있다면, 그는 그걸 자신의 결제를 도로 훔쳐 사람들을 속이는 데 쓰는 것(속이는 데 쓰이는 비용), 또는 새로운 화폐를 만들어내는 데 쓰는 것(인센티브를 얻기 위해 쓰이는 비용) 사이에서 선택해야 하는데 당연히 인센티브를 받는 것이 훨씬 이득이 될 수 밖에 없게 한다.
1) 블록생성 인센티브
2) 거래 수수료
두 가지로 인센티브가 구분이 되는데, 계속해서 비트코인을 채굴할 수 없기 때문에 한정된 비트코인을 위해 앞으로는 거의 거래 수수료방식의 인센티브로 주어지게 될 것이다.
7.간소화된 결제 검증
여기선 머클트리 개념만 알고 있으면 된다.
머클트리: 블록에 포함된 거래 내역을 나무 형태로 요약한 것
– 블록 내에서 다수의 원장(ledger)들을 암호화하고 합치는 과정을 반복하여 최종적으로 하나의 유닛(Unit)으로 암호화하는 방법
– 머클트리의 형태는 블록이 보유하고 있는 거래 내역들의 해시값을 가장 가까운 거래내역끼리 쌍을 지어 해시화하고, 쌍을 지을 수 없을 때까지 해당 과정을 반복하여 완성
– 이 과정을 통해 다수의 데이터를 하나로 묶어 용량을 절약할 수 있다.
머클트리 – 해시넷 (hash.kr)
우리는 머클트리 방식으로 블록에 머클 루트만을 기록해 놓는다.
그럼, 라이트 노드는 루트 해시만 가지고 있다가, 사용자가 요청을 해서 검증할 때 풀노드에게 해당 거래를 판별할 수 있을 정도로의 특정 해시, 거래의 정보만을 받아 그 정보로만 검증한다.
결국, 이러한 머클 트리로 인한 거래 내역 저장으로 간소화된 결제 검증을 함으로써 디스크 공간을 절약할 수 있다.
라이트 노드: 루트 해시를 확인할 수 있는 만큼의 거래만 가지고 있는 노드
풀노드: 모든 거래 내역을 가지고 있는 노드
8. 프라이버시
-
공개되는 정보는 누가 누구한테 얼마나 보내는지에 대한 정보뿐이다.
-
공개키의 익명성 보존으로 거래하는 사람에 대한 정보는 볼 수 없다.
-
또한, 현재 금액의 가치의 경로 역시 보여지지 않는다.
<정리: 개인 대 개인 전자 화폐 시스템 모델>
1. 새로운 거래들은 비트코인 네트워크 참여자 즉 모든 노드에게 브로드캐스트(전파) 한다.
2. 각 노드는 새로운 거래들을 하나의 블록에 차곡차곡 모아놓은 후에 일정 수준 모이면 작업증명 시작하게 된다.
3. 각 노드는 자신의 블록을 생성하기 위해 해시값을 구하는 작업증명 작업을 수행한다.
4. 노드들 중 가장 빠르게 답을 찾은 노드가 거래를 봉인한 블록을 모든 노드에게 전파한다.
5. 노드들은 작업증명이 끝난 블록에 포함된 모든 거래가 유효하며 중복된 거래가 없는 경우에만 그 블록을 수용한다.
6. 노드들은 자신이 해당블록을 수용했다는 의사표시로, 자신이 수용한 블록의 해시값을 바로 직전의 해시 값으로 사용하여 체인 내에 다음 블록을 생성하는 작업을 수행한다.
– 노드들의 과반수 이상 51% 가 합의를 하면 해당 블록 생성되어 체인으로 연결한다.
– 중요!) 만약 거의 동시에 두 노드가 답을 찾게 되면, 가장 긴 블록을 가진 것으로 채택한다.