Hyperledger Fabricとは
過去記事
https://qiita.com/melonattacker/items/342bf39a2119a2f6d880
公式サイト
https://www.hyperledger.org/projects/fabric
この記事はPart1です。Part2へのリンク。
Hyperledger Composerとは
JavaScriptでHyperledger上で動くアプリケーションを作れる便利グッズです。
チェーンコードがJavaScriptで書けるというのがいいと思います。
公式サイト
https://hyperledger.github.io/composer/latest/
今回作るもの
土地の所有権を取引できるようにしてブロックチェーンに記録するというシンプルなものです。
Hyperledger Composerが提供しているRest APIを使ってReactで書くフロントエンドにデータ引っ張ってきて表示させます。
事前準備
nodeとdockerが必要です
nodeのバージョンはv8.9.4を使っています。v10.14.2とかだと動きません笑。
dockerのインストールはこちら
https://docs.docker.com/docker-for-mac/install/
dockerを起動しておきましょう。
公式サイトに従ってCLI toolsをインストールしていきます。
npm install -g composer-cli@0.20
npm install -g composer-rest-server@0.20
npm install -g generator-hyperledger-composer@0.20
npm install -g yo
この時gyp ERR!が出る人はpythonを2.7系にしてnode-gypをインストールするといいです。
自分はこのインストールの段階でエラー連発しまくって4時間くらい詰まってました...
自分はこれをやるとインストールできるようになりました。
npm install -g node-gyp
npm i -g npm
次にHyperledger Fabricをインストールします。
まず、インストールするためのファイルを入れます。
mkdir ~/fabric-dev-tools && cd ~/fabric-dev-tools
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.2 をインストールします。
cd ~/fabric-dev-tools
export FABRIC_VERSION=hlfv12
./downloadFabric.sh
Hyperledger FabricをスタートしてPeerAdmin cardを生成します。
cd ~/fabric-dev-tools
./startFabric.sh
./createPeerAdminCard.sh
Yeomanを使ってbusiness networkを作ります。
yo hyperledger-composer:businessnetwork
Model Fileの設定
このbusiness networkの構成要素であるParticipant、asset、transactionを定義します。
namespace org.acme.landowner
enum LandDesc {
o Normal
o Agricultual
o Mountain
o Forest
}
enum LandSize {
o SMALL
o MEDIUM
o LARGE
}
participant Trader identified by email {
o String email
o String firstName
o String lastName
o String type
}
asset Land identified by landId {
o String landId
o LandSize size
o LandDesc description
--> Trader owner
}
transaction Trade {
--> Land land
--> Trader newOwner
}
土地の交換をするTrader、土地であるLand、Tradeトランザクションを用意しました。
Traderはemail、LandはlandIdで判別されます。
Script Fileの設定
このbusiness modelのメインロジックです。
これがチェーンコードの役割を果たします。
/**
* Track the trade of a land from one trader to another
* @param {org.acme.landowner.Trade} trade - the trade to be processed
* @transaction
*/
async function tradeLand(trade) {
trade.land.owner = trade.newOwner;
let assetRegistry = await getAssetRegistry('org.acme.landowner.Land');
await assetRegistry.update(trade.land);
}
これによって土地の所有権を移します。
Access Controllの設定
このbusiness networkのルールのようなものです。
rule Default {
description: "Allow all participants access to all resources"
participant: "ANY"
operation: ALL
resource: "org.acme.landowner.*"
action: ALLOW
}
rule SystemACL {
description: "System ACL to permit all access"
participant: "ANY"
operation: ALL
resource: "org.hyperledger.composer.system.**"
action: ALLOW
}
business network archive(.bna)ファイルの生成
business networkが定義されたので、.bnaファイルを生成します。
.bnaファイルは上で定義した3つのファイルをパッケージ化してHyperledger Fabricにデプロイするためのものです。
land-ownerディレクトリに移動して以下のコマンドを実行しましょう。bnaファイルが生成されます。
composer archive create -t dir -n .
business networkのデプロイ
Hyperledger Fabricにbusiness networkをデプロイするにはHyperledger Composerで作ったbusiness networkをピア上にインストールする必要があります。
land-ownerディレクトリにて以下を実行します。
composer network install --card PeerAdmin@hlfv1 --archiveFile land-owner@0.0.1.bna
composer network install
コマンドはPeerAdminというbusiness networkのcardを必要とします(上で作って、インポートしている)。.bnaファイルがbusiness networkを定義します。
ではbusiness networkをスタートします。
composer network start --networkName land-owner --networkVersion 0.0.1 --networkAdmin admin --networkAdminEnrollSecret adminpw --card PeerAdmin@hlfv1 --file networkadmin.card
composer network start
コマンドはbusiness network cardが必要です。
同様にbusiness network cardとしてインポートするためにnetworkのバージョンと名前、adminのidentityなども必要です。
networkの管理者のidentityを使用可能なbusiness network cardとしてインポートするために以下のコマンドを実行します。
composer card import --file networkadmin.card
business networkがちゃんとデプロイされているかを確認するには以下のコマンドを実行します。
composer network ping --card admin@land-owner
REST サーバーの生成
Hyperledger Composerはbusiness networkに基づくREST APIを生成することができます。これはWebアプリケーションを作るのに役立ちます。
land-ownerディレクトリにて次のコマンドを実行しましょう。
composer-rest-server
http://localhost:3000/explorer にアクセスするとREST APIに繋がります。

上で定義したparticipant、asset、transactionが表示されています。
まず、POSTルートで2人のTraderを登録しましょう
ParametersのValueの部分に以下を入力し、Try it out!を押しましょう。
{
"$class": "org.acme.landowner.Trader",
"email": "happy@email.com",
"firstName": "Ryugamine",
"lastName": "Mikado",
"type": "Farmer"
}
2人目も同じように作ります。
{
"$class": "org.acme.landowner.Trader",
"email": "sad@email.com",
"firstName": "Sonohara",
"lastName": "Anri",
"type": "Farmer"
}
Response Codeが200になっていると成功しています。また、GETルートでidのvalueに2人のemailを入力することによっても確認できます。http://localhost:3000/api/Trader に接続することによっても確認できます。
次にLandを作りましょう。
POSTルートでParametersのValueの部分に以下を入力し、Try it out!を押しましょう。
{
"$class": "org.acme.landowner.Land",
"landId": "0001",
"size": "SMALL",
"description": "Agricultual",
"owner": "resource:org.acme.landowner.Trader#happy@email.com"
}
http://localhost:3000/api/Land に接続するとLand:0001のownerがemail:happy@email.comであるTrader、つまりミカドであることがわかります。
では、Tradeトランザクションを作って見ましょう!
ここでは農民であるミカドとアンリが農地の所有権を取引する場面を考えています。
ミカドが持っているLand:0001の所有権をアンリに移します。
POSTルートでParametersのValueの部分に以下を入力し、Try it out!を押しましょう。
{
"$class": "org.acme.landowner.Trade",
"land": "resource:org.acme.landowner.Land#0001",
"newOwner": "resource:org.acme.landowner.Trader#sad@email.com"
}
ここでhttp://localhost:3000/api/Land に接続するとLand:0001のownerがemail:sad@email.comであるTrader、アンリに変わっていることが確認できます。
トランザクションの作成に成功しました!
Part1はここまでとして、Part2でシンプルなアプリケーションをReactで作っていきます。
Part2はこちら。
参照
https://hyperledger.github.io/composer/latest/installing/installing-prereqs
https://hyperledger.github.io/composer/latest/installing/development-tools
https://hyperledger.github.io/composer/latest/tutorials/developer-tutorial
https://medium.com/coinmonks/building-a-blockchain-application-using-hyperledger-fabric-with-angular-frontend-part-1-f070bf169231