目次


IBM Blockchain Platform にアプリケーションをデプロイする

Enterprise Membership Plan を利用して迅速に稼働させる

Comments

このチュートリアルでは、IBM Blockchain Platform 上にネットワークを作成し、そのネットワーク上のチャネル内にスマート・コントラクト (チェーンコード) をインストールして、サンプル・アプリケーションをデプロイする方法を説明します。また、共有レジャーにデータを取り込む方法と、ローカルのクライアント・アプリケーションからレジャーを呼び出して通信し、クエリーを実行したり、レジャーを更新したりする方法も説明します。

以前は High Security Business Network (HSBN) と呼ばれていた IBM Blockchain Platform は、IBM Cloud 上で稼働する、完全に統合されたエンタープライズ対応のサービスです。このプラットフォームは、複数の機関からなるビジネス・ネットワークの開発、ガバナンス、運用を迅速に行えるようにすることを目的に設計されています。

このチュートリアルで使用するサンプル・アプリケーションは、「fabcar」という Hyperledger Fabric サンプル・アプリケーションと同じものです。このサンプル・アプリケーションは Docker コンテナー内で実行することができますが、このチュートリアルでは IBM Cloud 上の IBM Blockchain Platform にインストールして実行する方法を説明します。The Linux Foundation でホストされている Hyperledger は、業界共通のブロックチェーン・テクノロジーを進化させることを目的とした、コラボレーションによる取り組みです。Hyperledger Fabric は Hyperledger プロジェクトの 1 つであり、IBM Blockchain Platform はこのフレームワーク実装で採用されているモジュール式アーキテクチャーで駆動されています。

1

IBM Blockchain Platform 上でネットワークを作成する

このチュートリアルに従うには、IBM Cloud アカウントと、IBM Blockchain Platform の Enterprise Membership Plan の有償サブスクリプションが必要です。Enterprise Membership Plan を利用することで、本番環境内でブロックチェーン・ネットワークをアクティブにできるようになります。IBM Blockchain Platform は頻繁に更新されるため、このチュートリアルに記載するスクリーンショットは、皆さんが目にする画面とは多少異なっている場合があることに注意してください。

  1. このリンク先の「Rapidly build with IBM Blockchain Platform」ページで、「Service Plans (サービス・プラン)」を選択します。プランを選択したら、「Upgrade (アップグレード)」(すでに IBM Cloud ライト・アカウントを持っている場合) または「Create (作成)」(IBM Cloud ライト・アカウントを持っていない場合) をクリックします。ウェルカム画面が表示されるので、ネットワークを作成するためのダッシュボードを表示するために「Create Network (ネットワークの作成)」をクリックします。 ウェルカム画面のスクリーンショット
    ウェルカム画面のスクリーンショット
  2. 「Create Network (ネットワークの作成)」ウィザードが表示されます。ウィザードで、必要な情報を入力します。 「Create Network (ネットワークの作成)」ウィザードのスクリーンショット
    「Create Network (ネットワークの作成)」ウィザードのスクリーンショット
  3. ウィザードの次のページでは、メンバーを招待できます。それには、そのメンバーが所属する機関の名前とメンバーの e-メール・アドレスを追加しますが、このチュートリアルではその必要はありません。メンバーを招待せずに「Next (次へ)」をクリックして先に進めます。次のページでは、デフォルトのガバナンス・ルールとポリシーを受け入れて「Next (次へ)」をクリックします。最後のページで、入力した詳細の要約を確認してから、「Done (完了)」をクリックします。
  4. ウィザードを完了すると、要約ページが表示されます。このページ上にある「Enter Network (ネットワークにアクセス)」をクリックすると、作成したブロックチェーン・ネットワークの概要とリソースが表示されます。 ネットワーク・ダッシュボード・ページのスクリーンショット
    ネットワーク・ダッシュボード・ページのスクリーンショット
  5. 「Overview (概要)」ページで「Add Peers (ピアの追加)」をクリックし、追加するピアの数を指定してピアを追加します。このチュートリアルでは、2 つのピアを追加するだけで十分です。 「Add Peers (ピアの追加)」ページのスクリーンショット
    「Add Peers (ピアの追加)」ページのスクリーンショット
  6. 追加したピアが「Overview (概要)」ページに示されます。 リソースのページに追加されたピアを示す画面のスクリーンショット
    リソースのページに追加されたピアを示す画面のスクリーンショット
2

チャネルを作成する

次のステップでは、「fabcar」という名前のチャネルを作成します。チャネルとは、ブロックチェーン・ネットワーク内の選択したピアからなる論理グループのことです。チャネルを使用すると、そのチャネルに関連付けられたピアは互いのトランザクションを確認できる一方、チャネル外部のピアはそれらのトランザクションを表示できません。チャネルによって、ピア間のトランザクションのプライバシーとセキュリティーをある程度確保することができます。ビジネス・ニーズに応じて、各チャネルが同じチェーンコードをインスタンス化することも、チャネルごとに異なるチェーンコードをインスタンス化することもできます。

  1. ブロックチェーン・ネットワーク内で、左側にある「Channels (チャネル)」タブをクリックし、「Create Channel (チャネルの作成)」を選択します。チャネル名として「fabcar」と入力し、「Next (次へ)」をクリックします。 新規チャネルを作成するページのスクリーンショット
    新規チャネルを作成するページのスクリーンショット
  2. 各メンバーにロールを割り当てた後、「Next (次へ)」をクリックします。このステップで、必ずすべての項目を選択してください。 メンバーを選択してロールを設定するサブページのスクリーンショット
    メンバーを選択してロールを設定するサブページのスクリーンショット
  3. チャネルの更新ポリシーを確認してから、「Submit Request (リクエストの送信)」をクリックします。 チャネルの更新ポリシーを確認するサブページのスクリーンショット
    チャネルの更新ポリシーを確認するサブページのスクリーンショット
  4. 「Notifications (通知)」タブに、通知が表示されているはずです。「Channel Request (チャネル・リクエスト)」チェック・ボックスを選択してから「Review Request (レビュー・リクエスト)」をクリックします。 「Notifications (通知)」タブのスクリーンショット
    「Notifications (通知)」タブのスクリーンショット
  5. チャネルのポリシーとメンバーを確認してから、「Accept (受け入れる)」をクリックしてチャネルへの招待を受け入れます。 fabcar チャネルへの招待を示すスクリーンショット
    fabcar チャネルへの招待を示すスクリーンショット
  6. 「Notifications (通知)」タブで、チャネルを選択し、「Submit Request (リクエストの送信)」をクリックします。 招待の受け入れを示す画面のスクリーンショット
    招待の受け入れを示す画面のスクリーンショット
  7. 「Channel (チャネル)」タブを選択し、「Submit (送信)」をクリックします。 このチャネルにピアを参加させるページのスクリーンショット
    このチャネルにピアを参加させるページのスクリーンショット
  8. 「Channel (チャネル)」タブ上の「Join Peers (ピアの参加)」をクリックします。 ピアのリストを示す画面のスクリーンショット
    ピアのリストを示す画面のスクリーンショット
  9. このチャネルに参加させるピアを選択して、「Add Selected (選択した項目を追加)」をクリックします。 ピアのリストを示す画面のスクリーンショット
    ピアのリストを示す画面のスクリーンショット
  10. チャネルが作成されたことを確認できます。 チャネルのリストを示す画面のスクリーンショット
    チャネルのリストを示す画面のスクリーンショット
3

チャネルにチェーンコードをインストールする

チャネルを作成したら、次はそのチャネルにチェーンコードをインストールします。ここでは「fabcar」サンプル・アプリケーションに含まれているチェーンコードを使用します。

  1. このチェーンコードを入手するには、このリンク先のページで説明している「ネットワークのテスト」手順に従うか、以下のように git clone を実行してリポジトリーを複製します。
    git clone https://github.com/hyperledger/fabric-samples.git
  2. チェーンコードをインストールするには、「Chaincode (チェーンコード)」タブを選択し、ピアを選択してから「Install chaincode (チェーンコードをインストール)」をクリックします。チェーンコードの名前として「fabcar」と入力し、チェーンコードのバージョンとして「v3」と入力します。次に、「Choose Files (ファイルの選択)」をクリックして、GitHub からダウンロードした fabric-samples/chaincode/fabcar フォルダー内にある fabcar.go チェーンコード・ファイルを選択します。最後に「Submit (送信)」をクリックします。 チェーンコードをインストールするページのスクリーンショット
    チェーンコードをインストールするページのスクリーンショット
  3. チェーンコードがピア上にインストールされました。 インストールされたチェーンコードを示すスクリーンショット
    インストールされたチェーンコードを示すスクリーンショット
  4. 次のステップは、チャネル上でチェーンコードをインスタンス化することです。それには、チェーンコードの init メソッドを呼び出します。このステップでは、引数を使用する必要はありません。fabcar チャネルを選択するだけで、「Arguments (引数)」フィールドは空の状態のままにできます。 チェーンコードをインスタンス化するページのスクリーンショット
    チェーンコードをインスタンス化するページのスクリーンショット
  5. インスタンス化されたチェーンコードは以下のように示されます。チェーンコードのリストを示すスクリーンショット
    チェーンコードのリストを示すスクリーンショット
  6. チャネル上でチェーンコードがインスタンス化されたら、「Channels (チャネル)」サイド・タブを選択して、「Chaincode (チェーンコード)」項目を選択します。fabcar の下に、以下の 3 つのボタンが表示されているはずです。
    • JSON: この JSON ファイルには、ブロックチェーン・ネットワークの資格情報とピア情報が格納されています。
    • Logs (ログ): チェーンコードのすべてのログは、ここに出力されます。
    • Delete (削除): このボタンは、チェーンコード・インスタンスを削除/停止するためのものです。
    チャネルのアクティビティおよび構成ページのスクリーンショット
    チャネルのアクティビティおよび構成ページのスクリーンショット

    fabric-samples/fabcar フォルダー内に、config という名前の新規フォルダーを作成します。「JSON」ボタンをクリックして新しいタブを開きます。このタブに表示されているすべてのデータを、新しく作成したファイルにコピーして、そのファイルを blockchain_creds.json という名前で config フォルダー内に保存します。

4

IBM Blockchain Platform 上で実行するようにアプリケーションを構成する

アプリケーションを IBM Blockchain Platform 上で実行するには、fabcar サンプルにいくつかの変更を加える必要があります。

まず、fabcar のルート・フォルダー fabric-samples/fabcar 内に、extractCerts.js ファイルと enrollUser.js ファイルをコピーしてください。

npm install を実行する

fabcar フォルダー内から npm install を実行します。

cd fabric-samples/fabcar
npm install

Windows を使用している場合、エラーを受け取ったとしたら、以下のコマンドを実行して Windows ビルド・ツールをインストールしてください。
npm install --global windows-build-tools

証明書を抽出する

IBM Blockchain Platform 内では TLS (Transport Layer Security) が有効にされているため、以降のステップに従って接続を確立するには、サービスによって提供された TLS 証明書を抽出する必要があります。

fabcar ディレクトリー内に network という名前のディレクトリーを作成してから、以下に示すように extractCerts.js を実行します。これにより、指定したパスに CA 証明書とピア証明書が作成されます。パスを指定しない場合、作成される証明書はデフォルトで fabcar ディレクトリー内の ./network/tls フォルダーに格納されます。証明書を作成するための入力は、デフォルトでは fabcar ディレクトリー内にある /config/blockchain_creds.json から取得されます。

node extractCerts.js

or

node extractCerts.js --input= /config/blockchain_creds.json --cert_path=./network/tls

上記のコマンドは証明書ファイルを作成する他に、次のステップで使用する EnrollId、EnrollSecret、CA_URL を出力します。また、次のステップでユーザーを登録するために使用する 3 つの URL (peer-url、peer-event-url、and orderer-url) も出力します。

ユーザーを登録

前のセクションで取得した EnrollId、EnrollSecret、CA_URL を使用して、以下のコマンドを実行します。このコマンドにより、指定したユーザーの証明書が、指定のウォレット・パスに生成されます。

node enrollUser.js --wallet_path=./network/creds --user_id=admin --user_secret=secret --ca_url=https://fft-zbcxxx.4.secure.blockchain.ibm.com:15185

チェーンコードを初期化する

レジャーのクエリーを実行したりレジャーを更新したりするためには、セットアップ・トランザクションを実行してレジャーにサンプル・データを取り込む必要があります。fabric-samples/fabcar フォルダー内にある invoke.js ファイルのコピーを作成し、そのコピーに invokeNetwork.js という名前を付けます。このコピーは必ずコピー元のファイルと同じフォルダー内に格納してください。次に、以下の手順に従って invokeNetwork.js コマンドに変更を加えます。

  1. util 変数の直後に、以下の require パラメーターを追加します。
    var fs = require("fs")
  2. options 変数を以下のように変更します。peer_urlevent-urlorderer-url の各フィールドの値を、前の手順で extractCerts.js を実行したときに返された値に更新してください。
    var wallet_path = path.join(__dirname, './network/creds');
    var user_id = 'admin';
    var channel_id = 'fabcar';
    var chaincode_id = 'fabcar';
    var peer_url = 'grpcs://fft-bc02c.4.secure.blockchain.ibm.com:30499';
    var event_url = 'grpcs://fft-zbc02c.4.secure.blockchain.ibm.com:20138';
    var orderer_url = 'grpcs://fft-zbc02b.4.secure.blockchain.ibm.com:20752';
    var tls_cert = JSON.parse(fs.readFileSync(path.join(__dirname, './network/tls') + '/peer.cert'));
  3. Replace this code:
    var channel = fabric_client.newChannel(‘mychannel ‘);

    with:

    var channel = fabric_client.newChannel(channel_id);
  4. Set
    var store_path = wallet_path;
  5. Comment this code:
    //fabric_client.setCryptoSuite(crypto_suite);
  6. Replace this code:
    return fabric_client.getUserContext(‘user1’, true);

    with:

    return fabric_client.getUserContext(user_id, true);
  7. TLS を有効にするために、以下のコードを置き換えます。
    var peer = fabric_client.newPeer('grpc://localhost:7051');

    上記のコードを以下のコードで置き換えます。

    var peer = client.newPeer(peer_url, {
        pem: tls_cert.pem
    });
  8. 以下のコードを置き換えます。
    var order = fabric_client.newOrderer('grpc://localhost:7050');

    上記のコードを以下のコードで置き換えます。

    var order = fabric_client.newOrderer(orderer_url, {
                pem: tls_cert.pem
            });
  9. 以下のコードを置き換えます。
    event_hub.setPeerAddr('grpc://localhost:7053');

    上記のコードを以下のコードで置き換えます。

    event_hub.setPeerAddr(event_url, {
                    pem: tls_cert.pem
                });
  10. 最後に、request 変数に含まれている fcn フィールドの値を createCar から initLedger に変更し、args を空の配列にします。変更後の request 変数は以下のようになります。
    var request = {
            targets: targets,
            chaincodeId: chaincode_id,
            fcn: 'initLedger',
            args: [''],
            chainId: channel_id,
            txId: tx_id
    };
  11. ファイルを保存してから、node invokeNetwork.js を使用して、この新しいコマンドを実行します。期待される出力は以下のとおりです。
    …
    Successfully sent transaction to the orderer.

レジャーのクエリーを実行する

invokeNetwork.js コマンドによってレジャーにサンプル・データが取り込まれたので、レジャーのクエリーを実行して、取り込まれたデータを確認しましょう。fabric-samples/fabcar フォルダー内にある query.js ファイルのコピーを作成し、そのコピーに queryNetwork.js という名前を付けます。このコピーは必ずコピー元のファイルと同じフォルダー内に格納してください。次に、以下の手順に従って queryNetwork.js コマンドに変更を加えます。

  1. path 変数の直後に、以下の require パラメーターを追加します。
    var fs = require("fs")
  2. options 変数を以下のように変更します。network_url フィールドの値を、前の手順で extractCerts.js を実行したときに返された peer_url の値に更新してください。
    var wallet_path = path.join(__dirname, './network/creds');
    var user_id = 'admin';
    var channel_id = 'fabcar';
    var chaincode_id = 'fabcar';
    var peer_url = 'grpcs://fft-bc02c.4.secure.blockchain.ibm.com:30499';    
    var tls_cert = JSON.parse(fs.readFileSync(path.join(__dirname, './network/tls') + '/peer.cert'));
  3. 以下のコードを置き換えます。
    var channel = fabric_client.newChannel(‘mychannel ‘);

    このコマンドを以下に置き換えます。

    var channel = fabric_client.newChannel(channel_id);
  4. Set:
    var store_path = wallet_path;
  5. Comment this code:
    //fabric_client.setCryptoSuite(crypto_suite);
  6. Replace this code:
    return fabric_client.getUserContext(‘user1’, true);

    with:

    return fabric_client.getUserContext(user_id, true);
  7. Replace this code:
    var peer = fabric_client.newPeer('grpc://localhost:7051');

    with:

    var peer = fabric_client.newPeer(peer_url, {
                pem: tls_cert.pem
            });
  8. ファイルを保存してから、node queryNetwork.js を使用して、この新しいコマンドを実行します。期待される出力は以下のとおりです。
    …
    Query result count =  1
    Response is  [{"Key":"CAR0","Record":{"make":"Toyota","model":"Prius","colour":"blue","owner":"Tomoko"}},{"Key":"CAR1","Record":{"make":"Ford","model":"Mustang","colour":"red","owner":"Brad"}},{"Key":"CAR10","Record":{"make":"","model":"","colour":"","owner":"Tom"}},{"Key":"CAR11","Record":{"make":"Honda","model":"Accord","colour":"Black","owner":"yog"}},{"Key":"CAR12","Record":{"make":"Honda","model":"Accord","colour":"Black","owner":"Tom"}},{"Key":"CAR2","Record":{"make":"Hyundai","model":"Tucson","colour":"green","owner":"JinSoo"}},{"Key":"CAR3","Record":{"make":"Volkswagen","model":"Passat","colour":"yellow","owner":"Max"}},{"Key":"CAR4","Record":{"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}},{"Key":"CAR5","Record":{"make":"Peugeot","model":"205","colour":"purple","owner":"Michel"}},{"Key":"CAR6","Record":{"make":"Chery","model":"S22L","colour":"white","owner":"Aarav"}},{"Key":"CAR7","Record":{"make":"Fiat","model":"Punto","colour":"violet","owner":"Pari"}},{"Key":"CAR8","Record":{"make":"Tata","model":"Nano","colour":"indigo","owner":"Valeria"}},{"Key":"CAR9","Record":{"make":"Holden","model":"Barina","colour":"brown","owner":"Shotaro"}}]

レジャーを更新する

最後に、レジャーを更新しましょう。それには、前の手順で新しく作成した invokeNetwork.js コマンドに別の単純な変更を加えます。

  1. request 変数を以下に示すように変更します。これにより、作成される自動車を説明する一連の引数を使用して createCar チェーンコードが呼び出されることになります。変更後の request 変数は以下のようになります。
    var request = {
            targets: targets,
            chaincodeId: chaincode_id,
            fcn: 'createCar',
            args: ['CAR11', 'Honda', 'Accord', 'Black', 'Tom'],
            chainId: channel_id,
            txId: tx_id
    };
  2. ファイルを保存してから、node invokeNetwork.js を使用して、このコマンドを実行します。期待される出力は以下のとおりです。
    …
    Successfully sent transaction to the orderer.

    これで、「Tom」を所有者とする新しい自動車が作成されて、レジャーに保管されました。レジャーに保管されたこの新しい自動車は、再び queryNetwork.js コマンドを実行することによって確認できます。この後は実験として、別の名前や所有者を設定して新しい自動車をレジャー上で作成してみてください。

  3. 最後に、changeOwner チェーンコードを使用して自動車の所有者を変更してみることをお勧めします。それには、invokeNetwork.js 内の request 変数を再び変更して、以下のような内容にします。
    var request = {
            targets: targets,
            chaincodeId: chaincode_id,
            fcn: 'changeCarOwner',
            args: ['CAR11', 'MGK'],
            chainId: channel_id,
            txId: tx_id
    };
  4. ファイルを保存してから、node invokeNetwork.js を使用して、このコマンドを実行します。期待される出力は以下のとおりです。
    …
    Successfully sent transaction to the orderer.
  5. レジャーに保管されたこの新しい自動車を確認するには、再び queryNetwork.js コマンドを実行します。所有者が「Tom」から「MGK」に変更されたことを確認できるはずです。
  6. すべての自動車ではなく、単一の自動車のクエリーを実行する場合は、queryNetwork.js コマンドに含まれる request 変数を以下のように変更してから、コマンドを再実行します。
    const request = {
            chaincodeId: chaincode_id,
            txId: transaction_id,
            fcn: 'queryCar',
            args: ['CAR11']
    };

    以下のように、単一の自動車に関する情報が表示されます。

    …
    Query result count =  1
    Response is  {"make":"Honda","model":"Accord","colour":"Black","owner":"MGK"}

まとめ

これで、IBM Blockchain Platform 上でネットワークが稼働中の状態になり、このネットワーク上のチャネル内にはサンプル・チェーンコードがインストールされ、実行中のアプリケーションを簡単に操作できるようになりました。レジャーにはすでにサンプル・データが取り込まれているため、IBM Blockchain Platform 上のブロックチェーンと通信 (クエリーおよび更新) できます。ブロックチェーンをいろいろと試してみてください!

謝辞

このチュートリアルの開発全体を通して専門家としてのガイダンスとサポートを提供してくれた、IBM Blockchain Labs Global Engagement チームの Anthony O'Dowd と David Gorman に感謝の言葉を贈ります。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing
ArticleID=1060144
ArticleTitle=IBM Blockchain Platform にアプリケーションをデプロイする
publish-date=04192018