2017年7月23日日曜日

Hyperdeger Fabric 1.0.0付属のサンプルコードを動かしてみる

Hyperdeger Fabric 1.0.0付属のサンプルコードを動かしてみます。

サンプルコードのイメージ図
(https://hyperledger-fabric.readthedocs.io/en/latest/write_first_app.htmlより抜粋)




  • ブロックチェーンネットワークの分散台帳に書き込むには、スマートコントラクトが必要。
  • 業務側のアプリケーションは、Fabricのネットワークエンドポイントにアクセスし、スマートコンストラクトを実行する
  • サンプルでは、台帳として車情報を管理し、アプリケーションに返す
  • 言語はJavaScriptを利用
  1. サンプルのダウンロード
    # git clone https://github.com/hyperledger/fabric-samples.git
    # cd fabric-samples/fabcar
    # ls
    creds  invoke.js  package.json  query.js  startFabric.sh
  2. startFabric.shの実行
    #./startFabric.sh
    このシェルを実行すると、サンプルを動かす環境を自動的に構築してくれる。
    シェルの中身をみてみると、だいたい以下のことを実行している。
    ・まず最初に、必要なDockerイメージのダウンロード
    ・Docker-composeでDockerコンテナの立ち上げ。以下の4つのコンテナを作成している。
        Creating orderer.example.com
        Creating ca.example.com
        Creating couchdb
        Creating peer0.org1.example.com
    ・ブロックチェーンネットワークを構成するチャネルの作成
    ・「peer0.org1.example.com」というノードをチャネルへ追加
    ・CLIコンテナの作成
    ・サンプルチェーンコードのインストール
    ・サンプルチェーンコードのイニシエト
    ・サンプルチェーンコードの実行
    docker psで確認してみると、以下のコンテナが起動されている。
  3. fabric-samples/fabcar配下で以下のコマンドを実行し、必要なパッケージをダウンロード
    # npm install
  4. クエリーから実行してみる。10データ分の車情報を取得できる。

query.jsソースをのぞいてみると、だいたい以下のことを実行している。

ユーザID'PeerAdmin’を利用する。チャネル名'mychannel'を指定する。また、チェーンコードID'fabcar'を指定して、7051ポートにアクセスする

var options = {
    wallet_path: path.join(__dirname, './creds'),
    user_id: 'PeerAdmin',
    channel_id: 'mychannel',
    chaincode_id: 'fabcar',
    network_url: 'grpc://localhost:7051',

};

Fabric Client SDKを呼び出し、認証に必要なKeyValueStoreを作成する。
client = new hfc();
return hfc.newDefaultKeyValueStore({ path: options.wallet_path });


チャネルを作成し、Peerノードに追加する。

channel = client.newChannel(options.channel_id);

channel.addPeer(client.newPeer(options.network_url));

トランザクションIDを生成し、'queryAllCars'という関数を呼び出す。

var transaction_id = client.newTransactionID();
console.log("Assigning transaction_id: ", transaction_id._transaction_id);

 // queryCar - requires 1 argument, ex: args: ['CAR4'],
 // queryAllCars - requires no arguments , ex: args: [''],
 const request = {
        chaincodeId: options.chaincode_id,
        txId: transaction_id,
        fcn: 'queryAllCars',
        args: ['']
 };

 return channel.queryByChaincode(request);

0 件のコメント: