백서 | 역사( 에피소드, 사망선고) | 사용법 | 평가 | 의견 |
1. 개요2. 본문
2.1. 서론2.2. 거래(Transactions)2.3. 타임스탬프 서버(Timestamp Server)2.4.
작업증명(Proof-of-Work)2.5. 네트워크(Network)2.6. 인센티브(Incentive)2.7. 디스크 공간 회수(Reclaiming Disk Space)2.8. 간소화된 결제 검증(Simplified Payment Verification)2.9. 가치 합치기와 나누기(Combining and Splitting Value)2.10. 프라이버시(Privacy)2.11. 계산들(Calculations)2.12. 결론
1. 개요
이 문서는 2008년 10월에 작성된 비트코인의 백서라고 할 수 있는 논문 'Bitcoin: A Peer-to-Peer Electronic Cash System'을 공식 한국어 번역본을 기반으로 새롭게 번역한 것이다. 일부 번역의 오류가 존재할 수도 있다.원문 공식 한국어 번역본
2. 본문
초록.[1] 순수한
P2P 형태의 전자화폐는 금융기관을 거치지 않고, 어느 한 쪽에서 다른 한 쪽으로 직접 전달되는 온라인 결제(payments)를 가능하게 만든다.
전자서명은 일부 해결책을 제공하지만, 이중지불(double-spending)을 막기 위해 신뢰받는 제 3자가 여전히 필요하다면, 그 주된 장점을 잃는다. 우리는
P2P 네트워크를 사용해 이중지불 문제를 해결하는 방법을 제안한다. 우리가 제안하는 네트워크는 거래를 해싱해 타임스탬프를 찍어서
해시 기반의
작업증명(proof-of-work)을 연결한
체인(chain)으로 만들고,
작업증명을 재수행하지 않고서는 변경할 수 없는 기록을 생성한다. 가장 긴 체인은 이벤트들이 목격된 순서를 증명하며, 가장 큰 CPU 파워를 가진 풀에서 나왔음을 증명한다.
네트워크 공격에 협력하지 않는 노드(채굴자)들이 과반 이상의 CPU 파워를 가진 상황이라면 이
노드들이 가장 긴 체인을 만들어내며, 이는
공격자 보다 앞선다. 이 네트워크 자체는 최소한의 구조만을 필요로 한다. 메시지(거래정보)는 가능한 많은 노드로 퍼져나가며, 각 노드들은 네트워크를 떠났다가 재합류할 수 있고, 자신이 떠난 사이에 벌어진 거래의 증명으로 가장 긴
작업증명 체인을 채택한다.
2.1. 서론
기존의 인터넷 기반 상거래는 전자결제를 처리하기 위해, 우리는 신뢰할 수 있는 제 3자인 외부의 금융기관에 의존해 왔다. 이러한 방식은 대부분의 거래에서 잘 작동하지만, 여전히 신뢰 기반 모델(trust based model)의 태생적 약점을 극복하지는 못했다. 금융기관은 분쟁 중재를 피할 수 없기에, 철회할 수 없는 거래를 하는 것은 불가능하다. 중재 비용은 거래 비용을 높여 실거래의 최소 규모를 제한하고 소액의 일상적 거래 가능성을 가로막으며, 철회할 수 없는 서비스에 맞는 철회할 수 없는 결제 기능의 상실로 더 큰 비용이 발생하게 만든다. 이러한 철회 가능성 때문에 신뢰의 필요성이 확산된다. 판매자는 지나치게 많은 정보를 요구하며 자신을 괴롭히는 고객을 경계해야 한다. 일정한 비율로 발생하는 사기는 불가피한 것으로 여겨진다. 이렇게 발생한 비용과 결제의 불확실성은 대면거래에서는 물리적 통화(currency)를 사용해 피할 수 있지만, 통신채널을 통한 거래에선 신뢰받는 제3자 없이는 피할 방법이 존재하지 않는다.
이런 상황에서 필요한 것은 신뢰가 아닌 암호학적 증명(cryptographic proof)에 기반해, 거래의사가 있는 두 당사자가 신뢰받는 제3자 없이 서로 직접 거래하게 해주는 전자화폐 시스템이다. 철회가 전산적으로 불가능한 거래는 사기로부터 판매자를 보호하며, 일반적인 에스크로[2] 방법은 구매자 보호를 위해 쉽게 시행할 수 있다. 이 논문에서 우리는 거래 시간순의 전산적 증명을 생성하는
P2P간 분산 타임스탬프 서버를 사용해 이중지불 문제를 해결할 수 있는 방법을 제안한다. 이 시스템은
정직한 노드들이 공격자 노드들보다 더 많은 CPU 파워로 통제하는 한 보안상에 있어 안전하다.
2.2. 거래(Transactions)
우리는 전자화폐(electronic coin)를
전자서명의
체인으로 정의한다. 이전 거래내역과 다음 소유자 공개키의 해시값을 전자적으로 서명하고, 이 정보를 화폐의 끝에 첨가함으로써 각 소유자는 화폐를 송금할 수 있다. 수취인은 소유권의 체인을 확인함으로써 서명을 검증할 수 있다.
이때 수취인이 소유자 중 누군가가 화폐를 이중지불[3]하지 않았다는 것을 검증할 방법이 없다는 문제가 발생한다. 통상적인 해법은 신뢰받는 중앙통제기관(trusted central authority)이나 조폐국(mint)을 세우고 모든 거래마다 이중지불 여부를 점검하는 것이다. 각각의 거래를 마칠 때마다 기존 화폐는 새로운 화폐로 발행되기 위해 조폐국으로 회수되며, 조폐국에서 직접 발행된 화폐만이 이중지불되지 않았다는 신뢰를 받는다. 이러한 해결책을 적용하게 되면 전체 통화체계(the entire money system)가
은행과 같이 모든 거래가 거쳐가야하는 조폐국을 운영하는 회사에 의존한게 된다는 문제가 발생한다.
따라서 우리는 이전 소유자가 과거에 다른 어떤 거래에도 서명하지 않았음을[4] 수취인에게 알릴 방법이 필요하다. 우리의 목적상 우리는 가장 앞선 거래 하나만을 인정하기 때문에, 이후 시도되는 이중지불은 무시한다. 이중지불된 거래가 없음을 확인할 유일한 방법은 모든 거래를 확인하는 것뿐이다. 조폐국 기반 모델에서 조폐국은 모든 거래를 확인했고, 최초로 받은 거래를 승인 대상으로 결정했다. 신뢰받는자 없이 이 방식을 실현하려면, 거래는 공개적으로 알려져야 하고[A], 참여자들에게는 단 하나의 거래순서 기록에 합의하는 시스템이 필요하다. 수취인은 각 거래의 시점에 해당 거래가 최초로 받은 거래임을 노드 다수가 동의했다는 증명을 필요로 한다.
따라서 우리는 이전 소유자가 과거에 다른 어떤 거래에도 서명하지 않았음을[4] 수취인에게 알릴 방법이 필요하다. 우리의 목적상 우리는 가장 앞선 거래 하나만을 인정하기 때문에, 이후 시도되는 이중지불은 무시한다. 이중지불된 거래가 없음을 확인할 유일한 방법은 모든 거래를 확인하는 것뿐이다. 조폐국 기반 모델에서 조폐국은 모든 거래를 확인했고, 최초로 받은 거래를 승인 대상으로 결정했다. 신뢰받는자 없이 이 방식을 실현하려면, 거래는 공개적으로 알려져야 하고[A], 참여자들에게는 단 하나의 거래순서 기록에 합의하는 시스템이 필요하다. 수취인은 각 거래의 시점에 해당 거래가 최초로 받은 거래임을 노드 다수가 동의했다는 증명을 필요로 한다.
2.3. 타임스탬프 서버(Timestamp Server)
우리가 제안하는 해결책은 타임스탬프 서버로 시작한다. 타임스탬프 서버는 타임스탬프가 찍힌 항목들의 블록
해시를 가져가 그 해시를 신문이나
유즈넷 게시물[B][C][D][E]처럼 널리 배포하는 식으로 작동한다. 이 타임스탬프는 해당 데이터가 해시에 들어가기 위해서 데이터가 해당 시각부터 존재해야 했음을 증명한다. 각각의 타임스탬프들은 자신의 해시 안에 이전 타임스탬프를 포함하며, 이전 타임스탬프를 강화하는 타임스탬프들을 연결해 하나의
체인으로 만든다.
2.4. 작업증명(Proof-of-Work)
P2P를 기반으로 분산 타임스탬프 서버를 구현하기 위해 우리는 신문이나 유즈넷 게시물 대신, 애덤 백의 해시캐시(Adam Back's Hashcash)와 유사한
작업증명(PoW) 시스템[F]을 사용할 필요가 있다. 작업증명은
SHA-256 같은
해시연산을 거쳐 만들어진 여러 개의 0 비트(zero bits)들로 시작하는 해시값을 확인하는 작업을 포함한다. 이 과정에서 필요한 평균 연산 작업은 결과값에 필요한 0 비트의 개수에 따라 지수적(exponential)으로 달라지며,
해시연산을 한 번 실행하는 것으로 검증된다.
우리는 타임스탬프 네트워크용으로
블록의 해시에 주어진 0 비트들을 모두 발견할 때까지 블록 안에 임시값을 증가시키는(incrementing a nonce) 것으로
작업증명을 구현했다.
CPU 동작(CPU effort)으로 작업증명이 성공했다면, 완료된 블록은 작업을 재수행하지 않고는 변경되지 않는다. 이후 생성된 블록들이 계속 연결된다면, 완료된 블록을 변경하는 작업은 이전에 작업된 모든 블록의
작업증명을 재수행하는 연산까지 포함하게 된다.
작업증명은
다수결의 대표성을 결정하는 문제도 해결한다. 만약
IP주소당 1표에 기반한
다수결이라면, 한번에 많은
IP를 할당할 수 있는 누군가에 의해 장악될 수 있다. 작업증명은 기본적으로
CPU 당 1표다. 다수결의 결과는 가장 많은 자원이 사용된 작업증명들의 가장 긴 체인이 된다. 만약 정직한 노드에 의해 다수의 CPU 파워가 통제된다면, 가장 정직한 체인이 가장 빠르게 늘어나 다른 경쟁 체인을 압도할 것이다. 또한 과거 블록을 수정하려면 공격자는 해당 블록과 그 이후에 이어져 있는 모든 블록의 작업증명을 재수행해야 하고, 가장 정직한 노드들의 작업을 따라잡아 앞질러야 한다. 뒤에서 우리는 이어지는 블록이 추가될수록[11] 정직한 노드보다 느린 공격자가 정직한 체인을 따라잡을 확률이 지수적으로 감소함을 보이겠다.
시간이 지날수록 증가하는 하드웨어의 속도와 변화하는 관여도(interest)에 따라 적절한 보상을 주기 위해,
작업증명의 난도(difficulty)는 시간당 평균 블록 수에 따른 평균 목표치를 조정해 결정된다. 만약 블록들이 너무 빨리 생성된다면 난도는 높아진다.
2.5. 네트워크(Network)
네트워크를 실행하는 단계는 다음과 같다:
1) 새로운 거래가 모든 노드에 브로드캐스트된다.
2) 각 노드가 새로운 거래를 블록에 수집한다.
3) 각 노드가 해당 블록에 맞는 난도의 작업증명을 찾아 나선다.
4) 노드가 작업증명을 찾으면, 해당 블록을 모든 노드로 브로드캐스트한다.
5) 노드들은 모든 거래가 유효하며 아직 지불되지 않았다는 조건에 맞을 경우에만 그 블록을 승인한다.
6) 노드들은 이전 해시로 승인된 블록의 해시를 사용해, 다음 블록을 체인 안에 생성함으로써 해당 블록이 승인 되었음을 표현한다.
2) 각 노드가 새로운 거래를 블록에 수집한다.
3) 각 노드가 해당 블록에 맞는 난도의 작업증명을 찾아 나선다.
4) 노드가 작업증명을 찾으면, 해당 블록을 모든 노드로 브로드캐스트한다.
5) 노드들은 모든 거래가 유효하며 아직 지불되지 않았다는 조건에 맞을 경우에만 그 블록을 승인한다.
6) 노드들은 이전 해시로 승인된 블록의 해시를 사용해, 다음 블록을 체인 안에 생성함으로써 해당 블록이 승인 되었음을 표현한다.
노드들은 항상 가장 긴 체인을 정확한 것으로 간주하고, 이 체인을 계속 이어나가는 작업을 한다. 만일 두 노드가 동시에 서로 다른 버전의 다음
블록을 브로드캐스트하면, 몇몇 노드들은 둘 중 하나를 먼저 받게 된다. 이 경우 노드들은 가장 먼저 받은 것으로 작업하지만, 다른
브랜치[12]에 이후에 들어온 블록을 저장해 이 체인[13]이 더 길어질 경우에 대비한다. 이후 다음 작업증명이 발견되면 체인의 연결은 끊어지고 한쪽 브랜치가 더 길어진다. 이때 다른 브랜치를 작업하던 노드들은 더 긴 브랜치로 전환한다.
새로운 거래가 반드시 모든 노드에게 브로드캐스트될 필요는 없다. 브로드캐스트된 거래는 많은 노드에 도달하는대로 블록 안에 들어간다. 블록의 브로드캐스트는 또한 메시지 누락에 내성을 갖는다. 만약 노드가 블록을 받지 못하면, 노드는 다음 블록을 받을 때 이전 블록이 누락된 것을 알아차리고, 누락된 블록을 요청한다.
2.6. 인센티브(Incentive)
관례상
블록 안의 첫 거래는, 해당
블록을 만든 이의 몫이 될 새 화폐에 대한 거래로 시작하는 특별한 거래다. 이는 화폐를 발행하는 중앙기관 없이 노드가 네트워크를 지원할 인센티브가 되며, 초기에 발행한 화폐를 유통할 방법을 제공한다. 새 화폐를 일정량 꾸준히 추가하는 것은,
금 채굴자가 유통하는
금을 추가하기 위해 자원을 소비하는 것과 유사하다. 우리의 경우, 소비되는 자원은
CPU의 시간과 전기다.
이 인센티브는 거래 수수료(transaction fees)로 충당될 수도 있다. 만약 거래에서 도출된 가치가 투입된 가치보다 작다면, 그 차이가 바로 거래를 포함한 블록의 인센티브에 더해질 거래 수수료다. 또한 만약 미리 정해 놓은 수 만큼의 화폐가 모두 유통된다면, 인센티브는 전부 거래 수수료로 바뀌어
인플레이션에서 완전히 자유로워질 수 있다.
또한 인센티브는 노드가 계속 정직하게 행동하도록 유도하는데 도움을 줄 수 있다. 만일 탐욕스러운 공격자가 모든 정직한 노드보다 더 많은
CPU 파워를 모을 수 있다면[14], 공격자는 CPU 파워를 누군가의 결제를 훔쳐 사람들을 속이는데 쓰는 방법과 새로운 화폐를 만들어내는 데 쓰는 방법 중 하나를 선택해야 한다. 공격자는 기존 시스템과 그가 가진 부의 유효성를 약화시키는것 보다, 다른 모든 사람들이 가진 것보다 더 많은 새로운 화폐를 그가 가진다는 규칙을 따르는 것이 왜 더 이득인지를 알아내야만 한다.[15]
2.7. 디스크 공간 회수(Reclaiming Disk Space)
화폐의 가장 최근 거래가 충분한 수의 블록 아래에 묻히면, 그 전에 지불된 거래는 디스크 공간을 절약하기 위해 폐기될 수 있다. 이런 작업을 블록의 해시를 깨지 않으면서 하기 위해, 거래는 머클
트리(Merkle Tree)[G][B][E]안에 해시되며, 그 트리의 루트(root)만이 블록의 해시 안에 포함된다. 이런 방식을 적용하게 되면, 오래된 블록은 트리의 분기를 쳐냄으로써 크기가 작아질 수 있다. 내부의 해시는 저장될 필요가 없다.
거래를 제외한 블록 헤더의 크기는 약 80
바이트(Byte) 정도다. 블록이 10분마다 만들어진다고 가정하면, 80(바이트) * 6 * 24 * 365 = 연간 4.2MB다. 2008년부터 일반적으로 판매되는 2GB의
램(RAM) 용량을 가진 컴퓨터와 연간 1.2GB씩의 용량 증가를 예측하고 있는
무어의 법칙을 봤을 때, 만일 블록의 헤더들이 반드시
메모리에 보존돼야 하더라도 저장공간은 문제가 되지 않는다.
2.8. 간소화된 결제 검증(Simplified Payment Verification)
결제 검증은 네트워크의 모든 노드를 다 구동하지 않아도 가능하다. 사용자는 자신이 가장 긴
작업증명
체인을 가졌다고 확신할 때까지 네트워크 노드를 조회해, 얻을 수 있는 가장 긴 체인의 블록 헤더(header) 복사본을 유지하면서, 타임스탬프가 찍힌 블록에 연결된 머클 분기를 얻기만 하면 된다. 그는 스스로 자신의 거래를 검사할 수는 없지만, 그걸 체인 내 장소에 연결함으로써 네트워크 노드가 거래를 승인한 것을 볼 수 있으며, 이후 더 많은 네트워크가 거래를 승인한 것이 확인되면 블록은 추가된다.
이처럼 정직한 노드가 네트워크를 제어하는 한 검증은 믿을만하지만, 만일 네트워크가 공격자에 의해 과점된다면 네트워크는 더 취약해진다. 네트워크 노드가 거래를 자체 검증할 수 있긴 하지만, 공격자가 네트워크를 계속 과점할 수 있는 한 소화된 검증은 공격자가 조작한 거래에 의해 속여질 수 있다. 이를 방어하기 위한 한 가지 전략은 네트워크 노드가 유효하지 않은 블록을 탐지해 경고를 받을 때, 사용자의 소프트웨어가 온전한 블록 전체를 내려받게 하고 경고된 거래에서 발생한 모순(inconsistency)을 확인하게 하는 것이다. 아마도 지불이 잦은 비즈니스는 여전히 더 독립적인 보안과 더 빠른 검증을 위해 그들의 자체 노드 구동을 원할 것이다.
2.9. 가치 합치기와 나누기(Combining and Splitting Value)
화폐들을 독립적으로 다루는 것이 가능하더라도, 모든 푼돈(every cent)을 별도의 거래로 만드는 것은 불가능한 일이다. 가치를 나누거나 합칠 수 있도록, 거래는 복수의 입출금을 포함한다. 일반적으로 입금은 더 큰 이전 거래의 단일 입금이거나 더 작은 거래들을 결합한 복수 입금이며, 출금은 지불용 출금과 만일 있다면 발생해야 하는 송금인(sender)에게 되돌려줄 거스름돈 출금, 이렇게 많아야 둘이다.
거래가 다른 몇몇 거래에 의존하고, 이 거래들이 더 많은 거래에 의존하는 팬아웃(fan-out)이 여기에서는 문제가 되지 않는다는 것에 주의해야 한다. 거래내역의 완전히 독립된(standalone) 사본을 추출해야 할 필요는 전혀 없다.
2.10. 프라이버시(Privacy)
전통적인 은행 모델은 참여 당사자(the parties involved)와 신뢰받는 제 3자의 정보 접근을 제한함으로써 일정 수준의 프라이버시를 달성한다. 모든 거래는 공개되어야 하기 때문에 이러한 방법은 불가능하지만, 공개키 익명성을 보존해 다른 장소에 있는 정보의 흐름을 끊는 것으로 프라이버시가 여전히 보장될 수 있다. 대중(the public)은 누군가가 다른 누군가에게 보내는 금액을 볼 수 있지만, 그 거래에 연결된 다른 누군가에 대한 정보는 볼 수 없다. 이는 증권거래소에서 공개되는 정보와 비슷한 수준으로, 증권거래에서 개별 거래 시각과 규모를 나타내는 "테이프(tape)"는 공개되지만 그 거래 당사자가 누구인지 알지는 못하는 것과 같다.
추가적인
방화벽으로, 각 거래는 어떤 공통된 소유자와 연결되지 않도록 새로운 키 쌍(key pair)을 사용해야 한다. 여러 입금이 동일 소유자의 소유임을 부득이하게 드러내는 다중입금 거래의 경우 몇몇 연결(linking)은 여전히 피할 수 없다. 만약 거래의 키 소유자가 드러나게 되면, 연결(linking)이 동일 소유자에게 속한 다른 거래까지 노출할 위험이 있다.
2.11. 계산들(Calculations)
정직한 체인보다 공격자가 더 빨리 대체 체인을 만들어내는 시나리오를 고려해 보자. 만약 이런 시도가 성공한다 하더라도, 그게 아무것도 없는 곳에서 가치를 만들어내거나 공격자가 소유한 적도 없는 돈을 얻게 만드는식으로 이 시스템이 무단 변경되도록 허용하진 않는다. 노드는 유효하지 않은 거래를 결제로 받아들이지 않으며, 정직한 노드는 유효하지 않은 거래를 포함하는 블록을 절대 받아들이지 않는다. 공격자는 오로지 자신의 거래에서 최근에 지출된 돈을 회수하도록 변경하는 것만 가능하다.
정직한 체인과 공격자 체인간의 경주는 이항랜덤워크(Binomial Random Walk)로 특징지을 수 있다. 성공이벤트는 정직한 체인이 그 우위(lead)를 +1 만큼 늘리는 블록 하나를 연장한 것이고, 실패 이벤트는 공격자 체인이 그 격차를 -1 만큼 좁히는 블록 하나를 연장한 것이다.
공격자가 주어진 열세를 따라잡을 확률은 도박꾼의 파산(Gambler's Ruin) 문제와 유사하다. 무제한의 신용을 갖은 도박꾼이 열세로 시작해, 손익분기(breakeven)에 도달하려는 시도를 잠재적으로 무한한 횟수에 걸쳐 시행한다고 가정해 보자. 우리는 그가 점차 손익분기에 도달할 확률, 다시말해 공격자가 정직한 사슬을 따라잡을 확률을 다음과 같이 계산할 수 있다[H]:
[math(p > q)] 라 가정하면, 공격자가 따라잡아야 하는 블록 수가 늘어날수록 따라잡을 확률은 지수적으로 감소한다. 만약 공격자에게 곤란한 일이 발생해 초기에 운좋게 앞으로 치고나가지 못한다면, 따라잡을 수 있는 확률은 공격자가 뒤쳐질수록 보이지 않을만큼 작아진다.
이제 송금인이 새로운 거래를 변경할 수 없다고 충분히 확신하기 전까지 수취인(recipient)이 얼마나 오래 기다려야할지 고려해 보자. 우리는 송금인을 수취인이 자신에게 화폐를 지불받았다고 잠시 동안 믿게 하고, 얼마간 시간이 흐른 후 지불한 화폐를 되찾고 싶어하는 공격자라 가정한다. 수취인(receiver)은 그런 일이 생길 때 경고를 받겠지만, 송금인은 그 경고가 늦기를 바란다.
[math(p)] = 정직한 노드가 다음 블록을 발견할 확률
[math(q)] = 공격자가 다음 블록을 발견할 확률
[math(q_{z})] = 공격자가 z 블록 뒤에서부터 따라잡을 확률
[math(q_{z} = \begin{Bmatrix} 1&if p\leq q \\ (q/p)^{z}&if p> q \\\end{Bmatrix})]
[math(q)] = 공격자가 다음 블록을 발견할 확률
[math(q_{z})] = 공격자가 z 블록 뒤에서부터 따라잡을 확률
[math(q_{z} = \begin{Bmatrix} 1&if p\leq q \\ (q/p)^{z}&if p> q \\\end{Bmatrix})]
[math(p > q)] 라 가정하면, 공격자가 따라잡아야 하는 블록 수가 늘어날수록 따라잡을 확률은 지수적으로 감소한다. 만약 공격자에게 곤란한 일이 발생해 초기에 운좋게 앞으로 치고나가지 못한다면, 따라잡을 수 있는 확률은 공격자가 뒤쳐질수록 보이지 않을만큼 작아진다.
이제 송금인이 새로운 거래를 변경할 수 없다고 충분히 확신하기 전까지 수취인(recipient)이 얼마나 오래 기다려야할지 고려해 보자. 우리는 송금인을 수취인이 자신에게 화폐를 지불받았다고 잠시 동안 믿게 하고, 얼마간 시간이 흐른 후 지불한 화폐를 되찾고 싶어하는 공격자라 가정한다. 수취인(receiver)은 그런 일이 생길 때 경고를 받겠지만, 송금인은 그 경고가 늦기를 바란다.
수취인은 새로운 키 쌍을 생성하고 서명 직전에 송금인에게 공개키를 준다. 이는 송금인이 운좋게 앞설 때까지 그 작업을 계속 수행함으로써 미리 블록들의 체인을 준비하지 못하게 방지하고, 그 시점에 거래를 실행한다. 거래가 한 번 발신되면, 이 부정직한(dishonest) 송금인은 수취인 몰래 준비한, 그의 거래가 포함된 평행한 다른 체인을 만드는 작업을 시작한다.
수취인은 해당 거래가 블록에 추가되고 [math(z)] 블록이 체인에 연결될 때까지 기다린다. 그는 공격자가 블록 처리를 진척시킨 규모를 알지 못하지만, 정직한 블록이 예상되는 블록당 시간 평균치를 따른다고 가정하면, 공격자의 잠재적 진척도는 기대값을 갖는
푸아송 분포(Poisson distribution)가 될 것이다:
[math(\lambda = z\frac{q}{p})]
공격자가 현재 따라잡을 수 있는 확률을 얻기 위해, 그가 해당 시점부터 따라잡을 수 있는 확률로 만들어낼 각 진척 규모별 푸아송 밀도를 곱한다:
[math(\sum_{k=0}^{\infty}\frac{\lambda^{k}e^{-\lambda}}{k!}\cdot\begin{Bmatrix}(q/p)^{(z-k)} & if k\leq z \\1 & if k>z \\\end{Bmatrix})]
분포의 무한꼬리 합산을 피하도록 정리하고...
[math(1-\sum_{k=0}^{z}\frac{\lambda^{k}e^{-\lambda}}{k!}(1-(q/p)^{(z-k)}))]
C언어 코드로 바꿔서...
#!syntax cpp
#include <math.h>
double AttackerSuccessProbability(double q, int z)
{
double p = 1.0 - q;
double lambda = z * (q / p);
double sum = 1.0;
int i, k;
for (k = 0; k <= z; k++)
{
double poisson = exp(-lambda);
for (i = 1; i <= k; i++)
poisson *= lambda / i;
sum -= poisson * (1 - pow(q / p, z - k));
}
return sum;
}
결과를 실행하면, z에 따라 확률이 지수적으로 감소하는 것을 볼 수 있다.
q=0.1
z=0 P=1.0000000
z=1 P=0.2045873
z=2 P=0.0509779
z=3 P=0.0131722
z=4 P=0.0034552
z=5 P=0.0009137
z=6 P=0.0002428
z=7 P=0.0000647
z=8 P=0.0000173
z=9 P=0.0000046
z=10 P=0.0000012
q=0.3
z=0 P=1.0000000
z=5 P=0.1773523
z=10 P=0.0416605
z=15 P=0.0101008
z=20 P=0.0024804
z=25 P=0.0006132
z=30 P=0.0001522
z=35 P=0.0000379
z=40 P=0.0000095
z=45 P=0.0000024
z=50 P=0.0000006
0.1% 미만에 대한 P 를 풀면...
P < 0.001
q=0.10 z=5
q=0.15 z=8
q=0.20 z=11
q=0.25 z=15
q=0.30 z=24
q=0.35 z=41
q=0.40 z=89
q=0.45 z=340
2.12. 결론
우리는 신뢰에 의존하지 않는 전자거래용 시스템을 제안했다. 우리는 강력한 소유권 통제를 제공하지만 이중지불 문제를 해결하기에는 완벽하지 않은,
전자서명으로 만든 일반적인 틀의 화폐로 논의를 시작했다. 이중지불 문제를 해결하기 위해 우리는 정직한
노드가
CPU 파워 대부분을 통제하는 경우,
공격자가 계산해 변경하는 것이 빠른 속도로 불가능하게 되는 공공의 거래이력(a public history of transactions)을 기록하기 위해,
작업증명을 사용하는
P2P 네트워크를 제안했다. 이 네트워크의 견고함은 구조화되지 않은 단순함(unstructured simplicity)에 있다. 노드는 거의 조정(coordination)되지 않고 모두 한 번에 동작한다. 노드들의 메시지는 경로를 지정받아 어떤 특정 위치로 가는 게 아니라 가능한 많은 노드로 퍼져나가는 것이기 때문에, 각 노드는 식별될 필요가 없다. 각 노드들은 네트워크를 떠났다가 재합류할 수 있고, 자신이 떠난 사이에 벌어진 거래의 증명으로 가장 긴
작업증명
체인을 채택한다. 노드들은 CPU 파워를 사용한 투표로 유효한 블록을 연장하는 작업을 통해 블록을 승인했음을 나타내고, 유효하지 않은 블록에 대한 작업을 거부함으로써 블록을 기각한다. 어떤 필요한 규칙과 인센티브든지 이러한 합의작용(consensus mechanism)을 통해 집행될 수 있다.
[1]
abstract
[2]
제3자가 상거래가 원활히 이루어질 수 있도록 중개를 하는 매매 보호 서비스
[3]
이미 사용된 화폐를 다른 곳에 다시 사용하는 것
[4]
이중지불하지 않았음을
[A]
W. Dai, "b-money," http://www.weidai.com/bmoney.txt, 1998.
[B]
H. Massias, X.S. Avila, and J.-J. Quisquater, "Design of a secure timestamping service with minimal trust requirements," In 20th Symposium on Information Theory in the Benelux, May 1999.
[C]
S. Haber, W.S. Stornetta, "How to time-stamp a digital document," In Journal of Cryptology, vol 3, no2, pages 99-111, 1991.
[D]
D. Bayer, S. Haber, W.S. Stornetta, "Improving the efficiency and reliability of digital time-stamping," In Sequences II: Methods in Communication, Security and Computer Science, pages 329-334, 1993.
[E]
S. Haber, W.S. Stornetta, "Secure names for bit-strings," In Proceedings of the 4th ACM Conference on Computer and Communications Security, pages 28-35, April 1997.
[F]
A. Back, "Hashcash - a denial of service counter-measure," http://www.hashcash.org/papers/hashcash.pdf, 2002.
[11]
체인이 길어질수록
[12]
체인의 분기
[13]
브랜치
[14]
51% 공격이 가능한 상황이라면
[15]
만약 체인이 공격당한다면 그 체인은 신뢰를 잃기때문에 화폐의 가치 또한 떨어져 결국 공격자도 손해를 입을 것이라는 의미로 해석된다.
[G]
R.C. Merkle, "Protocols for public key cryptosystems," In Proc. 1980 Symposium on Security and Privacy, IEEE Computer Society, pages 122-133, April 1980.
[B]
[E]
[H]
W. Feller, "An introduction to probability theory and its applications," 1957.