ビットコインホワイトペーパー略解

2021-07-04
2021-02-01

はじめに

最初に普及したブロックチェーンであろうビットコインの仕組みについて,原点であるホワイトペーパー(サトシ・ナカモトのビットコイン論文)を噛み砕いたものです.BIP (Bitcoin Improvement Proposal) によって日々改善されていくので現在の仕様と異なる部分はありますが,基本的な考え方として抑えておくのは良いと思います.

本論文では大まかに以下の概念が説明されています.

  • トランザクション
  • 電子署名の活用
  • 二重支払い問題
  • Proof of Work
  • インセンティブの基本設計
  • マークルツリーハッシュ
  • フルノードと SPV

もともと自分の理解のために書いたもので,全文完全翻訳ではありません.一部意訳や補足が含まれますがご了承ください.

Abstract

銀行等の金融機関や電子決済を提供する資金移動業者を介さずに,オンライン上の二者間で送り合うことを P2P 決済システムなどと呼びます.電子署名を利用すればいい感じに解決できますが,二重支払いを防ぐために先述の仲介者が必要になっているのが現状です.そこで,仲介者を必要としない P2P (Peer-to-peer) ネットワークで二重支払いのない仕組みを実現することを一つの目的としてビットコインが考えられました.

ビットコインブロックチェーンは以下のような特徴を持っています.

  • Proof of Work (PoW) で取引記録の真正性を保証する
  • ブロックチェーン(取引記録の連なり)の長さ,すなわち計算機の演算能力の高さで信頼性を評価する
  • メッセージはビットコインネットワーク上でブロードキャストされる
  • ネットワークへの参加及び離脱は任意のタイミングで可能

Introduction

インターネット上の商取引では電子決済を行うために信用の置ける第三者の存在が必須ですが,この信用ベースの取引は弱点を内在しています.その弱点とは,完全に不可逆な取引が実現不可能であるということです.

例として,マーケットプレイス型の EC サイトでの商品購入のプロセスを考えてみます.顧客が商品を購入し,販売者は商品を発送するとき,このプロセスには顧客,販売者,EC サイト運営者(決済の仲介者)が登場しています.この三者の中で誰か一人でも悪意を持つ人がいれば取引はうまくいきません.取引の第三者である EC サイト運営者,或いは決済の仲介者(金融機関,資金移動業者等)が信頼できる存在であったとしても,以下の二つのケースが考えられます.

  • 悪意のある顧客が商品到着後に返品を申請し,返金を受けながら商品を返送しない
  • 悪意のある販売者が代金を受け取りながら商品を発送しない

このような場合は EC サイト運営者が取引を仲裁しなければなりません.具体的には,販売者が返金した金額を補填する,商品購入金額を返金する,などの対応が考えられます.いずれも仲裁した第三者の取引コストを上昇させる原因となります.トラブルを避けるために販売者は信用できる顧客であるか判断するために,より多くの情報を求めるようになります.顧客にとっては入力する内容が増えるので面倒です.

対価を得ながら支払いをしないことは一般に「二重支払い問題」と呼ばれています.一度支払ったものを取り消し,そのお金を使ってもう一度支払うことができるからです.

例に挙げたような詐欺的行為は一定の確率で発生します.対面で物理的にお金をやり取りする場合にはこのような問題は発生しませんが,インターネット上の取引は信用できる第三者なしには成り立ちません.

そのため,電子決済には第三者を必要とせず従来の信用に代わる暗号学的証明をベースにしたシステムが求められます.コンピュータ上で不可逆な取引かつエスクローを実現するメカニズムを実装すれば,販売者も顧客も安全に取引できるというわけです.

ビットコインは二重支払い問題の解決策として,P2P ネットワーク上に分散したタイムスタンプサーバ(ノード)における時系列の取引ベースの証明方法を提案しています.このシステムはネットワーク上の信頼できるノード群が攻撃者よりも多くの演算処理性能を持っている限り,安全であると考えられています.

Transaction

ビットコインの実態は電子署名が連なったチェーンです.例えば,A さんから B さんへビットコインを送金(使用)する際に,A さん宛ての一つ前のトランザクション(取引記録)+送信先 B さんの公開鍵のハッシュに電子署名を施します.電子署名では送信元 A さんの秘密鍵を用いるため,A さんが支払ったことを証明できます.トランザクションには B さんの公開鍵が含まれるため,B さんは自分の秘密鍵を使用することで自分宛ての送金であることを検証できます.また,B さんがこのビットコインを使用するときには同様に B さんの秘密鍵で電子署名をすることになります.

bitcoin-whitepaper-1.png

ここで問題となるのは,受取人である B さんは支払人である A さんが二重支払いをしていないか確認できないことです.一般的な解決策としては信頼されている中央機関が二重支払いがないかをチェックし,その中央機関が造幣局として発行する通貨のみを信用する方法が考えられます.しかし,この解決策ではまさに銀行のような金融システムを動かしている企業や組織に依存することになります.

この問題を解決するには,A さんが B さん以外の人に署名済みトランザクションを送信できないという仕組みが必要です.そのため,ビットコインブロックチェーンでは最初に確認されたトランザクションのみを正しいものとみなし,他は無視するという方法を採用しました.そして,演算ノード群がすべてのトランザクションを認識し,どのトランザクションが最初に到達したか確認するしかありません.このシステムを中央機関のような第三者無しで成立させるためには,すべてのトランザクションを公開し,このトランザクション達がどのような順番で送られてきたのかを記録している唯一の履歴が必要になります.ノード群の大多数がこのトランザクションが最初に到達したものだと認めることで,支払人が正しく支払ったことの証明とするのです.

Timestamp Server

ビットコインブロックチェーンの肝となる技術の一つにはタイムスタンプサーバの存在があります.タイムスタンプサーバは複数のデータを取り込んだブロック+前ブロックのハッシュ+タイムスタンプをハッシュ化して公表する役割を持っています.ハッシュ化する際にタイムスタンプを含めることでデータがその時点で存在していたことを証明できます.また,前のブロックのハッシュを含めてチェーンのように関連付けていれば一部のデータのみを書き換えることができなくなるため,チェーン自体を補強できます.

Proof of Work

分散するタイムスタンプサーバが P2P で接続されるシステムを構築するためには proof-of-work (PoW) という仕組みが必要になります.proof-of-work という言葉は Hashcash1 で登場していて,SHA-256 等のハッシュ関数の一方向性を利用することで演算能力を以て,作業内容の正しさを証明するというものです.ビットコインブロックチェーンにおける取引記録の正しさはこの PoW によって維持されています.

bitcoin-whitepaper-2.png

タイムスタンプサーバは複数の取引記録を含むブロックをブロックチェーンに追加する際,前項で説明したように複数の取引データ+前ブロックのハッシュ(+タイムスタンプ)をハッシュ化しますが,PoW のためにナンスという数字も含めるようにします.平たく表現すれば,PoW というのはハッシュ化したときに条件に合うナンスを見つけるという作業です.条件とはハッシュの先頭数ビットが0になるというもので,先頭に必要な0の数を増やすと計算時間が指数的に増加するため,難易度調整に用いられます.ハッシュ関数は一方向性を持つため出力から入力の値を逆算することは極めて難しく,入力に含まれる唯一の変数であるナンスに1加算してハッシュを計算するという繰り返しで条件を満たすナンスを見つけなければなりません.また,ナンスを求めたブロックをブロックチェーンに追加した後,記録内容の変更にはハッシュの再計算を伴います.記録内容が変更されるとハッシュの入力が変わり,同じナンスでは条件を満たせなくなるためです.ブロックには前ブロックのハッシュも含まれるため,数ブロック前の記録内容を変更するためにはそれ以降に連なっているすべてのブロックのナンスを再計算しなければなりません.ここに,ビットコインブロックチェーンの改竄は難しいと言われる所以があり,以上のように PoW は計算量を担保として取引記録の信用性を保っています.

PoW はデータの真正性を保証するだけでなく,意思決定プロセスの解決策にもなっています.ビットコインブロックチェーンではチェーンが複数存在していても,最もブロックが連なっている最長のチェーンを正しいものとみなすと決められています.ブロックを追加するためには PoW の計算が必須であり,演算能力が高いほど速くチェーンが伸ばせるため,演算能力の高さが取引記録の真偽を決めているとも言えるわけです.善意のノードの演算能力が大部分を占める限り,攻撃者よりも速くチェーンを伸ばすことができるため安全であると言えます.

ハードウェアの進化によってナンスの計算時間は次第に短くなるため,ブロックの生成スピードは速くなってしまいます.そのため,先述のようにナンスに求める条件を変更して難易度調整を行い,一時間あたりに生成されるブロックが一定になるように設計されています.

Network

ビットコインネットワークを動かすために以下のステップを実行しています.

  1. 新しいトランザクションがすべてのノードにブロードキャストされる
  2. 各ノードはこのトランザクションを集めてブロックに格納する
  3. 各ノードは PoW でブロックのナンスを求める
  4. ナンスを見つけたノードはすべてのノードにブロックをブロードキャストする
  5. その他のノードはブロードキャストされたブロック内のトランザクションに誤りがないか確認する
  6. 各ノードは次のブロック生成時に5のブロックのハッシュを含めることで内容を承認したことを示す

ノードは最長のブロックチェーンにブロックを追加していきます.ブロック生成時に求めるナンスは条件を満たせば良いため,異なるノードから同時に異なるバージョンのブロックがブロードキャストされることも考えられます.この場合は,複数のバージョンのブロックがチェーンに連なっている状態,すなわちチェーンが部分的に2本になっていますが,次のブロック生成時に長くなったチェーンが正しいものとみなされます.

すべてのノードにトランザクションが到達するのを待つ必要はありません.多くのブロックに到達していればトランザクションがブロックに含まれることになるからです.ブロックについても同様で,ノードがブロードキャストされたブロックを受け取れていなくても次のブロック生成時に前のブロックが欠けているとわかります.

Incentive

ブロックに複数含まれるトランザクションの中で最初のものは,ノード自体が生成する特別なトランザクション(コインベース)です.コインベースはノード宛てのトランザクションで,ブロック生成・検証の報酬としてビットコインが支払われます.これがビットコインブロックチェーンにおける唯一の造幣手段です.時間とお金(+電力)をかけて PoW に参加することで定額の報酬を受け取る様は,金の採掘に見立ててマイニングと呼ばれています.

インセンティブにはブロック生成報酬以外に,トランザクション手数料があります.ブロックに含まれるトランザクションは送金金額と実際に受け取る金額に差があり,その差が手数料としてブロックを生成したノードに支払われます.ビットコインの総供給量は上限が決められているので,造幣が終了したらトランザクション手数料のみがノードの報酬となります.

このインセンティブはビットコインネットワークを安全に保つために必要とされています.PoW を採用するブロックチェーンの一般的な攻撃方法は,善意のノードによる演算能力を上回る性能で最長のブロックチェーンを作り出し,ビットコインを詐取することです.しかし,それだけの演算能力を保有していれば,わざわざ詐取せずともマイニング報酬を受け取るほうが理に適っていると言えます.また,詐取によってブロックチェーンの信頼性が薄れ,ビットコインの価値が低下すれば得られる取り分はマイニング報酬よりも少なくなるため,攻撃してもおいしくないのです.

Reclaimimg Disk Space

ブロックチェーンの先端に新しいブロックが連なっていき,ある程度深くなったらかつてのトランザクションの情報は不要になるため,これを破棄することで保存領域を節約できます.しかし,すべて消してしまうと検証できずにシステム上困ったことになるため,マークルツリーを使ってトランザクションのハッシュを圧縮します.マークルツリーは二分木構造を持つハッシュ木で,葉と葉の間でハッシュの文字列を結合し,根に対してそのハッシュを渡すという再帰的プロセスで情報を圧縮しています.

bitcoin-whitepaper-3.png

このようにしてブロックに含まれていたトランザクションの情報を圧縮し,マークルハッシュで置き換えたブロックヘッダの連なりで管理できるようにします.

Simplified Payment Verification

ブロック生成・検証を行うフルノードの運用には過去のブロックチェーンのすべてのデータが必要になりますが,支払い内容を検証するだけならその必要はありません.最長のブロックチェーンのブロックヘッダのコピーのみを保持し,該当するタイムスタンプを含むブロックのマークルツリーのブランチを確認することで,自身の支払いが承認されたかどうかを検証できます.この方法ではトランザクションの正しさは検証できませんが,支払いの承認のみを検証できれば良い SPV ウォレット(軽量ウォレット)等に用いられる技術です.

bitcoin-whitepaper-4.png

SPV は善意のノードによる演算能力が高い間は安心して使えますが,攻撃者の演算能力がこれを上回っている間はトランザクションを捏造される可能性があるという意味で脆弱性を持ちます.善意のフルノードが機能していることが前提として必要です.

Combining and Splitting Value

今まで述べてきたようにビットコインの支払いはトランザクションベースで行われますが,支払うビットコインの量を任意に指定できなければ不便です.そのため,トランザクションの入出力に複数のトランザクションをあててよいことになっています.すなわち,送るためのビットコインが単体のトランザクションで足りなければ複数を束ねて入力とし,使用する単体のトランザクションが送金額を上回るなら送金用と自分への返金用という具合に複数のトランザクションに分割して出力とすることができます.

Privacy

従来の銀行のモデルは立場に応じて機密情報に段階的にアクセスするというものでしたが,ビットコインはシステム上すべてのトランザクションを公開しなければなりません.そうなると取引の機密性は完全に失われているように思えますが,トランザクションに記録されているのは誰にいくら支払ったかということだけです.「誰に」の部分は公開鍵で示されているので,その公開鍵の持ち主を明らかにしなければプライバシーを保つことができます.

また,機密性を高めるためにそれぞれの取引でキーペアを変更するという方法も利用できます.もし,同じ公開鍵を使いまわしていれば一度取引したことがある相手のトランザクションを見つけることが可能ですが,一人で複数の公開鍵を使用すれば鍵をたどることはできません.

Calculations

ビットコインネットワーク上に善意のノードと攻撃者のノードが存在するとき,攻撃が成功する確率はどれくらいあるのかを数値実験した結果が示されています.詳細は省きますが,攻撃者がブロックのマイニングに成功したとしても最長のチェーンを維持し続けるのは確率的に困難であるということが書かれています.

おわり

参考

原文であるビットコインホワイトペーパーは以下で公開されています.

https://bitcoin.org/bitcoin.pdf


  1. Back, A. (2002). Hashcash - a denial of service counter-measure.