|
|
비트코인: P2P 전자 현금 시스템
나카모토 사토시
satoshin@gmx.com
개요. 순수한 P2P 버전의 전자 현금을 사용하면 금융기관을 거치지 않고 한 당사자에서 다른 당사자에게 온라인 지불을 직접 보낼 수 있습니다. 디지털 서명은 솔루션의 일부를 제공하지만 이중 지출을 방지하기 위해 신뢰할 수 있는 제3자가 여전히 필요한 경우 주요 이점을 잃게 됩니다. P2P 네트워크를 사용하여 이중 지출 문제에 대한 솔루션을 제안합니다. 네트워크는 트랜잭션을 해시 기반 작업 증명의 지속적인 체인으로 해시하여 트랜잭션에 타임스탬프를 지정하여 작업 증명을 다시 실행하지 않고는 변경할 수 없는 레코드를 형성합니다. 가장 긴 체인은 목격된 일련의 이벤트에 대한 증거일 뿐만 아니라 가장 큰 CPU 전력 풀에서 왔다는 증거이기도 합니다. CPU 성능의 대부분이 네트워크 공격에 협력하지 않는 노드에 의해 제어되는 한 가장 긴 체인을 생성하고 공격자를 능가합니다. 네트워크 자체에는 최소한의 구조가 필요합니다. 메시지는 최선의 노력으로 브로드캐스트되며 노드는 네트워크를 떠나거나 다시 참여할 수 있으며, 네트워크가 없는 동안 발생한 일의 증거로 가장 긴 작업 증명 체인을 받아들입니다.
1. 소개 (Introduction)
인터넷상의 상거래는 전자지불을 처리하기 위해 신뢰할 수 있는 제3자 역할을 하는 금융기관에 거의 전적으로 의존하게 되었습니다. 시스템은 대부분의 거래에 대해 충분히 잘 작동하지만 여전히 신뢰 기반 모델의 고유한 약점을 가지고 있습니다. 금융기관이 분쟁 조정을 피할 수 없기 때문에 완전히 되돌릴 수 없는 거래는 실제로 불가능합니다. 중재 비용은 거래 비용을 증가시켜 최소한의 실제 거래 규모를 제한하고 소규모 캐주얼 거래의 가능성을 차단하며, 되돌릴 수 없는 서비스에 대해 되돌릴 수 없는 지불 능력을 상실하는데 더 큰 비용이 발생합니다. 반전 가능성과 함께 신뢰의 필요성이 확산된다. 상인은 고객이 필요하지 않은 것보다 더 많은 정보를 얻기 위해 번거롭게 하여 고객을 경계해야 합니다. 일정 비율의 사기는 피할 수 없는 것으로 받아들여집니다. 이러한 비용 및 지불 불확실성은 실물 화폐를 사용하여 직접 피할 수 있지만 신뢰할 수 있는 당사자 없이 통신 채널을 통해 지불하는 메커니즘은 없습니다.
필요한 것은 신뢰 대신 암호화 증명을 기반으로 하는 전자 지불 시스템으로, 두 당사자가 신뢰할 수 있는 제3자 없이도 서로 직접 거래할 수 있도록 합니다. 되돌리기가 계산상 비실용적인 거래는 판매자를 사기로부터 보호하고 일상적인 조건부 날인증서 메커니즘을 쉽게 구현하여 구매자를 보호할 수 있습니다. 이 논문에서는 트랜잭션의 시간 순서에 대한 계산 증명을 생성하기 위해 P2P 분산 타임스탬프 서버를 사용하여 이중 지출 문제에 대한 솔루션을 제안합니다. 정직한 노드가 협력하는 공격자 노드 그룹보다 더 많은 CPU 전력을 집합적으로 제어하는 한 시스템은 안전합니다.
2. 트랜잭션 (Transactions)
우리는 전자 코인을 일련의 디지털 서명으로 정의합니다. 각 소유자는 이전 거래의 해시와 다음 소유자의 공개키에 디지털 서명을 하고 이를 코인 끝에 추가하여 다음 코인으로 전송합니다. 수취인은 서명을 확인하여 소유권 체인을 확인할 수 있습니다.
물론 문제는 수취인이 소유자 중 한 명이 코인을 이중으로 사용하지 않았는지 확인할 수 없다는 것입니다. 일반적인 솔루션은 모든 거래에 이중 지출이 있는지 확인하는 신뢰할 수 있는 중앙 기관 또는 조폐공사를 도입하는 것입니다. 각 거래 후 해당 코인을 조폐공사에 반납하여 새로운 코인을 발행해야 하며, 조폐공사에서 직접 발행된 코인만 이중 사용되지 않는다고 신뢰합니다. 이 솔루션의 문제는 전체 화폐 시스템의 운명이 은행처럼 모든 거래를 거쳐야 하는 조폐공사를 운영하는 회사에 달려 있다는 것입니다.
이전 소유자가 이전 거래에 서명하지 않았음을 수취인이 알 수 있는 방법이 필요합니다. 우리의 목적을 위해 가장 이른 거래가 중요한 거래이므로 나중에 이중 지출을 시도하는 것은 신경 쓰지 않습니다. 트랜잭션이 없음을 확인하는 유일한 방법은 모든 트랜잭션을 인식하는 것입니다. 민트 기반 모델에서 민트는 모든 거래를 인식하고 먼저 도착한 거래를 결정했습니다. 신뢰할 수 있는 당사자 없이 이를 수행하려면 거래를 공개적으로 발표해야 하며[1] 참가자가 수신된 주문의 단일 기록에 동의할 수 있는 시스템이 필요합니다. 수취인은 각 거래 시 대부분의 노드가 첫 번째 수신에 동의했다는 증거가 필요합니다.
3. 타임스탬프 서버 (Timestamp Server)
우리가 제안하는 솔루션은 타임스탬프 서버에서 시작됩니다. 타임스탬프 서버는 타임스탬프가 찍힐 항목 블록의 해시를 가져와 신문이나 유즈넷 게시물과 같이 해시를 널리 게시하는 방식으로 작동합니다[2-5]. 타임스탬프는 분명히 해시에 들어가기 위해 데이터가 그 당시에 존재했음을 증명합니다. 각 타임스탬프는 해시에 이전 타임스탬프를 포함하여 체인을 형성하고 각 추가 타임스탬프는 이전 타임스탬프를 강화합니다.
4. 작업증명 (Proof-of-Work)
P2P 기반으로 분산 타임스탬프 서버를 구현하려면 신문이나 유즈넷 게시물이 아닌 Adam Back의 Hashcash[6]와 유사한 작업 증명 시스템을 사용해야 합니다. 작업 증명에는 SHA-256과 같이 해시될 때 해시가 0비트 수로 시작하는 값에 대한 스캔이 포함됩니다. 필요한 평균 작업은 필요한 0비트 수에서 기하급수적이며 단일 해시를 실행하여 확인할 수 있습니다.
타임스탬프 네트워크의 경우 블록의 해시에 필요한 0비트를 제공하는 값을 찾을 때까지 블록의 nonce를 증가시켜 작업 증명을 구현합니다. 작업 증명을 만족시키기 위해 CPU 노력이 소비되면 작업을 다시 수행하지 않고 블록을 변경할 수 없습니다. 나중 블록이 그 뒤에 연결되기 때문에 블록을 변경하는 작업에는 그 뒤의 모든 블록을 다시 실행하는 작업이 포함됩니다.
작업 증명은 또한 다수결 의사 결정에서 대표성을 결정하는 문제를 해결합니다. 대다수가 하나의 IP 주소 하나의 투표를 기반으로 했다면 많은 IP를 할당할 수 있는 사람이라면 누구나 그것을 전복시킬 수 있습니다. 작업 증명은 기본적으로 1 CPU 1 투표입니다. 다수의 결정은 가장 큰 작업 증명 노력이 투자된 가장 긴 체인으로 표시됩니다. CPU 성능의 대부분이 정직한 노드에 의해 제어되는 경우 정직한 체인은 가장 빠르게 성장하고 경쟁 체인을 능가합니다. 과거 블록을 수정하기 위해 공격자는 블록과 그 이후의 모든 블록의 작업 증명을 다시 실행한 다음 정직한 노드의 작업을 따라잡고 능가해야 합니다. 후속 블록이 추가됨에 따라 더 느린 공격자가 따라잡을 확률이 기하급수적으로 감소한다는 것을 나중에 보여줄 것입니다.
시간이 지남에 따라 증가하는 하드웨어 속도와 노드 실행에 대한 다양한 관심을 보상하기 위해 작업 증명 난이도는 시간당 평균 블록 수를 목표로 하는 이동 평균으로 결정됩니다. 너무 빨리 생성되면 난이도가 높아집니다.
5. 네트워크 (Network)
네트워크를 실행하는 단계는 다음과 같습니다.
1) 새로운 트랜잭션은 모든 노드에 브로드캐스트됩니다.
2) 각 노드는 새로운 트랜잭션을 블록으로 수집합니다.
3) 각 노드는 해당 블록에 대한 어려운 작업 증명을 찾기 위해 노력합니다.
4) 노드가 작업 증명을 찾으면 블록을 모든 노드에 브로드캐스트합니다.
5) 노드는 모든 트랜잭션이 유효하고 아직 사용되지 않은 경우에만 블록을 수락합니다.
6) 노드는 수락된 블록의 해시를 이전 해시로 사용하여 체인에서 다음 블록을 생성하는 작업을 통해 블록 수락을 표현합니다.
노드는 항상 가장 긴 체인을 올바른 체인으로 간주하고 계속해서 확장 작업을 수행합니다. 두 노드가 동시에 다음 블록의 다른 버전을 브로드캐스트하는 경우 일부 노드는 하나 또는 다른 하나를 먼저 수신할 수 있습니다. 그 경우, 그들은 받은 첫 번째 분기에서 작업하지만 더 길어질 경우를 대비하여 다른
분기를 저장합니다. 다음 작업 증명이 발견되고 한 가지가 더 길어지면 넥타이가 끊어집니다. 그러면 다른 분기에서 작업하던 노드가 더 긴 것으로 전환됩니다.
새로운 트랜잭션 브로드캐스트가 반드시 모든 노드에 도달할 필요는 없습니다. 많은 노드에 도달하면 머지 않아 블록에 들어갈 것입니다. 블록 브로드캐스트는 삭제된 메시지도 허용합니다. 노드가 블록을 수신하지 않으면 다음 블록을 수신하고 누락된 블록을 깨달았을 때 요청합니다.
6. 인센티브 (Incentive)
일반적으로 블록의 첫 번째 트랜잭션은 블록 생성자가 소유한 새 코인을 시작하는 특별한 트랜잭션입니다. 이것은 노드가 네트워크를 지원하도록 인센티브를 추가하고, 발행할 중앙 기관이 없기 때문에 초기에 코인을 유통에 배포할 수 있는 방법을 제공합니다. 일정한 양의 새 코인을 꾸준히 추가하는 것은 금 채굴자가 순환에 금을 추가하기 위해 자원을 소비하는 것과 유사합니다. 우리의 경우 소비되는 것은 CPU 시간과 전력입니다.
인센티브는 거래 수수료로 자금을 조달할 수도 있습니다. 트랜잭션의 출력 값이 입력 값보다 작은 경우 차이는 트랜잭션을 포함하는 블록의 인센티브 값에 추가되는 트랜잭션 수수료입니다. 미리 정해진 수의 코인이 유통되면 인센티브는 완전히 거래 수수료로 전환되고 인플레이션이 전혀 없습니다.
인센티브는 노드가 정직함을 유지하도록 장려하는 데 도움이 될 수 있습니다. 탐욕스러운 공격자가 모든 정직한 노드보다 더 많은 CPU 파워를 모을 수 있다면, 그는 그것을 사용하여 지불금을 훔쳐 사람들을 속이는 데 사용할 것인지 아니면 새 코인을 생성하는 데 사용할 것인지 선택해야 합니다. 그는 다른 모든 사람을 합친 것보다 더 많은 새 주화로 자신에게 유리한 규칙과 같은 규칙을 따르는 것이 시스템과 자신의 부의 유효성을 손상시키는 것보다 더 수익성이 있음을 알아야 합니다.
7. 디스크 공간 회수 (Reclaiming Disk Space)
코인의 최신 트랜잭션이 충분한 블록 아래에 묻히면 디스크 공간을 절약하기 위해 이전에 사용한 트랜잭션을 폐기할 수 있습니다. 블록의 해시를 깨지 않고 이를 용이하게 하기 위해 트랜잭션은 블록의 해시에 루트만 포함된 머클 트리[7][2][5]에서 해시됩니다. 그런 다음 오래된 블록은 나무 가지를 잘라서 압축할 수 있습니다. 내부 해시는 저장할 필요가 없습니다.
트랜잭션이 없는 블록 헤더는 약 80바이트입니다. 10분마다 블록이 생성된다고 가정하면 연간 80바이트 * 6 * 24 * 365 = 4.2MB입니다. 2008년 현재 일반적으로 2GB의 RAM으로 판매되는 컴퓨터 시스템과 현재 연간 1.2GB의 성장을 예측하는 무어의 법칙으로 인해 블록 헤더를 메모리에 보관해야 하는 경우에도 스토리지는 문제가 되지 않습니다.
8. 간편 결제 확인 (Simplified Payment Verification)
전체 네트워크 노드를 실행하지 않고도 결제를 확인할 수 있습니다. 사용자는 자신이 가장 긴 체인을 가지고 있다고 확신할 때까지 네트워크 노드에 질문하여 얻을 수 있는 가장 긴 작업 증명 체인의 블록 헤더 사본을 유지하고 트랜잭션을 블록에 연결하는 머클 지점(Merkle Branch)를 얻기만 하면 됩니다. 타임스탬프가 찍혀 있습니다. 그는 트랜잭션을 직접 확인할 수 없지만 체인의 한 장소에 연결하면 네트워크 노드가 이를 수락하고 네트워크가 수락했음을 추가로 확인한 후 추가된 블록을 볼 수 있습니다.
따라서 검증은 정직한 노드가 네트워크를 제어하는 한 신뢰할 수 있지만 네트워크가 공격자에 의해 압도되는 경우 더 취약합니다. 네트워크 노드가 스스로 트랜잭션을 확인할 수 있지만 공격자가 네트워크를 계속 압도할 수 있는 한 공격자의 조작된 트랜잭션에 의해 단순화된 방법이 속일 수 있습니다. 이를 방지하기 위한 한 가지 전략은 네트워크 노드가 유효하지 않은 블록을 감지할 때 경고를 수락하고 불일치를 확인하기 위해 전체 블록과 경고 트랜잭션을 다운로드하도록 사용자 소프트웨어에 요청하는 것입니다. 자주 지불을 받는 기업은 더 독립적인 보안과 더 빠른 검증을 위해 여전히 자체 노드를 실행하기를 원할 것입니다.
9. 가치 결합 및 분할 (Combining and Splitting Value)
코인을 개별적으로 처리하는 것은 가능하지만 이체 시 1센트마다 별도의 거래를 하는 것은 다루기 어려울 것입니다. 가치를 분할하고 결합할 수 있도록 트랜잭션에는 여러 입력 및 출력이 포함됩니다. 일반적으로 더 큰 이전 거래의 단일 입력 또는 더 적은 금액을 결합한 여러 입력이 있으며 최대 두 가지 출력이 있습니다.
트랜잭션이 여러 트랜잭션에 종속되고 이러한 트랜잭션이 더 많은 트랜잭션에 종속되는 팬아웃은 여기에서 문제가 되지 않습니다. 트랜잭션 기록의 완전한 독립 실행형 사본을 추출할 필요가 없습니다.
10. 개인정보 보호 (Privacy)
전통적인 뱅킹 모델은 관련 당사자와 신뢰할 수 있는 제3자에게만 정보에 대한 액세스를 제한함으로써 개인 정보 보호 수준을 달성합니다. 모든 거래를 공개적으로 발표해야 하는 필요성 때문에 이 방법은 금지되지만 공개키를 익명으로 유지함으로써 다른 곳에서 정보 흐름을 차단함으로써 개인 정보를 계속 유지할 수 있습니다. 대중은 누군가가 다른 사람에게 금액을 보내고 있다는 것을 알 수 있지만 거래를 누구와 연결하는 정보는 없습니다. 이는 개인 거래의 시간과 규모인 '테이프'가 공개되지만 당사자가 누구인지는 밝히지 않은 증권거래소가 공개하는 정보 수준과 비슷하다.
추가 방화벽으로 각 트랜잭션에 대해 새 키 쌍을 사용하여 트랜잭션이 공통 소유자와 연결되지 않도록 해야 합니다. 일부 연결은 다중 입력 트랜잭션에서 여전히 불가피하며, 이는 해당 입력이 동일한 소유자의 소유임을 필연적으로 나타냅니다. 위험은 키 소유자가 공개될 경우 연결을 통해 동일한 소유자에게 속한 다른 트랜잭션이 공개될 수 있다는 것입니다.
11. 계산 (Calculations)
공격자가 정직한 체인보다 빠르게 대체 체인을 생성하려는 시나리오를 고려합니다. 이것이 달성되더라도 허공에서 가치를 창출하거나 공격자에게 속하지 않은 돈을 빼앗는 것과 같은 임의의 변경에 시스템을 개방하지 않습니다. 노드는 유효하지 않은 거래를 지불로 수락하지 않으며 정직한 노드는 이를 포함하는 블록을 수락하지 않습니다. 공격자는 최근에 지출한 돈을 회수하기 위해 자신의 거래 중 하나만 변경할 수 있습니다.
정직한 체인과 공격자 체인 간의 경쟁은 이항 랜덤 워크(Binomial Random Walk)로 특징지을 수 있습니다. 성공 이벤트는 정직한 체인이 한 블록 확장되어 리드가 +1 증가하는 것이고 실패 이벤트는 공격자의 체인이 한 블록 확장되어 격차가 -1 감소하는 것입니다.
공격자가 주어진 적자를 따라잡을 확률은 Gambler's Ruin 문제와 유사합니다. 신용이 무제한인 도박꾼이 적자에서 시작하여 손익분기점에 도달하기 위해 잠재적으로 무한한 시도를 한다고 가정합니다. 다음과 같이 공격자가 손익분기점에 도달하거나 공격자가 정직한 체인을 따라잡을 확률을 계산할 수 있습니다[8]:
p = 정직한 노드가 다음 블록을 찾을 확률
q = 공격자가 다음 블록을 찾을 확률
qz = 공격자가 z 블록 뒤에서 따라잡을 확률
p > q라고 가정하면 공격자가 따라잡아야 하는 블록 수가 증가함에 따라 확률이 기하급수적으로 떨어집니다. 그에게 불리한 확률이 있기 때문에 일찍 운이 좋은 돌진을 하지 않으면 더 뒤처질수록 그의 기회는 점점 작아집니다.
이제 새 트랜잭션을 받는 사람이 보낸 사람이 트랜잭션을 변경할 수 없다는 것을 충분히 확신하기 전에 기다려야 하는 시간을 고려합니다. 우리는 보낸 사람이 받는 사람이 잠시 동안 자신에게 돈을 지불했다고 믿게 한 다음 일정 시간이 지나면 자신에게 돈을 갚도록 전환하려는 공격자라고 가정합니다. 그런 일이 발생하면 수신자는 경고를 받지만 발신자는 너무 늦기를 바랍니다.
수신자는 새 키 쌍을 생성하고 서명 직전에 발신자에게 공개키를 제공합니다. 이렇게 하면 발신자가 운이 좋을 때까지 계속 작업하여 블록체인을 미리 준비한 다음 그 순간에 트랜잭션을 실행하는 것을 방지할 수 있습니다. 트랜잭션이 전송되면 부정직한 발신자는 자신의 트랜잭션의 대체 버전이 포함된 병렬 체인에서 비밀리에 작업을 시작합니다.
수신자는 트랜잭션이 블록에 추가되고 z 블록이 그 뒤에 연결될 때까지 기다립니다. 그는 공격자가 수행한 정확한 진행 정도를 알지 못하지만 정직한 블록이 블록당 평균 예상 시간을 소요했다고 가정하면 공격자의 잠재적 진행은 예상 값을 갖는 푸아송 분포가 될 것입니다:
공격자가 여전히 따라잡을 수 있는 확률을 얻기 위해 공격자가 만들 수 있는 각 진행 정도에 대한 포아송 밀도를 해당 지점에서 따라잡을 수 있는 확률로 곱합니다.
분포의 무한 꼬리를 합산하지 않도록 재정렬...
C 코드로 변환 중...
일부 결과를 실행하면 확률이 z와 함께 기하급수적으로 떨어지는 것을 볼 수 있습니다.
0.1% 미만의 P에 대해 풀기...
12. 결론 (Conclusion)
우리는 신뢰에 의존하지 않는 전자 거래를 위한 시스템을 제안했습니다. 우리는 소유권에 대한 강력한 제어를 제공하지만 이중 지출을 방지할 방법이 없으면 불완전한 디지털 서명으로 만든 코인의 일반적인 프레임워크로 시작했습니다. 이 문제를 해결하기 위해 우리는 작업 증명을 사용하는 P2P 네트워크를 제안하여 정직한 노드가 CPU 성능의 대부분을 제어하는 경우 공격자가 변경할 수 있는 계산상 비현실적인 트랜잭션의 공개 이력을 기록할 것을 제안했습니다. 네트워크는 구조화되지 않은 단순성에서 강력합니다. 노드는 약간의 조정으로 한 번에 모두 작동합니다. 메시지가 특정 위치로 라우팅되지 않고 최선을 다해 전달되기만 하면 되므로 식별할 필요가 없습니다. 노드는 네트워크를 떠나고 다시 참여할 수 있으며 작업 증명 체인을 네트워크가 없는 동안 발생한 일의 증거로 받아들입니다. 그들은 CPU 파워로 투표하여 유효한 블록을 확장하는 작업을 통해 승인을 표현하고 작업을 거부하여 잘못된 블록을 거부합니다. 이 합의 메커니즘을 통해 필요한 모든 규칙과 인센티브를 시행할 수 있습니다.
참고문헌
[1] W. Dai, "b-money," http://www.weidai.com/bmoney.txt, 1998.
[2] 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.
[3] S. Haber, W.S. Stornetta, "How to time-stamp a digital document," In Journal of Cryptology, vol 3, no 2, pages 99-111, 1991.
[4] 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.
[5] 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.
[6] A. Back, "Hashcash - a denial of service counter-measure," http://www.hashcash.org/papers/hashcash.pdf, 2002.
[7] R.C. Merkle, "Protocols for public key cryptosystems," In Proc. 1980 Symposium on Security and
Privacy, IEEE Computer Society, pages 122-133, April 1980.
[8] W. Feller, "An introduction to probability theory and its applications," 1957.
[출처] 비트코인 백서 (Bitcoin whitepaper) - 번역본|작성자 돌군
