わかりやすくブロックチェーンを説明してみる(第6回):ブロックチェーンの分岐(フォーク)

<連載目次>

はじめに

ブロックチェーンの本質は「データ分散(コピー)」技術です。

前回(第5回)はトランザクション(送金情報)がネットワーク上でどのようにチェックされるかについて説明しました。またなぜビットコインが「暗号資産」と呼ばれるのかについても触れました。秘密鍵、公開鍵、デジタル署名はもともと理解するのが難しい技術なので残念ながら「わかりやすい説明」とはいきませんでした。

しかしブロックチェーンの本質は「データ分散(コピー)」技術です。暗号化技術はブロックチェーンの本質ではないとまでは言いませんが、ブロックチェーン独自の技術ではないので説明もさらりとでいいような気もしています。

今回(第6回)は、ブロックチェーンの分岐(フォーク)について説明します。ブロックチェーンの分岐(フォーク)もかなりややこしいのですが厳密な説明は避け、なるべくわかりやすく説明してみます。

なお本連載はビットコインやブロックチェーンを技術的な側面から解説することを目的としています。ビットコインへの投資を勧める連載では決してありません。

ブロックチェーンの分岐(フォーク)

全員の取引台帳(ブロックチェーン)の内容を同じにするために、1人を決めるということが重要でした。また、1人を決めるために時間のかかる計算を解かせる(nonceを見つけさせる)、という話でした。

とは言ってもnonceを見つけた複数の人がほぼ同時に現れるということがある程度の確率で起こります。下図に示したように例えばXさんとYさんがほぼ同時にnonceを見つけてネットワーク上でnonce発見を通知したとします。そしてAさんにはまず先にXさんからの通知が届き、Bさんにはまず先にYさんからの通知が届いたとします。

図1 ブロックをほぼ同時に発見

この場合、AさんはXさんから転送されてきたブロックを自分の保存している取引台帳に書き込みます。一方、BさんはYさんから転送されてきたブロックを自分の保存している取引台帳に書き込みます。AさんおよびBさんが内部で保存しているブロックチェーンの様子を下図に示します。

図2 Aさんの保持するブロックチェーンの様子
図3 Bさんの保持するブロックチェーンの様子

図2に示したように、Aさんがマイニングをしているとき(nonceを探索中のとき)にXさんから「ブロックXを見つけた(nonceを見つけた)」という通知を受けます。そこでAさんは自分が実施していたマイニングをやめて、自分の保持するブロックチェーンの先頭にブロックXを追加します。そしてブロックXの先に追加すべき新しいブロックのために再びマイニングを開始します。

また図3のようにBさんがマイニングをしているとき(nonceを探索中のとき)にYさんから「ブロックYを見つけた(nounceを見つけた)」という通知を受けます。そこでBさんは自分が実施していたマイニングをやめて、自分の保持するブロックチェーンの先頭にブロックYを追加します。そしてブロックYの先に追加すべき新しいブロックのために再びマイニングを開始します。

この時点ではブロックチェーンは破綻

この時点において、AさんのブロックチェーンとBさんのブロックチェーンの内容は異なっています。つまりビットコイン・ネットワーク上に2種類のブロックチェーンが存在することになります。これをブロックチェーンの「フォーク」と呼びます。この状況を絵で表すと以下のようになります。

図4 全世界でブロックチェーンが2種類できてしまう

上図のようにビットコイン・ネットワークが2つの派に分かれます。つまり上図の上側のチェーンをマイニングし、そのチェーンを有効とする派(ブロックXを先に受信した人達)と、下側のチェーンをマイニングし、そのチェーンを有効とする派(ブロックYを先に受信した人達)です。

ここで注意して欲しいのは、上図はビットコイン・ネットワーク全体での様子を表しているものであり、Aさん、Bさんのブロックチェーンの状態を表しているものではありません。この後の説明でも出てきますが、Aさんが両方のチェーンに対してマイングするということはありません。Bさんについても同じです。

これでは全員が同じ取引台帳を保存していることにはなりません。この時点ではブロックチェーンは破綻しています。しかし、しばらく時間が経過するとこの破綻は解消されます。この破綻の解消について説明します。

AさんとBさんの内部で起こっていること


AさんはブロックXを受信した直後(数秒後)にブロックYを受信します。BさんはブロックYを受信した直後(数秒後)にブロックXを受信します。受信後のAさんの内部で保持するブロックチェーンの様子を下図に示します。

図5 AさんとBさんの内部で起きていること

上図にあるようにAさんはブロックYも自分のブロックチェーンに保存します。ただし、ブロックYの後ろに接続するブロックに関してはマイニングは行いません。ただブロックYを保存するだけです。これによりAさんの保持するブロックチェーンが2つに分岐しました。

Aさんの中で2つに分岐したチェーンのうち、Aさんがマイニングの対象としているチェーンを「メインチェーン」、もう一方のチェーンを「セカンダリチェーン」と呼ぶことにします。Aさんの中では「メインチェーン」を有効なブロックチェーンとします。

同様にBさんの中でもメインチェーンとセカンダリチェーンができています。ただしAさんのメインチェーンとBさんのメインチェーンは依然として中身が異なります。

長い方のチェーンを採用するというルール

この後、ブロックYの後に接続されるブロックY2がAさんとBさんに通知されたとします。その時のAさんが内部で保存しているブロックチェーンの様子を下図に示します。

図6 AさんはY2が来たのでメインチーンを変更(長い方のチェーンにマイニングを変更)

上図のようにAさんはブロックXの先のマイニングをやめ、保存しておいたセカンダリチェーンのブロックYの先にブロックY2を接続し、ブロックY2の先に対してマイニングを開始します。これは、これまでセカンダリチェーンであったものをメインチェーンし、メインチェーンだったものをセカンダリチェーンとすることを意味します。セカンダリチェーンとメインチェーンを入れ変えたわけです。

ではなぜ、AさんはブロックXの後ろにつながるべきブロックのマイニングをやめるのでしょうか?

それはビットコインのブロックチェーンでは、以下のルールが存在するためです。

  • 「ブロックチェーンが分岐した場合は、長い方のチェーンを有効なチェーンとする」
    (注)実際は長さではなくdifficultyと呼ばれるもので判断します。difficultyはnonce発見の難易  度を累積したものです。

つまり短いチェーンは「無効」となります。

ブロックチェーン内のブロックが無効とされてしまうと、そのブロックをマイニングをした人へのご褒美も無効になります。このためみんな長い方のチェーンをマイニングすることになります。この結果、全員の取引台帳の中身が同じとなります。

無効となったブロックXの中にある各トランザクションは再度マイニングの対象となります。ただし有効なブロックチェーンにすでに登録済みのトランザクションは除きます(再マイニングの対象にはなりません)。

なお、無効となったブロックデータはまだセカンダリーチェーンとして残しておきます。この理由については後ほど説明します。

Bさんが内部で保存しているブロックチェーンの様子を下図に示します。

図7 Bさんはメインチェーンは変更せず

上の図に示したようにBさんはこれまでマイニングしてたメインチェーン側をマイニングし続けます。理由はBさんがこれまでメインチェーンとしていたチェーンの方がセカンダリチェーンよりも長いからです。この結果、AさんのメインチェーンとBさんのメインチェーンは同じなり、無事にAさんとBさんのブロックチェーンの内容が同じとなります。

「長いチェーンを有効としよう」という単純なルールだけでいいのか?と思ってしまいそうですが、この単純なルールだけで全員の持つ取引台帳(ブロックチェーン)の中身を同じにすることが可能だとされています。

二重支払いができてしまう

しかし待って下さい。これでは重大な問題が発生してしまいます。それはAさんが「ブロックXを無効にした」という点です。

簡単に「無効にした」と書きましたが、Aさんが有効としていたブロックチェーンにブロックXは書き込まれていたわけです。これはAさんだけの話ではなく、ビットコイン・ネットワークの約50%の人(ブロックXが先に届いた人達)の有効ブロックチェーンも同じようにブロックXが書かれています。なお、他の約50%の人(ブロックYが先に届いた人達)の有効ブロックチェーンにはブロックXは書かれずブロックYが書かれています。

ブロックXには複数の送金情報が入っています。その送金情報の中にお客さんからお店への送金情報があったとします。お店はお客さんから送金があったことをブロックチェーンを見て確認します。そしてお店はお客さんに商品を送ります。

お店が客さんに商品を送った後、ブロックチェーンのフォーク発生によりブロックXが「無効」になったとします。つまり有効ブロックチェーンにはもはやブロックXは存在しなくなります。ということは先程のお客さんがお店に送金した(支払った)という事実はなくなります。その結果、お客さんはさっき使ったビットコインを再度使用することができるようになります。いわゆる二重支払いができてしまうわけです。

ではどうすればいいのでしょうか?一番簡単な方法は、ブロックXの次のブロックが来るまで待つ、つまり商品を送らない、という方法です。図6と図7を思い出してください。AさんにブロックXの次のブロックが来たときは、「長い方ルール」によりビットコイン・ネットワーク全体において下図のようなブロックチェーンが1つだけ存在するようになる、ということでした。

図8 1つ待てばブロックチェーンが1種類になる

1つ待った結果、お店の人はブロックXが無効、つまりお客さんからの支払いが無効、ということが分かり商品を送らずに済みます。

しかしまだ問題があります。1つ待っただけではフォーク状態が解決しない場合があるからです。

フォークの継続

先述のブロックY2と「ほぼ同時」にブロックX2が発見された場合はどうなるのでしょうか?なおブロックX2はブロックXの先に接続されるブロックとします。

AさんにはブロックY2よりも先にブロックX2が来て、BさんにはブロックX2よりも先にブロックY2が先に来たとします。その様子を下図に示します。

図9 ブロックX2とY2の受信

上図においてAさんはメインチェーン(Q-P-X)の先のX2が来たので、X2を接続しその先のマイングを行います。なぜならAさん内部のメインチェーンの方がAさん内部のセカンダリチェーンよりも長いからです。

一方、Bさんはメインチェーン(Q-P-Y)の先のY2が来たので、Y2を接続しその先のマイングを行います。なぜならBさん内部のメインチェーンの方がBさん内部のセカンダリチェーンよりも長いからです。

この結果、AさんのメインチェーンとBさんのメインチェーンでは内容が異なることになります。このように相変わらずビットコイン・ネットワーク上に2種類のブロックチェーンが存在することになります。つまり「フォーク」した状態のままです。この状況を絵で表すと以下のようになります。

図10 全世界でブロックチェーンが2種類できてしまう

この状況ではブロックX(つまりお客さんの支払い)が無効になるかどうかについてはまだわかりません。ではいつまで待てばいいのでしょうか?

なお、このように異なったブロックがほぼ同時に通知されるという事象が連続して起こるのはまれであり、このレースが3ブロック続く確率は非常に小さいとされています。

それにしてもいつまで待てばいいのでしょうか?

6回の承認

通知されたブロックに対して、nonce等のチェックをして自分が保存しているブロックチェーンに追加することを「ブロックの承認」と呼びます。

そしてビットコインでは下図に示すように、ブロックYの先に5個のブロックがつながったら(6回承認されたら)、ブロックY内の各トランザクション(送金情報)が完了(確定)した、とします。

図11 6承認


なお、6回の承認というのはビットコイン上の仕様となっているわけではありません。多く人が慣習的に6回の承認でよい、としているだけです。1つのブロックのマイニングには約10分かかるので、6回の承認のためには約60分待つことになります。

偶発的なフォークが3段以上続く確率は非常に低いのになぜ6承認も待つ必要があるのでしょうか?
理由は以下の2つがあります。

  1. 念のため多めに6承認
  2. 偶発的フォークではなく、悪者によるフォークに対応するため

上記2つめの「悪者」によるフォークについて説明します。

悪者によるフォーク

今仮に、「2回の承認で送金を確定する」というルールにしたとします。このとき悪者がやる手口について下図を使って説明します。

図12 悪者の手口

上図において悪者のUTXO(未使用ビットコイン)が1BTCしかないとします。そして悪者が1BTC(全財産)を支払ってXさんから商品を購入する場合を考えてみます。上図中のトランザクションTxAは「悪者→Xさん」への1BTC送金です。「2回の承認で送金を確定する」とした場合、ブロックCが接続された時点でTxAは確定し、Xさんは商品を悪者に送ることになります。

ブロックAが接続されるのとほぼ同時に悪者がブロックBをネットワーク上に通知したとします。このブロックB内には「悪者→Yさん」への送金トランザクションTxCが含まれています。そしてTxCはTxAと同じUTXOを参照しているものとします。ブロックBを通知するために悪者はnonceを誰よりも早く見つける必要があるのですが、今は仮に悪者がすごいコンピュータ資源を持っていると仮定します。

その後ブロックCが接続されるのとほぼ同時に、悪者はブロックDをネットワーク上で通知し、さらにブロックE、Fも通知したとします。

このとき悪者が通知したブロックチェーン(図12の下側のチェーン)の方が上側のチェーンより長くなったので、上側のチェーンは無効となります。TxA、つまり「悪者→Aさん」への送金、はなかったこととなります。

しかし「2回の承認で送金確定」というルールにしたため、Aさんは商品を悪者に送ってしまっています。にもかかわらず代金を支払ってもらえていない、という状況が発生します。

悪者は、上側のブロックチェーンにおいて使用したUTXO(未使用ビットコイン)を下側のブロックチェーンにおいても再度使用して商品を購入します。いわゆる二重支払いです。

上記において二重支払いが起きたのは「2回の承認で確定」としたためです。下図のように「6回の承認で確定」としたらどうでしょうか?

図13 6回の承認だと安全

「6回の承認で確定」とした場合は、悪者が先程と同じようなことをするためには上側のチェーンが伸びていくのとほぼ同時に悪者のチェーンを伸ばす必要があります。つまり5回連続して上側のチェーンとほぼ同時に悪者独自によりマイニングしなければなりません。

さすがにそれは無理でしょう、ということでビットコインでは「6回の承認で送金確定」ということになっています。

「フォーク」という単語はややこしい・・・

これまでブロックチェーンの分岐(フォーク)について説明しましたが、実はビットコインにおいて「フォーク」という単語には複数の使い方があります。本質は変わらないのですが、その意味が異なってきます。

かなりややこしいので、詳細については割愛します。簡単に以下にまとめてみたので興味がある方は調べてみて下さい。

図14 フォークの分類
図15 図14とは別の観点によるフォークの分類

次回

今回(第6回)はブロックチェーンの分岐(フォーク)について説明しました。フォークも秘密鍵、公開鍵、デジタル署名と同じく結構ややこしいので、「わかりやすく」は説明できなかったように思います。

これまで(第1回から今回(第6回)まで)はビットコインを例にしてブロックチェーンについて説明してきました。

ビットコインではブロックチェーンに送金情報を保存しています。では、ブロックチェーンに送金情報を以外のデータ、例えば契約書やプログラム(ソフトウェア)などのデータを保存できるとしたらどうなるんだろうか、と思う人も出てくるのではないでしょうか。

次回(第7回)は送金情報以外のデータを保存することができるブロックチェーンを持つ暗号資産「イーサリアム」について簡単に触れたいと思います。

<連載目次>