まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:hyperledger

オープンソースのブロックチェーン環境である Hyperledger Fabric 用のフレームワークとして Hyperledger Composer が提供されています:
https://hyperledger.github.io/composer/

この Composer (と Hyperledger Fabric)を使うことでブロックチェーンアプリケーションおよびビジネスネットワークを比較的簡単に作れるようになる、というものです。

この Composer を実際に動かして体験できるサービス(Hyperledger Composer Playground)がオンライン上で公開されているので使ってみました。以下はオンライン版の Composer Playground でも、ローカル版の Composer でも同じように実行できます。なお、Composer をローカル環境に導入する場合の手順は以下を参考にしてください:
Hyperledger Composer フレームワークをインストールする


では実際に Composer を使ってみましょう。まずは Hyperledger Composer Playground にアクセスします。オンライン版であれば、http://composer-playground.mybluemix.net/editor に、ローカル環境にインストールした場合であれば composer.sh を実行後に http://localhost:8080/ にアクセスします:
2017080401


このサービスを以前に使ったことがある場合はローカルストレージに以前の情報が記憶されて残っています。初めから体験し直したい場合は、ブラウザのコンソールで
> localStorage.clear()
と実行してから以下を続けてください。


Composer Playground 起動画面の "Let's Blockchain!" と書かれたボタンをクリックしてダイアログを消すと、このような初期画面になります:
2017080402


Composer では Model, Script, ACL の3つを定義してブロックチェーン上のアプリケーション(というか挙動)を定義します。この Composer Playground はサンプルをベースにこれらを改良して、実際にデプロイして動かすことができるオンラインサービスです。

では実際にサンプルを改良してシンプルなトレードアプリを作ってみましょう。まずは Model を変更してみます。画面左で "Model File models/sample.cto" と書かれた箇所をクリックして選択します。するとこのファイルの内容が画面右のエディタで表示されます:
2017080403


画面右はエディタになっているので編集可能です。デフォルトの中身を全て消し、代わりに以下の内容を(コピペなどで)入力します:
/**
 * My commodity trading network
 */
namespace org.acme.mynetwork
asset Commodity identified by tradingSymbol {
    o String tradingSymbol
    o String description
    o String mainExchange
    o Double quantity
    --> Trader owner
}
participant Trader identified by tradeId {
    o String tradeId
    o String firstName
    o String lastName
}
transaction Trade {
    --> Commodity commodity
    --> Trader newOwner
}

※入力直後に画面が以下のようになり、他のファイルでエラーが発生します。これは Model が変更になって、その Model に合わない内容が Script や ACL に設定されているためのエラーです。このエラーはこの後で修正していきます:
2017080404


※またエディタ内で編集した内容は自動的に保存されるようになっていますが、うまく働かないこともあるようです。その場合は Ctrl+S を実行して強制保存してください。環境によっては画面に HTML の保存ダイアログが出てしまうこともありますが、そちらはキャンセルしてください。


namespace (org.acme.mynetwork) を定義した上で、"Commodity" という asset 1つ(id は tradingSymbol)、"Trader" という participant 1つ(id は tradeId)、そして "Trade" という transaction 1つを定義しています。Model ではこのように取り扱うオブジェクトを asset 、取り扱う人(ネットワーク参加者)を participant、実行する処理を transaction と呼び、これらをまとめて定義するのが Model です。

では次にこの Model に合うように Script を変更します。画面左の "Script File lib/sample.js" と書かれた部分をクリックし、画面右のエディタで以下の内容に書き換えます:
2017080405
/**
 * Track the trade of a commodity from one trader to another
 * @param {org.acme.mynetwork.Trade} trade - the trade to be processed
 * @transaction
 */
function tradeCommodity(trade) {
    trade.commodity.owner = trade.newOwner;
    return getAssetRegistry('org.acme.mynetwork.Commodity')
        .then(function (assetRegistry) {
            return assetRegistry.update(trade.commodity);
        });
}

このスクリプトでは tradeCommodity という関数1つだけが定義されており、パラメータ内変数の書き換えを行った後でレジストリを取り出し、内容を書き換える、という処理を行っています。

最後に ACL を変更します。同様にして画面左の "Access Control permissions.acl" と書かれた箇所をクリックし、画面右のエディタで以下の内容に編集します:
2017080406
/**
 * Access control rules for mynetwork
 */
rule Default {
    description: "Allow all participants access to all resources"
    participant: "ANY"
    operation: ALL
    resource: "org.acme.mynetwork.*"
    action: ALLOW
}

rule SystemACL {
  description:  "System ACL to permit all access"
  participant: "org.hyperledger.composer.system.Participant"
  operation: ALL
  resource: "org.hyperledger.composer.system.**"
  action: ALLOW
}

↑デフォルトで全参加者にリソースへのアクセス権を与えるというシンプルな内容です。

ではここまでの変更内容を実際のブロックチェーンに反映させてみます。画面左下の "Deploy" ボタンをクリックします:
2017080401


画面右上に "Deploy Successful" と表示されればデプロイは成功です。これだけで定義した内容が Blockchain に反映されました、簡単ですね:
2017080403


Hyperledger Composer ではブロックチェーン上での動作確認を行うことも可能です。デプロイ後に "test" と書かれたタブを選択します。まずは Perticipant を登録してみましょう。画面左で "Trader" と書かれた箇所をクリック(※)し、画面右上の "+ Create New Participant" と書かれたボタンをクリックします:
2017080402


※画面内に "Trader" という表示が出てこなくて、"SampleParticipant" という表示しか出てこない場合は変更が画面に反映されていない状態であることを意味しています。その場合は強制的に更新するため、一度 "Define" タブに戻って、定義内容を "Export" し、エクスポートした .bna ファイルを "Import" し直してください。これで強制的に更新を行うので "Trader" が表示されるようになるはずです:
2017080401



テキスト入力のダイアログが開くので、以下の内容を入力して "Create New" ボタンをクリックします:
2017080403
{
  "$class": "org.acme.mynetwork.Trader",
  "tradeId": "TRADER1",
  "firstName": "Jenny",
  "lastName": "Jones"
}

入力した Trader が登録されます:
2017080404


同じ作業を繰り返して、以下の Trader も登録し、2つの Trader が Participant として登録されている状態にします:
{
  "$class": "org.acme.mynetwork.Trader",
  "tradeId": "TRADER2",
  "firstName": "Amy",
  "lastName": "Williams"
}

2017080405


同様にして asset である Commodity を作成します。"Commodity" が選択された状態で "+ Create New Asset" ボタンをクリックします:
2017080401


以下の内容を入力して "Create New" ボタンをクリックし、TRADER1(Jenny)の asset "ABC" を登録します:
2017080402
{
  "$class": "org.acme.mynetwork.Commodity",
  "tradingSymbol": "ABC",
  "description": "Test commodity",
  "mainExchange": "Euronext",
  "quantity": 72.297,
  "owner": "resource:org.acme.mynetwork.Trader#TRADER1"
}

この状態で "Submit Transaction" ボタンをクリックして、トランザクションを1つ実行してみましょう:
2017080403


トランザクションの内容は先程登録した TRADER1(Jenny) の Commodity アセット(ABC)の持ち主を TRADER2(Amy) に変更する、というものとします("Submit" をクリックするとトランザクションが実行されます):
2017080404
{
  "$class": "org.acme.mynetwork.Trade",
  "commodity": "resource:org.acme.mynetwork.Commodity#ABC",
  "newOwner": "resource:org.acme.mynetwork.Trader#TRADER2"
}

トランザクション実行後、"All Transactions" にはブロックチェーン上で実行されたトランザクションが記録されます:
2017080405


また、Assets 一覧を見ると、先程 TRADER1 の所有物として登録された Commodity "ABC" の持ち主が TRADER2 に変更されたことが確認できます:
2017080406


このように Composer を使うと、ブロックチェーン上で定義すべき参加者の種類、アセットの種類、アクセス権が簡単に定義できるだけでなく、試験的にデプロイしてトランザクションを発生させた上で動作を確認することが(REST API を呼んだり、プログラミングしたりしなくても)簡単に行えるようになります。


なお、上記で紹介している内容は以下のページを参考に日本語訳と解説を加えたものです。詳しくはこちらも参照ください:
https://hyperledger.github.io/composer/tutorials/playground-guide.html
 

オープンソースのブロックチェーン環境である Hyperledger Fabric 用のフレームワークとして Hyperledger Composer が提供されています:
https://hyperledger.github.io/composer/

この Composer (と Hyperledger Fabric)を使うことでブロックチェーンアプリケーションおよびビジネスネットワークを比較的簡単に作れるようになる、というものです。Hyperledger Fabric v1.0 が導入されている環境にこの Composer フレームワークをインストールしてみましょう。

前提条件として、Hyperledger Fabric v1.0 の導入が完了している必要があります。その手順についてはこちらを参照してください:
Hyperledger Fabric V1.0 でブロックチェーン環境を作る


Hyperleger Composer の導入は非常に簡単です。Hyperleger Fabric が導入されているシステムの作業ディレクトリで、以下の1行コマンドを実行するだけです:
$ curl -sSL https://hyperledger.github.io/composer/install-hlfv1.sh | bash

このコマンドを実行すると Composer の実行に必要な docker イメージがダウンロードされて、Composer アプリケーションが 8080 番ポートで実行され、ウェブブラウザが自動的に起動してローカルホストの 8080 番ポートにアクセスし、Composer ツールが利用できるようになります:
20170804


このコマンドを実行した結果、作業ディレクトリ内に composer.sh ファイルが作成されます。Composer を止める場合は "stop" オプションを付けて実行します:
$ ./composer.sh stop

Composer 停止状態から起動する場合や、実行状態から再起動する場合は、このファイルをそのまま実行します:
$ ./composer.sh

Composer ツールの使い方は次回以降で。

オープンソースのブロックチェーン環境である Hyperledger Fabric に待望の V1.0 がリリースされ、同時に初の公式版リリースとなりました:
http://hyperledger-fabric.readthedocs.io/en/latest/releases.html


オープンソースなので、(前提環境さえあれば)誰でも同環境をダウンロードして構築することができます。というわけで、以下ではその導入手順を紹介します。

【前提環境】
まず前提として以下の環境が必要になります:
 Docker: 17.x for Linux or Mac OS X
 Docker-Compose
 Node.js V6.x(V8.x は未対応)

Docker は 17.x であればプラットフォームは問いません。自分は Ubuntu 14.04 および Mac OS X で確認しました。

今回紹介する方法では Fabric Composer のコマンドラインインターフェースを使って環境セットアップを行います。この Fabric Composer コマンドラインインターフェース(composer-cli)の導入前提として Node.js 環境が必要です。なお Node.js V6.x を用意してください、V8.x には未対応です。

【Hyperledger Fabric コマンドラインインターフェースを導入】
Node.js と同時に導入する npm を使って composer-cli をインストールします:
$ sudo npm install -g composer-cli
※Node.js V8.x だとここでコケます。Node.js V6 環境で行ってください。


【Hyperledger Fabric サポートツールを導入】
Hyperledger Fabric V1.0 環境を docker 内に構築するためのツールをダウンロード&展開します。以下の例では fabric というフォルダを作ってその中にダウンロード&展開していますが、ここは作業用ディレクトリなので任意の空フォルダで構いません:
$ mkdir fabric (作業用フォルダ)
$ cd fabric
$ curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-dev-servers/fabric-dev-servers.zip
$ unzip fabric-dev-servers.zip

【サポートツールを使って Hyperledger Fabric V1.0 環境を導入】

展開したサポートツールを使って Hyperledger Fabric V1.0 (の docker イメージ)をダウンロードして、実行します(docker サービスが稼働している必要があります):
$ ./downloadFabric.sh
$ ./startFabric.sh

ここまでの作業で Hyperledger Fabric V1.0 が起動しました! docker コマンドでこの時点での稼働サーバーの(プロセスの)様子を確認します(青字が出力内容):
$ docker ps
CONTAINER ID        IMAGE                                     COMMAND                  CREATED             STATUS              PORTS                                            NAMES
d2561aba32f0        hyperledger/fabric-peer:x86_64-1.0.0      "peer node start -..."   22 minutes ago      Up 22 minutes       0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp   peer0.org1.example.com
b189b5837328        hyperledger/fabric-couchdb:x86_64-1.0.0   "tini -- /docker-e..."   22 minutes ago      Up 22 minutes       4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp       couchdb
5dc8e344f9f3        hyperledger/fabric-ca:x86_64-1.0.0        "sh -c 'fabric-ca-..."   22 minutes ago      Up 22 minutes       0.0.0.0:7054->7054/tcp                           ca.org1.example.com
5552ed31eb7d        hyperledger/fabric-orderer:x86_64-1.0.0   "orderer"                22 minutes ago      Up 22 minutes       0.0.0.0:7050->7050/tcp                           orderer.example.com

1つのピア(peer0.org1.example.com)や、CA、CouchDB(Cloudant) などが docker 上で稼働していることが確認できました。


【デフォルトプロファイルの作成】
最後に Composer を使ってデフォルトのプロファイルを作成します。これもサポートツールを使って実行します:
$ ./createComposerProfile.sh

【Hyperledger Fabric V1.0 の停止】
サービスを停止する場合もサポートツールで用意されているコマンドを使います:
$ ./stopFabric.sh

このコマンドを実行した後に再度 docker プロセスを確認すると、先程まで動いていたサーバーが止まっていることが確認できます:
$ docker ps
CONTAINER ID        IMAGE                                     COMMAND                  CREATED             STATUS              PORTS                                            NAMES


というわけで、Docker (+Docker Compose) 環境があれば簡単に Hyperledger Fabric V1.0 が動かせるようになりました!

ここまでの内容だと、単に Hyperledger Fabric v1.0 を使ったブロックチェーンのネットワークを動かすまでの説明であって、UIとかで動いている様子を見れるわけではないのでちとわかりにくい部分があるかもしれません。そのあたりやアプリケーション開発に関してはおいおいと。。


話題(?)のブロックチェーンを小型コンピュータであるラズベリーパイ(以下、「ラズパイ」)から操作する、ということに挑戦してみました。


まずは操作の対象となるブロックチェーン環境を用意します。今回は IBM のクラウドプラットフォームである IBM Bluemix から提供されているマネージドハイパーレジャー環境である IBM Blockchain サービスを使うことにします(2017/Jun/04 現在では HyperLedger Fabric v0.6 と v1.0 がベータ提供されています)。IBM Bluemix アカウントが必要になりますが、30日間無料試用も用意されているので、必要に応じてアカウントを取得してください。

IBM Bluemix にログイン後、米国南部データセンターになっていることを確認し、「サービスの作成」をクリックします:
2017060404


そして「アプリケーション・サービス」カテゴリ内にある "Blockchain" を探してクリック:
2017060405


利用する Blockchain の種類をプランから選択します。今回は無料の "Starter Developer plan(beta)" を選択します。ちなみにこのプランの場合、Hyperledger Fabric は v0.6 を使うことになり、4つのブロックチェーンピアが作成されます。最後に「作成」ボタンをクリック:
2017060406


しばらく待つと IBM Blockchain サービスが起動します。ここでダッシュボードに移動することもできますが、この後で利用する情報を先に取得しておきます。左ペインの「サービス資格情報」を選択:
2017060407


サービス資格情報から「資格情報の表示」をクリックして、表示される JSON テキストを全てコピーしておきます(この後、ラズパイ内で使います):
2017060408


改めて「管理」タブを選択し、「ダッシュボードを起動」ボタンをクリックして、ダッシュボード画面に切り替えておきましょう:
2017060409


IBM Blockchain のダッシュボード画面が表示されます。4つのピアが動いていますが、この時点ではまだチェーンコードは作られていないことが確認できます。これでブロックチェーン側の準備は完了です:
2017060401


では続けてラズパイ側の準備に取り掛かります。以下はラズパイ上での作業です(僕の検証では3Bを使いました)。ラズパイにはネットワークのセットアップが済んだ Raspbian Jessie を用意し、そこに Hyperledger Fabric Node SDK ごとサンプルコードを導入してデモアプリケーションを動かします。というわけでまずは Node.js と npm を用意します。まずはこのドキュメント内にあるように、Node.js v6.2.x ~ v6.10.x のバージョンの環境を用意します(以下は v6.10.3 の例です。v7.x は未対応):
$ sudo apt-get install -y nodejs npm
$ sudo npm cache clean
$ sudo npm install n -g
$ sudo n v6.10.3
$ node -v
v6.10.3  <- v6.10.3 の導入が完了

続けて npm を最新版(以下の例では v5.0.2)に更新します:
$ sudo npm update -g npm
$ sudo npm outdated -g
$ npm -v
v5.0.2  <- v5.0.2 の導入が完了

git でデモアプリをダウンロードし、必要なライブラリをインストールします:
$ git clone https://github.com/IBM-Blockchain/SDK-Demo.git
$ cd SDK-Demo
$ npm install

ダウンロードしたデモアプリの中(直下のディレクトリ)にある ServiceCredentials.json ファイルの中身を、上記でコピーしたサービス資格情報の JSON テキストの中身で全て書き換えます:
{
  "peers": [
    {
      "discovery_host": ******

      :
      :
"cert_path": "/certs/peer/cert.pem" }

これでラズパイ側の準備も完了しました。後は以下のコマンドを実行して、デモアプリを実行します:
$ node helloblockchain.js

以下のようにコマンドが次々を流れていきます。実際にはこの中でチェーンコードの初期化や、初期データ入力、データ変更などが行われています。最後に "Successfully ****" というメッセージがいくつか表示されていればコマンドは成功です:

2017060403


この最後のメッセージについて補足します。この helloblockchain.js ではチェーンコード初期化などの作業を行った後に「"a" という入れ物に 100 、"b" という入れ物に 200 のデータを保存」します(ここまでが初期化)。そして「"a" から "b" へ 10 移動」するようなトランザクションが実行されます(なのでここまでの処理が完了すると "a" に 90 、"b" に 210 入っている状態になるはずです)。最後に「"a" の値を取り出す」処理が実行されます。その辺りの様子が以下のメッセージから分かります("a" が 90 になっています):
  :
  :
Chaincode ID : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Successfully deployed chaincode: request={"fcn":"init","args":["a","100","b","200"],"chaincodePath":"chaincode","certificatePath":"/certs/peer/cert.pem"}, response={"uuid":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","chaincodeID":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}

Successfully submitted chaincode invoke transaction: request={"chaincodeID":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","fcn":"invoke","args":["a","b","10"]}, response={"uuid":"zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz"}

Successfully completed chaincode invoke transaction: request={"chaincodeID":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","fcn":"invoke","args":["a","b","10"]}, response={"result":"Tx zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz complete"}
Custom event received, payload: "Event Counter is 1"


Successfully queried  chaincode function: request={"chaincodeID":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","fcn":"query","args":["a"]}, value=90


※↑数値の移動は Submit して Complete しているのが別行で表示されているので、全部で4行表示されています。


なお初期化部分は最初の1回しか実行されないため、この helloblockchain.js を何度か実行すると、"a" の値が 10 ずつ減っていく様子がわかります:
$ node helloblockchain.js

  :
  :
Successfully queried  chaincode function: request={"chaincodeID":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","fcn":"query","args":["a"]}, value=80

$ node helloblockchain.js

  :
  :
Successfully queried  chaincode function: request={"chaincodeID":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","fcn":"query","args":["a"]}, value=70


また、これらの処理を実行すると、ダッシュボード上からもチェーンコードが生成されて、実行されている様子が確認できます(初期状態だと画面更新が3分ごとなので、画面に反映されるまで少し時間がかかるかもしれません):
2017060402


まだ環境の一部がベータ版だったりする状態ではありますが、今やラズパイでもブロックチェーンが動くようになったんですねー。

このページのトップヘ