Multichainによるブロックチェーンの実装(Streams編)

Hayato (okayHyatt) です。

普段はIoT関連の仕事をしているが、Blockchainの活動についても関わるようになった。
ブロックチェーンとIoTは親和性がとても高いので大変ありがたいことだが、テクノロジーのことを知らないまま関わっていくのも気持ちが悪いので、ブロックチェーンを自分で実装してみることで理解することにした。

今回実装するのは、先日SAPからSAP Cloud Platform(SCP)上で使えるようになったと発表があったMultichainだ。
SCP上で試せれば良いのだが、トライアルで利用することはできないし、個人でライセンスを購入するほど安くもないので、 今回はAzure上で仮想マシンを作成し、そこにブロックチェーンを実装しようと思う。

Multichainとは

Multichainはプライベート型、もしくはコンソーシアム型のどちらもで利用できるブロックチェーンだ。

ブロックチェーンは、ビットコインのような誰でも参加できるパブリック型、特定企業のみが参加するコンソーシアム型、組織内で利用するプライベート型と大きく分けると3つに分類される。この分類については以下のサイトが分かりやすいので参考にすると良いだろう。

gaiax-blockchain.com

Multichainは金融機関などでの利用を目的に、参加ノードのコントロール機能と高いプライバシーを以下によって実現している。

  • ブロックチェーンのアクティビティを閲覧できるのを予め許可が与えられたユーザーのみに限定
  • 取引を許可するコントロール機能を導入
  • Proof of Workなしでセキュアにマイニングを実施

ビットコインのようなパブリック型ブロックチェーンと違って、コンソーシアム型もしくはプライベート型のブロックチェーンは参加者を限定できるし、Proof of Work(PoW)もする必要がないことは直感的にわかるだろう。

さて、ここからはMutichainの実装に移っていく。

システム要件

2018年6月16日現在のMultichainのシステム要件は以下になっている。

  • Linux: 64-bit, supports Ubuntu 12.04+, CentOS 6.2+, Debian 7+, Fedora 15+, RHEL 6.2+.
  • Windows: 64-bit, supports Windows 7, 8, 10, Server 2008 or later.
  • Mac: 64-bit, supports OS X 10.12 (we hope to support earlier versions soon).
  • 512 MB of RAM
  • 1 GB of disk space

Download and Install MultiChain | MultiChain

LinuxへのMultichainのインストール

それではAzure上の仮想マシン(Cent OS 7.2)を使ってMultichainを実装していく。基本的にはチュートリアルにしたがって実装していく。

一台目

$ su
# cd /tmp
# wget https://www.multichain.com/download/multichain-1.0.5.tar.gz
# tar -xvzf multichain-1.0.5.tar.gz
# cd multichain-1.0.5
# mv multichaind multichain-cli multichain-util /usr/local/bin 
#  exit 

これでインストールは完了だ。

一台目

$ multichain-util create chain1

これでブロックチェーンが作成された。

一台目

$ multichaind chain1 -daemon

(省略)
Other nodes can connect to this node using:
multichaind chain1@10.0.0.5:6727
(省略)

これでブロックチェーンが初期化された。この6727は後で使うのでメモしておく。

ここからは二台目のサーバに移って作業する。同じくMultichainのインストールから行う。

二台目

$ su
# cd /tmp
# wget https://www.multichain.com/download/multichain-1.0.5.tar.gz
# tar -xvzf multichain-1.0.5.tar.gz
# cd multichain-1.0.5
# mv multichaind multichain-cli multichain-util /usr/local/bin 
# exit 

これで二台目についてもMultichainの作成が完了した。

一台目

$ multichaind chain1@10.0.0.5:6727

MultiChain 1.0.5 Daemon (latest protocol 10011)

Retrieving blockchain parameters from the seed node 10.0.0.5:6727 ...
Blockchain successfully initialized.

Please ask blockchain admin or user having activate permission to let you connect and/or transact:
multichain-cli chain1 grant 1EWXTFE8ES7skdzfQJNreGSHUGBAsKAnF9g4Vh connect
multichain-cli chain1 grant 1EWXTFE8ES7skdzfQJNreGSHUGBAsKAnF9g4Vh connect,send,receive


Blockchain successfully initialized.

Please ask blockchain admin or user having activate permission to let you connect and/or transact:
multichain-cli chain1 grant 1EWXTFE8ES7skdzfQJNreGSHUGBAsKAnF9g4Vh connect
multichain-cli chain1 grant 1EWXTFE8ES7skdzfQJNreGSHUGBAsKAnF9g4Vh connect,send,receive

一台目で作成したブロックチェーンに接続しようとしたことろ、権限の付与を行う必要があると返ってきた。

Multichainの特徴としてはブロックチェーンに参加するノードに細かく権限を付与できるところである。 標準出力に書いてあるコマンドを使って、一台目のサーバから権限を付与するコマンドを実行する。

一台目

$ multichain-cli chain1 grant 1EWXTFE8ES7skdzfQJNreGSHUGBAsKAnF9g4Vh connect,send,receive
{"method":"grant","params":["1EWXTFE8ES7skdzfQJNreGSHUGBAsKAnF9g4Vh","connect,send,receive"],"id":1,"chain_name":"chain1"}

55180abde3bd94d40f44ac45b58cab2305d8582f256d12c6d812926917387a4e

これで二台目のサーバに権限を付与できたので、二台目のサーバから再度接続してみる。

二台目

$ multichaind chain1 -daemon

MultiChain 1.0.5 Daemon (latest protocol 10011)

Starting up node...

Retrieving blockchain parameters from the seed node 10.0.0.5:6727 ...
Other nodes can connect to this node using:
multichaind chain1@10.0.0.4:6727

Listening for API requests on port 6726 (local only - see rpcallowip setting)

Node ready.

今度は二台目のサーバからブロックシェーンに接続された。これにより2つのサーバが一つのブロックチェーン上で接続されたことになる。

ここからは実際にMultichainのメインの機能を試していく。MultichainにはStreamsとAssetsという機能があり、StreamsはデータベースのようにMultichain上にデータを追加できる機能、Assestはビットコインのように仮想通貨をやり取りする機能だ。 ここではエンタープライズ用途でより使われると思われるStreamsを実装する。

Streamsの実装

一台目のサーバでmultichain-cliコマンドを使ってインタラクティブモードに入ってStreamsを作っていく。

一台目

$ multichain-cli chain1

chain1:create stream stream1 false
{"method":"create","params":["stream","stream1",false],"id":1,"chain_name":"chain1"}

72278614e5270d3b0c8eb95b76b135ecf55dae4fd6bb49b97bdf1c91a210939a

chain1: publish stream1 key1 73747265616d2064617461
{"method":"publish","params":["stream1","key1","73747265616d2064617461"],"id":1,"chain_name":"chain1"}

1d6e29622550eb1afe7ce881c72070262d2fd29d202e6152a6287923cfa89855

これでstream1というStreamsが作成され、そこにitem key1が作成された。
StreamsはNoSQLのようなkey-valueで管理され(上の出力でいうと、key1がkeyで73747265616d2064617461がvalueとなる)、タイムスタンプやトランザクションID(txid)を持つ。
NoSQLと違ってすごくブロックチェーンっぽいのは、itemの削除ができないことだ。ブロックチェーンの特性上、アイテムのステータスを変化の時系列を含めて管理したいという概念があるからだ。

さて、次は二台目のサーバでstream1をSubscribeし、権限を付与して、stream1のアイテムを表示してみる。

二台目

chain1:subscribe stream1

chain1: grant 1EWXTFE8ES7skdzfQJNreGSHUGBAsKAnF9g4Vh stream1.write
{"method":"grant","params":["1EWXTFE8ES7skdzfQJNreGSHUGBAsKAnF9g4Vh","stream1.write"],"id":1,"chain_name":"chain1"}

aab39ced6f38756bbc4318633219186cbcd848cfc01583242fcf6df88771eada

chain1: liststreamitems stream1

{"method":"liststreamitems","params":["stream1"],"id":1,"chain_name":"chain1"}

[
    {
        "publishers" : [
            "12tyKhNYWyFYiophW5G4qvnkGdrzUjE547TyeP"
        ],
        "key" : "key1",
        "data" : "73747265616d2064617461",
        "confirmations" : 44,
        "blocktime" : 1529236260,
        "txid" : "1d6e29622550eb1afe7ce881c72070262d2fd29d202e6152a6287923cfa89855"
    }
]

一台目で作成したアイテムが二台目からでも確認できることがわかる。

以上からも分かる通りブロックチェーンを構築すること自体はとても簡単だ。
実際にエンタープライズで使うには、業務プロセスと結びつける必要があるので、

  • 何をブロックチェーン上で管理するのか
  • 管理する情報と業務プロセスをどう結びつけるのか

など、考えることはたくさんある。Track & Traceのためにブロックチェーン使うというのはよく聞くが管理形態が異なるので、データベースの保存先がブロックチェーン上になるという簡単なものではないので注意されたい。

まとめ

今回はMultichainを使ってブロックチェーンの実装を行った。

実装自体はとても簡単で1時間もあればできるだろう。今回はMultichainを使ったが、他のブロックチェーンでもブロックチェーン自体の実装は簡単だと思う。

大切なのはブロックチェーンと業務プロセスとをどう結びつけるかだ。
実際のプロジェクトを通じてそれを理解する機会があれば、また記事にしたいと思う。