なぜ取引は改ざんされない? サトシとビットコイン最初の受取人のやりとり
ビットコインを発明し、未だその正体が分かっていないサトシ・サカモト。そんなサトシが残した約2年間の文章を、小宮自由氏の解説と共に紹介する連載「サトシ・ナカモトが残した言葉〜ビットコインの歴史をたどる旅」の第6回。
今回はサトシのメールの前に、本連載の元になっている書籍『ビットコイン バイブル:サトシナカモトとは何者か?』の著者フィル・シャンパーニュ氏の解説も掲載する。
フィル・シャンパーニュ氏の解説
この投稿には数点の質問とそれに対するサトシの回答が収録されている。質問者は、ビットコイン送金の最初の受取人となったHal Finneyである。
第一の質問では、ブロックへ取引が編入されるまでの間、マイナーがどのように取引を保持するか、サトシが解説している。
第二の質問では、サトシは、特定のブロックチェーンでは二重支払が起きえないことを説明し、二人のマイナーが同時にブロックの解決に至ったときに、どのような仕組みで片方のブロックチェーンのみが勝利するかを解説している。ここでは、また、ブロックチェーンで公式に確認されるまで、受取人の側で一時間、取引を保持しなければならない仕組みも説明している。サトシは、取引の確認とブロックチェーンへの不可逆的な編入に要する最適な時間として、6ブロック分という数字(1ブロック当たり10分に6ブロックをかけると60分=1時間になる)に言及している。
第三の質問では、ビットコインへの攻撃者が「履歴を書き換える」、つまり、ブロックチェーンを改変して再構築するには何をしなければならないか、サトシが論じている。過去のブロックに取引を追加したり削除したりするには、現在進行中のブロックチェーンの作業に従事するネットワーク内の全てのマイナーを上回る速度で書き換える必要がある。孤児ブロック*1 について記述した箇所で、最長のブロックチェーンとはネットワーク全体が使っているブロックチェーンである、とした議論を思い出したい。サトシは言う。「CPUパワーのプルーフ・オブ・ワークによる投票が最後の決定でなければなりません。全員が理解すべき唯一の条件は、最長のチェーンが常に有効なチェーンであると信じることのみです」。
第四の質問は、受取人による送金取引の検証に関するものである。
第五の質問は、システム内のノード(つまり、マイナー)の役割についてである。一人のマイナーがプルーフ・オブ・ワーク(先頭に正解の個数のゼロが並ぶハッシュ値)を発見すると、いま「採掘した」ブロックをブロードキャスト*2 する。このブロックには幾つかの取引が含まれている。このブロックを受け取ったネットワーク内の全ノードは、ブロックに含まれる全ての取引の有効性をチェックしてこれを有効化しなければならない。
最後に、サトシは、全ての問題点が解決したことを自分で確信するため、ビットコイン告知の論文執筆の前にコードを書いたことを報告している。
【訳注】
*1 ネットワーク全体により受け入れられなかったブロックのこと。第7回で詳しく説明する。
*2 取引データをビットコイン・ネットワークに送信すること
サトシ・ナカモト 2008年11月09日 日曜日 11時13分34秒 -0800
それでは2008年11月9日11時13分34秒のサトシのメールをみていこう。
========================
Re:ビットコイン ピア・ツー・ピア 電子キャッシュ 論文
サトシ・ナカモト 2008年11月09日 日曜日 11時13分34秒 -0800
(注:斜体はサトシ以外の者の質問を指す)
Hal Finneyは書きました:
ブロードキャストした取引が全ノードに届かなくても、はるか以前にブロックチェーンに編入されているからOKだ、と述べられています。これはどうして可能なのでしょう?もし「次の」ブロックを作成するノード(ハッシュキャッシュ衝突*3 を最初に発見したノード)が取引を受信しなかったという状況が発生し、その取引を受信しなかったノードにより、あと数ブロックが追加されたらどうなりますか? 受信した全てのノードが、運よく次のハッシュキャッシュ衝突を発見できたときにブロックに編入されるのを期待しながら、その取引を保持することになるのですか?
その通りです。ノードは、ブロックに編入されるまで取引を作業セットに保持します。取引がノードの90%に届けば、新たなブロックが見つかるたびに、その取引がブロックに編入されるチャンスが90%になります。
あるいは、例えば、とあるノードが二つ以上のチェーンを保持し、どのチェーンが最も速く成長するかを見ているとします。そのとき、あるブロックはチェーンAに入ってくるが、AにはチェーンB内のコインの二重支払が含まれるとしたらどうなりますか?チェックされますか、されませんか?(これが起きるのは、誰かが二重支払を実行し、二つの異なるノード群が同一のコインによる二つの異なる取引を受信した場合です)
それはチェックする必要はありません。取引はどちらのチェーンに入っても同じで、最終的に先行して伸びた方が有効な取引になります。二重支払を試みても、有効となるのは必ずどちらか片方の取引で、その他は全て無効になります。
通常、取引を受信したら、一時間強、保持する必要があります。これは、この種の(二重支払のような)可能性を解決する時間を確保するためです。
最初の送金の直後にコインを再送金することはできますが、商品発送などの行動を起こす前に待ち時間が生じるのです。
私が正確に理解できていないのは、全ての誠実な参加者を上回る計算パワーを行使する優勢な攻撃者が、二重支払や取引の取消をどのように実行するか、です。攻撃者が新たなブロックを作成し、チェーンに追加して最長のチェーンを生み出せるのは分かりますが、チェーン内の過去の取引の削除や追加はどうやったらできますか? 攻撃者が新しいブロックをブロードキャストするときに、何も削除されていないことを確認するため、誠実なノードによる一貫性のチェックが行われるのですか? この種の攻撃に関してもっと説明があると、この攻撃で攻撃者が得る利益と、自分の計算能力を新規コインの通常の造幣作業(マイニング)に使うことの利益の比較考量をする上で手助けになります。
攻撃者はブロックを末尾に追加しません。戻って自分の取引が含まれるブロックとその後の全てのブロックに対して再度作業*4 をしなければなりません。加えて、再作業の最中にもチェーンの末尾には新たなブロックが次々と追加されていきますが、それに対しても再度作業しなければなりません。攻撃者は履歴を書き換えていることになります。自分のチェーンが長さで上回れば、それが新たに有効なチェーンとなります。
これは重要なポイントです。接続中の全員が詐欺行為を目撃していても、何もメリットはありません。
最長のチェーンが常に有効なチェーンであるということが絶対に必要です。接続中のノードたちは、最初にあったのは片方のチェーンで、それが別のチェーンに置き換わったのを覚えているでしょう。しかし、チェーンが切り替わるときに接続中でなかったノードにこの事実を伝えても説得はできません。あるチェーンが最初だったと思い込んでかたくなに曲げようとしないノード、別のチェーンを最初に見た別のノード、遅れて接続し、何が起きたかを見なかったノード、というように、ノードの立場の細分化はありえません。CPUパワーのプルーフ・オブ・ワークによる投票が最後の決定でなければなりません。全員が理解すべき唯一の条件は、最長のチェーンが常に有効なチェーンであると信じることのみです。
送金取引についてですが、コインの受取人はどんなチェックが必要ですか? 過去のコイン送金の全履歴をさかのぼって、リスト上の全取引が確かに「タイムスタンプ」のブロックチェーンに連結されているのを確認する必要がありますか? 最新の履歴だけで済みますか?
受取人のノードで必要とされる作業は、ブロックチェーン内で十分な過去の時点に相当する深さにまでさかのぼって検証することだけですが、通常、条件となる深さはせいぜい取引二つ分です。それ以前の取引はチェックせずとも影響はありません。
タイムスタンプ・ノードが取引をチェックするときは、コイン内の直前の取引がチェーンに含まれていることを確認し、チェーン内の全ての取引の有効をより強く証明しますか?
まさにその通りです。ノードがブロックを受け取ると、含まれる全ての取引の署名を過去の取引に照らしてチェックします。ブロックに含まれる取引は、同一ブロックか、直前の数ブロックか、いずれかのうちの有効な取引に依存するものだけです。例えば、取引Cは同一ブロック内の取引Bに依存し、取引Bは前のブロック内の取引Aに依存する、という具合です。
質問ばかりですみません。前にも述べたように、これは有望かつ独創的なアイデアですし、今後どう発展するかを楽しみにしています。このアイデアをもっとプロセス重視で説明してくれると参考になりますし、多様な対象(コイン、ブロック、取引)のデータ構造の具体的な詳細、メッセージに含まれるデータ、システム内で発生する多様な出来事の処理過程のアルゴリズム的な説明があると助かります。あなたは実装に取り組んでいると言っていましたが、システムに関してテキストによるもっと形式的な説明があると、より有益だと思います。
質問に感謝します。実は実装の方が先行していました。全ての問題点を解決できる確信を持つ前に全てのコードを書く必要があって、論文を書いたのはそれが済んでからでした。詳しいスペックを書く前にコードをリリースできると思います。皆さんが想定した事項の大半は的を射た正しいものです。皆さんの質問によって、システムの説明に関して不十分な点を補完できました。
サトシ・ナカモト
暗号学メーリングリスト
【訳注】
*3 ハッシュキャッシュにおいて、ハッシュ関数に出力されるハッシュ値がある値以下になるような入力値のことを、このように表現したと考えられる。
*4 ハッシュキャッシュ型のプルーフ・オブ・ワークにおいて、ハッシュ値がある値以下になるような入力値を見つける作業のこと。この後に出てくる「作業」も同じ意味。
========================
解説
サトシとの一問一答です。質問者の主な関心事は、「どのように取引の改ざんを防いでいるか」「改ざんに対抗するためにはどうしたらいいか」です。これはデジタル通貨において唯一かつ究極の要望ではないでしょうか。どんなに便利なインターフェースでも、改ざんされてしまえばその通貨は信用を失います。この問題に多くのユーザが興味を持つのは当然のことです。
サトシの回答は、今日においても完璧に通用するものであり、ビットコインのアイデア
の完成度の高さが伺えます。サトシは論文に先行してコードを実装しており、ここから彼の実践主義的性格が垣間見えます。
小宮自由
→この連載の他の記事を読む
参考リンク
・取引(トランザクション)
(image:iStock/ Photoplotnikov・Benson George)
Source: https://www.neweconomy.jp/features/sato/180845