
昨日のALIS配布の影響で、ALIS関連の投稿が上位にのきなみ並んでいますが、、
われわれは淡々とサトシナカモトの論文を読んでいきましょう笑
前回までの記事をまだご覧になっていない方はこちらをどうぞ
【よくわかる(?)】サトシナカモトの論文を読んでみようPart2
英語原著論文はこちら
1) Bitcoin: A Peer-to-Peer Electronic Cash System - Bitcoin.org
日本語訳はこちら
2) 日本語で読むビットコイン原論文 [by Satoshi Nakamoto]
論文解説サイトはこちら
3) http://kogarashi.net/pitchblende/bitcoinwhitepaper
次はチャプター4 プルーフ・オブ・ワークです!
4. プルーフ・オブ・ワーク
P2P ベースで分散型サーバーを実行するには、新聞や Usenet ポストというよりはアダム・バック のハッシュキャッシュ[6]に似た、プルーフ・オブ・ワークシステムを使用する必要がある。プルーフ・ オブ・ワークには、例えば SHA-256 のような、ハッシュ化された時に0ビットの番号で始まるハッ シュ値のスキャンが含まれる。通常作業に要求されるのは、必要な0ビットの番号の指数関数で あり、これはハッシュ一つを実行することで検証される。我々のタイムスタンプネットワークでは、 ハッシュ化の際に要求される 0 ビットを与える値が見つかるまでの間、データブロックにワンタイ ムパスワードを足すことでプルーフ・オブ・ワークを実現している。一度プルーフ・オブ・ワークを満 たすべく CPU パワーが費やされると、この作業をやり直さない限りそのデータブロックを変更する ことはできない。その後のデータブロックもチェーン化されて後に連なるため、該当ブロックを書き 換えようとするならば、それ以降の全てのブロックを書き換えなくてはならない。
このプルーフ・オブ・ワークはまた、多数決で意思決定をする際の代表をどうするかという問題を 解決する。もし1IP アドレスにつき一票としたならば、多くの IP アドレスを取得できる者は誰でもシ ステムを乗っ取ることができてしまう。プルーフ・オブ・ワークは原則的に 1CPU につき一票であ
る。多数決の意思決定は、最も多くのプルーフ・オブ・ワークの労力が費やされたことを示す最も 長いチェーンによって表される。CPU パワーの過半数が良心的なノードによってコントロールされ るとき、その良心的なチェーンは他のどのチェーンよりも早く成長する。過去のデータブロックを書 き換えるためには、攻撃者はそのブロックのプルーフ・オブ・ワークだけでなくその後に続くプルー フ・オブ・ワークを書き換え、さらに良心的なチェーンに追いつき、追い越さなければならない。低 速の攻撃者が良心的チェーンに追いつく可能性は、後続のブロックが追加されるごとに指数関数 的に減少していくことをのちに説明する。加速するハードウェアスピードと長期的に変動する利益
レートに対応するために、プルーフ・オブ・ワーク算出の難易度は、一時間ごとのブロック数を一定 の平均値に保つことを目指す平均移動によって決定される。ブロック算出のスピードが速ければ 速いほど難易度が増す。
2)より引用
アダムバックのハッシュキャッシュというのは本来はSPAMメールを防ぐために、メールを送る際にコンピューターに演算を要求して一手間かけさせる(数秒の仕事をさせる)ことで、SPAMメールを無限に送るのを阻止しようというものです。
ビットコインにおいては、この考え方を応用しています。
3)より引用
図のように、一つのブロックには前のブロックのハッシュ値、そして今回のブロックの取引の記録そしてNonceという数字が含まれています。
このブロックをハッシュ化するときに、Nonce(数字)を変化させることで、ハッシュ値は変化していきますが、ハッシュ値の最初のnビットがすべて0になるようなNonce(数字)を探させる手間を与えます。
これを演算量証明(Proof of Work)と言い、ブロックの内容を改ざんしようとすればこの計算をもう一度行わなければならず、さらに後続のブロックについても同じようにNonceを計算し直さなければいけなくなります。
ブロック生成の途中では、図のようにチェーンが分岐することがあるかもしれませんが、最も苦労して作られたチェーン(最も長いチェーン)を集団の意思決定であると決めます。
参加者の大多数が善良なノードによって構成されていれば、不正のないものが最速で伸びて行くはずです。
採掘の難易度(difficulty)は最初の何ビットを0とするNonceを見つけるかによって調整します。ビットコインの場合、平均で10分でNonceがみつけられるように調整するということですね。
このようにして、ブロックを作らせるのですね!
では、次のチャプター!
ネットワーク実行の手順は以下の通りである
1. 新しい取引は全ノードに送信される。
2. 各ノードが新しい取引をブロックに取り入れる。
3. 各ノードがそのブロックへのプルーフ・オブ・ワークを算出する。
4. プルーフ・オブ・ワークを見つけ次第、各ノードはそれを全ノードに告知する。
5. ノードは、ブロックに含まれる全ての取引が有効であり、以前に使われていない場合の み、それを承認する。
6. ノードは、承認されたブロックのハッシュを直前のハッシュとして用いて、チェーンの次のブ ロックの作成を開始することで、ブロック承認を表明する。
ノードは常に最長のチェーンを正しいものと判断し、それをさらに延長しようとする。もし二つのノー ドが同時に異なる二パターンのブロックを次のブロックとして告知した場合、ノードによって受信の 順番が入れ替わる可能性がある。その場合、ノードは最初に受信した方のブロックを処理する
が、もう一つのブロックも保存しそちらのチェーンが長くなった場合に備えておく。次のプルーフ・オ ブ・ワークが発見され、どちらかのチェーンが伸びたとき、そちらが正しいチェーンと認識され、もう 一つのチェーンに取り組んでいたノードはより長いチェーンに切り替える。
新しい取引の告知は必ずしも全ノードに届かなくともよい。告知が多数のノードに受信されている 限り、やがてブロックに組み込まれる。ブロック告知もまたメッセージの欠落に耐えうる。ノードがブ ロックを受信しなかった場合、次のブロックを受信するときにそれを要求し、一つ受信していなかっ たことを認識する。
2)より引用
取引で不正がないかは2段階でチェックされます。
1段階目は各ノードがブロックを生成する過程で、整合性の合わない取引がブロックに入るのを防ぎます。
もし、ノード自体が不正をしていた場合はどうでしょうか?
2段階目として不正なブロックが生成されてしまったときは、各ノードがそのブロックを受け付けないことで、不正を防ぐことができます。
ブロックを受け付けなければ、新たなブロックはその後ろには繋がって行かず、不正なブロックは生き残ることができません。
このようにビットコインではブロックの生成に対して2段階でチェックをすることで不正を防ぐ仕組みを取っているんですね。
なんだか少しずつ分かってきたような気がしますね笑
ではこの先はまた次の投稿で!
イイね!お待ちしております!










