11章_ビットコインのアップグレード
担当: 発火大根
ビットコインには、「フォーク」という概念がある
このフォークは、githubのforkなどとは違う概念であり、「ブロックチェーンのプロトコルの変更」を意味する
フォークは2種類存在する
ハードフォーク
制限を厳しくする以外の変更が加えられている
新ノードが作った新ブロックは、旧ノードに受け入れられない場合がある
旧ノードが作った旧ブロックは、新ノードに受け入れられる
ソフトフォーク
制限を厳しくする変更
新ノードが作った新ブロックは、旧ノードに受け入れられる
旧ノードが作った旧ブロックは、新ノードに受け入れられない場合がある
ハードフォークの場合、ハッシュ率 (ある時点でのビットコイン・ネットワークが確保できる総計算能力の予測値)が
新ノード > 旧ノードとなった時、チェーンが分岐する
そこから更にハッシュ率が旧ノード > 新ノードとなった場合、チェーンが再編されてワイプアウトされる場合がある
※チェーンがワイプアウトされると、短いチェーンの取引履歴は無効となる
これを防ぐために、ハードフォークされた新ノードは「ワイプアウトプロテクション」といって
チェーンがワイプアウトされるのを防ぐ仕組みを導入する必要がある
※ビットコインキャッシュでは、分岐後の初期ブロックが1MB以上となるような制限が入っている
一方ソフトフォークの場合は、チェーンが分岐することはよしとしない。
基本的にビットコインのアップデートはソフトフォークで行われる。
前段
この章を理解するために、理解しておく必要のある章
6章 ブロックチェーン
7章 プルーフオブワーク
8章 ピアツーピアネットワーク
MASF (マイナーアクティベートソフトフォーク)
マイナーがサポートを表明(シグナリング)して新しいルールが施行
問題点: 大手のマイナーが事実上の拒否権を持てる
UASF (ユーザーアクティベートソフトフォーク)
「プロトコルを最終的に決めるのは経済的多数派」という考え
11.1 ビットコインのフォーク
ビットコインのフォークは、一般的なOSSのフォークと違う意味を持つ
ビットコインのフォーク = プロトコルの変更
プロトコル: 有効なブロックチェーンとは何か
フォーク: 有効なブロックチェーンの定義を変えること
例
ブロックの重さを4,000,000WU以下に制限する -> 合意されたプロトコル
ノードのリレーポリシー: プロトコルの一部ではない(フォークでは無い)
例: 手数料が低すぎるトランザクションのリレーを拒む
ハードフォーク
前方互換性: 保障しない
後方互換性: 保障しない
旧Verだと無効のブロックの一部が、新Verだと有効となる場合がある
例: ブロックの重さ上限を倍にする
ソフトフォーク
前方互換性: 保障する
後方互換性: 保障しない
旧Verだと無効のブロックは、新Verでも無効
旧Verだと有効のブロックの一部は、新Verでは無効の場合がある
例: ブロックの重さ上限を半分に引き下げる
図11.3のベン図が分かりやすい
11.1.1 ビットコインのフォークを伴わない変更
BIP-152 (Compact Block)
ブロックチェーンには手を付けていない
11.1.2 ハードフォーク
ハードフォークによるブロックチェーンの分岐
ハッシュ率が旧ノード > 新ノードの場合
https://scrapbox.io/files/674ddfe17e0ef75c91bb4824.png
ハッシュ率が旧ノード < 新ノードの場合
https://scrapbox.io/files/674de0b1f23a8925d503f420.png
再度ハッシュ率が旧ノード > 新ノードになった場合
https://scrapbox.io/files/674de3ec4aa170c6e351b63c.png
新ノードが旧ノードのチェーンに戻った時
チェーンが再編(re-organization)によりワイプアウト(wipeout)されたと言われる
11.2.1 ワイプアウトプロテクション
新ノードが、旧ノードに必ず弾かれるような変更を加えること
例: プルーフオブワークのハッシュ関数を変更する など
ビットコインからハードフォークしたビットコインキャッシュ
ブロックサイズを変更した
Segwitを取り除いた
ワイプアウト対策: チェーン分岐後の最初のブロックを1MB以上とした
11.1.3 ソフトフォーク
新ノードが作るブロックのプロトコルが、旧ノードでも受け入れられるようにすること
Segwit: ソフトフォークの例
11.1.4 ハードフォークとソフトフォークの違い
ハードフォーク:
ルールを厳しくする以外の変更
旧ノードが新ノードを受け入れないように、ワイプアウトプロテクションを入れる必要がある
ソフトフォーク:
ルールを厳しくする変更
旧ノードが新ノードを受け入れる
11.2 トランザクションのリプレイ
11.2.1 リプレイプロテクション
11.3 アップグレードメカニズム
11.3.1 コインベースによるシグナリング: BIP-16
11.3.2 ブロックのバージョン番号を上げることによるシグナリング: BIP-34, 66, 65
11.3.3 ブロックバージョンビットによるシグナリング: BIP-9
11.3.4 BIP-9による相対ロックタイムのデプロイ
11.3.5 BIP-9によるセグウィットのデプロイ
11.3.5.1 利害の衝突
11.3.5.2 UASF (ユーザーアクティベートソフトフォーク)
11.3.5.3 対立派閥を橋渡しする提案
11.3.5.4 得られた教訓
11.3.6 UASF
11.4 復習
11.5 演習問題
11.5.1 基本問題
11.5.2 応用問題
11.6 まとめ