(InterArmaEnimSilの引用投稿)

6 件のメッセージ BitcoinTalk InterArmaEnimSil, knightmb, ラズロ・ハニエツ, Strofcon, Theymos, サトシ・ナカモト 2010年7月14日 — 2010年7月14日

なるほど、全員のマシンがそれぞれ異なる問題のハッシュに取り組んでいるなら、運が要素になるのは理解できる。しかし、自分のマシンが取り組んでいる問題と他の人の問題との間の変動の源は何なのか?先の返信の一つでは、そのユーザーが最近参加したトランザクションに関係しているようだったが…最近のトランザクションに参加していない我々についてはどうなるのか?(最後のトランザクションは少なくとも2日前だ)

knightmb 2010年7月14日 原文 · 個別ページ

Quote from: InterArmaEnimSil on July 14, 2010, 07:07:03 PM

なるほど、全員のマシンが別々の問題のハッシュに取り組んでいるなら、運が要素になるのはわかる。しかし、自分のマシンが取り組んでいる問題と、あなたのマシンの問題の間のバリエーションの源は何だろうか? 以前のある返信では、その個人が最近参加したトランザクションに関係があるようなことを示唆していた……しかし、最近のトランザクションに参加していない人はどうなるのだろうか?(自分の最新のものは少なくとも2日前だ)

コイン生成に関しては、ネットワークに接続さえしていればいい。それだけで、あなたのコンピュータが「見つけた!」というメッセージをブロードキャストし、他のコンピュータがそれが有効かどうかチェックできる。ブロックは常に生成されているので、オフラインでのコイン生成は現実的ではない。なぜなら、2日前にあなたのコンピュータがブロックを見つけたが、私のPCもそうで、私のPCはずっとオンラインだった場合、ネットワーク全体が私のPCを勝者/所有者と認定するからだ。あなたのPCが2日後にやってきて同じ解を見つけたとブロードキャストしても、他のコンピュータは「遅すぎる、XYZがすでに解いた、次は頑張れ」と返すだけだ。

問題のバリエーションに関して言えば、ブロックが見つかると、全員が次のブロックに取りかかる。だから、あなたのコンピュータがブロック68000の解決に向けて1%しか進んでいない時に「XYZが数分前にブロック68000を解いた」というメッセージを受け取ると、あなたのPCは「じゃあ次に行こう」と思う。すでに誰かが解いたブロックにCPUを浪費しない。そこが検証の部分だ。そうでなければ、誰かがクライアントを改ざんして「ブロック68000、68001、68002などを解いた」とブロードキャストして全範囲の所有権を主張することになる。クライアントがブロックを解いたと言うと、他のすべてのコンピュータが「わかった、じゃあ証明しろ、結果を送れ」と言う。十分な数が互いにそれについて話し合うと、「はい、あなたのPCがブロック68000を解いた、新しい所有者だ、おめでとう」と合意する。

重要なポイントは、我々のPCがブロックを解くのに数時間/数日かかるが、他の全員がそれが本当かどうかチェックするのはミリ秒しかかからないということだ。これにより、ネットワーク上での「偽ブロック発見」攻撃が防止される。

別の例を挙げよう。何百人もいる部屋がある。全員にランダムに混ぜられたルービックキューブが渡される。最初に解いた人が50コインもらえる。

誰かが「解いた!」と叫んだら、周りの人が一目見るだけで本当かどうかわかる(全面に単色)。誰かが「解いた!」と叫んでもまだグチャグチャなら、全員その人を無視して続ける。「本当に」解いた最初の人が賞を獲得し、全員が現在のルービックキューブを捨て、天井からさらにランダムに混ぜられたルービックキューブが落ちてきて、プロセスが再開される。

データの意味を理解するためのハウスキーピングフィールドを除けば、ハッシュされるデータの残りはランダムだ。全員のものが異なり、解に近づくことは決してない。調整して再ハッシュするたびに、解を見つける確率は同じだ。これはくじ引きを買うのと同じだ。全員の番号が異なり、すべてが当たりの可能性がある。しかし、より多くのくじ引きを手に入れた人は、このプロセスが繰り返されればより頻繁に当たるかもしれない。より速くハッシュできるコンピュータはより多くのくじ引きを持つが、各ハッシュ計算が当たりである確率は同じだ。

Strofcon 2010年7月14日 原文 · 個別ページ

確認が取れるまで軽く受け止めてほしいが、以下が自分の理解だ……

問題自体にバリエーションはない――すべてのノードが同時に同じブロックに取り組むことが意図されている(レイテンシーなどを考慮して)。運の要素は、各ノードが新しいブロックの解決を開始する際に生成するランダムな数値(ナンス)にある。新しいブロックを解く必要がある時、各ノードはランダムな値(ナンス)を生成し、それを使ってブロックをハッシュする。そのハッシュが正しくなければ、ナンスがインクリメントされ、新しいインクリメントされた値でブロックが再ハッシュされる。

例えば自分のボロPCが1,000 khash/s(実際そうだ…… Sad)を出し、あなたが100,000 khash/sのクラスターを持っているとしても、自分のボロPCが非常に少ないハッシュ数でブロックを解く値にランダムに(そして非常に幸運に)たどり着く合理的な可能性がある……例えばわずか10ハッシュでナンスが当たりだとする。1秒あたり1,000,000ハッシュを処理しているので、ブロックを解くのに1/100,000秒しかかからなかった。あなたのクラスターが自分の幸運な推測に勝つには、0.00001秒以内に正しいナンスを生成しなければならない……つまりクラスターは100,000,000 (hash/s) / 100,000 (s) = 1,000ハッシュ以内に正解しなければならない。可能なハッシュの巨大な数を考えると、1,000以内に当たる確率は極めて低い……

確かに、10ハッシュ以内に当たる自分の確率はもっと天文学的に低かったが、言いたいことは伝わったと思う。そう、クラスターは全体として自分のボロPCよりも多くのブロックを解くが、毎回勝つわけではない。

さて、ここまで説明したが……きっと誰かが自分の推論の欠陥を指摘するだろう! Smiley でもそれで構わない。すべてを正しく理解したいのだ。

編集 - ラスロの方がはるかに簡潔に言ったが、同じポイントを言っている……と思う? だといいが!

ランダムなナンスに加えて、各ブロックにはBitCoinアドレス(新規生成され、この目的のみに使用される)も含まれており、ブロックを解いた場合に50 BCの報酬がそのアドレスに記録される。2つのノードが同じランダムなナンスから始めたとしても(可能性は低い)、異なるBitCoinアドレスを持つことはほぼ確実だ。

Quote from: knightmb on July 14, 2010, 07:17:43 PM

つまり、あなたのコンピュータがブロック68000の解決に向けて1%しか進んでいなかったら これはよくある混乱のポイントだ。ブロック解決に向けて1%進んでいるというようなことはない。解決に向けて進捗することはないのだ。24時間作業した後でも、解決できる確率は開始時やどの瞬間と同じだ。

37枚のコインを同時に投げて全部表を出そうとするようなものだ。試すたびに、成功する確率は同じだ。

RNGはOpenSSLのセキュアな乱数生成器だ。Windowsではコンピュータが起動してからのすべてのハードウェアパフォーマンスカウンターの完全なセットでシードされ、Linuxではdev/randomだ。