BitcoinにおけるPoW
流れ
マイナーはそれぞれのローカルの環境で取引データを受け取りブロックに取り込んでいく。
1. ブロックが出来上がったらハッシュ値に合うnonceを算出する
取引データをブロックに取り込んでいくと、ある段階でそのブロックにはそれ以上取引データが入らなくなる。そうしたら、マイナーはブロック全体のハッシュ値を取得する。この時、ハッシュ値は頭に特定の回数0が連続しなければならず、その回数は動的で、そのご時世のマシンの性能によって変化する。このように指定されたハッシュ値が算出できるまで、ブロック内のnonceを変化させ続ける。ハッシュ値から元の文字列を逆算することはできないため、nonceを当てずっぽうで繰り返し変えていくしかない。
https://scrapbox.io/files/61e860152c5548001d1e7354.png
2. nonceの算出に成功したらそのブロックを全ユーザーにブロードキャストする
最も速く条件に合うnonceを算出できたユーザーは、そのブロックを全ユーザーにブロードキャストする。他のユーザーはそのブロックを検証し、不正でなければ自分のブロックチェーンに取り込み、次のブロックの生成を始める。
Bitcoinのような巨大なネットワークであれば、複数ユーザーが同時に条件に合うnonceを見つけることも十分にあり得る。その場合は、どちらのブロックもとりあえず検証の後自分のブロックチェーンに取り込み、より後続のブロックが長く続いた方を正統とする。 不正の防止
nonceの計算そのものに意味はないが、CPUのリソースを使わせ、新しいブロックの生成を困難にすることで改ざんにも時間がかかるようにしている。こうすることで攻撃者は、一つのブロックを書き換えたら、現状のブロック生成速度を上回る速度で後続のブロックの書き換えを行う必要が生じるのである。
システムを乗っ取るよりも、正当にブロックを生成して報酬を受け取る方のメリットが大きいように仕組まれている。
課題
ファイナリティーの不確実性
PoWの特徴として、同じブロックが同時に作成された場合、とりあえず取り込んでおいてその後より長く続いた方を正統とする仕組みがある。
これによって全ノードの整合性が取れるが、ブロックが取り込まれた段階ではそれが未来永劫正統であるかは分からない
電力消費
ブロックを生成しようとする全てのマイナーがnonceの算出に大量の電力を費やす訳であり、ネットワークが大きくなればなるほど電力消費量も上がっていく。これに対する解決策としてProof of Stakeが存在し、Ethereumもv2からはPoSに移行することになっている。