Satoshi Nakamoto
佐藤 誠
ビットコイン
概要: 電子現金の純粋なピアツーピア バージョンでは、金融機関を介さずに、オンライン支払いを一方から他方へ直接送信できます。デジタル署名はソリューションの一部を提供しますが、二重支払いを防ぐために信頼できる第三者が必要な場合は、主な利点が失われます。ピアツーピア ネットワークを使用した二重支払い問題のソリューションを提案します。ネットワークは、ハッシュ ベースのプルーフ オブ ワークの進行中のチェーンにトランザクションをハッシュすることで、トランザクションにタイムスタンプを付け、プルーフ オブ ワークをやり直さない限り変更できないレコードを形成します。最長のチェーンは、目撃された一連のイベントの証明としてだけでなく、最大の CPU パワー プールから発生したことの証明としても機能します。CPU パワーの大部分が、ネットワーク攻撃に協力していないノードによって制御されている限り、それらのノードは最長のチェーンを生成し、攻撃者を上回ります。ネットワーク自体には最小限の構造が必要です。メッセージはベストエフォート方式でブロードキャストされ、ノードは自由にネットワークから離脱したり再参加したりすることができ、離脱中に何が起こったかの証明として最長の作業証明チェーンを受け入れます。
1. はじめに
インターネット上の商取引は、電子決済を処理する信頼できる第三者として機能する金融機関にほぼ全面的に依存しています。このシステムはほとんどの取引で十分に機能しますが、信頼に基づくモデルに固有の弱点が依然としてあります。金融機関は紛争の調停を避けられないため、完全に不可逆な取引は実際には不可能です。調停のコストは取引コストを増大させ、実用的な最小取引サイズを制限し、小規模な臨時取引の可能性を断ち切ります。また、不可逆なサービスに対して不可逆な支払いを行う能力を失うことで、より広範なコストが発生します。不可逆の可能性により、信頼の必要性が広がります。商人は顧客を警戒し、通常必要となる以上の情報を顧客に要求しなければなりません。一定の割合の詐欺は避けられないものとして受け入れられています。これらのコストと支払いの不確実性は、物理的な通貨を直接使用することで回避できますが、信頼できる当事者なしで通信チャネルを介して支払いを行うメカニズムは存在しません。
必要なのは、信頼ではなく暗号証明に基づく電子決済システムです。これにより、信頼できる第三者を必要とせずに、任意の 2 つの意思のある当事者が直接取引できるようになります。計算上、取り消すことが不可能な取引は、売り手を詐欺から保護し、通常のエスクロー メカニズムを簡単に実装して買い手を保護することができます。この論文では、ピアツーピアの分散タイムスタンプ サーバーを使用して、取引の時系列の計算証明を生成することで、二重支払いの問題に対するソリューションを提案します。正直なノードが、協力する攻撃ノードのグループよりも多くの CPU パワーを総合的に制御している限り、このシステムは安全です。
2. 取引
電子コインは、デジタル署名のチェーンとして定義されます。各所有者は、前のトランザクションのハッシュと次の所有者の公開キーにデジタル署名し、これらをコインの末尾に追加することで、コインを次の所有者に転送します。受取人は署名を検証して所有権のチェーンを検証できます。
もちろん、問題は受取人が所有者の 1 人がコインを二重に使用していないことを確認できないことです。一般的な解決策は、すべてのトランザクションで二重使用をチェックする信頼できる中央機関、つまり造幣局を導入することです。各トランザクションの後、コインは造幣局に返却され、新しいコインが発行されます。造幣局から直接発行されたコインだけが二重使用されていないと信頼されます。この解決策の問題は、貨幣システム全体の運命が造幣局を運営する会社にかかっており、すべてのトランザクションは銀行と同じように造幣局を経由する必要があることです。受取人が、以前の所有者が以前のトランザクションに署名していないことを知る方法が必要です。私たちの目的のためには、最も古いトランザクションが重要なので、後で二重使用を試みることは気にしません。トランザクションがないことを確認する唯一の方法は、すべてのトランザクションを認識することです。造幣局ベースのモデルでは、造幣局はすべてのトランザクションを認識し、どのトランザクションが最初に到着したかを決定していました。信頼できる当事者なしでこれを実現するには、取引を公開する必要があり[1]、参加者が取引が受け取られた順序の単一の履歴に同意するシステムが必要です。受取人は、各取引の時点で、大多数のノードがそれが最初に受け取られたものであることに同意したことを証明する必要があります。
3. タイムスタンプサーバー
私たちが提案するソリューションは、タイムスタンプ サーバーから始まります。タイムスタンプ サーバーは、タイムスタンプを付けるアイテムのブロックのハッシュを取得し、そのハッシュを新聞や Usenet の投稿 [2-5] などで広く公開することによって機能します。タイムスタンプは、ハッシュに入るためには、データがその時点で存在していたに違いないことを証明します。各タイムスタンプには、ハッシュ内に前のタイムスタンプが含まれており、チェーンを形成し、追加のタイムスタンプは前のタイムスタンプを強化します。
4. プルーフ・オブ・ワーク
ピアツーピアベースの分散タイムスタンプサーバーを実装するには、新聞やUsenetの投稿ではなく、Adam BackのHashcash [6]に似たプルーフオブワークシステムを使用する必要があります。プルーフオブワークでは、SHA-256などでハッシュ化されたときに、ハッシュがゼロビットの数で始まる値をスキャンします。必要な平均作業量は、必要なゼロビットの数の指数関数であり、単一のハッシュを実行することで検証できます。
タイムスタンプ ネットワークでは、ブロックのハッシュに必要なゼロ ビットを与える値が見つかるまで、ブロック内の nonce を増分することでプルーフ オブ ワークを実装します。プルーフ オブ ワークを満たすために CPU の労力が費やされると、作業をやり直さずにブロックを変更することはできません。後続のブロックがその後に連鎖されるため、ブロックを変更する作業には、その後のすべてのブロックをやり直す作業が含まれます。
プルーフ・オブ・ワークは、多数決による意思決定における代表性を決定する問題も解決します。多数決が 1 つの IP アドレスに 1 票に基づいていた場合、多くの IP を割り当てることができる人なら誰でもそれを覆すことができます。プルーフ・オブ・ワークは、基本的に 1 つの CPU に 1 票です。多数決は、最も多くのプルーフ・オブ・ワークの労力が投入された最長のチェーンによって表されます。CPU パワーの大部分が正直なノードによって制御されている場合、正直なチェーンは最も速く成長し、競合するチェーンを凌駕します。過去のブロックを変更するには、攻撃者はそのブロックとそれ以降のすべてのブロックのプルーフ・オブ・ワークをやり直し、正直なノードの作業に追いついて追い越す必要があります。後ほど、遅い攻撃者が追いつく可能性は、後続のブロックが追加されるにつれて指数関数的に減少することを示します。
ハードウェア速度の向上と、時間の経過とともに変化するノード実行への関心を補うために、プルーフ・オブ・ワークの難易度は、1 時間あたりの平均ブロック数を目標とした移動平均によって決定されます。ブロックが速く生成されすぎると、難易度が高くなります。
5. ネットワーク
ネットワークを実行する手順は次のとおりです。
1) 新しいトランザクションはすべてのノードにブロードキャストされます。
2) 各ノードは新しいトランザクションをブロックに収集します。
3) 各ノードは、そのブロックの困難なプルーフ・オブ・ワークを見つけることに取り組みます。
4) ノードが作業証明を見つけると、そのブロックをすべてのノードにブロードキャストします。
5) ノードは、ブロック内のすべてのトランザクションが有効であり、まだ使用されていない場合にのみ、ブロックを受け入れます。
6) ノードは、受け入れられたブロックのハッシュを前のハッシュとして使用して、チェーン内の次のブロックを作成することで、ブロックの受け入れを表現します。
ノードは常に最長のチェーンを正しいチェーンとみなし、そのチェーンを拡張する作業を続けます。2 つのノードが同時に次のブロックの異なるバージョンをブロードキャストした場合、一部のノードはどちらか一方を最初に受信する可能性があります。その場合、最初に受信したブロックで作業しますが、もう一方のブランチは長くなる場合に備えて保存します。次の作業証明が見つかり、一方のブランチが長くなったときに同点が解消され、もう一方のブランチで作業していたノードは、長い方に切り替えます。
新しいトランザクションのブロードキャストは、必ずしもすべてのノードに到達する必要はありません。多くのノードに到達すれば、すぐにブロックに組み込まれます。ブロック ブロードキャストは、メッセージの欠落にも耐えます。ノードがブロックを受信しない場合、次のブロックを受信したときにブロックを要求し、ブロックを見逃したことに気付きます。
6. インセンティブ
慣例により、ブロックの最初のトランザクションは、ブロックの作成者が所有する新しいコインを開始する特別なトランザクションです。これにより、ノードがネットワークをサポートするインセンティブが追加され、コインを発行する中央機関がないため、最初にコインを流通させる方法が提供されます。一定量の新しいコインが着実に追加されることは、金鉱夫が金を流通させるためにリソースを費やすことに似ています。この場合、費やされるのは CPU 時間と電力です。
インセンティブは、取引手数料で賄うこともできます。取引の出力値が入力値より少ない場合、その差額は取引手数料となり、その取引を含むブロックのインセンティブ値に加算されます。所定の数のコインが流通すると、インセンティブは完全に取引手数料に移行し、完全にインフレフリーになります。
このインセンティブは、ノードが誠実であり続けるよう促すのに役立つかもしれない。貪欲な攻撃者が誠実なノード全員よりも多くの CPU パワーを集めることができた場合、そのパワーを使って支払いを盗み返して人々を騙すか、新しいコインを生成するかの選択を迫られるだろう。攻撃者は、システムや自分の富の正当性を損なうよりも、他の全員を合わせたよりも多くの新しいコインを自分に有利に与えるようなルールに従ってプレイする方が利益になると考えるはずだ。
7. ディスク領域の再利用
コインの最新のトランザクションが十分なブロックに埋め込まれると、それ以前の使用済みトランザクションは破棄され、ディスク容量を節約できます。ブロックのハッシュを壊さずにこれを容易にするために、トランザクションはMerkle Tree [7][2][5]でハッシュ化され、ブロックのハッシュにはルートのみが含まれます。古いブロックは、ツリーのブランチを切り離すことで圧縮できます。内部のハッシュは保存する必要はありません。
トランザクションのないブロック ヘッダーは約 80 バイトです。ブロックが 10 分ごとに生成されると仮定すると、80 バイト × 6 24 × 365 = 4.2MB/年になります。2008 年現在、コンピュータ システムは通常 2GB の RAM を搭載して販売されており、ムーアの法則では現在の成長率は年間 1.2GB と予測されているため、ブロック ヘッダーをメモリ内に保持する必要がある場合でも、ストレージは問題にならないはずです。
8. 支払い確認の簡素化
完全なネットワーク ノードを実行しなくても、支払いを検証できます。ユーザーは、最長のプルーフ オブ ワーク チェーンのブロック ヘッダーのコピーを保持するだけで済みます。このコピーは、最長のチェーンを持っていると確信できるまでネットワーク ノードにクエリを実行して取得し、トランザクションをタイムスタンプの付いたブロックにリンクする Merkle ブランチを取得します。ユーザーは自分でトランザクションを確認することはできませんが、チェーン内の場所にリンクすることで、ネットワーク ノードがトランザクションを受け入れたことを確認できます。さらに、その後に追加されたブロックによって、ネットワークがトランザクションを受け入れたことを確認できます。
そのため、正直なノードがネットワークを制御している限り、検証は信頼できますが、ネットワークが攻撃者に圧倒されると、より脆弱になります。ネットワーク ノードはトランザクションを自分で検証できますが、攻撃者がネットワークを圧倒し続けることができる限り、簡素化された方法は攻撃者の偽造トランザクションに騙される可能性があります。これを防ぐための 1 つの戦略は、無効なブロックを検出したときにネットワーク ノードからのアラートを受け入れ、ユーザーのソフトウェアにブロック全体をダウンロードしてトランザクションにアラートを出して不一致を確認するように促すことです。頻繁に支払いを受ける企業は、より独立したセキュリティとより迅速な検証のために、おそらく独自のノードを実行することを望むでしょう。
9. 価値の結合と分割
コインを個別に扱うことも可能ですが、送金の 1 セントごとに別々のトランザクションを行うのは扱いにくいでしょう。価値を分割して結合できるようにするために、トランザクションには複数の入力と出力が含まれます。通常、以前のより大きなトランザクションからの単一の入力、またはより小さな金額を結合した複数の入力があり、最大で 2 つの出力があります。1 つは支払い用、もう 1 つはお釣りがある場合はそれを送信者に返す出力です。
ファンアウト (トランザクションが複数のトランザクションに依存し、それらのトランザクションがさらに多くのトランザクションに依存する) はここでは問題にならないことに注意してください。トランザクションの履歴の完全なスタンドアロン コピーを抽出する必要はありません。
10. プライバシー
従来の銀行モデルでは、情報へのアクセスを関係者と信頼できる第三者に限定することで、ある程度のプライバシーを実現しています。すべての取引を公表する必要があるため、この方法は不可能ですが、情報の流れを別の場所で遮断することで、つまり公開鍵を匿名にすることで、プライバシーを維持することができます。一般の人々は、誰かが誰かに金額を送金していることはわかりますが、その取引を誰かに結び付ける情報はわかりません。これは、証券取引所が公開する情報レベルに似ています。証券取引所では、個々の取引の時間と規模、つまり「テープ」が公開されますが、当事者が誰であるかはわかりません。
追加のファイアウォールとして、各トランザクションが共通の所有者にリンクされないように、新しいキー ペアを使用する必要があります。複数入力トランザクションでは、入力が同じ所有者によって所有されていることが必然的に明らかになるため、ある程度のリンクは避けられません。キーの所有者が明らかになると、リンクによって同じ所有者に属する他のトランザクションが明らかになるというリスクがあります。
11. 計算
攻撃者が正直なチェーンよりも速く代替チェーンを生成しようとするシナリオを考えてみましょう。たとえこれが達成されたとしても、何もないところから価値を生み出したり、攻撃者の所有物ではなかったお金を奪ったりするなど、システムが恣意的な変更にさらされることはありません。ノードは無効なトランザクションを支払いとして受け入れることはなく、正直なノードは無効なトランザクションを含むブロックを受け入れることはありません。攻撃者は、最近使ったお金を取り戻すために、自分のトランザクションの 1 つを変更しようとすることしかできません。正直なチェーンと攻撃者のチェーン間の競争は、二項ランダム ウォークとして特徴付けることができます。成功イベントは、正直なチェーンが 1 ブロック拡張され、リードが +1 増加することであり、失敗イベントは、攻撃者のチェーンが 1 ブロック拡張され、ギャップが -1 減少することです。
攻撃者が与えられた赤字から追いつく確率は、ギャンブラーの破産問題に似ています。無制限のクレジットを持つギャンブラーが赤字からスタートし、損益分岐点に到達するために無限回の試行を行うとします。彼が損益分岐点に到達する確率、または攻撃者が正直なチェーンに追いつく確率は、次のように計算できます [8]。
p = 正直なノードが次のブロックを見つける確率
q = 攻撃者が次のブロックを見つける確率
qz = 攻撃者がzブロック後ろから追いつく確率
qz= { p≤qの場合1
(q/ p)^z (p>qの場合)
p > q という仮定を前提とすると、攻撃者が追いつく必要があるブロックの数が増えるにつれて、確率は指数関数的に低下します。攻撃者が不利な状況で、早い段階で幸運な突進をしない限り、攻撃者が遅れをとるにつれて、チャンスは消え去るほど小さくなります。
ここで、新しいトランザクションの受信者が、送信者がトランザクションを変更できないことを十分に確信するまでに、どのくらい待つ必要があるかを考えてみましょう。送信者は、受信者にしばらくの間、支払いをしたと信じ込ませ、しばらく経ってから自分自身に返済するように切り替えたい攻撃者であると想定します。これが発生すると受信者に警告が送信されますが、送信者は手遅れであることを望みます。
受信者は新しいキー ペアを生成し、署名する直前に送信者に公開キーを渡します。これにより、送信者が幸運にも十分な先まで進めるまで継続的に作業してブロックのチェーンを事前に準備し、その時点でトランザクションを実行することを防ぎます。トランザクションが送信されると、不正な送信者は、トランザクションの代替バージョンを含む並列チェーンを秘密裏に作業し始めます。
受信者は、トランザクションがブロックに追加され、その後に z ブロックがリンクされるまで待機します。攻撃者がどれだけ進んだかは正確にはわかりませんが、正直なブロックがブロックあたりの平均予想時間を要したと仮定すると、攻撃者の潜在的な進行状況は、期待値を持つポアソン分布になります。
C コードに変換しています...
いくつかの結果を実行すると、確率が z とともに指数関数的に低下することがわかります。
0.1 の
0 P=1.0000000
1 P=0.2045873
2 P=0.0509779
3 P=0.0131722
4 P=0.0034552
5 P=0.0009137
6 P=0.0002428
7 P=0.0000647
8 P=0.0000173
9 P=0.0000046
10 P=0.0000012
0.3 の
0 P=1.0000000
5 P=0.1773523
10 P=0.0416605
15 P=0.0101008
20 P=0.0024804
25 P=0.0006132
30 P=0.0001522
35 P=0.0000379
40 P=0.0000095
45 P=0.0000024
50 P=0.0000006
P が 0.1% 未満になるように解きます...
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 パワーの過半数を制御する場合、攻撃者が変更することが計算上すぐに非現実的になる、取引の公開履歴を記録するプルーフオブワークを使用するピアツーピアネットワークを提案しました。このネットワークは、構造化されていないシンプルさで堅牢です。ノードはほとんど調整せずに同時に動作します。メッセージは特定の場所にルーティングされず、ベストエフォートベースで配信するだけでよいため、ノードを識別する必要はありません。ノードは、不在中に何が起こったかの証拠としてプルーフオブワークチェーンを受け入れ、自由にネットワークから離脱したり再参加したりできます。ノードは CPU パワーで投票し、有効なブロックを受け入れる場合は拡張に取り組み、無効なブロックを拒否する場合は作業を拒否することでブロックを却下します。このコンセンサスメカニズムにより、必要なルールやインセンティブを適用できます。
参考文献
[1] W. Dai、「b-money」、http://www.weidai.com/bmoney.txt、1998年。
[2] H. Massias、X.S. Avila、J.-J. Quisquater、「最小限のコストで安全なタイムスタンプサービスの設計」
「信頼要件」、ベネルクス30回情報理論シンポジウム、1999年5月。
[3] S. Haber、W.S. Stornetta、「デジタル文書にタイムスタンプを付与する方法」、Journal of Cryptology、第3巻、第1号、1999年、11-20ページ。
2、99-111ページ、1991年。
[4] D. Bayer、S. Haber、W.S. Stornetta、「デジタルタイムスタンプの効率と信頼性の向上」
Sequences II: コミュニケーション、セキュリティ、およびコンピュータサイエンスの方法、329-334 ページ、1993 年。
[5] S. Haber、W.S. Stornetta、「ビット文字列の安全な名前」、第4回ACMカンファレンスの議事録
コンピュータと通信のセキュリティに関する国際会議、28-35 ページ、1997 年 4 月。
[6] A. Back、「ハッシュキャッシュ - サービス拒否攻撃への対抗策」
http://www.hashcash.org/papers/hashcash.pdf、2002年。
[7] R.C. Merkle、「公開鍵暗号システムのプロトコル」、1980年セキュリティと情報セキュリティに関するシンポジウム
プライバシー、IEEE コンピュータ協会、1980 年 4 月、122-133 ページ。
[8] W.フェラー「確率論とその応用入門」1957年。