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

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

タグ:hyperledger

オープンソースのブロックチェーン環境である Hyperledger Fabric と、その開発ツールである Composer の環境を手元のマシンに導入する手順を紹介します。基本手順は以前に IDCF テックブログに寄稿させていただいた内容と同じですが、各モジュールのバージョンや導入直後のカード作成の部分が異なっているので、補足する形で紹介します。

前提条件

まず、以下の説明では前提プラットフォームとして Ubuntu 16.04 を使います。ここに Docker, Docker-Compose, Node.js V6.x を導入してから Hyperledger Fabric をインストールしていくのですが、この3つ(Docker, Docker-Compose, Node.js V6.x)が導入されていれば macOS でも可能です(macOS でのこれら3つの導入手順は省略させてください、普通にググれば見つかると思うので・・・)。以下はこれら3つが導入されている前提で、それ以降の手順を紹介します(Ubuntu でも macOS でも手順は同じです)。

というわけで、この時点では以下の3つのモジュールが導入されているものとします(バージョンは 2018/02 時点で手順に沿って実施した場合に入るバージョンでした):
 - Docker 17.12.0-ce
 - Docker-Compose 1.12.0
 - Node.js v6.12.3

ここまでの導入手順については、こちらを参照ください:
Hyperledger Fabric でブロックチェーン環境を構築


Hyperledger Composer コマンドラインインターフェース

前提環境を整える時に導入されている npm コマンドを使って、Hyperledger Composer のコマンドラインインターフェース(composer-cli)をインストールします:
$ sudo npm install -g composer-cli

(↓2018/03/27 追記)
以下の PeerAdmin@hlfv1 カードを作成する際の仕様が変わったため、ここでは composer-cli のバージョン v0.16.3 を指定してインストールする必要があります。したがって以下のコマンドを実行してください:
$ sudo npm install -g composer-cli@0.16.3
(↑2018/03/27 追記)


導入に成功すると composer コマンドが使えるようになります。2018/02 時点でのバージョンは 0.16.3 でした:
$ composer
v0.16.3

Hyperledger Fabric 開発環境サポートツール

「サポートツール」と呼ばれるファイル群を使って、開発環境として使える Hyperledger Fabric を導入します。一般的にブロックチェーンでは「分散台帳」と呼ばれる方式でデータを複数のノードに分散して共有する仕組みを取りますが、開発環境では1ノードのみ使います。

まず、この時点で docker サービスが有効になっている必要があります。docker サービスが停止している場合は、このタイミングで起動しておきます:
$ sudo service docker start

改めてサポートツールを使って Hyperledger Fabric 環境を導入します。以下の例では ~/fabric というフォルダを作って、その下にサポートツールを導入しています:
$ cd
$ mkdir fabric  (ホームディレクトリ配下の ~/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

「サポートツールの導入」といっても実質「zip ファイルの展開」です。展開ファイルを確認します:
$ ls
_loader.sh                downloadFabric.sh       startFabric.sh
composer-logs             fabric-dev-servers.zip  stopFabric.sh
createComposerProfile.sh  fabric-scripts          teardownAllDocker.sh
createPeerAdminCard.sh    package.json            teardownFabric.sh

2018/02 版では以前に紹介した時よりもファイルが増えています。これは Hyperledger Composer の仕様変更に伴うもので、以前にはなかった createPeerAdminCard.sh などは環境準備後に使うことになります。

では展開したサポートツールを使って Hyperledger Fabric 環境を構築します。といってもコマンドはこれひとつです:
$ ./downloadFabric.sh

このコマンドの中で必要とされる docker イメージのダウンロード等が行われ、Hyperledger Fabric 環境がローカルマシン内に構築されます。

コマンドが終了したら、いったんこの時点で docker コンテナのプロセスを確認します。他の用途で docker を使っていたりしない限り、この時点では docker コンテナのプロセスは1つも動いていないはずです:
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Hyperledger Fabric 環境の起動

ではローカルマシンに導入した Hyperledger Fabric 環境を起動します。これもコマンド1つです:
$ ./startFabric.sh

このコマンドが完了すると Hyperledger Fabric が起動したことになります。改めて docker コンテナのプロセスを確認すると、先程まで空だったコンテナプロセスがいくつか動いていることが確認できるはずです:
$ docker ps
CONTAINER ID        IMAGE               COMMAND             
6eb73fa9bc26        dev-peer0.org....   "chaincode -peer.a..."   
3ce2ff860034        hyperledger/f....   "peer node start -..."
e99420efba7f        hyperledger/f....   "orderer"
0dc1e0deaa92        hyperledger/f....   "sh -c 'fabric-ca-..."
c6bc1fe8a3f8        hyperledger/f....   "tini -- /docker-e..."

なお、起動中の Hyperledger Fabric を停止する場合は ./stopFabric.sh を実行します(以下の作業を続けるのであれば、しなくてもいいです):
$ ./stopFabric.sh


カードファイルの作成

ここからは以前の情報にはなかった、新しい仕様に関わる新しい箇所です。2018/02 時点では Hyperledger Fabric に接続する際に「カードファイル」と呼ばれる仕組みを使ってアクセスを行う必要があります(以前は「プロファイル」と呼ばれる仕組みを使った方法が用いられていました)。

作成&起動した Hyperledger Fabric 環境についてもカードファイルを使わないとアクセスしたり、操作することができません。まずはローカル環境(hlfv1)のデフォルト管理者となる PeerAdmin 用のカードファイルを作成します。サポートツールに含まれる以下のスクリプトを実行します:
$ ./createPeerAdminCard.sh

色々動いて、最後に "Command succeeded" と表示されれば成功で、/tmp/PeerAdmin@hlfv1.card というファイルが作られているので、このファイルを手元に(例えばホームディレクトリに)保存しておきます:
$ cp /tmp/PeerAdmin@hlfv1.card .

同時に、この時点で PeerAdmin@hlfv1 カードは有効に登録されています。登録済みのカードを一覧表示するには以下のコマンドを実行します:
$ composer card list

The following Business Network Cards are available:

Connection Profile: hlfv1
+--------------------+-----------+------------------+
| Card Name          | UserId    | Business Network |
+--------------------+-----------+------------------+
| PeerAdmin@hlfv1    | PeerAdmin |                  |
+--------------------+-----------+------------------+


Issue composer card list --name  to get details a specific card

Command succeeded


 ↑PeerAdmin@hlfv1 が確認できました。




・・・というわけで、2018/02 時点での仕様に合わせた Hyperledger Fabric & Composer 環境の構築手順と、カードファイルの準備手順までを紹介しました。ここまでできていると、composer コマンドとカードファイルを使ってビジネスネットワークを定義したり、起動したり、、、といったことができるようになります。そのための準備作業という意味合いでの紹介でした。


これらのエントリの続きです:
アリババクラウドを使う(使おうとしてみた)
アリババクラウドのインスタンスを作ってみた


↑前回までの作業でアリババクラウドの青島データセンター内に Ubuntu サーバーを立てることができました。このサーバーインスタンスを使って色々試したかったことをやってみたいと思います。

まずはお約束として、拙作マンホールマップを使ってみたいと思います。残念ながら GUI を用意していないので、curl コマンドを使ってマンホールマップ API を呼んでみます。まずは普通に「中国」を 10 件検索してみます:
$ curl 'http://manholemap.juge.me/searchkeyword?keyword=中国&limit=10'

2018020704


動きました!「中国」というキーワードで検索ヒットしたマンホール情報の一覧から最初の10件が XML で取得できました。

では同様にして中国国内から「天安門」を検索してみます(他意はありません):
$ curl 'http://manholemap.juge.me/searchkeyword?keyword=天安門&limit=10'

2018020705



ゼロ件! えっ!?もしかしてこれが噂の The Great Firewall ・・・ かと思いましたが、実際にマンホールマップには「天安門」で登録されている情報は一件もありませんでした(笑)。繰り返しますが他意はありませんよ、ええ:
2018020708


(参考)他意はありませんが、参考リンク
中国を含む各国版のGoogleで「天安門事件」を画像検索するとどうなるのか?



次に挑戦したのは「中国国内のサーバーに Hyperledger Fabric を導入してブロックチェーン環境を作る」というものです。こちらの記事を参考に Hyperledger Fabric のインストールを試みました。

同記事内では docker を導入し、docker-compose を導入し、その後に Node.js & npm をインストールしてから composer-cli を導入します。docker & docker-compose までは順調に入りました。その後に Node.js を導入しようと、n package を入れて、Node.js の新しいバージョンを導入しようとしたら・・・
2018020701


・・・やけに時間がかかる・・・
2018020702


・・・まだ終わらん・・・
2018020703


と、結果的には導入できたのですが、このプロセスにこれまでに経験なかったほど時間がかかりました。何か環境が違っているのだろうか・・・


そして改めてこの記事の手順に沿って、npm を使って composer-cli をインストール・・・
2018020706


・・・失敗してしまいました:
2018020707


エラーが記録されているのは暗号化ライブラリである pkcs11js パッケージを導入するタイミングでした。ただここに問題があるのが、別の所の問題が引き金になっているのかは分かっていません。pkcs11js 単体でのインストールには問題なかったのですが、この一連の流れの中では何度試しても 100% ここで引っかかってしまう、という現象に見舞われてしまいました。過去にこんな所でひっかかったことがなかった所で引っかかってしまいました。

エラーメッセージを調べているのですが、未だに原因がよくわかっていません。何がいけないんだろうか?もしかしてさっき変な検索したのが良くなかった??(苦笑)
2018020709


とりあえず、サーバー作成までは意外(?)とあっけなかったのですが、その先は一筋縄ではいかない環境であることが分かりました。うーむ、想定よりも早めに問題に遭遇・・・


もう少しわかりやすく手を加えた上で、いずれちゃんと紹介する機会(BMXUG勉強会?)を作るつもりですが、オープンソースのブロックチェーン環境であるHyperledger Fabric を使ってユーザーと資産の管理、そして資産の譲渡といった最低限の機能を持ったアセット管理プラットフォームを作って、MIT ライセンスで公開しました。

「資産」=「仮想通貨」とみなせばいろいろ話題の仮想通貨プラットフォーム(の基礎)にもなると思います。仮想通貨でなく、普通の資産の管理や譲渡にも使えると思ってます(むしろそっちをイメージして作ってます)。またそこでの作成や譲渡といったトランザクションはブロックチェーン上に記録されるので改竄時のトラッキング機能を内包していることになります。

現時点では Hyperledger Fabric 環境が用意されていることが必須の上、管理プラットフォームとしてのUI未作成で、REST API のみ実装しているだけです。なので「使える人は使える」レベルのものだと思っています(改良予定あり)。 その代わり MIT ライセンスなのでかなり自由度高く改変・改良・再利用することを認めています。今のままでもブロックチェーン環境のデモ程度には使えると思ってます。


そんな、まだまだ普通に使えるレベルのものではないことは理解した上で、僕自身はこのタイミングあたりからフィードバックももらえたらいいなとか、共同開発に興味ある人がいたら・・・という目的もあって公開することにしました。コードはこちら:


導入方法などは README.md を参照・・・していただきたいのですが、Hyperledger Fabric 環境の用意を前提としているなど、まだ現時点ではハードル高いと思ってます。いずれ PaaS や SaaS でもっと気軽に使えるようになることを期待していますが。。


ちなみに、上記のコードはこの週末に GPD Pocket (Ubuntu 版)に Hyperledger Fabric と、Hyperledger Composer を導入したことでスタンドアロンなブロックチェーンアプリケーション開発環境ができ、嬉しくなって地元の津田沼を散歩しながら持ち歩いて、その休憩時に取り出して作りました。なので開発期間は実質週末の2日くらい。それほど凝ったものは作れておらず、ユーザーや資産の作成、ログイン、資産譲渡、といった API が用意されている程度です:
20180203
(↑開発中の様子)


逆に現時点ではまだ検索用の機能がほぼ手付かずだったり、管理用の UI すらなく、唯一 Swagger スタイルのインタラクティブな API Document が用意されている程度です。なのでまだ低レベルな部分もこれから作っていく必要があるもので、その点でも(良くも悪くも)プラットフォームとしての実装段階です。 そんなことを理解した上で「開発に関わってみたいなあ」とか「Hyperledger Fabric の勉強も兼ねて実装してみたいなあ」とか「ぶっちゃけブロックチェーン分からないけど、UI/UXだけでも関わりたいなあ」とか思っている人がいたら心強いっす。もちろん MIT ライセンスで公開している以上、「勝手に使わせてもらって改良する」でも全然オッケーです。個人的には Hyperledger Fabric が広まってほしいなあ、という思いを優先してます。


以前のブログエントリの中で Hyperledger Composer を使うことでブロックチェーンのビジネスネットワークを比較的簡単な定義で動かすことができることを紹介しました:
Hyperledger Composer フレームワークを使ってみる

↑ここで紹介したように Hyperledger Fabric v1.0 と Hyperledger Composer を使うことで、"asset" と呼ばれる取扱データ、"participant" と呼ばれるユーザー、 "transaction" と呼ばれる実行処理、そして "ACL" と呼ばれるアクセス権管理を定義してブロックチェーン環境に簡単にデプロイすることができるようになります。

この方法でデプロイしたブロックチェーンネットワークを外部のプログラムから使う方法も何通りかあるのですが、今回はその中から「Composer の内容を Web API 化」して、外部からは HTTP(S) を使った REST API として使えるように公開する方法を紹介します。以下の手順を実際に試す場合はローカル環境内に Hyperledger Fabric v1.0 および Hyperledger Composer がインストールされている必要があります。その手順は以下を参照して、ローカル環境で Hyperledger Composer が使える状態を作っておいてください:
Hyperledger Composer フレームワークをインストールする


また、実際に REST API として公開する内容のビジネスネットワークを定義した .bna ファイルが必要です。今回は以下のページで紹介されている方法に従って my-network.bna ファイルを作り、それを使うことにします(以下に日本語で解説します):
Developer Tutorial for creating a Hyperledger Composer solution


ではビジネスネットワークの定義ファイルを用意するまでの手順を紹介します。今回は github.com に公開されているサンプルをベースにクローンして用意します。

まず、上記リンク先の手順に従って Hyperledger Fabric v1.0 および Hyperledger Composer が導入された環境を用意して、両方のサービスを有効にします。

次に同環境にログインし、作業ディレクトリ(以下の例では ~/work)を作って、サンプルプロジェクトを git clone します:
$ mkdir ~/work (作業ディレクトリ)
$ cd ~/work
$ git clone https://github.com/hyperledger/composer-sample-networks.git

このサンプルプロジェクト内の basic-sample-network の内容を my-network という名前でコピーします:
$ cp -r ./composer-sample-networks/packages/basic-sample-network/  ./my-network

my-network プロジェクトの package.json ファイルを変更します。変更内容は name と prepublish 内のプロジェクト名を "my-network" にすることと、description の内容を変えることです:
    :
  "name": "my-network",
  "version": "0.1.6",
  "description": "My Commodity Trading network",
  "networkImage": "https://hyperledger.github.io/composer-sample-networks/packages/basic-sample-network/networkimage.svg",
  "networkImageanimated": "https://hyperledger.github.io/composer-sample-networks/packages/basic-sample-network/networkimageanimated.svg",
  "scripts": {
    "prepublish": "mkdirp ./dist && composer archive create --sourceType dir --sourceName . -a ./dist/my-network.bna",
    "pretest": "npm run lint",
    :

そして実際のビジネスネットワークの内容を書き換えます。定義する内容は上記ブログエントリの中で紹介したものと同じ定義をこのプロジェクト内にも作成することにします。というわけでまずは models/sample.cto ファイルを開き、以下の内容に書き換えて保存します:
/**
 * 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
}

↑ Commodity という asset と、Trader という participant と、Trade という transaction を定義しています。

同様にして lib/sample.js ファイルを開き、以下の内容に書き換えます:
/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * 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 という処理を定義しています。

そして同様にして permissions.acl ファイルも以下の内容に書き換えます:
/**
 * 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
}

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


ではここまでに定義した models/sample.cto, lib/sample.js, permissions.acl の内容でビジネスネットワークをビルドします:
$ cd ~/work/my-network
$ npm install

このコマンドが成功すると、 my-network/dist フォルダ内に my-network.bna ファイルが生成されます。このファイルと Hyperledger Composer を使って Hyperledger Fabric v1.0 に同ビジネスネットワークをデプロイします:
$ cd dist
$ composer network deploy -a my-network.bna -p hlfv1 -i PeerAdmin -s randomString

デプロイが成功しているかどうかは以下の ping コマンドで確認できます:
$ composer network ping -n my-network -p hlfv1 -i admin -s adminpw

ここまでの作業でビジネスネットワークを定義し、Hyperledger Fabric v1.0 上にデプロイすることができました。最後にこのビジネスネットワークを Web API 化して HTTP クライアントから REST でアクセスできるようにします。 そのためには composer-rest-server というツールを使います。composer-rest-server は npm を使ってインストールします:
$ sudo npm install -g composer-rest-server

composer-rest-server の使い方は REST API 化したい Hyperledger Composer プロジェクト上でコマンド実行するだけです:
$ cd ~/work/my-network
$ composer-rest-server

すると Hyperledger-Composer ロゴが現れ、知る人ぞ知る Strongloop loopback のようなインターフェースでのプロパティ指定画面になります:
2017081401


質問内容に以下のように答えます:
 Fabric Connection Profile Name: hlfv1
 Business Network Identifier: my-network
 Fabric username: admin
 secret: adminpw
 namespaces: never use namespaces
 (ここから下はデフォルトのまま)
 REST API to be secured: No
 event publication over WebSockets: Yes
 TLS security: No
2017081402


すると上記画面のように http://(IPアドレス):3000/explorer と表示されます。ウェブブラウザでこの URL にアクセスすると、(これも知る人ぞ知る StrongLoop Loopback のような)定義したビジネスネットワークに REST API でアクセスするための Open API ドキュメントが表示されます:
2017081403


この画面からは定義した Commodity や Trader, Trade といった asset, perticipant, transaction を読み書き実行するための各 API を展開したり、
2017081404


実際にパラメータを指定して実行したりすることもできます:
2017081405


この方法であればブロックチェーンにあまり詳しくないデベロッパーでも REST API で利用できるので非常に便利といえます。

 

オープンソースのブロックチェーン環境である 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
 

このページのトップヘ