티스토리 뷰

목차



    비트코인 백서는 모두 11개의 주제로 구성되어 있습니다. 아래의 내용은 영어 원문의 내용을 한글로 번역한 내용입니다.

    "아래 파일을 클릭하시면 비트코인 백서 영어 원문이 다운로드됩니다"

    비트코인 백서 영어 원문.pdf
    0.18MB

     

     

     

    비트코인 백서 원본 파일 주소 

    https://bitcoin.org/bitcoin.pdf

     

     

     

    비트코인: 피어 투 피어 전자 현금 시스템


    사토시 나카모토
    satoshin@gmx.com
    www.bitcoin.org

     

    요약


    완전히 피어 투 피어(Peer-to-Peer) 방식의 전자 현금 시스템은 금융 기관을 거치지 않고 한 당사자에서 다른 당사자에게 직접 온라인 결제를 할 수 있게 합니다. 디지털 서명이 일부 해결책을 제공하지만, 신뢰할 수 있는 제3자가 여전히 필요하다면 이 시스템의 주요 장점은 사라집니다. 우리는 피어 투 피어 네트워크를 사용하여 이중 지불(double-spending) 문제를 해결하는 방법을 제안합니다.
    이 네트워크는 거래를 타임스탬프 방식으로 기록하며, 이를 해시를 사용해 연속적인 작업 증명(Proof-of-Work) 체인에 포함시킵니다. 이렇게 형성된 기록은 작업 증명을 다시 하지 않으면 변경할 수 없습니다. 가장 긴 체인은 사건의 순서를 증명할 뿐만 아니라, 그 사건이 가장 많은 CPU 파워를 가진 네트워크에서 발생했다는 것을 증명합니다. 네트워크에 참여하는 대부분의 CPU 파워가 협력하지 않고 공격하지 않으면, 그들은 가장 긴 체인을 생성하며 공격자보다 빠르게 앞설 수 있습니다. 이 네트워크는 최소한의 구조만을 필요로 하며, 메시지는 최선을 다해 전파되고, 노드는 자유롭게 네트워크를 떠나거나 다시 참여할 수 있으며, 그동안의 사건들을 가장 긴 작업 증명 체인을 통해 확인합니다.

     

    1. 서론

     

    인터넷 상의 상거래는 거의 대부분 금융 기관들이 전자 결제를 처리하는 신뢰할 수 있는 제3자로서 역할을 하면서 이루어집니다. 이 시스템은 대부분의 거래에서는 잘 작동하지만, 신뢰 기반 모델의 본질적인 약점으로 여전히 문제를 겪고 있습니다.

     

    완전히 되돌릴 수 없는 거래는 사실상 불가능합니다. 왜냐하면 금융 기관은 분쟁을 중재하는 역할을 피할 수 없기 때문입니다. 중재의 비용은 거래 비용을 증가시켜 최소한의 실용적인 거래 크기를 제한하고, 소규모의 간단한 거래는 불가능하게 만듭니다. 또한, 되돌릴 수 없는 서비스에 대해 되돌릴 수 없는 결제를 할 수 없는 능력의 상실이라는 더 넓은 비용이 발생합니다. 되돌릴 수 있는 가능성이 존재하면, 신뢰의 필요성은 확장됩니다. 상인은 고객을 경계해야 하고, 그렇지 않으면 필요하지 않은 추가 정보를 요구하게 됩니다. 일정 비율의 사기는 불가피한 것으로 받아들여지게 됩니다. 이러한 비용과 결제에 대한 불확실성은 대면 거래에서는 물리적 화폐를 사용하여 피할 수 있지만, 신뢰할 수 있는 제3자 없이 통신 채널을 통해 결제할 수 있는 메커니즘은 존재하지 않습니다.

     

    필요한 것은 신뢰가 아닌 암호학적 증명을 기반으로 한 전자 결제 시스템으로, 이를 통해 두 당사자가 신뢰할 수 있는 제3자의 개입 없이 직접 거래할 수 있게 됩니다. 계산적으로 되돌릴 수 없는 거래는 판매자를 사기로부터 보호할 수 있으며, 일상적인 에스크로(escrow) 메커니즘을 통해 구매자를 보호할 수 있습니다. 본 논문에서는 피어 투 피어 분산 타임스탬프 서버를 사용하여 거래의 시간 순서를 계산적으로 증명하는 방법으로 이중 지불(double-spending) 문제를 해결하는 방안을 제안합니다. 이 시스템은 정직한 노드들이 협력하는 공격자들의 노드보다 더 많은 CPU 파워를 제어하는 한 안전합니다.

     

     

    2. 거래


    전자 화폐는 디지털 서명의 연쇄(chain)로 정의됩니다. 각 소유자는 이전 거래의 해시와 다음 소유자의 공개 키를 디지털 서명하여 동전을 다음 소유자에게 전송하고, 이를 동전의 끝에 추가합니다. 수취인은 서명을 확인하여 소유권의 연속성을 검증할 수 있습니다.

    문제는 수취인이 이전 소유자가 동전을 이중 지불(double-spend)하지 않았다는 것을 확인할 수 없다는 점입니다. 일반적인 해결책은 신뢰할 수 있는 중앙 권위나 발행 기관(mint)을 도입하여 모든 거래에서 이중 지불을 검사하는 것입니다. 각 거래 후, 동전은 발행 기관에 반환되어야 하며, 새로운 동전이 발행되어야만 이 동전은 이중 지불되지 않았다고 신뢰할 수 있습니다.

     

    이 해결책의 문제는 모든 거래가 발행 기관을 거쳐야 하므로, 전체 화폐 시스템의 운명이 발행 기관을 운영하는 회사에 의존하게 된다는 점입니다. 이는 마치 모든 거래가 은행을 거쳐야 하는 것과 같습니다.

     

    우리는 수취인이 이전 소유자들이 더 이상 이전 거래를 서명하지 않았음을 알 수 있는 방법이 필요합니다. 우리의 목적에 맞게, 가장 초기의 거래가 중요하므로 나중에 발생한 이중 지불 시도는 중요하지 않습니다. 거래가 없었음을 확인할 수 있는 유일한 방법은 모든 거래를 알고 있는 것입니다. 발행 기관 모델에서는 발행 기관이 모든 거래를 알고 있었고, 어느 거래가 먼저 이루어졌는지 결정할 수 있었습니다.

     

    신뢰할 수 있는 제3자 없이 이를 구현하기 위해서는 거래가 공개적으로 발표되어야 하고, 참가자들이 거래가 수신된 순서에 대한 단일한 역사에 동의할 수 있는 시스템이 필요합니다. 수취인은 각 거래가 이루어졌을 당시, 대다수의 노드들이 그것이 첫 번째로 수신된 거래임을 동의했다는 증거가 필요합니다.

     

    3. 타임스탬프 서버


    우리가 제안하는 해결책은 타임스탬프 서버에서 시작됩니다. 타임스탬프 서버는 타임스탬프를 찍을 항목들의 블록에 대한 해시를 생성하고, 그 해시를 신문이나 유즈넷 게시글과 같은 방식으로 널리 퍼뜨리는 방식으로 작동합니다. 이 타임스탬프는 데이터가 해당 시간에 존재했음을 증명합니다. 이는 해시에 포함되기 위해서는 분명히 그 데이터가 그 시점에 존재해야 하기 때문입니다.

     

    각 타임스탬프는 이전 타임스탬프를 자신의 해시 안에 포함시키며, 이렇게 형성된 타임스탬프 체인은 각 추가된 타임스탬프가 이전 것들을 강화하는 구조를 만듭니다.

     

     

    4. 작업 증명 (Proof-of-Work)


    피어-투-피어 방식으로 분산 타임스탬프 서버를 구현하기 위해, 우리는 아담 백의 해시캐시(Hashcash)와 비슷한 작업 증명 시스템을 사용해야 합니다. 여기서는 신문이나 유즈넷 게시글 대신 작업 증명을 사용합니다.

     

    작업 증명은 해시값이 특정 수의 0 비트로 시작하는 값을 찾는 과정을 포함합니다. 예를 들어, SHA-256 해시 함수를 사용할 수 있습니다. 필요한 0 비트의 수에 따라 평균적인 작업량은 지수적으로 증가하며, 이는 단일 해시를 실행하여 검증할 수 있습니다.

     

    우리의 타임스탬프 네트워크에서는 블록 안의 논스(nonce)를 증가시켜 블록의 해시가 요구된 0 비트를 얻을 수 있는 값을 찾는 방식으로 작업 증명을 구현합니다. CPU 노력을 통해 작업 증명이 충족되면, 그 블록은 작업을 다시 하지 않고서는 변경할 수 없습니다. 이후 블록들이 그 뒤에 연결되면서, 해당 블록을 변경하려면 그 이후의 모든 블록들을 다시 작업해야 합니다.

     

    작업 증명은 또한 다수결 결정에서 대표성을 결정하는 문제를 해결합니다. 만약 다수결이 "하나의 IP 주소, 하나의 투표" 방식으로 이루어진다면, 여러 IP를 할당할 수 있는 사람이 이를 조작할 수 있습니다. 하지만 작업 증명은 본질적으로 "하나의 CPU, 하나의 투표" 방식입니다. 

     

    다수결 결정은 가장 긴 체인으로 나타나며, 이 체인은 가장 많은 작업 증명 노력이 들어간 체인입니다. 만약 CPU 파워의 다수가 정직한 노드에 의해 제어된다면, 정직한 체인이 가장 빨리 성장하고 경쟁하는 다른 체인들을 능가할 것입니다. 과거의 블록을 수정하려면, 공격자는 그 블록과 그 이후의 모든 블록에 대해 작업 증명을 다시 해야 하며, 이후 정직한 노드들의 작업을 추격하고 능가해야 합니다. 우리는 이후에 공격자가 더 느리게 추격하는 확률이 후속 블록들이 추가됨에 따라 지수적으로 감소한다는 것을 보여줄 것입니다.

     

    하드웨어 속도의 증가와 시간이 지남에 따라 노드를 실행하려는 관심의 변화를 보상하기 위해, 작업 증명의 난이도는 시간당 평균 블록 수를 목표로 하는 이동 평균에 의해 결정됩니다. 블록이 너무 빠르게 생성되면, 난이도가 증가합니다.

     

     

    5. 네트워크


    네트워크를 실행하는 절차는 다음과 같습니다:

     

    1. 새로운 거래는 모든 노드로 브로드캐스트 됩니다.
    2. 각 노드는 새로운 거래를 블록에 모읍니다.
    3. 각 노드는 자신의 블록에 대해 어려운 작업 증명(proof-of-work)을 찾기 위해 작업을 시작합니다.
    4. 노드가 작업 증명을 찾으면, 블록을 모든 노드로 브로드캐스트 합니다.
    5. 노드는 블록이 유효하고 이미 사용되지 않은 거래만 포함된 경우에만 그 블록을 받아들입니다.
    6. 노드는 받은 블록을 승인하는 방식으로, 승인된 블록의 해시를 이전 해시로 사용하여 다음 블록을 만들기 위해 작업을 시작합니다.

     

    노드는 항상 가장 긴 체인이 올바른 체인이라고 간주하며, 이를 확장하기 위해 계속 작업합니다. 만약 두 노드가 동시에 다른 버전의 다음 블록을 브로드캐스트 하면, 일부 노드는 먼저 받은 블록을 작업하기 시작합니다. 이 경우, 그들은 처음 받은 블록을 작업하되, 다른 분기는 나중에 더 긴 체인이 될 경우를 대비해 저장해 둡니다. 동점이 발생하면, 다음 작업 증명이 발견되고 하나의 분기가 더 길어지면, 다른 분기에서 작업하던 노드들이 더 긴 분기로 전환합니다.

    새로운 거래 브로드캐스트는 반드시 모든 노드에 도달할 필요는 없습니다. 많은 노드에 도달하기만 하면, 곧 블록에 포함될 수 있습니다. 블록 브로드캐스트 또한 메시지 손실에 대해 내성이 있습니다. 만약 노드가 블록을 받지 못하면, 다음 블록을 받았을 때 그것을 놓쳤다는 것을 인지하고 요청할 수 있습니다.

     

    6. 인센티브

     

    일반적으로 블록 내 첫 번째 거래는 특별한 거래로, 블록을 생성한 사람에게 새로운 코인을 시작해 주는 거래입니다. 이는 노드들이 네트워크를 지원하도록 유도하는 인센티브를 제공하며, 중앙 기관 없이 코인이 순환하도록 초기 배분하는 방법을 제공합니다. 새로운 코인을 일정량씩 꾸준히 추가하는 방식은 금광업자들이 자원을 소모하여 금을 순환시키는 것과 비슷합니다. 여기서 자원은 CPU 시간과 전력입니다.

     

    인센티브는 거래 수수료로도 제공될 수 있습니다. 거래의 출력값이 입력값보다 적으면 그 차액은 거래 수수료가 되어, 그 거래가 포함된 블록의 인센티브 값에 추가됩니다. 일정 수의 코인이 순환에 들어가면, 인센티브는 거래 수수료로만 전환되어 완전히 인플레이션 없는 시스템이 될 수 있습니다.

     

    이 인센티브는 노드들이 정직하게 행동하도록 유도하는 데 도움이 될 수 있습니다. 만약 탐욕스러운 공격자가 모든 정직한 노드보다 더 많은 CPU 파워를 모을 수 있다면, 그는 이를 자신이 이미 받은 결제금을 다시 훔쳐내는 데 사용할지, 아니면 새로운 코인을 생성하는 데 사용할지 선택해야 합니다. 그는 시스템을 파괴하고 자신의 재산의 유효성을 약화시키기보다는, 규칙을 따르며 자신에게 더 많은 새로운 코인을 주는 규칙에 따라 행동하는 것이 더 유리하다고 느낄 것입니다.

     

    7. 디스크 공간 회수

     

    한 코인의 최신 거래가 충분한 수의 블록 아래에 묻히면, 그 이전의 사용된 거래들은 디스크 공간을 절약하기 위해 삭제할 수 있습니다. 이를 블록의 해시를 깨지 않으면서 쉽게 할 수 있도록, 거래들은 머클 트리(Merkle Tree) [7][2][5]에서 해시화되며, 블록의 해시에는 트리의 루트만 포함됩니다. 이렇게 하면 오래된 블록들을 트리의 가지들을 잘라내어 압축할 수 있게 됩니다. 트리의 내부 해시들은 저장할 필요가 없습니다.

     

    트랜잭션이 없는 블록 헤더는 약 80바이트 정도의 크기를 가집니다. 만약 블록이 10분마다 생성된다고 가정하면, 80바이트 * 6 * 24 * 365 = 4.2MB가 1년에 저장됩니다. 2008년 기준으로 2GB의 RAM을 탑재한 컴퓨터 시스템이 판매되며, 무어의 법칙에 따라 현재 연간 1.2GB 정도씩 성장한다고 예측되므로, 블록 헤더들이 메모리에 저장되어야 한다 하더라도 저장 문제는 발생하지 않을 것입니다.

     

    8. 단순화된 결제 검증

     

    전체 네트워크 노드를 실행하지 않고도 결제를 검증할 수 있습니다. 사용자는 가장 긴 작업 증명(chain of proof-of-work)의 블록 헤더 사본만을 보관하면 되며, 이 블록 헤더는 네트워크 노드에 질의하여 가장 긴 체인을 확보했다고 확신할 때 얻을 수 있습니다. 또한, 트랜잭션이 타임스탬프된 블록과 연결되는 머클 트리(Merkle tree)의 분기를 얻을 수 있습니다. 사용자는 직접적으로 거래를 검증할 수 없지만, 이를 체인의 특정 위치에 연결함으로써 네트워크 노드가 해당 거래를 수락했다는 것을 확인할 수 있고, 그 후에 추가된 블록들은 네트워크가 거래를 수락했다는 것을 더욱 확실히 증명합니다.

     

    따라서 검증은 정직한 노드가 네트워크를 제어하는 한 신뢰할 수 있지만, 네트워크가 공격자에게 압도당할 경우 더 취약해집니다. 네트워크 노드는 거래를 독립적으로 검증할 수 있지만, 단순화된 방식은 공격자가 네트워크를 압도할 수 있는 한 공격자가 조작한 거래에 속을 수 있습니다. 이를 방어하기 위한 전략 중 하나는, 네트워크 노드가 잘못된 블록을 탐지할 경우 경고를 수신하여 사용자의 소프트웨어가 전체 블록과 경고된 거래를 다운로드하여 불일치를 확인하도록 하는 것입니다. 자주 결제를 받는 비즈니스는 더 독립적인 보안과 빠른 검증을 위해 자체 노드를 운영할 수 있습니다.

     

     

    9. 가치의 결합과 분할

     

    동전들을 개별적으로 처리하는 것도 가능하지만, 이체에서 매 센트마다 별도의 거래를 만드는 것은 불편할 것입니다. 가치를 분할하고 결합할 수 있도록 하기 위해, 거래에는 여러 개의 입력과 출력이 포함됩니다. 일반적으로 거래에는 더 큰 이전 거래에서 나온 하나의 입력 또는 적은 금액을 결합한 여러 입력이 있으며, 출력은 두 개가 될 수 있습니다: 하나는 결제용이고, 나머지 하나는 잉여 금액을 보낸 사람에게 반환하는 용도입니다.

     

    여기서 중요한 점은 팬 아웃(fan-out) 문제입니다. 이는 하나의 거래가 여러 거래에 의존하고, 그런 거래들이 더 많은 거래들에 의존하는 경우를 말하는데, 이는 이 시스템에서 문제가 되지 않습니다. 거래 기록을 완전한 독립된 형태로 추출할 필요는 없습니다.

     

     

    10. 개인정보 보호

     

    전통적인 은행 모델은 거래에 관련된 당사자들과 신뢰할 수 있는 제3자만 정보에 접근할 수 있도록 하여 일정 수준의 개인정보 보호를 달성합니다. 그러나 모든 거래를 공개적으로 발표해야 하는 필요성은 이 방법을 불가능하게 만듭니다. 그럼에도 불구하고, 정보 흐름을 다른 방식으로 차단하여 개인정보를 보호할 수 있습니다. 그것은 바로 공개 키를 익명으로 유지하는 방법입니다. 공개적으로는 누군가가 특정 금액을 다른 사람에게 송금하는 것을 알 수 있지만, 거래와 이를 연결하는 정보는 공개되지 않습니다. 이는 주식 거래소에서 공개되는 개별 거래의 시간과 크기("테이프")가 공개되지만, 당사자가 누구인지는 공개되지 않는 방식과 유사합니다.

     

    추가적인 방어벽으로, 각 거래마다 새로운 키 쌍을 사용하는 것이 좋습니다. 이렇게 하면 거래들이 공통된 소유자와 연결되는 것을 방지할 수 있습니다. 그러나 다중 입력 거래의 경우는 불가피하게 그 입력들이 동일한 소유자에게 속해 있다는 것을 드러내므로 일부 연결은 피할 수 없습니다. 키의 소유자가 공개되면, 그 소유자에게 속한 다른 거래들이 연결될 위험이 존재합니다.

     

     

    11. 계산*

    *11번의 내용에는 수식이 많이 포함되어 있어서 핵심내용으로 번역되었습니다. 

     

    • 목표: 공격자가 정직한 체인을 추월할 확률을 계산.
    • 상황: 공격자가 정직한 체인보다 더 빠르게 대체 체인을 생성하려 할 때, 공격자는 자신이 보낸 거래를 되돌리려고 시도할 수 있음.
    • 경쟁: 정직한 체인과 공격자 체인 간의 경쟁은 이항 확률적 이동(Binomial Random Walk) 모델로 설명할 수 있음. 이는 각 체인이 다음 블록을 찾을 확률을 기반으로 결정됨.

    핵심 공식:

    • p: 정직한 노드가 다음 블록을 찾을 확률.
    • q: 공격자가 다음 블록을 찾을 확률.
    • qz: 공격자가 z 블록 뒤에서 따라잡을 확률.

    공격자가 따라잡을 확률은 지수적으로 감소.

     

    핵심 계산:

    • Poisson 분포를 사용하여 공격자가 진행 상황을 예측.
    • 수신자는 거래가 블록에 추가된 후 z 블록이 추가될 때까지 기다림.
    • 공격자는 병행 체인에서 자신의 거래를 변경하려 시도하고, 수신자는 공격자가 따라잡을 수 있는 확률을 계산.

    확률 계산:

    • λ는 공격자가 따라잡을 확률의 예상 값: λ = z * (q / p)
    • 이 계산은 공격자가 지연된 블록 수(z)에 대해 따라잡을 확률이 지수적으로 감소함을 보여줌.

    결론:

    • 공격자가 정직한 체인을 추월할 확률은 시간이 지남에 따라 급격히 감소.
    • 수신자는 블록 수가 증가함에 따라 거래 변경의 위험이 매우 낮아짐.


    References 

     

    [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





     

    반응형