ビットコイン・インスティテュート

Re: ビットコインP2P電子キャッシュ論文

ハル・フィニーの投稿(2008年11月7日23:40 UTC)

ブロードキャストされたトランザクションがすべてのノードに届かなくても、じきにブロックチェーンに入るから問題ない、と書かれている。それはどうやって起きるんだろう。「次の」ブロックを作るノード(最初にHashcashの衝突を見つけたノード)がそのトランザクションを聞いていなくて、さらにそのトランザクションを聞いていないノードがいくつかブロックを足したら? そのトランザクションを聞いたノードはみんな、次の衝突を見つける幸運に恵まれたらブロックに入れようと、それを持ち続けるのかな。

その通り、ノードはトランザクションをブロックに入るまでワーキングセットに保持する。トランザクションがノードの90%に到達した場合、新しいブロックが見つかるたびに、そのブロックに含まれる確率は90%だ。

ハル・フィニー

あるいは、たとえばノードがどのチェーンが一番速く伸びるかを見守るあいだ二つ以上のチェーンを保持していて、チェーンAに、チェーンBにあるコインの二重支払いを含むブロックが届いたら? それはチェックされるのかな、されないのかな。(誰かが二重支払いをして、ノードの二つの集団が、同じコインを使った別々のトランザクションをそれぞれ聞いた場合に起こりうる。)

それをチェックする必要はない。先行する分岐のトランザクションが有効となり、もう一方は無効となる。誰かがそのような二重支払いを試みた場合、1つのみの支払いが常に有効となり、他は無効となる。

トランザクションの受取人は通常、この種の可能性が解決されるまでの時間を確保するため、おそらく1時間以上トランザクションを保持する必要がある。コインは即座に再度使うことができるが、商品の発送などの行為を行う前には待つべきだ。

ハル・フィニー

それから、正直な参加者全員を上回る計算能力を集められる優勢な攻撃者が、二重支払いやトランザクションの取り消しをどうやって実現するのかも、正確には分からない。新しいブロックを作って足し、最長のチェーンを作れるのは分かる。でも、チェーンの中の古いトランザクションをどうやって消したり足したりできるんだろう。攻撃者が新しいブロックを送り出すとき、何も消されていないことを確かめるために、正直なノードができる整合性のチェックはないのかな。この攻撃をもっと説明してもらえると、攻撃者がこれで得るものと、その計算能力を使って正直に新しいコインを発行する場合とを比べて判断するのに役立つだろう。

攻撃者は末尾にブロックを追加するのではない。自分のトランザクションが含まれるブロックまで遡り、そのブロックとその後のすべてのブロックをやり直さなければならない。さらに、その作業中にネットワークが末尾に追加し続けるすべての新しいブロックもやり直す必要がある。歴史を書き換えているのだ。その分岐がより長くなれば、それが新しい有効なチェーンとなる。

これは重要なポイントに触れている。たとえその場にいる全員が不正を目にしていたとしても、その事実を利用する方法はない。

最長のチェーンが常に有効なものと見なされることは絶対に必要だ。その場にいたノードは、ある分岐が先にあり別の分岐に置き換えられたことを覚えているかもしれないが、その場にいなかった者にこのことを納得させる方法はない。ある分岐が最初だったと主張する派閥、別の分岐が最初だったと見た派閥、そして後から参加して何が起きたか見ていない派閥——このような分裂は許されない。CPUパワーによるプルーフ・オブ・ワークの投票が、最後に決めなければならない。全員が同じ認識に立ち続ける方法は一つしかない。何があっても、最長のチェーンを常に正当とみなすことだ。

ハル・フィニー

支払いのトランザクションについては、コインの受け取り手はどんなチェックをしなければならないのかな? コインの移転の履歴をすべてさかのぼって、リストのすべてのトランザクションが「タイムスタンプ」のブロックチェーンに本当につながっているかを確かめる必要があるのかな。それとも最新の一つだけでいいのかな。

受取人はブロックチェーン内の十分な深さまで遡って検証するだけでよく、多くの場合2トランザクションの深さだけで十分だ。それ以前のすべてのトランザクションは破棄できる。

ハル・フィニー

タイムスタンプのノードはトランザクションをチェックして、コインの前のトランザクションがチェーンにあることを確かめ、チェーンにあるトランザクションはすべて有効なコインを表すという規則を守らせるのかな。

その通り、まさにそうだ。ノードはブロックを受信すると、その中のすべてのトランザクションの署名を以前のブロック内のトランザクションと照合してチェックする。ブロックは前のブロックまたは同一ブロック内の有効なトランザクションに依存するトランザクションのみを含むことができる。トランザクションCは同一ブロック内のトランザクションBに依存し、Bはより前のブロック内のトランザクションAに依存することができる。

ハル・フィニー

質問ばかりですまない。でも、さっきも言ったように、これは本当に有望で独創的なアイデアに思えるし、この考えがこれからどう発展していくのかを楽しみにしている。アイデアを、もっと処理の流れに沿って説明したものがあると助かる。さまざまなオブジェクト(コイン、ブロック、トランザクション)のデータ構造、メッセージに含まれるデータ、そしてこのシステムで起こるさまざまな出来事を扱う手順のアルゴリズムを、具体的に書いたものだ。実装に取り組んでいると書いていたけど、次の一歩としては、システムのもっと形式的な、文章による説明が役に立つと思う。

質問してくれてありがたい。実際、逆のやり方をした。すべての問題を解決できると自分で納得するには、まずコードを全部書かなければならなかった。それから論文を書いた。詳細な仕様を書くよりも先にコードをリリースできると思う。ハルが空白を埋めた仮定のほとんどは、すでに正しい。

Satoshi Nakamoto


The Cryptography Mailing List Unsubscribe by sending “unsubscribe cryptography” to majordomo at metzdowd.com