논문링크: https://bitcoin.org/bitcoin.pdf
한글번역판 링크: https://mincheol.im/wp/wp-content/uploads/2017/09/bitcoin_ko_v1.2.pdf
(한글번역판이 있다는걸 내가 직접 리뷰하던 도중 알게 됐지만, 나는 직접번역을 계속하려한다.)
읽기좋게 약간의 의역 및 생략/추가가 포함돼있다.
중간중간 내 생각은 다른 색깔로 표시돼 있다.
아래 논문을 보다보면 자주나오는 용어들이 있는데, 그에 대한 풀이를 먼저 기록해둔다.
용어집
신뢰기반모델: 기존 금융을 비판하기 위해 쓰인 용어 같은데 정확히 모르겠다. 검색도 원활하게는 안되는듯?
신뢰집단: 개인간 대면거래가 아닌, 비대면 통신채널에서 거래를 하는데 있어서, 기존 금융에서는 반드시 필요한 집단.
비가역거래: 거래는 비가역적이어야 하며, 기존 금융에선 이게 안된다고 하고 있다.
이중지불: 간단히 이야기하면 코인 복사를 해서 두번 지불하는걸 의미
지불=결제: payment가 문맥에 따라 지불 또는 결제로 번역되는데 같은 의미로 보면 된다.
hashcash:
- (문과적설명) 만드는데는 짧은 시간이 걸리지만 문제를 푸는데는 긴 시간이 걸린다. 적절한 시간내에 문제를 풀었다면, 이 사용자는 유효한 사용자라는 것을 증명 할 수 있다.
- (이과적설명) hashcash는 특정한 조건을 가지는 해시값을 찾는 것이다. 그 특정한 조건이란 특정한 해시를 계속 수행해서 해시된 결과의 앞자리 비트 몇개가 0인 것. 자세한 알고리즘은 여기가 이해가 편했다.
제목: Bitcoin: A Peer-to-Peer Electonic Cash System
Abstract
bitcoin으로 개인간 돈을 직접 전송한다.
전자서명으로는 위의 이슈를 일부 해결가능하나 이중지불 문제를 피할 수 없다(이 문장이 좀 모호한데 일단 넘어가자 ㅋ)
우리는 peer-to-peer network으로 이중지불 문제를 피할 수 있는 솔루션을 제시한다.
해당 네트워크는 해시베이스의 proof-of-work로 진행되는 체인에 트랜잭션 타임스탬프를 넣으며, 이것은 proof-of-work를 다시하기전까진 변조될 수 없다.
가장 긴 체인은 이벤트 증명으로서의 역할 뿐 아니라, 가장큰 CPU파워풀에서 나왔음을 증명한다.
가장큰 CPU power를 가진쪽이 공격자와 협력하지만 않는다면, 그들은 가장긴 체인을 만들어 공격자를 앞지를 것이다.
네트워크 자체는 minial structure를 요구한다.
메시지는 best effort 기반으로 브로드캐스트 되며, 모든 노드는 네트워크를 참여하거나 떠날수 있다(이건 무슨말?)
가장긴 proof-of-work 체인을 그동안 지나온길로 받아들이며 .
1. 서론
인터넷 전자상거래는 전자지불을 처리하는 서드파티역할을 하는 금융기관에 거의 독점적으로 의존해왔다.
그 시스템은 대부분의 트랜잭션에 대해서 잘 동작하는 한편, 신뢰기반모델의 내재하는 약점에 여전히 고통받고 있다.
완전히 되돌릴수없는 거래는 가능하지 않다, 금융기관은 분쟁조정(mediating dispute)을 피할수 없기 때문이다.
중재비용은 거래비용을 증가시키고,
현실적인 최소 거래규모를 제한하며, 작고 캐주얼한 거래의 가능성을 잘라버린다.
그리고 되돌릴수없는 서비스에 대한 되돌릴수없는 지불이 불가하기에 더 광범위한 비용이 존재한다.
되돌릴수 없는 거래가 가능하지 않기 때문에, 신뢰에 대한 필요가 확산된다.
상거래자들은 고객에 대해 걱정해야하며, 필요이상의 더 많은 정보들로 인해 귀찮게 된다.
특정확률로 사기는 피할수 없다고 받아들여진다.
이러한 비용과 지불의 불확실성은 대면거래에서는 물리적화폐를 통해 피할수 있지만,
통신채널을 통해서는 신뢰집단없이는 기술적으로 불가하다.
필요한것은 암호신뢰증명에 기반한 전자적지불시스템이며, 이를 통해 두 집단간 거래는 제3의 신뢰집단없이 가능하다.
되돌리기가 계산적으로 불가능한 거래는 판매자를 사기로 부터 보호하며, 제3자예치(이게 머지?)방식은 구매자를 보호한다.
이 논문에서, 우리는 거래 시간순의 전산적 증명을 생성하는 peer-to-peer 분산 타임스탬프 서버를 사용한 이중지불문제의 솔루션을 제시한다.(뭔솔?)
이 시스템은 정직한 노드들의 합이 공격자 노드들 보다 많은 CPU파워를 컨트롤 한다면 안전하다.
2. 거래
우리는 전자적 코인을 전자서명의 체인으로 정의한다.
각 소유자는 전 거래의 hash 및 다음 소유자의 공개키에 전자서명함으로서 코인을 송금한다. 그리고 이걸 코인의 끝에 추가한다.
돈은 받는 사람은 이 서명들을 검증해서 소유권 체인을 검증할 수 있다.
(위 그림을 보면 이전 소유자와 다음소유자의 전자서명과 검증과정이 들어가는걸 볼 수 있고, 위의 구조가 minimal인지는 잘 모르겠네.
그냥 봐서는 좀 복잡해 보이는 느낌인데.전 거래의 해시가 들어가는건 당연할건데, 이걸 왜 이전 소유자의 전자서명을 해두는걸까?
아마도 소유권 증명같은걸 위해서겠지?좀더 파보자.)
문제는 수신자가 이중지불이 되지 않았는지 검증이 힘들다는 것이다.
일반적인 해결책은 믿을만한 중앙통제기관이나 조폐국을 두고 모든 거래에 대해 이중지불을 체크하는 것이다.
거래마다, 코인은 조폐국으로 반납돼서 새 코인이 발급되고, 이것만 이중지불 되지 않았음을 보장한다.
(위에서 소유권 체인을 만들었음에도 이중지불 문제가 남아있는 이유는 뭘까? 뒤에 나오지만 소유자가 반복해서 거래 노드를 만들수 있다면 가능할 것이다.)
이 방법의 문제점은 전체 화폐시스템이 조폐국을 운영하는 특정회사에 의존한다는 점이다. 모든 트랙잭션에 대해. 마치 은행처럼.
수신자입장에서 이전 소유자들이 앞 전 거래들에 어러번 싸인을 하지 않았음을 알아야만 한다.
유일한 방법은 기존 모든 거래를 인식하고, 이어서 수신된 최초로 싸인된 거래를 차례대로 승인하는 방법이다.
조폐국 없이 이를 수행하려면 거래는 공개적으로 알려져야 하고, 모든 참가자들이 단일한 이력에 대해 합의 하는 시스템이 필요하다.
수금자는 각 거래의 시점에 그게 최초로 받은 거래임을 노드 다수가 동의했다는 증명을 요한다.
3. 타임스탬프 서버
우리는 이 문제 해결을 위해 타임스탬프 서버를 제안한다.(왜 갑자기 타임스탬프 이야기가 나오지?)
이 서버는 아이템 블록을 타임스탬프와 함께 해시하고 신문이나 유즈넷게시물처럼 널리 배포하는 식으로 동작한다.
타임스탬프는 해당 아이템이 특정 시간에 존재했음을 증명한다. 각 타임스탬프는 이전 타임스탬프를 해시에 포함한다. 이로서 하나씩 연장하는 체인을 형성한다.
(이 3번단락은 내용도 짧고 내용도 타임스탬프를 넣어서 시간정보를 기록한다는 내용 뿐이라 왜 굳이 단락을 할당했는지 모르겠다. 이중지불 문제가 타임스탬프로 단순하게 풀린다는 것처럼 써있는데, 그 논리도 잘 이해가 안된다. 뒤에 다시 타임스탬프 언급이 나오는지 살펴보자.)
4. 작업증명
P2P 베이스로 분산 타임스탬프 서버를 구현하기 위해, 뉴스나 유즈넷보다는 아담백의 hashcash같은 작업증명시스템이 필요하다.
(여기서 hashcash이야기가 나오는데, 먼저 공부하고 와도 좋을 것 같다.)
작업증명은 SHA256등으로 해시된 결과가 몇 개의 제로비트로 시작되는걸 스캔하는 작업을 포함한다.
제로비트 개수에 따라 필요한 작업은 지수적으로 증가하는 반면, 검증은 hash한번으로 쉽게 된다.
우리의 타임스탬프 네트웍을 위해서, 우리는 nonce를 증가시키면서 주어진 블럭의 해시결과가 필요한 제로비트 개수를 포함하도록 작업증명시스템을 구현했다.
한번 CPU써서 작업증명을 만족시키면 이 작업을 다시하지 않는한 블럭은 바뀌지 않는다.
블럭뒤에 다른 블럭이 붙기 때문에, 바꾸려고 하면 이 모두를 다시 작업 수행해야한다.
작업 증명은 또한 다수결 의사 결정에서 대표성을 결정하는 문제(릉?)를 해결한다.
다수결을 IP주소당 한개의 투표권을 기반으로 한다면, 많은 IP를 할당할 수 있는 사람이 이겨버리는 문제가 생긴다.
작업증명은 기본적으로 CPU당 한표이다. 다수결은 가장 긴 사슬로 표현되며, 가장 큰 작업 증명 노력이 투자된 것이다.
CPU대부분이 정직하게 제어되는 경우, 정직한 체인이 가장 빠르게 성장하고 체인 경쟁에서 다른 체인을 능가한다.
과거 블록을 변조하기 위해서는 공격자가 해당블록과 그 이후의 모든 블록의 작업 증명을 다시 실행한 다음 정직한 노드의 작업을 따라잡고 능가해야 한다.
후속 블록이 추가됨에 따라 더 느린 공격자가 따라잡을 확률이 기하급수적으로 감소한다는 것을 나중에 보여줄 것이다.
시간이 지남에 따라 증가하는 하드웨어 속도와 노드 실행에 대한 다양한 관심을 보상하기 위해 작업 증명 난이도는 시간당 평균 블록 수를 목표로 하는 이동 평균으로 결정되고, 너무 빨리 생성되면 난이도가 높아진다.
5. 네트워크
네트워크를 실행하는 단계는 다음과 같다.
1) 새로운 트랜잭션은 모든 노드에 브로드캐스트된다.(블럭은 뭐고 노드는 뭐지, 노드는 네트워크 참여자를 의미하는걸까..그런듯)
2) 각 노드는 새로운 트랜잭션을 블록으로 수집한다.(이 노드들은 어떻게 서로가 서로를 알고 소통할까)
3) 각 노드는 해당 블록에 대한 (까다로운) 작업 증명을 수행하려고 노력한다.
4) 노드가 작업 증명을 찾으면 블록을 모든 노드에 브로드캐스트한다.
5) 노드는 모든 트랜잭션이 유효하고 아직 사용되지 않은 경우에만 블록을 수락한다.
6) 노드는 승인된 블록의 해시를 이전 해시로 사용하여 체인에서 다음 블록을 생성하는 작업을 통해 블록 승인을 표현한다.
노드는 항상 가장 긴 체인을 올바른 체인으로 간주하고 계속해서 확장 작업을 수행한다. 두 노드가 다음 블록의 다른 버전을 동시에 브로드캐스트하는 경우 일부 노드는 하나 또는 다른 하나를 먼저 수신할 수 있다. 그런 경우, 그들은 받은 첫 번째 블록으로 작업하지만 더 길어질 경우를 대비하여 다른 분기를 저장합니다. 다음 작업 증명이 발견되고 한 가지가 더 길어지면 타이가 해결됨. 그러면 다른 분기에서 작업하던 노드는 더 긴 것으로 전환한다. 새로운 트랜잭션 브로드캐스트가 반드시 모든 노드에 도달할 필요는 없다. 그들이 많은 노드에 도달하는 한, 그들은 머지 않아 블록에 들어갈 것입니다(이건 왜글지?). 블록 브로드캐스트는 삭제된 메시지도 처리된다. 노드가 블록을 수신하지 않으면 다음 블록을 수신하고 누락된 블록을 깨달았을 때 요청한다.
6. 인센티브
일반적으로 블록의 첫 번째 트랜잭션은 블록 작성자가 소유한 새 코인을 시작하는 특별한 트랜잭션인다(블럭마다 그 블럭을 생성한 생성자가 새코인을 발행하고 그걸 가진다는 이야기) 이것은 노드가 네트워크를 지원하도록 인센티브를 추가하고, 발행할 중앙 기관이 없기 때문에 초기에 코인을 유통에 배포하는 방법을 제공한다. 일정한 양의 새로운 코인을 꾸준히 추가하는 것은 금 채굴자가 금유통을 늘리기 위해 자원을 소비하는 것과 유사하다.우리의 경우 소비되는 것은 CPU 시간과 전력이다.
인센티브는 거래 수수료로 조달할 수도 있다. 트랜잭션의 출력 금액이 입력 금액보다 작은 경우 차이는 수수료이다. 미리 정해진 수의 코인이 유통에 들어가면 인센티브는 완전히 거래 수수료로 전환되고 인플레이션이 전혀 없다(많은 사람들의 오해와 다르게 채굴이 종료되어도 네트웍이 유지될 수 있겠네(수수료지급은 계속 되므로))
인센티브는 노드가 정직함을 유지하도록 장려하는 데 도움이 될 수 있다.
탐욕스러운 공격자가 모든 정직한 노드보다 더 많은 CPU 파워를 모을 수 있다면, 그는 이를 사용하여 지불금을 훔쳐 사람들을 기만할 것인지, 아니면 새 코인을 생성하는 데 사용할 것인지 선택해야 한다. 그는 다른 모든 사람을 합친 것보다 더 많은 새 주화로 자신에게 유리한 규칙을 따르는 것이 시스템과 자신의 부의 유효성을 훼손하는 것보다 더 수익성이 있음을 알아야 한다(심지어 51%공격이 가능한 사람이 나오더라도, 그냥 건전하게 채굴이나 계속하는게 신규코인을 계속 받을 수 있으니 유리하다는 논리까지 이미 갖추고 있었네)
7. 디스크 공간 회수
코인의 최신 트랜잭션이 충분한 블록 아래에 묻히면 디스크 공간을 절약하기 위해 이전에 사용한 트랜잭션을 폐기할 수 있습니다. 블록의 해시를 손상시키지 않고 이를 용이하게 하기 위해 트랜잭션은 블록의 해시에 포함된 루트만 포함하여 Merkle Tree[7][2][5]에서 해시됩니다. 그런 다음 오래된 블록은 가지치기를 통해 압축할 수 있습니다. 내부 해시는 저장할 필요가 없습니다.
(음 자세한 로직은 잘 모르겠고 왜 트리구조인지도 잘 모르겠지만, 어쨌든 너무 길어지면 뭔가 압축되는 과정이 원래부터 고려된건 신기하네..근데 블록 안에서만 압축되는건가?)
트랜잭션이 없는 블록 헤더는 약 80바이트입니다.(블록안에 트랜잭션이 많으면?, 년도가 쌓이면?) 10분마다 블록이 생성된다고 가정하면 연간 80바이트 * 6 * 24 * 365 = 4.2MB입니다. 2008년 현재 일반적으로 2GB의 RAM으로 판매되는 컴퓨터 시스템과 현재 연간 1.2GB의 성장을 예측하는 무어의 법칙을 고려할 때 블록 헤더를 메모리에 보관해야 하는 경우에도 스토리지는 문제가 되지 않습니다.
8. 단순화된 지불 검증
(그러니까 위의 압축, 머클트리 이런걸로 단순화 시켰을때 약점이 존재한다는걸 짚은거 같은데, 전반적으로 뭔소린지 모르게 기술돼 있다. 이해하려고 하면 관련 논문이나 추가자료를 봐야할듯?)
전체 네트워크 노드를 동원하지 않고도 결제를 확인할 수 있습니다.
사용자는 그가 최장 작업증명 사슬을 가졌다고 확신할 때까지 네트워크 노드를 조회해, 얻을 수 있는 가장 긴 사슬의 블록 헤더 사본을 유지하면서, 해당 거래 를 타임스탬프가 찍힌 블록에 연결한 머클 분기를 얻기만 하면 된다(대체 뭔솔? 갑자기 왠 사용자?)
그는 트랜잭션을 직접 확인할 수는 없지만 체인의 한 장소에 연결하면 네트워크 노드가 이를 수락하고 네트워크가 수락했음을 추가로 확인한 후에 추가된 블록을 볼 수 있습니다(뭔소리냐고..)
따라서 검증은 정직한 노드가 네트워크를 제어하는 한 신뢰할 수 있지만 네트워크가 공격자에 의해 압도되는 경우 더 취약합니다. (why?)
네트워크 노드가 자체적으로 트랜잭션을 확인할 수 있지만 공격자가 네트워크를 계속 압도할 수 있는 한 공격자의 조작된 트랜잭션에 의해 단순화된 방법을 속일 수 있습니다. (그러니까 뭔소리냐고)
이를 방지하기 위한 한 가지 전략은 네트워크 노드가 유효하지 않은 블록을 감지할 때 경고를 발송하여, 사용자의 소프트웨어가 전체 블록을 다운로드하도록 하고 불일치를 확인하도록 하는 것입니다.
빈번한 지불을 받는 기업은 더 독립적인 보안과 더 빠른 검증을 위해 여전히 자체 노드를 실행하기를 원할 것입니다.(노드는 오픈환경에서 서로 경쟁하는거 아닌가? 자체 노드를 돌린다는게 무슨뜻이지? 단순히 오픈환경에 여러노드를 참여시킨다는 정도의 의미인가? 그렇다면 이게 왜 더 유리하지?)
9. 가치 결합 및 분할
코인을 1개씩 개별적으로 취급하는 것은 가능하지만, 이체 시 1코인마다 별도의 트랜잭션처리를 하는 것은 현명하지 않다. 가치를 분할 및 결합할 수 있도록 트랜잭션에는 입출력이 여러개이다. 일반적으로 이전 트랜잭션의 큰 단일 입력 또는 더 적은 금액을 결합한 여러 입력이 있으며 최대 두 개의 출력이 있습니다.두개의 출력중 하나는 지불을 위한 것이고 다른 하나는 거스름돈이 있는 경우 송금인에게 다시 반환하는 것입니다.
트랜잭션이 여러 트랜잭션에 의존하고 이러한 트랜잭션이 더 많은 트랜잭션에 의존하는 팬아웃은 여기서 문제가 되지 않는다는 점에 유의해야 합니다. 트랜잭션의 완전한 기록사본을 추출할 필요가 없습니다(대충 원래 트렌잭션 추적을 제대로 하려면 트리구조가 나오는데, 그걸 몰라도 된다는 내용인거 같은데, 자세히는 모르겠다)
10. 개인 정보 보호
(걍 실명제가 아니라서 프라이버시가 보장된다는 내용을 길게도 써놨네)
전통적인 뱅킹 모델은 관련 당사자 및 신뢰할 수 있는 제3자에게만 정보에 대한 액세스를 제한함으로써 개인 정보 보호 수준을 달성합니다. 비트코인에서는 모든 거래를 공개적으로 발표해야 하는 필요성 때문에 이 방법은 못쓰지만,
공개키 익명성을 보존 해 다른 장소에서 정보의 흐름을 끊는 걸로 여전히 프라이버시가 보장될 수 있다.
대중은 누군가가 다른 사람에게 금액을 보내고 있음을 알 수 있지만 거래를 누구와 연결하는 정보는 없습니다.
이는 개인 거래의 시간과 규모인 '테이프'를 공개하되 당사자가 누구인지는 밝히지 않은 증권거래소가 공개하는 정보 수준과 비슷하다.
추가적인 방화벽으로서, 각 트랜잭션에 대해 새 키 쌍을 사용하여 공통 소유자와 연결되지 않도록 해야 합니다. 일부 연결은 다중 입력 트랜잭션에서 여전히 피할 수 없으며, 이는 해당 입력이 동일한 소유자의 소유임을 필연적으로 나타냅니다. 위험은 키 소유자가 공개될 경우 연결 시 동일한 소유자에게 속한 다른 트랜잭션이 공개될 수 있다는 것입니다.
(뭐여.. 일부 한계가 있다는 점을 쿨하게 인정하고 넘어감?)
11. 계산
공격자가 정직한 체인보다 빠르게 대체 체인을 생성하려는 시나리오를 고려해보자.
그런일이 발생해도, 허공에서 가치를 창출하거나 공격자의 소유가 아닌 돈을 빼앗는 것과 같은 임의의 변경까지 시스템이 허용하진 않는다(진짜?)
노드는 유효하지 않은 거래를 지불로 수락하지 않으며 정직한 노드는 이를 포함하는 블록을 수락하지 않습니다.(왜?)
공격자는 최근에 지출한 돈을 회수하기 위해 자신의 거래 중 하나만 변경할 수 있습니다.(왜일까.. 최근이 아니면 너무 변경할게 많아서 그런거고 자신의 거래가 아니면 키관련 문제가 있어서 그럴까?) 정직한 체인과 공격자 체인 간의 경쟁은 이항 랜덤 워크(Binomial Random Walk)로 특징지을 수 있습니다.
성공 이벤트는 정직한 체인이 한 블록 확장되어 리드가 +1 증가하는 이벤트이고, 실패 이벤트는 공격자의 체인이 한 블록 확장되어 격차가 -1만큼 감소하는 것입니다.
공격자가 주어진 격차를 따라잡을 확률은 도박꾼의 파멸(Gambler's Ruin) 문제와 유사합니다.
(도박꾼의 파산은 유한한 초기 자산을 가지고 일련의 공평한 도박을 하는 도박꾼은 거의 확실하게 자산이 0이 되어 파산하게 된다는 정리이다. 위키백과)
신용이 무제한인 도박꾼이 적자에서 시작하여 손익분기점에 도달하기 위해 잠재적으로 무한한 시도를 한다고 가정합니다. 다음과 같이 공격자가 손익분기점에 도달하거나 공격자가 정직한 체인을 따라잡을 확률을 계산할 수 있습니다.
이담에 수학적인 식들이 나오는데, 결국 공격이 힘들다는 내용이므로 일단 지금은 생략하자.
12. 결론
우리는 신뢰에 의존하지 않는 전자 거래를 위한 시스템을 제안했습니다.
우리는 소유권에 대한 강력한 제어를 제공하지만 이중 지출을 방지할 방법이 없으면 불완전한 디지털 서명으로 만든 코인의 일반적인 프레임워크로 시작했습니다.이 문제를 해결하기 위해 우리는 작업 증명을 사용하는 P2P 네트워크를 제안하여 정직한 노드가 CPU 성능의 대부분을 제어하는 경우 공격자가 변경할 수 있는 계산적으로 빠르게 비실용적이 되는 트랜잭션의 공개 이력을 기록합니다. 네트워크는 구조화되지 않은 단순성으로 인해 강력합니다. 노드는 약간의 조정으로 한 번에 모두 작동합니다. 메시지가 특정 위치로 라우팅되지 않고 최선을 다해 전달되기만 하면 되므로 식별할 필요가 없습니다. 노드는 네트워크를 떠나고 다시 참여할 수 있으며 작업 증명 체인을 네트워크가 없는 동안 발생한 일의 증거로 받아들입니다. 그들은 CPU 파워로 투표를 하여 유효한 블록을 확장하는 작업을 통해 승인을 표현하고 작업을 거부하여 유효하지 않은 블록을 거부합니다. 이 합의 메커니즘을 통해 필요한 모든 규칙과 인센티브를 시행할 수 있습니다.
'비트코인' 카테고리의 다른 글
이더리움 관련 Q&A(자문자답) (0) | 2022.03.23 |
---|---|
비트코인 관련 Q&A (자문자답) (0) | 2021.12.30 |
블럭체인의 원리 (0) | 2020.07.31 |
md5, sha (0) | 2017.12.12 |
비트코인 분석 연재를 시작하며 (0) | 2017.12.10 |