アーパボー(ARPABLE)
アープらしいエンジニア、それを称賛する言葉・・・アーパボー(商標登録6601061)
ブロックチェーン

ブロックチェーンは何故信頼できるのか

ブロックチェーンの信用力

ブロックチェーンは、自律分散型のネットワークの中で、中央の権威によらず全ての取引データが公開されているにも拘らず、非常に巧みな仕掛けと検証力により信頼性が担保されている。

ここ数年ブロックチェーンの調査をする中で、今更ながら2008年にすい星のごとく現れ、論文を発表したサトシ・ナカモト氏に心から敬意を表したい。

そこで今回は、ブロックチェーンの信用力をどのように担保しているかについて整理してみたい。

ここではサトシ・ナカモトの論文ベース、即ちビットコインベースで解説します。

検証するノードたち

ブロックチェーンを構成する自律分散型ネットワーク上にあるノード(参加者)は全て同じ機能を持っているわけではありません。

ノードの種類に関しては、以下の4つの機能から説明するケースが多いのですが、直感的にイメージするためにはかえって分かりにくいので省略します。
(4つの機能:ルーティング、ブロックチェーンデータベース、マイニング、ウォレット)

代表的なノードは以下の3つであり、これらが自律分散型のネットワーク上で連携しながらブロックチェーンを構成してます。

  • フルノード
  • 軽量ノード(SPVノード)
  • ソロマイナー

この中で、軽量ノードは実際の取引に必要な検証はしますが、ブロックチェーン全体の検証をするのはフルノードとソロマイナーです。

フルノード

フルノードは、過去から現在までのすべてのブロックチェーンをダウンロードして、ビットコインのコンセンサスルールとマッチするか検証します。
代表的なフルノードはビットコインコアと呼ばれ、ビットコインのマイニングや取引などを行うためのオープンソースプログラムのことで、ビットコインの根幹を支えている技術です。

軽量ノード(SPVノード)

SPVノード(Simplified payment verification)、その名の通り秘密鍵を管理し送受金を行うことを目的とした軽量ノードです。

単に支払いをするだけならブロックチェーンの全てのデータをダウンロードしなくても、トランサクションを検証することができるノードです。

具体的には、関連するブロックのヘッダー部分だけをダウンロードし、実際に取引をする目的においてトランザクション検証をします。

ソロマイナー

単独でマイニング作業を行っているノードです。
フルノードもマイニングの機能を持っていますのでマイナーのうちいくつかはフルノードになります。

より強力にマイニングを行うため、仲間を作ってグループでマイニングを行うプールマイナーと呼ばれる人たちもいますが、ブロックチェーンの検証をするという観点ではやることは同じです。

ブロックチェーンの検証力(全体図)

ハッシュチェーン

ブロックチェーンの1ブロックは1MB(ビットコインの場合)と規程されてますが(※1)、各ブロックのヘッダ部(80バイト)のハッシュ値は次のブロックのブロックヘッダ内のprevious hash(32バイト)の領域に書き込まれます。

(※1)実際にはSegwit等の仕組みで実質的に1.7MB程度まで上下しているようです。
ちなみに2017年にハードフォークしたビットコインキャッシュは最大32MBまで実装可能です。

これを繰り返すことにより各ブロックヘッダには常に前のブロックのハッシュ値が書き込まれる、所謂「ハッシュチェーン」を構成することにより、確定したブロックを改ざんすることは極めて困難になってます。

ハッシュツリー

1つのブロックには2000~4000程のトランザクション(取引情報)が含まれてますが、この改ざん検知に使われているのがマークルルート(hashMarkleRoot)でした。

これによりトランザクションデータを1ビットでも変更すると、ブロックヘッダ内のhashMarkleRootの値と異なるため簡単に検出ができてしまいます。

詳細はマークルツリーとはを参照のこと。

トランザクション検証

アドレスの検証

ブロックチェーンのアドレスは公開鍵ハッシュにチェックサムを追加してBese58でエンコードしたものが使われます。

(※)詳細は、ブロックチェーンのアドレスとはを参照のこと。

秘密鍵はウオレット機能で保護されている上、公開鍵から秘密鍵を導出するのは現時点の技術では実用上において不可能であり、アドレスには公開鍵ハッシュの末尾に4バイトのチェックサムが追加されているので改ざんが難しくなってます。

勿論秘密鍵が漏洩すればそれに対応する資産は大きなリスクにさらされますのが、むしろそれは個人の管理だったりウオレットの管理体制の問題であり、ブロックチェーン特有の問題点とは違うのではないでしょうか?

つまり、銀行口座の暗証番号や、インターネットバンキングのパスワードが盗まれるのと同じ課題だということですね。

トランザクション検証

トランザクションを検証するタイミングは、新しいトランザクションがネットワークに投入されたとき、あるいはマイナーがトランザクションプールからブロックを生成するときに行われます。

❶データ構造の正当性

トランザクションのデータ構造が以下のようになっているかを検証します。
この構造になってないトランザクションは捨てられます。
(出典はbitcoin wiki


❷2重支払防止

取引情報が記載されているトランザクションが2重支払いをしてないかの確認を行う必要があります。

主にINPUTに記載されているUTXOが存在し、それを使用する権利があるかどうかをトランザクションスクリプトにより検証します

※)詳細は、ブロックチェーントランザクション2の「五条さんの主張を検証する3ステップ」を参照のこと。

 

❸INPUTの金額がOUTPUTの金額よりも大きいか
(ガス代があるためイコールにはならない)

詳細はブロックチェーントランザクション(2)を参照のこと。

ブロック検証

マイナーが作成したブロックはネットワークに投入され各ノードにより以下の検証が行われます。条件に合わないブロックは捨てられます。

❶ブロックのデータ構造は正しいか?

ブロックの構造は以下のとおりです。(出典はbitcoin wiki

ブロックヘッダのデータ構造は以下のとおりです。
(出典はbitcoin wiki

❷ナンスの検証

ナンスを検証するためにヘッダのハッシュ値が採掘難易度(上図のBits)より小さいか確認する。

チェーン検証

ブロックチェーンのような自律分散型のネットワークでは、新しいブロックが同時多発的に発生することがあります。

複数のチェーンが発生した場合、参加者が納得する形で唯1つのチェーンを選択する必要があります。その場合のルールとしては

  • 常により長いチェーンが選択され、短いチェーンは捨てられる
  • 新しいブロックが6個以上つながったら正しいものとして確定する
    (従って新しいブロックは約60分後に確定します)

上図において左側のノードNはブロックZを受け取った後にブロックBを取得しますが、ブロックZとつながらない場合があります(※)
例えば、ブロックBのヘッダ部のhashPrevBlock(32バイト)が、ブロックZのヘッダ部のハッシュ値と合しない場合です。

この時には別のブロックAを発見してブロックBとつながることを確認するとブロックZは捨てられます。

まとめ
ブロックチェーンの信用力担保の為の検証

以上をまとめると以下の図のようになりますね。

(アーパボー)