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

ブロックチェーンを使った送金の仕組み

はじめに

はじめまして。エンジニアの光田(@34ro)と申します。たまには技術的なネタを投稿したいと思います。
ブロックチェーンの内部的な仕組みについて紹介されているサイトはあまり多くありません。ここではLiskという仮想通貨の実装を追っていくことでブロックチェーンの仕組みを紹介していきたいと思います。

Liskとは

2016年5月に本番ネットワークでの運用が開始された仮想通貨です。Microsoft Azureとパートナーシップを結んだことが話題になり、2016年8月現在で時価総額約25億円に成長しています。DPoSと呼ばれるコンセサンスアルゴリズムを採用しています。

Liskを支える技術

サーバサイドアプリケーションにnode.js、データベースにPostgreSQLが採用されています。コアな部分はC++で実装され独自のデータベースをローカルストレージ上に構築する仮想通貨が多いなか、web系のエンジニアにとって馴染みやすい仮想通貨です。nodeの豊富なライブラリを導入することで他の仮想通貨に比べ驚くほど少ないコード量で実装されています。
network

さっそく送金してみる

詳細な説明は後回しにして、まずはWebUIを使って実際に送金してみましょう。自前ノードを構築することも可能ですがコミュニティもWebUIを公開しています。
login.lisk.io

アカウントの作成から送金まで

まだアカウントを作ったことのない場合は「NEW ACCOUNT」からアカウントを作成します。12個の英単語が表示されるのでそれをどこかにメモしておきます。同じ単語リストを2度入力し「CONFIRM」を押すとアカウントの残高の画面に移動します。
login
残高(Balance)が表示されます。作成した直後は0のはずですが、ここでは予め残高を準備しています。左上のLで終わっている数字がこのアカウントのアドレスです。
top
右上のSendボタンを押すとダイアログボックスが表示されるので送金先のアドレスと送金額を入力し、Sendを押します。
send
残高が減ることが確認できます。送金手数料として0.1LSK余分に引かれます。10秒ほどでブロックチェーンに取り込まれるので、右のメニューからBlockchainを選ぶと先程の送金トランザクションが確認できます。
transaction
今現在どのようなトランザクションが作られたかはブロックチェーンエクスプローラーで確認することができます。
explorer.lisk.io
※今回作成したトランザクションは個人開発環境のものでmain-net上には存在しません。

送金するとはどういうことか

仮想通貨を送金するとはどういうことでしょうか? Liskの内部で起こっていることを読み解いていきたいと思います。

アカウント作成時に起こっていること

Liskにおけるアカウント作成はランダムな128bitのデータを生成することに過ぎません。アカウント作成時にランダムな単語のリストはmnemonicと呼ばれ、次回のログイン時に必要になります。単語リストはBIP39と呼ばれる仕様で定義されたもので、12個の単語の羅列が128bitのデータ量を持っています。これを元に秘密鍵と公開鍵を生成し、さらに公開鍵からアドレスを生成します。秘密鍵、公開鍵はすべての取引の署名に使います。アカウントの残高はブロックチェーン上に記録してあるのでP2Pネットワークのどのノードでログインしても同じアカウントで送金が可能です。mnemonicからアドレスに関するすべての鍵情報が決まるので、他人に教えてしまうとすべての権限を譲り渡すことになります。
key_relation
ちなみにLiskでは電子署名にエドワーズ曲線デジタル署名アルゴリズムの「ed25519」という実装を採用しています。
LiskのWebUIは現在対応していませんがBIP39では日本語の単語リストも規定されています。

送金ボタンを押した時に起こっていること

送信者はトランザクションと呼ばれるオブジェクトを生成し、Liskネットワーク上の、他のノードにPOSTします。トランザクションには送金元アドレス、送金先アドレス、送金額と送金者の公開鍵と電子署名が含まれています。電子署名を含めることで送金者にしかトランザクションが生成できないことが担保されます。ブロックに取り込まれていないトランザクションはノードからノードへと伝播していき、ブロック生成者まで到達するとブロックチェーンに取り込まれ送金が確定します。送金確定まで時間がかかりそうな印象を受けますが実際には数秒後には到達します。ブロック生成者は生成したブロックを同じように他のノードにPOSTしてネットワーク上に伝播させていきます。ブロックチェーン上には過去のすべての送金履歴が残っているのでアドレスの残高を計算するときはすべての送金履歴を足し合わせていきます。

ブロックチェーンとは

ここで登場したブロックチェーンについてより詳しくみていきたいと思います。Liskを始め多くの仮想通貨のP2Pネットワークには誰もが参加可能です。信頼できる中央サーバを挟まずP2Pネットワーク上に改ざんが困難なデータベースを構築する手法としてブロックチェーンが考え出されました。送金情報をブロックと呼ばれる単位でまとめて鎖のように連ねていきます。Liskでは10秒ごとに新たなブロックが生成されます。生成されるとすぐにLiskネットワーク上でブロードキャストされ、ノード全員の足元に同じブロックチェーンのコピーが作られます。不正なブロックの生成を排除するためにDPoSという仕組みを取り入れているのですが、こちらは次回詳しく追っていきます。
blocks

Liskのデータ構造

Liskの代表的なテーブル構成をER図にしてみました。
er
最上位にブロックがあり、ブロックにトランザクションが紐づき、さらにトランザクションが送金以外のデータに紐づいています。
まずは中核をなすトランザクションからみていきましょう。トランザクションには送金額、送金先のアドレスと送金者による署名が記録されています。アドレスの残高の増減にかかわる情報はすべてトランザクションに記録されています。DappにはLisk上で動作するアプリケーション、DelegateはDPoSのための情報が記述されていますが残高の増減には直接関係ないので別テーブルに切り出されています。別テーブルに切り出しているのはトランザクションのデータ量を節約するためとトランザクションに拡張性を持たせるための工夫でしょう。残高が増減するのはユーザ同士の送金だけでなくブロック生成者への投票などいくつかパターンがあります。トランザクションの種類の違いをTypeで区別しています。
次にブロックを見ていきます。ブロック生成者のところにはブロックに取り込まれていないトランザクションが次々に飛んできます。それぞれのトランザクションの内容に不備がないことをチェックしたうえでトランザクションのリスト全体に自分の署名を施しブロックを生成します。全体のダイジェストを計算してブロックIDにして、ひとつ前のブロックを参照する形で鎖のようにつなげていきます。gitのコミットログのように途中のデータが少しでも違えば、その後のブロックのハッシュは全く異なるものになっていくわけです。ブロック生成者には送金手数料と生成の報酬が手に入ります。

まとめ

Liskの送金時のUI操作と送金処理の流れを見ていきました。仮想通貨における送金の仕組みがイメージいただけたでしょうか。
LiskのP2Pには誰でも参加することができるので悪意のあるノードや不具合を抱えたノードの存在を想定しなくてはいけません。どのようなノードが参加していても世界中で全く同じブロックチェーンを共有するためにDPoSと呼ばれる仕組みが採用されています。次回はこのDPoSについて詳しく見ていきたいと思います。
続き:LISKから読み解くブロックチェーンのしくみ 2
coincheck ビットコイン取引所