Pythonで作るブロックチェーン所感 その5 PoWの話

引き続きこの記事を参考にしながら、ブロックチェーンを作りつつ、色々周辺事情を調べて行きたいと思います。

ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin

bitFlyer ビットコインを始めるなら安心・安全な取引所で

 

Proof Of Work

プルーフ・オブ・ワークとは

よくPoWと略記されます。
PoWの解説は至る所で超わかりやすく書かれています。

プルーフ・オブ・ワーク(以下「PoW」と略す)アルゴリズムは、非中央集権的で、誰が参加しているかわからない分散(P2P)ネットワークにおいて、取引の合意形成を可能にした、コンセンサス・アルゴリズムの一つです。

ブロックチェーンの仕組みにおいては、支払いや契約といったトランザクション(取引データ)を含めた台帳の1ページとしてブロックを生成しますが、誰もが自由にブロックを生成できてしまうと、容易に改ざんされたブロックが生成できてしまいますので、 ブロック生成に何らかの制約を加えないといけません。

PoWでは、これを「CPUの計算量」に応じて発言権を与えることにしました。具体的には膨大な計算量を要する問題(特定の条件を満たすハッシュを探す)を最初に解いたものに発言権を与えています。

【引用元】分散ネットワークでの合意を可能にしたコンセンサスアルゴリズム「プルーフ・オブ・ワーク」

端的にまとめると以下のようになります。
・CPUの計算パワーが大きいほどブロック承認の成功率が高い
・マイニングによってコインが作られる
・この計算をするために秒間数千兆回のハッシュ生成処理をする
・この計算の解はネットワーク上の誰もが見つけるのは難しく、確認するのは簡単なものである。

このPoWこそが「ブロックチェーンは革新的だ!」と言われる所以になった重要なアイディアです。
この仕組みを導入することでデータの改竄が困難になります。

 

ちょっと作ってみる

Qiitaに書いてあった簡単な例を触ってみましょう。

ある整数xかけるある整数yのhashが0で終わらないといけないとしよう。というわけで、hash(x * y) = ac23d…0というようになる。そしてこの簡単な例では、x = 5と固定しよう。Pythonで実装するとこうなる。

つまりマイニングの解の条件を「算出されるハッシュ値が0で終わる」と設定しています。
今回はxを適当に5と設定し、それに対応するyを探します。
ここでyのことを「nonce」と呼びます。「number used once」の略です。
日本語では「ナンス」とか「ノンス」とか表記されています。

 

上記のコードを実行すると
「The solution is y = 21」と出力されます。

実際に出力されたハッシュ値は以下のようになり、
1253e9373e781b7500266caa55150e08e210bc8cd8cc70d89985e3600155e860
確かに0で終わっていることが確認できます。

出力されるハッシュ値が16進数なのでこの問題設定だと16分の1の確率で解が見つかるので、
めちゃくちゃ難易度は低いです。

 

余談ですが上記コードのprint(f'y = {y}')という書き方は、
python3.6から追加されたf-stringという機能です、{}の中に変数をそのまま書くことができます。
jsのテンプレート文字列の様なものですね。

 

本来の問題設定

本来の問題はもっと難易度が高く、「とても小さいハッシュ値を求めよ」というものです。

取引情報xに対し、ある値yを合わせ、その数をハッシュ関数にかけます。
その出力が非常に小さくなるようなy(=nonce)を求めるのです。

 

「非常に小さい」というのは、
ハッシュ値 < 000..00385fd を満たす。 というイメージです。

このyを求める計算に合理的な方法はないので、総当たりで代入しまくるしかないのです。
このyを求めるために、世界の大企業がめちゃくちゃ大きなPCを使って計算させまくっているのです。

 

こんな無意味な計算をひたすらさせるのではなく、
惑星の軌道計算や、円周率の計算、素数の発見など、
人類にとって意義のある計算に替えたほうが良いんじゃないかという提案もあるようです。
これをProof Of Useful Work(POUW)と呼びます。

 

しかし、そうしないのにも理由があます。

コンピューターで分析する対象に偏りがあので問題の勝利解がどれも同じでない弱点があります。
また問題の性質によっては、その計算結果を快く思わず、ネットワークの乗っ取りを企てる人が現れかねません。

【引用元】仮想通貨とブロックチェーン (日経文庫)

他の意図が加わらず、ただ純粋に経済的な動機でしか動かないので、
それ以外の(時に悪質な)動機を持った人が介入してこないので、
ビットコインの堅牢なネットワークは支えられているのです。

 

さて本題です。

proof of work

 

last_proofとの積が問題を満たすようにproofを順番にインクリメントしていくプログラムです。

 

valid_proof

 

今回の問題は簡単の為にハッシュ値が0000ff...ffより小さいものを探せという風に設定されています。
つまり16^4分の1の確率で当たることになります。

 

Binance

コメントを残す