Liskから読み解くブロックチェーンの仕組み 2

なぜブロックをチェーンのようにつなげると改ざんが困難になるのか

はじめに

エンジニアの光田(@34ro)です。
前回に引き続きブロックチェーンについて技術的なネタを投稿します。
前回記事:LISKから読み解くブロックチェーンのしくみ 1
世界中で同じデータを共有し、不正な改ざんができなければ通貨として機能させることができるのは前回の説明の通りです。世界中で同じデータを共有するというと簡単そうに聞こえますが、信頼できる中央サーバを介さず信頼関係のないP2Pネットワーク上だけで実現するのは一筋縄にはいきません。不正なブロックをどう見分けて排除すればいいでしょうか? Liskで採用しているDPoSと呼ばれる仕組みを読み解いていくことで、ブロックを繋げると改ざんが困難になる理由を考えていきます。

正しいブロックをどうやって判別するのか?

Liskでは10秒ごとに新たなブロックが生成され、参加者にブロードキャストされます。各ノードは受け取ったブロックが「正しい」ものか自己判断し自分の足元のブロックチェーンに追加していきます。
別のノードから受け取ったブロックを足元のブロックチェーンに取り込む前に以下のことをチェックしています。
1.項目に不足がない
2.送金者の公開鍵と署名の関係が正しい
3.送金者の残高が不足していない
4.ブロックが正しい生成者によって生成(署名)されている
「1. 項目に不足がない」は仕様に従っているかをチェックするだけなので簡単に判定できます。「2. 送金者の公開鍵と署名の関係が正しい」も電子署名アルゴリズムによって簡単に判定できます。「3. 送金者の残高が不足していない」を判定するためには送金者の残高を計算する必要があるのでその時点までのすべてのブロックを参照して送金履歴をたどる必要があります。「4. ブロックが正しい生成者によって生成(署名)されている」はどうでしょう。ここでDPoSが登場します。

DPoSというコンセンサスアルゴリズム

Liskではある時点のブロックを作ってもよいアドレスは一つに決まっています。投票で選ばれた101のアドレスのうちの一つのみです。この101のアドレスはTop Delegateと呼ばれています。投票状況はブロックチェーンの中に刻まれているので改ざんは困難です。あるブロックの生成者は直前までのブロック数を元にした乱数で決定されるので、同じブロックチェーンを共有していれば全てのノードの内部で同じアドレスが選出されています。すなわち、ある時点までのすべてのブロックを持っていれば次のブロックの生成者になるべきアドレスを判断できるのです。
ある時点でのTop Delegateの例です。アカウント名が「genesis_」で始まっているアカウントは最初のblock(genesis block)でdelegateに登録されているので初期メンバーということがわかります。2016年8月現在においてLiskのTop Delegateは101人とも初期メンバーのまま変わっていません。
top_delegate
ちなみに、もし選ばれたノードがブロックを作ってブロードキャストしなかった場合はその回のブロック生成はスキップされ、ブロック生成間隔は20秒ということになります。ブロックの生成をサボるDelegateはLiskネットワークにとって迷惑な存在なので票を減らされ、民主主義の原理でTop Delegateでいられなくなります。一方でDelegateになるとブロック生成の報酬や送金手数料が貰えるので誰もDelegateにならないという事態は起こりません。投票で選ばれたDelegateがブロックを生成(forging)する仕組みはDPoS(Delegated Proof of Stake)と呼ばれています。ビットコインやEthereumが採用しているPoWのように計算リソースで競争することなくを改ざんが困難なデータベースを構築する新たな試みです。

なぜブロックをチェーン(鎖)のように繋げると改ざんが困難になるのか

P2Pネットワーク上で受け取ったブロックが正しいかどうかはその時点までのすべてのブロックがあれば判断できる分かりました。すなわち
・最初の正しいブロックを手に入れる
・あるブロックまで正しいなら、その次のブロックが正しいかを判定できる
が実現できれば世界中で同じ内容のブロックチェーンを構築できそうです。
1番目のブロック(genesis block)はgithubで公開されているソースコードの中に設定ファイルとして直接置かれています。
Liskのノードのプロセスを起動したとき、足元のDBにブロックを1つも持っていなければ2番目以降のブロックをP2Pネットワーク上の別のノードから取得してきます。2番目のブロックが正しいかどうかは1番目のブロックを持っているので判定できます。さらに 3番目のブロックも 1番目、2番目が分かっているので判定できます。こうやって4番目、5番目・・・と最新のブロックまでドミノ倒しのように検証していきます。
・1番目のブロックは正しい
・1~n番目の正しいブロックを持っていればn+1番目のブロックが正しいか判定できる
→あらゆるブロックに対して正しいか判定できる
というわけです。時系列にそってブロックの列をつくることで数学的帰納法のように検証することができるのです。
データをあえてブロック単位に切って、時系列でチェーンのように繋げていくのはこのためです。
ちなみに特定の番号(height)のブロックだけ中身をソースコードの中に直接記述して、そのソースコードをネットワーク参加者に配れば、実質的に開発者がブロックを作成できてしまいます。
7/20に行われたEthereumのThe Dao救出Hard Forkはこの方法で実行されました。

まとめ

LiskのコンセサンスアルゴリズムであるDPoSを紹介しました。なぜわざわざブロックを繋げていく必要があるのか、その仕組みがイメージいただけたでしょうか。
最もポピュラーなコンセンサスアルゴリズムはPoWですが、ほかにもいろいろな手法が模索されています。いずれも共通のルールに基づいてブロックを判定することで、信頼できる中央サーバが無くても世界中で同一のデータを共有することを目指しています。
https://coincheck.com