こんにちは。CTOの馬場です。
暗号通貨や換金可能性が高いポイントやトークンなどを前提としない技術的なポイントをきちんと知っておきたいというモチベーションがあり、かねてからブロックチェーンという技術に興味がありました。 最近いろいろ本を読んだり BPStudy#137〜静かに進むブロックチェーン革命を学ぶ - connpass に参加したりと勉強しており、 先日の社内勉強会で調べたことをまとめて話したので、せっかくなのでblogにも書いてみます。
お断り
このエントリの内容について、、、 恐らく大外しはしていないと思いますが、 なにぶん初心者が調べた範囲の情報をもとに書いているので、 誤りや認識齟齬があればぜひ教えてください。
調べる中でいくつか書籍などを読みまして、 わたしのニーズに最も合致していたのは 徹底理解ブロックチェーン ゼロから着実にわかる次世代技術の原則(impress top gear) | Daniel Drescher, 株式会社クイープ でした。 お勧めです。 本エントリの内容もこの本に大いに影響を受けています。
なおこのエントリは本当にコア部分だけに絞って話をしているので、 「ここの懸念・課題はこの実装ではこう解決してるよ」 みたいなのがたくさんあると思います。
ブロックチェーンとは?
以下の特徴を持つデータベースマネジメントシステムです。 これらの特徴から、順序が重要な処理や、 証跡が重要な処理など、、、 具体的には金融取引や特許申請、トレーサビリティなどで活用できそうです。
- 追記のみ可能
- 確定したトランザクションは取り消しや修正が不可能
- トランザクションの適用順序が一意に決定される
- (最新のhash値が決まると)そこに至るまでのチェーン(=トランザクション適用履歴)が並列なく1本になり、順序を完全に決定できる
- データの改ざんを検出することが容易
- (最新のhash値と、そこに至るまで遡ったブロックをもとに)低い計算機コストでデータ改ざん検出が可能
データ構造が以下のように数珠繋ぎになっており、 この様子を指してブロックチェーンと呼んでいます。
これらの特徴を実現している肝がhash関数です。 (よい)hash関数の特徴を活用することでこの構造を実現しています。
(よい)hash関数の特徴
「よい」という用語には色々な含みがあるように感じられてしまいますが、 ともあれブロックチェーンの文脈で、 ブロックチェーンに都合のよいhash関数は以下の特徴を備えています。 (若干重複があるような感じもしますが、他によい表現が浮かばず...)
- 入力から出力が一方向であること
- 入力と出力が不可逆で、出力から入力を復元できない
- 出力から入力が推測不可能であること
- 出力から入力を推測できない
- 衝突耐性があること
- 異なる入力から同じ出力が得られることがない
- 入力に対し出力が決定的であること
- 同じ入力に対して必ず同じ出力が得られる
- どのような入力に対しても出力を返すことができること
- 入力に対して制限がない
- 素早く(計算機コストが少なく)出力を得られること
- 入力から出力を得るための計算機コストが少ない
これらの特徴を活用することで、 先に挙げた特徴のうち特に データの改ざんを検出することが容易 という点を実現しています。
データの改ざんを検出できるのは誰?
ブロックチェーンの特徴の「データの改ざんを検出することが容易」ですが、 では誰がどのようにしてデータの改ざんを検出できるのでしょうか?
- データの改ざんを検出することが容易
- (最新のhash値と、そこに至るまで遡ったブロックをもとに)低い計算機コストでデータ改ざん検出が可能
上記のとおり、データの改ざんを検出するためには以下の2要素が必要です。
- 最新のhash値
- そこに至るまで遡ったブロック
この図で検証者が data2
が本物であると確認するためには、
hash3
、
data3
、
hash2
、
hash1
が必要です。
hash1
と、手元の data2
をもとに検算し hash2
が得られればひとまず安心で、
あとはその後 hash3
にたどり着くまでの検算に齟齬がなければデータの改ざんはないと言えます。
この data1
や data3
などは、データそのものではなく、
それぞれのデータのhash値でもよいので、
そうすると検証対象の以外元データ(今回の例だと data3
そのもの)を検証者に対して秘匿したまま、
いままでチェーンを保持・生成してきた人とは別の第三者が改ざん有無を検証できるようになります。
そう。最新hash値と、ブロックチェーンのチェーンデータの2つを共有される関係性があれば。
まあこれが難しい、というのがここからの話です。
最新hash値が決まるか問題
最新のhash値ですが、チェーン生成処理を並列度1で実施しているうちは難しいことはありませんが、 並列度を上げて分散処理すると、ぱっと決まらず大変なことになります。
分散処理するためには以下の2種類の方法が考えられます。
- a.何らかの方法で確定させる
- 例: 別のデータストアで管理する
- b.(hash値が確定したと「見做す」仕組み & ちゃぶ台返しが成功しにくい仕組みの合わせ技)
- 例: bitcoinのProof of Work・マイニング報酬という仕組み
たとえばbitcoinは、ぱっと(というか永遠に)決まらない仕組みを利用しています。 一番長いチェーンを正しいチェーンだとし、データを格納してからブロックが6つ延びたら確定したと見做す & マイニングのスキームによってちゃぶ台返ししづらくする(後述)、 という仕組みです。
ちなみにブロックチェーンにおいて最新hash値を確定することをファイナリティと呼ぶようです。 b.の場合はファイナリティがないので、ちゃぶ台返しされる可能性は永遠に消えません。
検証者は誰?問題
ブロックチェーンの特徴は「改ざんしづらい」ではなく「改ざんを検出しやすい」なので、 その価値を発揮・維持するためには以下の2点が成立し続ける必要があります。
- 検証者が常に存在する
- 検証者に対して検証元データが適切に、継続的・持続的に共有される
このような技術的背景から、ブロックチェーンの運用形態が 「利害が対立するが目的を同じくする複数参加者によるコンソーシアム」 や 「公開ブロックチェーン」 という形式に至るようです。
※プライベート(非公開)ブロックチェーンでもプライベートの中で複数参加者によるコンソーシアムが成立していればよいという考え方もできます
参考1: 共有するデータの削減・元データの秘匿
前述のとおり、ブロックチェーンが価値を維持し続けるためには、 検証者が無限に増え続けるデータの共有を受け続ける必要があります。
はっきり言ってしんどい。
というわけで、共有を受けるデータ量を削減し、 ついでに元データを秘匿できる方法があります。
ここまでで少し触れましたが、チェーンに格納するデータを、元データではなく、元データのhash値にすることで、 ブロックチェーンの改ざん検出機能を損なうことなくデータ量を削減できます。 さらに検証者に対して元データを秘匿できるというオマケつきです。
例えば、Markle Tree構造を利用し、hash値のhash値のみブロックチェーンに格納することで、
元データ量に対してブロックチェーンに格納するデータ量を圧倒的に削減できる可能性があります。
(厳密には、効果は元データの長さとhash値の長さに依存します)
参考2: マイニングのスキームの目的と意義
前述のとおり、マイニングのスキームの目的は 「ファイナリティとして見做しを使う世界観において、ちゃぶ台返しが成功しにくい仕組み」 を実現することです。
一番長いチェーンが正しいチェーンだと判断されるため、 別のツリーを高速で延ばしてぶつけ、 「正しいチェーン」をまるごと差し替えることでちゃぶ台返しが実現します。
(事象としてはhard forkによるチェーン乗っ取りです。 ブロックチェーン生成処理を行っている計算機パワーの50%を上回る計算機パワーによって実現可能なため 51%攻撃 などとも呼ばれるようです)
対策ですが、本流側が乗っ取り側よりも早くチェーンを伸ばし続ければちゃぶ台返しを防ぐことができます。 この状況を継続的に実現するための仕組み(仕掛け)がハッシュパズルとマイニング報酬です。
またこの制約から、系としてのトランザクションピーク処理性能問題が発生します。
ハッシュパズル
まずブロックのhash値として採用できる値に条件をつけます(例:先頭6文字が0のhash値)。
そしてチェーンを伸ばすためには、この特定条件に合致するhash値を得る必要があることとします。 この特定条件に合致するhash値を得るには、前のブロックのhash値と今回のデータに加えて、任意のデータ(nance)も込みでhash値を計算します。 これをハッシュパズルと呼びます。
(よい)hash関数の特性上、パズルを解くには力技で超大量のnance値を試すするしかないので、 次のhash値を得るために膨大な計算機コストが必要になります。
この計算機コスト負担の重さが、ちゃぶ台返しを難しくするためのポイントになります。
マイニング報酬
前述のとおりハッシュパズルを解くには大量の計算機コストが必要です。 計算機コストは自然界に湧いて出るものではないので、 誰かが明確に負担する必要があります。
計算機コストを率先して負担してもらうことがちゃぶ台返し防止の重要な要件なので、 このコスト負担問題は構造的に解決する必要があります。
そこで、ハッシュパズル正答に対して早いもの勝ちで報酬を支払う、 マイニング報酬制度によってこの問題を解決しています。
大量の計算機パワーを有し計算機コストを支払うことができるのであれば、 ちゃぶ台返しを狙うよりも素直にチェーンを伸ばす方に協力したほうが儲かる仕組みを作ることで、 ちゃぶ台返しの難易度を上げています。
※大富豪が「金銭的利益を無視してちゃぶ台返し!」みたいになったら防げない可能性はあります
系としてのトランザクションピーク処理性能問題
前述のとおり、見做しの世界観においては、 チェーンを伸ばしやすくすることでトランザクション性能を向上させることができます。 そのためにはチェーンを伸ばしやすくする必要があります。
でもチェーンを伸ばしやすくするとちゃぶ台返ししやすくなってしまいます。
困りますね。。。
※ブロックチェーンの問題ではなく、ファイナリティに見做しを採用した場合に発生する問題
まとめ
いかがでしょうか?
わかったような、わからないような感じになりましたか?
わたしは、多少わかった気になりました。
万能ではないですが、 系(システム)の参加者がデータを検証できる や 利害が対立するが目的を同じくする複数参加者が中央特権管理者なしで系(システム)を構築・維持する というのはあまり他の技術にない特徴だと思います。
新しい技術って面白いですね。