※ updated at 10/23 3:07
こんにちは、えたろうです。
ハードフォークとソフトフォークについて調べていて「仕組み」の部分を解説してくれている記事があまりにも少なかったので、まとめていきたいと思います。
少しだけ易しいMastering Bitcoinを読んで一通りBitcoinの仕組みを理解している人向けに書いていきます。
そもそもFork(フォーク)とは何だったか?
「少しだけ易しいMastering Bitcoin」の第8章後半 ⑵-④-(b)で学んだ通り、Forkとは
「複数のマイナーが同時に'同じ親ブロックを持つブロック'をマイニングしてBitcoinネットワークに伝搬した時に生じるブロックチェーンの分岐」の事でした。
そして分岐したチェーンは、ナカモトコンセンサスと呼ばれる「最も長いチェーンを真のブロックチェーンとする」ルールに従って一意に収束するのでした。
ハードフォーク・ソフトフォークの場合の「フォーク」とは
一般的に「ハードフォーク」「ソフトフォーク」と言われる場合のフォークとは、上記のForkとは少し違う状況の事を指しています。
あらゆるアプリケーションには当初は気がつかなかったバグが含まれていることもありますし、ユーザーの動向によって後から修正が必要になる場合も多々あります。
通常のスマホアプリで修正が必要な箇所が発生した場合には、アプリ運営者は、仕様を変更したものをapple storeなどに出し、ユーザーがアップデートするのを待ちますね。
そして、「あまりにもアップデートしないユーザー」は最終的に、iphone側(クライアント側)の仕様が古すぎて、サービスを提供しているサーバーについていけないこともあるため、サービス運営者は強制アップデートをさせたり、場合によってはそのようなユーザーは見捨ててしまえば良いことになります。
では、BitcoinのようなP2P型のアプリケーションは「仕様のアップデート」をどのようにするのでしょうか?
P2Pのシステムでは、それぞれのノード(参加者)は「運営者でもあり、消費者でもある」つまり、クライアントサーバー型のような「このサーバーが王様であり、こいつに従わないとサービス受けられません」という中央がなく、「全ノードが平等にサービスの仕様を決める権利を持っている」ので、前述したスマホアプリのように全ユーザーに一斉に強制的な仕様変更処置を取ることは現実的に不可能です。
このことから分かる通り、仕様のアップデートをしたい場合は、あくまでも「全ノードに向けた新仕様へのupdateの提案」をすることになります。
イメージとしては「ノードさん達、これからはこの基準でトランザクションやブロックの検証をするプログラムにupdateしてくださいね」みたいな感じです。
この提案に従って新仕様にupdateするノードと、この提案を拒否して新仕様にupdateしないノードが存在し得ることになり、それによってBitcoinネットワークの中で「別々の基準でトランザクション検証を行うノード」「別々のブロックチェーンデータを持ち、それぞれの新規ブロックをマイニングするマイナー」が現れ得るために起こるチェーンの分岐がハードフォーク・ソフトフォークの場合のForkなのです。
ソフトフォークとは
ソフトフォークは「元の仕様と後方互換性がある仕様変更(最終的には分岐しないのでただの仕様変更)」です。
例えば、これまで「ブロックサイズは1MB以内」と決まっていた仕様を、「ブロックサイズは0.8MB以内」という仕様に変更するような場合は、以下の画像のように元の仕様で動いているノードでも新しい仕様のブロックを受け入れることができます。
これが互換性がある仕様変更です。
別の言い方をすれば「ルールを厳しくする」仕様変更です。
ソフトフォークが起こる場合
前述したような仕様変更であるソフトフォークが実現するかどうかは、
「マイナーの何%が新仕様を支持(新versionにupdate)するか」で実質的に決定します。
具体的に場合分けして見て行きます。
①全てのマイナー(100%)が新仕様にupdateした場合
仕様変更が提案されたその日から、全員が新しい仕様の検証基準で自身のブロックチェーンにブロックを取り込み、チェーンを繋いでマイニングして行くため、新しい仕様のチェーンのみが伸びて行き、チェーンの分岐は起きないまま、新仕様が適用されます。
結果:ソフトフォークは実現する
②マイナーの過半数(51% ~ 99%)が新仕様にupdateした場合
上の画像では 赤色のマイナーが「ブロックサイズは0.8MB以下という新仕様にupdateしたマイナー」、青色のマイナーが「ブロックサイズは1MB以下という旧仕様のままのマイナー」を表しています。
仕様変更が提案された後、過半数の新仕様賛成派マイナー(赤マイナー)が、新仕様のブロック(0.8MBのブロック)を作り、チェーンを分岐させて伸ばして行きます。
赤マイナーが過半数ですので、ブロック生成速度が速いため、このチェーンが元の仕様のチェーン(青チェーン)の長さよりも長くなります。
赤マイナーの中での「最も長いチェーン」はもちろん赤チェーンです。
一方、青マイナーから見て赤チェーンのブロック(赤ブロック)は全て1MB以内のブロックであるため、旧ルール違反をしたブロックではありません。すなわち、青マイナーは伝搬してきた赤ブロックを拒否するわけではなく、自身のブロックチェーンに取り入れるのです。そのため、青マイナーの中でも「最も長いチェーン」は赤チェーンということになり、青マイナーも赤チェーンの最新ブロックの次のブロックをマイニングして繋げていくのです。
チェーンが分岐した直後は、青マイナーは旧仕様の青チェーンをマイニングするかもしれませんが、赤チェーンに長さが追い抜かれて青ブロックがorphanブロックになることが繰り返され、全ての青マイナーが青チェーンを分岐させて赤チェーンよりも長いチェーンにするのを諦めた(赤マイナーが過半数だから追い抜かすのは実際無理)とき、旧仕様の青チェーンは消滅します。
結果として、チェーンは分岐されず、新仕様が適用されます。
結果:ソフトフォークは実現する
③マイナーの半数以下(1% ~ 50%)が新仕様にupdateした場合
「ブロックサイズは0.8MB」という新仕様にupdateしていないマイナーがこれまで通りの仕様でブロックを生成し、チェーンを伸ばして行きます。
一方で、新仕様にupdateしたマイナーは、新仕様のチェーンを伸ばして行きますが、半数以下なので長さで負けてしまいます。
しかし、青チェーンには1MBや0.9MBのブロックが含まれており、これらは新仕様のルールに違反しているため、赤ブロックは伝搬してきた青ブロックを自身に取り込むことなく拒否しています。そのため、赤マイナーの中での「最も長いブロックチェーン」は赤チェーンであり、赤マイナーは赤チェーンを伸ばし続けるため、チェーンが分岐します。
しかし、将来的に、新仕様を支持するマイナーが過半数になったら②の状態になり、新仕様のチェーン一本に収束する(ソフトフォークが実現する)ことが見込めます。
結果:当面はソフトフォークが実現しないが、将来的には実現することが見込める
④マイナーのうち誰も(0%)新仕様にupdateしなかった場合
新仕様に誰もupdateしない、つまりソフトフォーク提案がシステム全体に却下されるということになります。
仕様変更が提案された日以降も、マイナー全員が元の仕様でブロックを繋いで行くため、元の仕様のチェーンがそのまま伸びて行き、チェーンの分岐は起きず、仕様は旧仕様のままになります。
結果:ソフトフォークは実現しない
ハードフォークとは
ハードフォークは「元の仕様と後方互換性がない仕様変更」です。
例えば、これまで「ブロックサイズは1MB以内」と決まっていた仕様を、「ブロックサイズは2MB以内」という仕様に変更するような場合は、以下の画像のように元の仕様で動いているノードが新しい仕様のブロックを受け入れることはできません。
これが後方互換性がない仕様変更です。
別の言い方をすれば「ルールを緩める」仕様変更です。
後方互換性のない仕様変更が提案されることによって、新仕様が採用されたときにそれが旧versionのノードに対応していないために、各versionのノード間で保持しているブロックチェーンデータに齟齬が生じます。
上の画像でいうと、仕様変更前のversionのノードは新仕様に従った2MBのブロックを拒否しますが、update済みのノードはこのブロックを自身のブロックチェーンに取り込みます。
これによってそれぞれのノードが保持するブロックチェーンデータが異なり、それぞれのノードから見た「最も長いブロックチェーン」が別のチェーンになってしまう可能性があるのです。すなわちBitcoinネットワーク内で複数のブロックチェーンデータが存在することになってしまいます。
その異なるブロックチェーンが恒久的なものになったハードフォークでは、新しい通貨が生まれます。
(Bitcoinネットワークの全てのノードが仕様変更後versionにupdateする、もしくはしなければフォークすることはないのですが、それは現実的に不可能という前提があります。)
ハードフォークが起こる場合
新仕様の提案が採用されるのか否かは「マイナーの何%が新仕様を支持(にupdate)するか」で実質決まるのでした。
具体的に場合分けして見て行きます。
①全てのマイナー(100%)が新仕様にupdateした場合
仕様変更が提案されたその日から全員が新しい仕様の検証基準で自身のブロックチェーンにブロックを取り込んだ上で、マイニングしてブロックを繋いで行くため、新しい仕様のチェーンのみが伸びて行きます。
新仕様のチェーンはそれ以前のversionとは互換性がないため、各versionのノード間でチェーンが分岐し、異なる通貨が生まれます。
しかし、全てのマイナーが新仕様のチェーンをマイニングすることになりますので、旧仕様のチェーンはその時点で停止します。
この場合は、旧仕様のチェーンをマイニングするマイナーがゼロになるということになりますが、実際には旧仕様のチェーンの通貨にも価値がついているはずであるため、全てのマイニングノードが新仕様にupdateして、このチェーンをマイニングするノードがゼロになることはないと言われています。
結果:ハードフォーク(後方互換性のない仕様変更)が実現し、旧versionノードと新versionノードの間で異なる「最も長いブロックチェーン」を保持してしまうことから、別のブロックチェーンとして分岐が起こり、新しいチェーン・通貨が生まれる。しかし、旧仕様のチェーンはその時点で停止するので実質それ以降のチェーンは新仕様のチェーン一つ。
②マイナーの過半数(51%~99%)が新仕様にupdateした場合
仕様変更提案がされた後、新仕様を支持する過半数のマイナーがブロックを生成し、新仕様のチェーンを伸ばして行きます。
赤マイナーが過半数であるので、赤チェーンの方が長くなります。
赤マイナーから見た「最も長いチェーン」は、もちろん赤チェーンです。
しかし、青マイナーから見ると赤チェーンには1.6MBや2MBのブロックが含まれており、旧仕様のルールに違反しているため、青マイナーは赤ブロックが伝搬してきても不正なブロックとして拒否してしまいます。これにより、青マイナーが自身のブロックチェーンに取り込むブロックは青ブロックのみとなり、青マイナーから見た「最も長いチェーン」は青チェーンになります。
すなわち、青マイナーは青チェーンを伸ばし続けるため、チェーンが分岐します。
結果:ハードフォーク(後方互換性のない仕様変更)が実現するが、旧versionノードと新versionノードが存在し、かつどちらの仕様のチェーンもマイニングされ続けることから、別のブロックチェーンとして分岐が起こり、2種類のチェーン・通貨に分かれる。
③マイナーの半数以下(1% ~ 50%)が新仕様にupdateした場合
過半数の青マイナーが旧仕様のブロックを生成し、青チェーンに繋いで行くため、赤チェーンよりも青チェーンの方が長くなります。
青マイナーの中での「最も長いチェーン」は、もちろん青チェーンになります。
赤マイナーは伝搬されてくる青ブロックも(1MB以下の青ブロックは2MB以下でもある)受け入れ、自身のブロックチェーンに取り込むため、赤マイナーの中での「最も長いチェーン」は青チェーンになります。
よって、赤マイナーは青チェーンにブロックを繋げていくので、赤チェーンはいずれ消滅します。
結果として、分岐は起こらず、仕様も旧仕様のままになります。
結果:ハードフォークは実現しない
④マイナーのうち誰も(0%)新仕様にupdateしなかった場合
新仕様を誰も支持しない、つまり仕様update提案がシステム全体に却下されるということになります。
仕様変更が提案された日以降も、マイナー全員が元の仕様でブロックを繋いで行くため、元の仕様のチェーンがそのまま伸びて行き、チェーンの分岐は起きず、仕様は旧仕様のままになります。
結果:ハードフォークは実現しない
ハードフォーク・ソフトフォークの判別方法
これまで述べてきたハードフォークとソフトフォークのあらゆる場合をまとめると以下の表のようになります。
そもそも「仕様変更・アップデート」に伴うFolkのことをソフトフォーク・ハードフォークというのでした。
そしてそのfolkがハードフォークなのかソフトフォークなのか、そもそもフォークするのかしないのかを判別するには
- 「仕様変更の後方互換性の有無」
- 「過半数のマイナーが仕様変更を支持しているかどうか」
の2点が重要です。
実際のハードフォーク事例
2017年8月1日にBitcoinからハードフォークして、Bitcoin Cashが誕生しました。
このハードフォークは主に「ブロックサイズを1MBから8MBに拡大する」という仕様変更に伴って生じたものです。
(この仕様変更は後方互換性がないためハードフォークの原因になりますね)
結局、この仕様変更には「過半数のマイナーが賛成」したことで、BitcoinとBitcoin Cashという2種類のチェーン・通貨に分岐しました。
(これまでの説明でいうと「ハードフォークの②の場合」、上の表で言うと「黄色の部分」ですね。これが一般的に言われているハードフォークです)
この仕様変更提案は、大規模なマイニングプールが主導していました。
ブロックサイズの拡大すると、マイナーが生成したブロックがネットワーク内に伝搬する時間がよりかかることになるので、ブロック生成に成功したマイナーは、変更前よりもさらに、他のマイナーより早く次のブロックのマイニングをスタートできるようになります。
ハッシュパワーを多く持つ大規模マイニングプールがブロックを生成する機会が多いので、この変更によって彼らはよりブロックを生成しやすくなりマイニング報酬を受取りやすくなるのです。
このように現実には、政治的な対立など様々な要因によって、仕様変更への賛否が分かれ、ハードフォーク・ソフトフォークが起こっているのです。
計画的なハードフォーク
ハードフォーク(後方互換性のないupdate)は
「マイナーの100%が新仕様にupdateすると、チェーンはforkせず新仕様のチェーンになる」
「マイナーの過半数以上が新仕様にupdateすると、チェーンがforkし、新仕様のチェーンと旧仕様のチェーンに分かれる」
ことで実現します。
(マイナーの半数以下しか新仕様にupdateしない場合はそもそも実現されません)
マイナーの半数以上が新仕様にupdateした場合は「チェーンがforkしてしまう」すなわち「コミュニティが分断されてしまう」ので、何度もコミュニティが分断されると最終的には参加者がどんどん少なくなってしまいます。
そのため、後方互換性のないupdate(ハードフォーク)は、計画的に行うことが重要とされています。
Ethereumでは、4段階のハードフォークによるupdateが事前に計画されており、こうすることで、マイナーのupdateが計画的に行われることを促します。
またEthereumでは、もしupdateに反対してupdateしないマイナーが居て、旧チェーンと新チェーンに分岐してしまった場合にも、旧チェーンをマイニングするdifficultyが指数関数的に上昇してブロック生成速度が一気に遅くなり、最終的には停止してしまうこと(Ice Ageと言う)で、旧チェーンをマイニングをするインセンティブがなくなってしまうようなプログラム(difficulty bomb)を事前にクライアントソフトに組み込むことによって、コミュニティが分断せずに新チェーンをマイニングするようにする仕組みが用いられています。
<References>
- 山崎重一郎; 安土茂亨; 田中俊太郎. 『ブロックチェーン・プログラミング 仮想通貨入門』 (KS情報科学専門書) (Kindle の位置No.211-212). 講談社. Kindle 版
- https://blockchain.gunosy.io/entry/bitcoin-fork-release
- https://speakerdeck.com/sonatard/fork
- https://zoom-blc.com/softfork-hardfork
0コメント