「信頼」の源泉はどこにある?
ブロックチェーンを使えば信頼できる/信頼されなければならないデータ(例えばお金)を扱うことができようになる。ブロックチェーンの魅力といえばまずこれがあげられるだろう。
「信頼」はブロックチェーンにおける根本的な価値であるが、その原理やしくみはなかなか理解されていないのではないだろうか?今回はブロックチェーンにおける「信頼」の仕組みについて考察してみたい。
まずブロックチェーンにおける「信頼」は単純な一つの原理で生まれるわけではなく、そこには3つのレベルがあると考えられる。
1、トランザクションのレベル
2、ステートのレベル
3、ブロックのレベル
では順番にみていこう。
1、トランザクションのレベル
最初のレベルはトランザクションそのものだ。トランザクションといってもその形式は様々なフォーマットがあるが、どんな場合でも共通していることがある。
それは「トランザクションには必ず署名(ハンコ)エリアがあり、データに対して電子署名がされている」ということとである。
公開鍵暗号を使っているから署名があるのは当然なのだが、この意味をもう少し深く考えてみたい。
少しややこしくなるのでまず登場人物を整理しよう。
A:公開鍵。これはトランザクション内に直接かかれるか署名から計算可能
B:秘密鍵。公開鍵に紐つく秘密鍵でトランザクション作成者が知っている
C:署名されるべきデータ。データはハッシュをとりそれに署名する
D:署名。署名は証明対象データに含まれない。当たり前だが
公開鍵暗号における署名というのは次の2点を保証できる。
・この署名(D)は秘密鍵(B)を知っている人によって作成された
・この署名(D)は署名対象データ(C)に対して署名され、1ビットたりとも変更されていない
つまり、日本語に翻訳するとこうだ。
「この文書には間違いなく田中(仮名)さんのハンコが押してあります。そして、田中さんがハンコを押したときに書いてあった文面は絶対に改ざんされていません」
従来のシステムではこうはいかない。上記と同じことを保証するには専用のシステムを作り、そのシステムがハッキングされたりしておらず、中の人も不正を働いていない、ということを運営母体の社会的な信頼や運営の透明性などと合わせて保証しなくてはならないのだ。
つまり従来のシステムにおいて「信頼」はその運営母体から生じるといってよいだろう。
ブロックチェーンではこの「信頼」は数学的な事実「秘密鍵を知らない人は署名を生成することができない」から直接発生するわけで好対照といえよう。
中央システムを信頼する必要はないし通信経路も気にする必要はない。そもそもハッキングされたとしても署名をねつ造することはできない(もちろん秘密鍵を盗まれたときは別だ。皆さん知っての通り)
とどのつまりデータがどこを経由してやってこようと、署名を見ればそのデータを「信頼」できるかどうかわかる。「信頼」はデータがどこからやってきたかに依存するのではなくデータそのものに内在しているのである。
2、ステートのレベル
2番目のレベルはステートのレベルだ。トランザクションを実行すると残高の状態などが変わる、この「状態」のことをステートと呼ぶ。
ビットコインではそのコインがまだ未使用の場合 Unspent Transaction Outと呼び UTXO と略記する。このUTXOも使用済みか未使用かの状態であるので状態の一種だ。
署名によりトランザクションが「信頼」できたとしても、そのトランザクションが有効であるとは限らない。残高が足りなかったり、すでに一度実行したりしたトランザクションは無効だからだ。これをチェックしなければ誰でも無限にコインを得ることができてしまう。
このようなことが起きるのはトランザクションの有効性は状態に依存し、状態によっては有効であったり無効であったりするためだ。
だからこのレベルの「信頼」を得るには自分自身で状態をチェックする必要がある。どこか別のノードに問い合わせることも可能だが、その答えはなぜ信頼できるのか?結局そのノードを「信頼」することになってしまい、従来のシステムと同じレベルの「信頼」しか得られない。
だからブロック(台帳)を自分で取得し、ブロック内のトランザクションを自力で実行し、その時点で残高があるか、2重支払いになっていないか、などを自力でチェックする必要がある。
ビットコインでよく言われる「世界中に何万と台帳がコピーされお互いに確認しあっているので改ざんすることはできない」というやつだ。まさに各ノードが監査人となり、24時間365日ブロックに無効なトランザクションが混入していないかをチェックし続けているのだ。
パブリックチェーンというのはネットワークへの参加が自由で公開されているチェーンのことであった。だからパブリックチェーンにおいては簡単にこの「信頼」を得ることができる。仮想通貨がパブリックチェーンを採用しているのはこのようなわけがあるからだろう。
ではプライベートチェーンではこのレベルの「信頼」を得ることができないのだろうか?もちろんどんどん参加者を増やせば同じようなことはできる。しかし通常のプライベートチェーンのコンセンサスアルゴリズムはコンセンサスノードが増えると性能が悪化するし、参加するために許可が必要となり面倒でもある。
そこでmiyabiでは第三の選択肢を用意している。それはコアノードとアプリケーションノードという考え方だ。(実は特許も取っていたりする)
この2つのノードの違いはたった一つ、アプリケーションノードはコンセンサスアルゴリズムに参加しないということだけだ。それ以外のあらゆる点でコアノードとアプリケーションノードに違いはない。
つまりコアノードだけがコンセンサスアルゴリズムに参加するためアプリケーションノード数が増えたとしても性能は悪化しない。また同時にアプリケーションノードはコンセンサスに参加しないのだから参加のためのハードルも低くてすむ。
特にプライベートチェーンにおいては、このレベルの「信頼」は意識しないと得ることができない恐れがある。サーバサイドでブロックチェーンが動いていても利用者がすべてそのシステムが提供するAPIなりUIを使っていたのではこのレベルの「信頼」を得ることができないからだ。そのようンシステムは従来のシステムと同様に中央のシステムを信頼することでステートレベルの「信頼」を得ることになる。
3、ブロックのレベル
最後のレベルはブロックのレベルだ。前章でステートの「信頼」はブロックを自力でチェックすることで得られるといったが、そもそもそのブロックはなぜ「信頼」できるのか?という問題である。
まずはビットコインの場合を考えてみよう。意外なことかもしれないが、ビットコインの場合Proof of Workによってブロックが「信頼」されるのではない。PoWはマイナーが投じた1票の正当性を保証しているだけで、そのブロックがプロトコルに従っていることを保証はしない。プロトコル通りブロックがちゃんとLongest Chain につながっていることを保証するのはPoWではなくマイナーの経済的合理性なのだ。
これこそビットコインのもっとも革命的なアイデアといってもいいだろう。攻撃者は攻撃するくらいならマイニングしたほうが得であり、まともな思考の持ち主なら攻撃なんてしない。だから作られたブロックは「信頼」に値するのだ。
この原理は次のように一般化できる。
「システムを攻撃することによって得られる利益よりもそれによって失う損失のほうが大きい場合、そのシステムは攻撃されないであろう。そのことを皆が信じることで「信頼」が生まれる。」
だからこのレベルの「信頼」を得るためには、攻撃者の利益を減らし、攻撃者の損失を増やすことが必要である。
まず利益のほうを考えよう。つまりプロトコルに準じないブロックを生成した時に攻撃者は何を得ることができるのか?
実は100%のハッシュパワーを得たところでトランザクションをねつ造することはできない(トランザクションレベルの信頼)し、もともと持っていないコインを送ることもできない(ステートレベルの信頼)。よくよく考えると攻撃者やれることはせいぜい
・特定のトランザクションを無視する
・歴史を書き換え過去とは別の人にコインを送る
ことくらいだ。もちろん歴史を書き換えることは強力な行為ではあるのだが・・・。
これさえもmiyabiのようにファイナリティのあるコンセンサスアルゴリズムを使っている場合は歴史を書き換えることさはできない。決まったことは覆らないからこそファイナリティがあるという。だからそんなことが起きればシステムは止まってしまうのだ。逆に言えば攻撃者はシステムを停止させることができるとも言えわけだが。
次に損失のほうを考えてみよう。ビットコインで攻撃者が思いとどまるのは「そんなことするくらいならマイニングしたほうがましだ」と考えるからだった。これってつまりマイニング報酬を与えることで攻撃者の損失を増やしているのだと考えることができる(機会損失という意味で)。
さてプライベートチェーンではどうだろうか。
プライベートでは通常マイニング報酬はない。だからノードの運営者はネットワークを運営することによって何かしら利益を得ていると考えられる。そうじゃなければ運営コストを払うわけがないからだ。
また誰が運営しているのはネットワーク利用者には公開されているだろう。誰が運営しているかわからないサービスは使わないだろうから。
ということはシステムを攻撃するとことは少なくとも次の2つの点で損失になる。
・運営者のレピュテーションが下がる
・システムが止まってしまい本来の利益が得られないこと
あとはこれらの損失と利益を天秤にかけ、損失のほうが大きくなるようにすればいい。レピュテーションの低下やシステムが止まることの利益や損失はケースごとに違うだろうから一般論は語れないが、勝算のある話だと思う。これが達成できればビットコインと同じようにブロックのレベルの「信頼」を得ることができるのだ。
長くなったのでまとめ
1、トランザクションレベル → 秘密鍵による「信頼」
2、ステートレベル → 状態の自力チェックによる「信頼」
3、ブロックレベル → 利益 << 損失 となることによる「信頼」
ということだ。ビットコインが成功したのもうなずける。レベル1は公開鍵暗号で、レベル2はP2Pで、レベル3はマイニング報酬という仕組みをうまく使うことで達成しているからだ。
同様にほかのケースでどうすればいいかの指針もわかる。トランザクションの署名には形式的にではなく、利害関係者による意味のある署名を行うべきで、監査用のノードを参加させてチェックを行い、システムを攻撃したときの損失が大きくなるよな参加者にノードを任せるべきだ。
ブロックチェーンの一番の特徴である「信頼できる」という特徴がどのようなメカニズムで発生するのか、これをちゃんと理解して実案件で応用することがブロックチェーンシステム構築において重要なことだと思う。