ビットコイン

ビットコインの起源!『Bitcoin: A Peer-to-Peer Electronic Cash System』論文を日本語で読んでみよう!

f:id:webzap:20171121043454j:plain

今回はビットコインの論文の翻訳を紹介します。

下記サイトの原文、翻訳です!

Bitcoin: A Peer-to-Peer Electronic Cash System

 

少し読みやすいように、論文ちっくな翻訳ではなく説明口調に変えてみました。

興味がある人はぜひ、一度読んでみてください!

 

 

ビットコイン:P2P 電子マネーシステム

中本 哲史

 

satoshi@gmx.com

www.bitcoin.co.jp

 

概要

 

純粋なP2P電子マネーによって、金融機関を通さない甲乙間の直接的オンライン取引が可能になります!

電子マネーにおいて、電子署名は問題の一部を解決するが、依然信用できる第三者機関による二重使用予防が求めらため、その恩恵は失われてしまいます。

そこで、当システムはP2P電子マネーにおける二重使用問題の解決を提案することにしました。

このネットワークは取引に、ハッシュベースの継続的なプルーフ・オブ・ワークチェーンにハッシュ値として更新日時を記録し、プルーフ・オブ・ワークをやり直さない限り変更できない履歴を作成し、最長である一連のチェーンは、取引履歴を証明するだけでなく、それがCPUパワーの最大のプールから発せられたことを証明します。

大多数のCPUパワーがネットワークを攻撃していないノード(ネットワーク接続ポイント)によってコントロールされている限り最長のチェーンが作成され、攻撃者を凌ぐでしょう。

ネットワーク自体は最小限の構成でいいです。

メッセージは最善努力原則で送信され、ノードは自由にネットワークから離脱、再接続することができ、離脱していた間のイベントの証明として最長のプルーフ・オブ・ワークチェーンを受信します。

 

1. イントロダクション

 

インターネットでの商取引は、ほぼ例外なく、電子取引を処理する信用できる第三者機関としての金融機関に頼っているのが現状です。

大多数の取引においてはこのシステムで十分であるものの、信頼に基づくモデルであるがゆえの弱点は残っているでしょう。

この金融機関は争議の仲裁を避けて通ることができないため、完全に非可逆的な取引を扱うことはできません。

また、仲裁コストが取引のコストを引き上げることで、取引規模は限定され、小額取引の可能性が失われます。

さらに、非可逆的サービスに対する非可逆的支払いを提供することができないことによる損失はより広範にわたってしまいます。

可逆的取引を扱うためには信用が問われます。

つまり、商業主は顧客に対し用心深くあらねばならず、顧客から多くの情報を求めることになります。

そして、それは一定の割合の詐欺は避けられないものとして受け入れられていることを意味します。

対個人におけるこれらの損失や支払いの不確さは有形通貨を使うことで避けられますが、第三者機関を通さずに通信チャンネル経由で支払いを可能にするメカニズムは存在していません。

必要なのは、信用ではなく暗号化された証明に基づく電子取引システムであり、これにより希望する二者が信用できる第三者機関を介さずに直接取引できるようになることです。

コンピュータ的に事実上非可逆的な取引は売り手を詐欺から守り、容易に実施できる習慣的なエスクロー(第三者預託)メカニズムにより買い手も守られる。

この論文では、時系列取引のコンピュータ的証明を作成するP2P分散型タイムスタンプ・サーバーを用いた、二重支払い問題の解決策を提案します。

本システムは、良心的なノードが集合的に、攻撃者グループのノードを上回るCPUパワーをコントロールしている限り安全であると言えます。

 

2. 取引

 

一つの電子コインは、連続するデジタル署名のチェーンと定義されます。

電子コインの各所有者は、直前の取引のハッシュと次の所有者のパブリック・キー(公開鍵)をデジタル署名でコインの最後に加えることにより、電子コインを次の所有者に転送します。

受取人は一連の署名を検証することで、過去の所有権を検証できます。

 

f:id:bitcoin_picks:20140915154221p:plain

 

 

無論、問題は受取人には過去の所有者がコインを二重使用していないことを検証できないことにあるでしょう。

一般的な解決法は信用のおける中央機関もしくは造幣局を間に入れ、全取引を監視させることです。

取引の度にコインは造幣局に戻され、新しいコインが発行され、造幣局から新しく発行されたこのコインのみが二重使用されていないものとして信用されます。

この解決法の問題は、全取引が造幣局を通じて行われるため、銀行と同様に造幣局を運営している企業に、金融システム全ての運命が左右されることです。

そこで必要なのは、コインの受取人に今までの所有者らが二重署名していないことを知らせる方法です。

この目的においては、最初の取引だけが論点であるので、後の二重支払いの試みについては関係のないものとします。

取引がなかったことを明確にするには全取引を監視する必要があります。

造幣局モデルの解決方法では、造幣局が全取引を監視し取引の順番を決定していました。

これを第三者機関なしに行うには、取引が公開され、参加者たちが受け取った順番の唯一の取引履歴に合意することのできるシステムが必要となります。

受取人は取引毎に、取引が行われた時点で大多数のノードがそのコインが初めて使用されたことに賛同したという証明を必要とします。

 

3. タイムスタンプ・サーバー

 

提案する解決法は、まずタイムスタンプ・サーバーの提案です。

タイムスタンプ・サーバーは、タイムスタンプされる複数アイテムを含むデータブロックをハッシュとして処理し、そのハッシュを新聞やUsenetポスト[2-5]のように広範囲に公開します。

タイムスタンプにより、そのデータがタイムスタンプされた時点でハッシュとなるために存在していたことが証明されます。

各タイムスタンプはそのハッシュの中に直前のタイムスタンプを含んでいくことでチェーンを形成し、タイムスタンプが増えるたびに以前のタイムスタンプを強化していきます。

 

f:id:bitcoin_picks:20140915154240p:plain

 

 

4. プルーフ・オブ・ワーク

 

P2Pベースで分散型サーバーを実行するには、新聞やUsenetポストというよりはアダム・バックのハッシュキャッシュ[6]に似た、プルーフ・オブ・ワークシステムを使用する必要があります。

プルーフ・オブ・ワークには、例えばSHA-256のような、ハッシュ化された時に0ビットの番号で始まるハッシュ値のスキャンが含まれます。

通常作業に要求されるのは、必要な0ビットの番号の指数関数であり、これはハッシュ一つを実行することで検証されます。

我々のタイムスタンプネットワークでは、ハッシュ化の際に要求される0ビットを与える値が見つかるまでの間、データブロックにワンタイムパスワードを足すことでプルーフ・オブ・ワークを実現しています。

一度プルーフ・オブ・ワークを満たすべくCPUパワーが費やされると、この作業をやり直さない限りそのデータブロックを変更することはできません。

その後のデータブロックもチェーン化されて後に連なるため、該当ブロックを書き換えようとするならば、それ以降の全てのブロックを書き換えなくてはならないのです。

 

f:id:bitcoin_picks:20140915154303p:plain

 

このプルーフ・オブ・ワークはまた、多数決で意思決定をする際の代表をどうするかという問題を解決します。

もし1IPアドレスにつき一票としたならば、多くのIPアドレスを取得できる者は誰でもシステムを乗っ取ることができてしまうでしょう。

しかし、プルーフ・オブ・ワークは原則的に1CPUにつき一票です。

そのため、多数決の意思決定は、最も多くのプルーフ・オブ・ワークの労力が費やされたことを示す最も長いチェーンによって表されます。

CPUパワーの過半数が良心的なノードによってコントロールされるとき、その良心的なチェーンは他のどのチェーンよりも早く成長します。

過去のデータブロックを書き換えるためには、攻撃者はそのブロックのプルーフ・オブ・ワークだけでなくその後に続くプルーフ・オブ・ワークを書き換え、さらに良心的なチェーンに追いつき、追い越さなければなりません。

低速の攻撃者が良心的チェーンに追いつく可能性は、後続のブロックが追加されるごとに指数関数的に減少していくでしょう。これはのちに説明します。

加速するハードウェアスピードと長期的に変動する利益レートに対応するために、プルーフ・オブ・ワーク算出の難易度は、一時間ごとのブロック数を一定の平均値に保つことを目指す平均移動によって決定されるでしょう。

さらに、ブロック算出のスピードが速ければ速いほど難易度が増します。

 

5. ネットワーク

 

ネットワーク実行の手順は以下の通りです。

新しい取引は全ノードに送信されます。
各ノードが新しい取引をブロックに取り入れます。
各ノードがそのブロックへのプルーフ・オブ・ワークを算出します。
プルーフ・オブ・ワークを見つけ次第、各ノードはそれを全ノードに告知します。
ノードは、ブロックに含まれる全ての取引が有効であり、以前に使われていない場合のみ、それを承認します。
ノードは、承認されたブロックのハッシュを直前のハッシュとして用いて、チェーンの次のブロックの作成を開始することで、ブロック承認を表明します。

ノードは常に最長のチェーンを正しいものと判断し、それをさらに延長しようとします。

もし二つのノードが同時に異なる二パターンのブロックを次のブロックとして告知した場合、ノードによって受信の順番が入れ替わる可能性があります。

ただその場合、ノードは最初に受信した方のブロックを処理しますが、もう一つのブロックも保存しそちらのチェーンが長くなった場合に備えておきます。

次のプルーフ・オブ・ワークが発見され、どちらかのチェーンが伸びたとき、そちらが正しいチェーンと認識され、もう一つのチェーンに取り組んでいたノードはより長いチェーンに切り替えます。

新しい取引の告知は必ずしも全ノードに届かなくともいいです。

それは、告知が多数のノードに受信されている限り、やがてブロックに組み込まれるからです。

ブロック告知もまたメッセージの欠落に耐えうります。

仮に、ノードがブロックを受信しなかった場合、次のブロックを受信するときにそれを要求し、一つ受信していなかったことを認識します。

 

6. インセンティブ

 

慣例により、ブロック内の最初の取引は新しいコインを始める特別な取引とされ、そのコインはブロック作成者のものとなります。

これはノードにネットワークを支持するインセンティブとなると同時に、コインを発行する中央機関不在の中、最初にコインを配布する方法としても機能します。

新しいコインを一定量安定して追加していくことは、金鉱労働者が働いて採金し、金の流通量を増やすことと似ています。

この場合は、働いてるのはCPU時間と電力です。

インセンティブは、取引手数料によっても得ることができます。

もしある取引でアウトプットされた価値がインプットされた価値よりも少ない場合、その差は取引手数料としてその取引を含むブロックのインセンティブに加算されます。

ひとたびコインの流通量が既定の数値に達するとインセンティブを取引手数料として使うことが可能になり、またコインは既定以上流通されないのでインフレからは完全に解放されます。

インセンティブはノードが良心的であり続ける動機となりうります。

もし欲深い攻撃者が良心的なノードの合計を上回るCPUパワーを作り出すことができたとして、攻撃者はそのパワーを使って、他の良心的なノードから自分の支払った金額を盗んで取り戻すか、新しいコインを作り出すかの選択を迫られることになり、おのずと自分の資産価値とそれを支えるシステムを損なうよりも、ルールに従って行動し、他の全ノードを合わせたよりも多くの新しいコインを作りだすほうが、自分の利益になると考えるだろうからです。

 

7. ディスク・スペースをリクレイムする

 

コインの最新の取引が十分な数のブロックに書き込まれると、それ以前の取引記録はディスク・スペースを節約するために破棄することができます。

ブロックのハッシュを壊さずにこの作業を行うために、取引はそのブロックのハッシュにルートしか含まないマークル・ツリー(Merkle Tree[7][5])を用いてハッシュ化される。古いブロックは、ツリーのブランチを取り除くことで軽くすることができます。

インテリア・ハッシュを保存する必要はありません。

 

f:id:bitcoin_picks:20140915155208p:plain

 

マークル・ツリーを用いてハッシュ化された取引ブロックからTx0-2を取り除いた後引なしのブロック・ヘッダーは約80 bytesです。

仮に十分ごとに一つのブロックが作成されると仮定すると、

80 bytes × 6 ×24 ×365 = 4.2 MB/年

となります。

2008年の時点で平均的なパソコンは2 GBのRAMで売られており、ムーアの法則によると1.2 GB/年のペースで増大すると予測されるので、ブロック・ヘッダーをメモリに保存しておく必要があってもスペースの問題はないはずです。

 

8. 簡易版支払い検証

 

完全なネットワークノードを実行していなくとも、支払いを検証することは可能です。

ユーザーは、ネットワークノードにクエリーを行って得られる最長のチェーンが含む各ブロックのブロック・ヘッダーのコピーを保存しておくだけで、そのブロックにタイムスタンプされている取引をブロックにリンクしているマークル・ブランチを得ることができるからです。

ユーザー自身が自らその取引をチェックすることはできませんが、そのマークル・ブランチをチェーンにリンクすることで、ネットワークがその取引を承認済みということが確認でき、またその後にブロックが加えられていったことでさらなる確証が得られます。

 

f:id:bitcoin_picks:20140915155231p:plain

 

このように、良心的なノードがネットワークをコントロールする限り検証は信頼のおけるものとなりますが、ネットワークが攻撃者に乗っ取られた場合には脆弱になります。

ネットワークは自身で取引を検証できる一方で、各ノードが行う簡易版は、攻撃者がネットワークを乗っ取り続ける限り攻撃者の偽造した取引にだまされてしまいます。

一つの対処法は、ネットワークが不正なブロックを感知したときに発するアラートを受信する設定にしておき、受信した場合はユーザーのソフトウェアによりブロック全体とアラートされた取引をダウンロードし、不一致を確認することです。

頻繁に支払いを受け取るビジネスに関しては、より独立した安全性とスピードの速い検証のために、独自のノードを運営するほうが良いでしょう。

 

9. 価値の結合や分割

 

一つ一つのコインを個別に扱うことも可能な一方で、取引に使われる金額を1セントずつ個別に取引することは非常に不便です。

価値の分割や結合を可能にするために、取引には複数のインプットとアウトプットが含まれます。

通常、インプットはより価値の大きい前の取引からの一つのインプットか小額のものをいくつか合わせた複数のインプットで、アウトプットは多くても二つ、次の支払いに向かうものが一つと、おつりがあればそれを支払い元に戻すものが一つです。

 

f:id:bitcoin_picks:20140915155259p:plain

 

注目すべきは、一つの取引が複数の取引に依存し、それらの取引もまた多数の取引に依存しているファンアウトはここでは問題でないことにあります。

取引履歴からある取引の完全に独立したコピーを抽出する必要性はあり得ないからです。

 

10. プライバシー

 

従来の銀行モデルは、情報へのアクセスを関連団体と信頼のおける第三者機関に限定することで一定レベルのプライバシーを実現しています。

全取引を公開する必要性はこの可能性を除外しますが、情報のフローを他の箇所で分断することでプライバシーを保つことができます。

パブリック・キーを匿名にするのです。

誰かが他者にどれだけのコインを送っているかは公開されますが、その取引情報は誰にもリンクされていません。

これは個別の取引の時間やサイズ、「テープ」は公開されても取引の当事者は明らかにされない証券取引と同等の情報レベルであります。

 

f:id:bitcoin_picks:20140915155320p:plain

 

追加のファイアウォールとして、同一の所有者にリンクされることを防止するためには、取引一回ごとに新しいペアのキーを用いる必要があります。

複数インプットの場合はそれらのインプットが同じ所有者に所有されていることがどうしても露見するので、多少のリンクを避けることはできません。

さらに他のリスクは、もしキーの所有者が明らかになった場合、そのリンクにより同じ所有者が関わった他の取引も露見する可能性があることです。

 

11. 計算

 

攻撃者が正当なチェーンよりも速いスピードで偽のチェーンを作成しようとするシナリオを考えてみます。

仮にそれに成功したとしても、コインを無から創り出したり攻撃者自身が所有したことのないコインを盗んだりというようにシステムを自由に操れるようになるわけではありません。

ノードは無効な取引を用いた支払いも無効な取引を含んだブロックも拒絶するからです。

攻撃者にできるのは自身の取引記録を書き換えることで、最近支払った金額を取り返そうとすることだけです。

良心的なチェーンと攻撃者のチェーンの競争は二項酔歩(二項ランダムウォーク)と特徴づけられます。

成功のイベントは良心的なチェーンが一ブロック延長してリードが一つ増えること、失敗のイベントは攻撃者のチェーンが一ブロック延長して差が一つ縮められることです。

攻撃者が与えられた遅れを取り戻す確率はギャンブラー破産の問題と似ています。

無限の資金を持つギャンブラーが赤字からスタートして損益分岐点を目指して無数の賭けを行うと仮定します。

彼が損益分岐点に到達する確率、もしくは攻撃者が良心的なチェーンに追いつく確率は以下のように計算することができます。

P = 良心的なノードが次のブロックを見つける確率

q = 攻撃者が次のブロックを見つける確率

qz= 攻撃者がzブロックの遅れから追いつく確率

 

f:id:bitcoin_picks:20140915155404p:plain

 

p>q というわれわれの仮定を前提とすると、追いつかなくてはならないブロックの数が増えるにしたがい確率は指数関数的に下がっていきます。

この分の悪い確率のもとでは、初期の段階でよほどの幸運に恵まれて突進しない限り、彼が追いつく確率は、さらに遅れをとっていく中でまずあり得ないほど小さくなっていきます。

次に、新しい取引の受け手が、送り手がもう取引内容を変更できないと確信できるまでにどれだけの時間、待つ必要があるかを考えます。

送り手が攻撃者で、受け手に支払いを済ませたとしばらくの間信じ込ませたのちに自分に払い戻そうとしていると仮定します。

その場合受け手はアラートを受信しますが、送り手(攻撃者)はその時点ですでに手遅れとなっていることを望むものとします。

受け手はパブリック・キーを作成し、電子署名する直前にそれを送り手に送ります。

これにより、送り手が前もって偽のチェーンを用意しておきパブリック・キーが送られてきた瞬間に偽の取引を行うことを防止できます。

取引が送信されるやいなや、不正な送り手(攻撃者)は密かにもう一つのバージョンの取引を含んだパラレル・チェーンの作成に取りかかります。

受け手は自分の取引がブロックに加えられ、z 個のブロックがその後にリンクされるまで待ちます。

受け手には攻撃者の正確な進捗は分かりませんが、正当なブロックが平均的な時間で作成されたと仮定すると、攻撃者の進捗は以下のポアソン分布の期待値で求められるます。

 

f:id:bitcoin_picks:20140915155426p:plain

 

攻撃者がこの時点で追いつくことのできる確率を求めるには、彼の行うことのできた仕事量あたりのポアソン分布密度を、その時点での追いつくことができた確率で掛けます。

 

f:id:bitcoin_picks:20140915155442p:plain

 

これをCコードに変換すると…

 

  #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 * (1pow(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

 

 

Pが0.1%以下の時について値を求めると…

 

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

 

12. 結論

 

本論文では、信用に依存しない電子取引のシステムを提案しました。

電子署名で作られるコインという従来通りのフレームワークは所有権を強くコントロールを実現できますが、二重支払い防止対策なしには不完全です。

その解決策として、良心的なノードがCPUパワーの過半数をコントロールする限り、プルーフ・オブ・ワークを使って記録された公開型の取引履歴を攻撃者が変えようとすることが、コンピュータ的に加速度的に実質上実行不可能になっていくP2Pネットワークを提案しました。

ネットワークは非構造の単純性により堅固になっています。

各ノードは同時に動作するが協調性は低いです。

メッセージは最善努力原則で送信すればよく、また特定の場所に転送されるわけではないのでノードが特定される必要性はありません。

ノードは自由にネットワークに接続、離脱でき、離脱していた間のプルーフ・オブ・ワーク・チェーンをその間の取引の証明として承認します。

ノードはCPUパワーを用いて受信したチェーンへの承認・拒絶を表明し、受信したチェーンが有効であると受け入れた場合にはそれに含まれるブロックを延長することで承認を表明し、無効なブロックであればそれらの処理を拒否することで拒絶を表明します。

必要なルールやインセンティブはこの合意メカニズムに従って実行できます。

 

まとめ 

今回はビットコインの論文を紹介しました。

いやーかなりの量がありましたね。

とっても疲れました。。。

おそらくこれを読んでも、完全に理解できる人は少ないかと思います。

ですので別記事でビットコインの技術についてまた解説させてもらおうと思います。

これを全て読んだあなた、本当にお疲れ様です。