Hal Finneyの投稿:
ブロードキャストされたトランザクションがすべてのノードに到達しなくても 大丈夫で、やがてブロックチェーンに入ると述べられていますが、これはどのように 実現されるのでしょうか——「次の」ブロックを作成するノード(hashcashの 衝突を最初に見つけたノード)がそのトランザクションを聞いておらず、 その後さらにいくつかのブロックがそのトランザクションを聞いていない ノードによって追加された場合はどうなるのでしょうか?トランザクションを聞いた すべてのノードは、次の衝突を見つけるのに十分幸運になるまでそのトランザクションを 保持し、ブロックに組み込もうとするのでしょうか?
その通り、ノードはトランザクションをブロックに入るまでワーキングセットに保持する。トランザクションがノードの90%に到達した場合、新しいブロックが見つかるたびに、そのブロックに含まれる確率は90%だ。
あるいは例えば、ノードが最も速く成長するチェーンを見極めるために 2つ以上のチェーンを保持しており、チェーンAのブロックが届いたが、 そこにチェーンBにあるコインの二重支払いが含まれている場合はどうですか? これはチェックされるのでしょうか?(誰かが二重支払いを試み、 2つの異なるノードセットが同じコインの2つの異なるトランザクションを 受信した場合に起こりえます。)
それをチェックする必要はない。先行する分岐のトランザクションが有効となり、もう一方は無効となる。誰かがそのような二重支払いを試みた場合、1つのみの支払いが常に有効となり、他は無効となる。
トランザクションの受取人は通常、この種の可能性が解決されるまでの時間を確保するため、おそらく1時間以上トランザクションを保持する必要がある。コインは即座に再度使うことができるが、商品の発送などの行為を行う前には待つべきだ。
また、優秀な攻撃者がすべての正直な参加者よりも多くの計算能力を 集めることができた場合、二重支払いやトランザクションの取り消しが 正確にどのように達成されるのかも理解できません。彼が新しいブロックを 作成し、最長のチェーンに追加できることはわかりますが、チェーン内の 古いトランザクションをどのように消去したり追加したりできるのでしょうか? 攻撃者が新しいブロックを送信する際、正直なノードが何も消去されて いないことを確認するための整合性チェックはありませんか?この攻撃の より詳しい説明があれば、攻撃者にとっての利得と、単に計算能力を使って 正直に新しいコインを鋳造することとの比較を判断するのに役立つでしょう。
攻撃者は末尾にブロックを追加するのではない。自分のトランザクションが含まれるブロックまで遡り、そのブロックとその後のすべてのブロックをやり直さなければならない。さらに、その作業中にネットワークが末尾に追加し続けるすべての新しいブロックもやり直す必要がある。彼は歴史を書き換えているのだ。彼の分岐がより長くなれば、それが新しい有効なチェーンとなる。
これは重要なポイントに触れている。たとえその場にいる全員が不正を目にしていたとしても、その事実を利用する方法はない。
最長のチェーンが常に有効なものと見なされることは絶対に必要だ。その場にいたノードは、ある分岐が先にあり別の分岐に置き換えられたことを覚えているかもしれないが、その場にいなかった者にこのことを納得させる方法はない。ある分岐が最初だったと主張する派閥、別の分岐が最初だったと見た派閥、そして後から参加して何が起きたか見ていない派閥——このような分裂は許されない。CPUパワーのプルーフ・オブ・ワーク投票が最終決定権を持たなければならない。全員が同じページに留まる唯一の方法は、何があろうと最長のチェーンが常に有効であると信じることだ。
支払いトランザクションに関して、コインの受取人はどのようなチェックを 行う必要がありますか?コインの移転の全履歴を遡って、リスト上の すべてのトランザクションが「タイムスタンプ」ブロックチェーンに リンクされていることを確認する必要がありますか?それとも最新のもの だけでよいのですか?
受取人はブロックチェーン内の十分な深さまで遡って検証するだけでよく、多くの場合2トランザクションの深さだけで十分だ。それ以前のすべてのトランザクションは破棄できる。
タイムスタンプノードはトランザクションをチェックして、コインの前の トランザクションがチェーンに含まれていることを確認し、チェーン内の すべてのトランザクションが有効なコインを表すというルールを 強制していますか?
その通り、まさにそうだ。ノードはブロックを受信すると、その中のすべてのトランザクションの署名を以前のブロック内のトランザクションと照合してチェックする。ブロックは前のブロックまたは同一ブロック内の有効なトランザクションに依存するトランザクションのみを含むことができる。トランザクションCは同一ブロック内のトランザクションBに依存し、Bはより前のブロック内のトランザクションAに依存することができる。
多くの質問をして申し訳ありませんが、先ほど述べたように、これは非常に 有望で独創的なアイデアのようであり、このコンセプトがさらに発展する のを楽しみにしています。アイデアのよりプロセス指向の記述、 各種オブジェクト(コイン、ブロック、トランザクション)のデータ構造の 具体的な詳細、メッセージに含まれるデータ、このシステムで発生する 各種イベントの処理手順のアルゴリズム的記述があると役に立つでしょう。 実装に取り組んでいるとのことですが、より形式的なテキストによる システムの記述が次のステップとして有益でしょう。
ご質問をありがたく思う。実は私はこれを逆の順序で行った。すべての問題を解決できると自分を納得させるために、まずすべてのコードを書き、その後論文を書いた。詳細な仕様を書くよりも先にコードをリリースできると思う。あなたが空白を埋めた仮定のほとんどは、すでに正しい。
Satoshi Nakamoto
The Cryptography Mailing List Unsubscribe by sending “unsubscribe cryptography” to majordomo at metzdowd.com