7章_プルーフオブワーク
担当: かすてらふぃ
概要
6章終了時点でのブロックチェーンは、リサ(中央集権的管理者)がすべてのブロックを生成するシステム
気に入らないトランザクションをブロックから排除=検閲を許してしまう
検閲耐性のために、誰もがブロックを生成できるようにする
次のブロックを作れるのは誰か?を決めるしくみとして、プルーフオブワーク(Proof of Work, PoW)を導入
PoWが不正を抑止するしくみ: 不正をはたらくのに、それによって得られる利益を超えるだけのコストがかかるようにする
PoWのもとでブロックを生成する主体を「マイナー」とよぶ
マイナーがトランザクションをブロックに含めるインセンティブとして、トランザクション手数料を導入する
7.1 リサのクローン
ブロックの生成が1人の管理者の手にかかっていると(=中央集権)、トランザクションの検閲 が可能になってしまう
管理者自身の意志ではなく、外部からの圧力による検閲もありうる
誰もがブロックを生成できるようにすれば、検閲のリスクを下げられる
以下、ブロックを生成する主体のことを「マイナー(採掘者)」と呼ぶ
新たな問題: ブロックの衝突をどう防ぐ?
ブロックの衝突
複数のマイナーが同じようにブロックを作ると、同じトランザクションを持つブロックが複数できる。これをブロックの衝突という
くじ引き方式
ブロックの衝突を防ぐには、マイナーたちの間で「次のブロックを作る人」を取り決める必要がある
くじ引き方式: 各マイナーは1秒毎にくじを引き、特定範囲の数字を引き当てた瞬間にブロックを生成して公開する
ラッキーナンバー(特定範囲内の数字)を引く確率は、マイナー全体で平均して10分に一度のペースでブロックが生成されるように設定する
例: マイナーが3人の場合は1/(600 * 3)に設定
複数のマイナーが同時にラッキーナンバーを引くと、ブロックチェーンが分裂する(図7.7, 7.8, 7.9)
発生確率は低いが0ではない。現実的なタイムスパンでは、長さ2以上の分裂が発生することはまずない
長さ2の分裂が発生する確率は90年に一度程度
くじ引き方式の問題点
虚偽申告ができる。つまり、本当にラッキーナンバーを取ったのが誰かを証明できない
マイナーの秘密鍵が漏れると、ブロック報酬を騙し取れてしまう
マイナーが増えるほど、上記2つのリスクが上がる
ブロックの作成ペースを維持しながらマイナーを追加するのが大変
「10分に1回」というペースを守るには、マイナーの参加人数が変わるたびにラッキーナンバーの範囲を変える必要がある
7.2 本当の数値の申告を強制するしくみ
プルーフオブワーク(PoW):
マイナーたちにたくさんの「仕事」(コンピュータによるハッシュ値の計算)をさせ、その証拠を提出させる
PoWは、非中央集権的にすべてのマイナーの中からリーダーをランダムに選ぶためのしくみ
PoWは、ビットコインを本当の意味で非中央集権化に導くもの。ビットコインの本質
ブロックヘッダ内の(マイナーによる)デジタル署名をPoWに置き換える(図7.10)
ブロックヘッダの中身
OUT: デジタル署名
IN: ブロックID(=ブロックヘッダのハッシュ値)のターゲット・ノンス(nonce)
ブロックIDがターゲット(目標値)以下になっていればOK
難易度調整:ターゲットは一定のルールに従って変化する
マイナーの増減がブロックの生成ペースに影響を与えないようにするためのしくみ(後で詳しく)
「ブロックIDをターゲット以下にする」ためには?
ブロックIDを変えるには、ハッシュ関数への入力であるブロックヘッダの中身を変えるしかない
ブロックヘッダに追加されたノンス(乱数)をとっかえひっかえして、ターゲット以下になるまでブロックIDの計算を何度も何度も繰り返す
マイナーたちがやってることは本質的にはくじ引き方式と変わらないが…
このルールであれば、ブロックに含まれるデータだけからその有効性を検証できる
デジタル署名の場合は、マイナーの公開鍵が必要
「公開鍵の提供者」という中央集権的情報源の排除は、非中央集権化への進歩
最強チェーン
ブロック生成の「難易度」:あるブロックを生成するのに必要な作業量の目安
ターゲットが大きい→判定がゆるい→難易度が低い
ターゲットが小さい→判定が厳しい→難易度が高い
PoWにおいて、ブロックチェーン分裂時にどのブランチを正とするかの基準は、単純な長さではなくチェーンに含まれる全ブロックの難易度の合計。これが最大のブランチを「最強チェーン」とよび、これが正とみなされる
7.3 マイナーは社外へ
ハッシュレート: 1秒に何回ブロックID(=ブロックヘッダのハッシュ値)を計算できるか
ブロック率: ブロックが生成される速度
マイナーが増えたり、既存のマイナーが設備増強でハッシュレートを増やしたりすると、総ハッシュレートの増加に伴いブロック率が想定より高くなってしまう
ブロック率が高すぎると…
マネーサプライが増えすぎる
チェーンの分裂が発生しやすくなる
→ くじ引き方式の問題のうち「ブロックの作成ペースを維持しながらマイナーを追加するのが大変」だけは未解決
7.4 難易度の調整
最後に残った問題の解決策: 難易度調整
ブロックIDのターゲットを定期的に再計算し、ブロックのマイニング難易度を調整する
正確には2,016ブロックごと。10分に1つのブロック率でちょうど2週間に相当
リターゲット期間: 一度難易度が調整されてから次に調整されるまでの期間
リターゲット期間が基準の2週間より長ければ難易度を下げ、短ければ難易度を上げる
リターゲット期間がT(週間)だったら、次のターゲットは現在の clamp(1/4, T/2, 4) 倍になる
係数に制限を設けるのは、ある種の二重払い攻撃の影響を抑えるため
ブロックのタイムスタンプを操作して意図的にマイナー有利に難易度を変更する攻撃を防ぐため、ブロックのタイムスタンプは以下の範囲に収まっていなければならない(図7.23)
直近11ブロックのタイムスタンプの中央値よりも後
PoW検証者の時計+2時間より前
チェーンの強さと長さが異なる状況:
最も代表的なのは、リターゲット直前に自然なチェーンの分裂が起きた場合(図7.24)。
この場合、タイムスタンプが先のブロックに続くブロックの難易度のほうが(リターゲット期間が短いために)高く設定されるので、そちらが最強チェーンになる
7.5 マイナーはどのような悪事を働けるか
ブロックへのデジタル署名を廃したため、再びブロックの改ざんが可能になったように見えるが…?
二重払いが成功する状況
同じUTXOから、正規のトランザクションと、(正規で払った分を自分に戻す)二重払いトランザクションを作る(図7.25)
自分以外のマイナーには正規トランザクションだけを見せつつ、自分だけ二重払いトランザクションを含むブロックを作り、PoWを探す
→ 二重払いを含む「嘘ブランチ」を嘘のないブランチよりも優位に立たせることができれば、二重払いが成立(図7.26)
二重払い攻撃からの防御方法
この攻撃を成立させるには、他のマイナーよりも早くPoWを見つける必要があり、設備コスト・計算で消費する電力のコストがかかる
→ 二重払いで取り戻せる額がコストに見合わないのであれば、攻撃を行う意味はない。つまり攻撃の経済性を低めればよい
高額取引の際、取引を認めるのに必要な「承認」の数を(たとえば)6に増やす。すなわち、目的の取引が含まれるブロックのあとに追加で5個のブロックが追加されるまでは取引を認めないようにする(図7.27)。
この状況で二重払いを成立させるには、正規ブランチが6ブロック伸びるまでに「独力で」嘘のブランチを6ブロック伸ばすしかない。
攻撃者が攻撃を諦める理由:
攻撃者が掌握するハッシュレートのシェアが小さい場合、嘘のないブランチを出し抜くのが困難
攻撃が成功しなければ、かけた電気代はパー
攻撃が成功しなければ、得られるはずだったブロック報酬もパー
→ 普通にマイニングしたほうがよっぽどマシ
攻撃者が掌握するハッシュレートのシェアが50%を超える場合、諦めなければ必ず攻撃が成功してしまう
マイナーの権力集中によりこの状況が発生する見込みがあるというだけでも、そのブロックチェーンの価値は地に落ちる
逆に、「権力集中への対抗」こそが、マイニングを始める1つのインセンティブとなっている
7.6 トランザクション手数料
トランザクション手数料:
マイナーが、ブロック生成時にあるトランザクションを含めたときにもらえる手数料
トランザクションの出力合計額を入力合計額よりも小さくすると、その差額がそのトランザクション手数料になる
ブロック報酬 = ブロック補助金 + トランザクション手数料
ブロック補助金: これまで「報酬」と呼んでいたもの。ブロック生成時に新しく発行されるお金
トランザクション手数料: ブロックに含まれる全トランザクションの手数料の合計
トランザクション手数料は、「特定のトランザクションを他のトランザクションよりも優先してブロックに含める行為」に対するインセンティブ。
トランザクション手数料が解決する問題
ブロックが小さくなりすぎないようにする
2人のマイナーがほぼ同時にPoWを見つけブロックをアップロードする状況では、ブロックのデータ量が小さいほうが有利なので、マイナーはこぞってブロックを小さく保とうとする
→ トランザクション承認のスループットが低下
これを破るために、ブロックにトランザクションをたくさん入れるほど報酬が増えるようにする
未承認トランザクションがブロックに入り切らないとき、どれを優先するかの決め手となる
ブロックのサイズには上限がある
余談: 書籍には1,000,000バイト(1MB)とあるが、2017年に4,000,000 weight unitに変更されている。
レガシートランザクションとSegwitトランザクションでデータ量に対する重み付けを変える。レガシートランザクションの上限は変わらず1MB。Segwitトランザクションの場合、実質的な上限は2MB程度
承認待ちのトランザクションが1つのブロックに収まりきらない場合、高いトランザクション手数料はマイナーがそれを選択するインセンティブになる
なお、mempoolを見てみると、現在採掘されているブロックはだいたい上限いっぱいにトランザクションが詰まっているもよう
ビットコインを全量採掘したあとのマイナー報酬
ブロック補助金は約4年毎に半減し最終的には0になる
それ以降はトランザクション手数料だけがマイナーに対する報酬となる
マイナーたちはマイニングにかかるコストを上回るだけの報酬を得られるような水準のトランザクション手数料を送金者に課すことになる。
トランザクション手数料が上昇すると、少額送金では割に合わなくなる
→ 1取引あたりの手数料を抑えるために、1つのトランザクションで大量の支払いを済ませるシステム(例: LN)が生まれた
残る問題: ブロックをアップロードする共有フォルダ管理の中央集権性 → ピアツーピアネットワークの導入へ…(8章)