目次


IBM Blockchain Platform スターター・プランにサンプル・アプリケーションをデプロイする

Hyperledger Fabric の「fabcar」サンプルを使用してスターター・プランを迅速に稼働させる

Comments

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

IBM Blockchain Platform スターター・プランは IBM Cloud 上で稼働する、完全統合型のエンタープライズ対応サービスです。スターター・プランは、複数の機関からなるビジネス・ネットワークの開発、ガバナンス、運用を迅速に行えるようにすることを目的に設計されています。このプランでターゲットとしているのは、本番のシナリオではなく、テストと開発のシナリオです。本番のシナリオには、エンタープライズ・プランを利用してください。

このチュートリアルで使用するサンプル・アプリケーションは、「fabcar」という Hyperledger Fabric のサンプル・アプリケーションです。チュートリアルでは、このサンプル・コードを確認して Docker コンテナー内でローカルに実行しながら、アプリケーションを IBM Cloud 上の IBM Blockchain Platform スターター・プランにインストールして実行する方法を説明します。

IBM Blockchain Platform スターター・プランは頻繁に更新されるため、このチュートリアルに記載するスクリーンショットは、皆さんが目にする画面とは多少異なっている場合があることに注意してください。

学習目的

  • IBM Blockchain Platform スターター・プランについて理解する
  • スターター・プラン上で初のネットワークを作成する
  • チェーンコードをネットワーク内のピアにインストールする
  • サンプル・アプリケーションを実行してチェーンコードを呼び出す
  • 共有レジャーにデータを取り込み、クエリーを実行して更新する

このチュートリアルの所要時間

  • 約 45 ~ 60 分

前提条件

  • IBM Cloud アカウントをまだお持ちでない場合は、このリンク先のページで作成してください。
  • デプロイするサンプル・チェーンコードは GitHub から取得するため、ローカル・マシン上に git がインストールされている必要があります。
  • アプリケーションを構成できるよう、ローカル・マシン上に Node.js と npm がインストールされている必要があります。現在のところ、Node.js v9.x はまだサポートされていないので、v8.9.x を使用してください。
  • 500ドル分(約1ヶ月の評価可能 * )のクレジットを評価用にご提供。お申し込みはこちら

* 2つの組織と 1ピア/組織のフル機能のネットワークを利用可能

IBM Blockchain Platform スターター・プラン上でネットワークを作成する

  1. IBM Cloud アカウントにログインします (アカウントをまだお持ちでない場合は作成してください)。
  2. このリンク先の「Rapidly build with IBM Blockchain Platform」ページで、「Service Plans (サービス・プラン)」を選択します。IBM Cloud アカウントにログインしていることを確認してください。
    サービス名として「Blockchain-demo」と入力し、「Starter Plan Membership (スターター・プラン・メンバーシップ)」を選択してから「Create (作成)」をクリックします。 サービス名とデプロイ先の領域を選択する画面のスクリーンショット
    サービス名とデプロイ先の領域を選択する画面のスクリーンショット
  3. 「Network created! (ネットワークが作成されました!)」パネルが表示されます。このページ上の「Launch (起動)」をクリックして、ネットワークのダッシュボードを表示します。 ネットワークを起動する画面のスクリーンショット
    ネットワークを起動する画面のスクリーンショット
  4. 「Let's get started! (はじめましょう!)」というウェルカム画面が表示されます。表示内容を読んだら、「Got it (了解)」をクリックします。 ウェルカム・パネルのスクリーンショット
    ウェルカム・パネルのスクリーンショット
  5. 画面の左上に、自動的に生成されてネットワークに付けられた名前が示されています。この名前をクリックして、「fabcar」という名前に変更します。 ネットワークの名前変更を示すスクリーンショット
    ネットワークの名前変更を示すスクリーンショット
  6. ネットワーク名を変更すると、数秒の間、名前が正常に変更されたことを伝えるポップアップが画面の右上に表示されます。 ネットワーク名が正常に変更されたことを伝えるポップアップのスクリーンショット
    ネットワーク名が正常に変更されたことを伝えるポップアップのスクリーンショット
  7. スターター・プランではこのように、難しい設定を一切行うことなく、実際に使える単純なネットワークが自動的に作成されます。「Overview (概要)」タブをクリックすると、自動的に作成された個々のコンポーネントを確認できます。 「Overview (概要)」パネルのスクリーンショット
    「Overview (概要)」パネルのスクリーンショット
  8. このネットワークは、実際には企業 A (Org1)企業 B (Org2) という 2 つの組織で構成されています。デフォルトでは Org1 としてログインされるので、認証局 (CA) と Org1 のピアの他、両方の組織が共有する Orderer サービスだけが表示されます。
  9. ネットワーク・メンバーの詳細を表示するには、「Members (メンバー)」タブをクリックします。 「Members (メンバー)」パネルのスクリーンショット
    「Members (メンバー)」パネルのスクリーンショット
  10. 左側の「Channels (チャネル)」タブをクリックすると、defaultchannel という名前のチャネルが表示されます。これも、スターター・プランによって自動的に作成されたものです。 「Channels (チャネル)」パネルのスクリーンショット
    「Channels (チャネル)」パネルのスクリーンショット
  11. このチュートリアルでは単純にするために、この defaultchannel を使用します。テーブル内の「defaultchannel」の行をクリックすると、このチャネルの詳細が表示されます。 defaultchannel の詳細を表示する画面のスクリーンショット
    defaultchannel の詳細を表示する画面のスクリーンショット
  12. このチャネルでは、チェーン上ですでに合計 3 つのブロックを保持していることに注目してください。これらのブロックに、初期構成情報が保管されています。各ブロックの行を選択すると、そのブロックの詳細を確認できます。
2

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

次のステップは、チェーンコードをチャネルにインストールすることですが、その前に、git clone コマンドを使用して GitHub リポジトリーからチェーンコードを取得する必要があります。

  1. git がローカル・マシンにインストールされていることを確認します。
  2. コマンド・ラインまたは端末ウィンドウを開き、適切なディレクトリーにナビゲートして、fabcar という名前の新しいディレクトリーを作成します。カレント・ディレクトリーを新規に作成した fabcar ディレクトリーに変更し、以下のコマンドを実行して Fabric サンプル・ソースを複製します。
    git clone https://github.com/hyperledger/fabric-samples.git

    上記のコマンドにより、すべてのサンプルのコードがローカル・マシンにコピーされます。スターター・プランの UI を使用して、左側のサイドバーから「Install Code (コードのインストール)」タブを選択します。これにより、「Install code (コードをインストール)」パネルが表示されます。

    「Install code (コードをインストール)」パネルのスクリーンショット
    「Install code (コードをインストール)」パネルのスクリーンショット
  3. 「Choose-peer... (ピアを選択...)」ドロップダウンをクリックし、「org1-peer1」を選択してから「Install Chaincode (チェーンコードのインストール)」ボタンをクリックします。 チェーンコードをインストールするために使用するパネルのスクリーンショット
    チェーンコードをインストールするために使用するパネルのスクリーンショット
  4. 「Install chaincode on org1peer1 (チェーンコードを org1peer1 にインストール)」ダイアログで、「Chaincode ID (チェーンコード ID)」には「fabcar」と入力し、「Chaincode Version (チェーンコード・バージョン)」には「v1」と入力します。

    fabcar チェーンコードの Node.js バージョンと Golang バージョンのどちらをデプロイするかを選択できます。どちらのバージョンも同じ機能を提供するので、どちらを選択するのでも構いません。「Chaincode Type (チェーンコードのタイプ)」で、「Node」または「Golang」を選択してください。

    最後に、このパネル上の「Choose files (ファイルを選択)」をクリックし、インストールするチェーンコード・ソースを選択します。

    • Go バージョンを使用する場合は、GitHub からダウンロードした fabric-samples/chaincode/fabcar/go フォルダー内にある fabcar.go チェーンコード・ファイルだけを選択します。 Go バージョンの fabcar チェーンコードを示すスクリーンショット
      Go バージョンの fabcar チェーンコードを示すスクリーンショット
    • Node.js バージョンを使用する場合は、GitHub からダウンロードした fabric-samples/chaincode/fabcar/node フォルダー内にある fabcar.js ファイルと package.json ファイルの 2 つを選択します。 Node バージョンの fabcar チェーンコードを示すスクリーンショット
      Node バージョンの fabcar チェーンコードを示すスクリーンショット

    ファイルを選択したら、「Submit (送信)」ボタンをクリックします。これで、チェーンコードがスターター・プランに送信されます。

  5. 次に必要な作業は、チェーンコードをインスタンス化することです。「Actions (アクション)」列内にある 3 つのドットのアイコンをクリックしてメニューを表示し、そこから「Instantiate (インスタンス化)」を選択します。 チェーンコードのインスタンス化を開始する画面のスクリーンショット
    チェーンコードのインスタンス化を開始する画面のスクリーンショット
  6. fabcar に必要な引数はないため、「Instantiate chaincode (チェーンコードをインスタンス化)」ダイアログで指定する引数は何もありません。ただし、「Channel (チャネル)」ドロップダウンで「defaultchannel」を選択してから、「Chaincode Type (チェーンコードのタイプ)」を前の手順でアップロードしたコードの言語 (Node または Golang) と一致させる必要があります。その後、「Submit (送信)」をクリックします。 「Instantiate chaincode (チェーンコードをインスタンス化)」ダイアログのスクリーンショット
    「Instantiate chaincode (チェーンコードをインスタンス化)」ダイアログのスクリーンショット
  7. 「Instantiate chaincode (チェーンコードをインスタンス化)」ダイアログでの作業が完了したら、「fabcar」の行を選択して、defaultchannel 上でチェーンコードがインスタンス化されたことを確認できます。 インスタンス化されたチェーンコードを示すスクリーンショット
    インスタンス化されたチェーンコードを示すスクリーンショット
  8. チャネル上でチェーンコードがインスタンス化されたので、「Channels (チャネル)」サイド・タブを選択し、「defaultchannel」の行を選択してその詳細を確認します。 defaultchannel の詳細を表示する画面のスクリーンショット
    defaultchannel の詳細を表示する画面のスクリーンショット

    ご覧のように、チャネル上にもう 1 つのブロックが追加されました。このブロックは、今行ったインスタンス化の処理を記録するものです。

  9. このパネル上で「Chaincode (チェーンコード)」タブを選択し、「fabcar」の行を選択して展開します。fabcar の下に、以下の 2 つのボタンが表示されているはずです。
    • 「JSON」は、ブロックチェーン・ネットワークの資格情報とピア情報を格納するファイルです。
    • Delete (削除)」は、チェーンコード・インスタンスを停止して削除する場合に使用するボタンです。
    fabcar の詳細を表示する画面のスクリーンショット
    fabcar の詳細を表示する画面のスクリーンショット
  10. 上掲の「JSON」ボタンをクリックします。これによって新しいタブが開きます。このタブに表示されているすべてのデータを、network-profile.json という名前を付けた新しいファイルにコピーして、そのファイルをマシン上のどこかに保存してください。後でこのデータをコピーする必要があります。
3

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

GitHub からダウンロードした fabcar アプリケーションは、Hyperledger Fabric のローカル・インスタンスを使用するようにハードコーディングされています。けれども、私たちが使用するのはリモートの IBM Blockchain Platform 上にある Hyperledger Fabric です。したがって、リモート・プラットフォームにセキュアに接続する新しいバージョンの fabcar アプリを取得し、前のステップでダウンロードして保存した network-profile.json 構成ファイルを使用する必要があります。

オリジナルの fabcar アプリケーションの 4 つのファイルは、以下の名前になっています。

  • enrollAdmin.js
  • registerUser.js
  • invoke.js
  • query.js

新しいバージョンの fabcar アプリケーションを取得する

上記のファイルの新しいバージョンは、fabcar-network という名前の GitHub リポジトリー内にあります。新しいファイルの名前は、いずれも「Network」という単語で終わっています。これは、新しいバージョンでは fabcar にリモートでアクセスすることを意味します。

  • enrollAdminNetwork.js
  • registerUserNetwork.js
  • invokeNetwork.js
  • queryNetwork.js

GitHub リポジトリー内には、上記の他にもう 1 つのファイルがあります。リモートの fabcar チェーンコードにアクセスするために必要な追加の構成が含まれる構成ファイルです。この構成ファイルの名前は以下のとおりです。

  • client-profile.json

以上の新しいファイルを取得するには、fabric-samples フォルダー内から以下のコマンドを実行します。

git clone https://github.com/m-g-k/fabcar-network.git

このコマンドによって、既存の fabcar フォルダーと同じレベルに fabcar-network という名前のフォルダーが作成されます。

次のステップとして、前にダウンロードして保存した network-profile.json ファイルを、fabric-samples/fabcar-network/config フォルダー内にコピーして、既存の client-profile.json ファイルと一緒に保管します。

npm install を実行する

ネットワーク・バージョンの fabcar クライアント・アプリケーションは Node.js を使用して作成されています。次のステップとなるこの手順を完了するには、ローカル・マシン上に Node.js と npm がインストールされている必要があります。

  1. コマンド・ラインまたは端末ウィンドウに戻って、fabric-samples/fabcar-network フォルダー内から npm install コマンドを実行します。
    npm install

    Windows を使用している場合、ビルド・エラーが表示されたとしたら、以下のコマンドを実行して Windows ビルド・ツールをインストールしてください。

    npm install --global windows-build-tools

    これで、fabcar クライアント・アプリケーションを実行するための前提条件となる node パッケージのすべてがインストールされました。

管理者を登録する

スターター・プラン内でネットワークを作成したときに、各組織に admin という名前の管理者ユーザーが自動的に認証局 (CA) に登録されました。このユーザーの登録証明書 (eCert) を取得するために、CA に登録リクエストを送信する必要があります。

  1. fabric-samples/fabcar-network フォルダー内から以下のコマンドを実行します。
    node enrollAdminNetwork.js

    以下のような出力が表示されるはずです。

    > node enrollAdminNetwork.js
    Found organization: org1 and ca name: org1-ca
    Enrolling using enrollmentId: admin and EnrollmentSecret: 2d87ae1b59
    Successfully enrolled admin user "admin" with msp: "org1"
    Assigned the admin user to the fabric client ::{…}

上記の出力に示されているように、enrollAdminNetwork.js アプリケーションは hfc-key-store という名前のフォルダーを作成し、そのフォルダー内にローカルの公開鍵と秘密鍵のペアを作成します。その後、証明書署名リクエスト (CSR) を org1 のリモート CA に送信します。これにより、リモート CA から eCert が発行されます。発行された eCert は、いくつかのメタデータといっしょに hfc-key-store フォルダー内に格納されます。このアプリケーションは、CA 配置場所の接続の詳細および接続するために必要な TLS 証明書のすべてを、前にダウンロードした network-profile.json から取得します。

新規ユーザーを登録する

admin ユーザーの eCert を取得したので、これを使用して、user1 という名前の新しいユーザーを作成し、CA に登録します。後でレジャーに対してクエリーを実行して更新する際は、これから作成する新しいユーザーの ID を使用します。

  1. fabric-samples/fabcar-network フォルダー内から以下のコマンドを実行します。
    node registerUserNetwork.js

    以下のような出力が表示されるはずです。

    > node registerUserNetwork.js
    Successfully loaded admin from persistence
    Successfully registered "user1" - with secret:gTYshgoNxoLH
    Successfully enrolled member user "user1" with msp: "org1"
    "user1" was successfully registered and enrolled and is ready to interact with the fabric network

前に実行したコマンドと同様に、アプリケーションは新しい公開鍵と秘密鍵のペアを作成して、CA に CSR リクエストを送信します。これにより、CA から user1 の eCert が発行されます。hlf-key-store フォルダー内を調べると、ID ごとに 3 つのファイル、つまり合計で 6 つのファイルがあることがわかります。

レジャーを初期化する

オリジナルの fabcar サンプル・アプリケーションに含まれているスクリプトは、すぐにレジャーを使い始められるよう、自動的に initledger トランザクションを呼び出して 10 台の自動車のサンプル・データをレジャーに取り込みます。ここではこのスクリプトを使用しないため、このトランザクションを手作業で呼び出さなければなりません。そこで、このトランザクションを直接呼び出す、invokeNetwork.js コマンドを作成しておきました。

  1. fabcar フォルダー内から以下のコマンドを実行します。
    node invokeNetwork.js

    出力の終わりに以下のようなメッセージが表示されるはずです。


    Sucessfully sent Proposal and received ProposalResponse: Status - 200

    Failed to invoke successfully :: TypeError : fabric_client.getEventHub is not a function が出力されることがありますが、これはHyperledger Fabricのバージョンの差異によるマイナーエラーであり、Ledgerへの書き込み自体は成功しています)

チェーンコードは別個のチェーンコード用 Docker コンテナー内で実行されることから、初めて使用する際はコンテナーの起動が完了するまでに時間がかかる可能性があります。タイムアウトが発生した場合、または「早期実行」エラーが表示された場合は、コマンドを再試行してください。コマンドが正常に完了した後、「Channel Overview (チャネルの概要)」を表示すると、レジャー上に新しいブロックが追加されていることがわかります。

レジャーに対してクエリーを実行する

invokeNetwork.js コマンドによってレジャーに 10 台の自動車のサンプル・データが取り込まれたので、レジャーに対してクエリーを実行し、そこに取り込まれたデータを確認しましょう。それには、queryNetwork.js コマンドを実行します。このコマンドによって、レジャー上に存在するすべての自動車のクエリーがセットアップされます。

  1. fabcar フォルダー内から以下のコマンドを実行します。
    node queryNetwork.js

    以下のような出力が表示されるはずです。

    > node queryNetwork.js
    Successfully loaded user1 from persistence
    Query has completed, checking results
    Response is  
    [{"Key":"CAR0", "Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},
    {"Key":"CAR1", "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}},
    {"Key":"CAR2", "Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}},
    {"Key":"CAR3", "Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}},
    {"Key":"CAR4", "Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}},
    {"Key":"CAR5", "Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}},
    {"Key":"CAR6", "Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}},
    {"Key":"CAR7", "Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}},
    {"Key":"CAR8", "Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}},
    {"Key":"CAR9", "Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}]

レジャーを更新する

最後に、レジャーを更新する方法を説明します。レジャーを更新するには、invokeNetwork.js コマンドに単純な変更を加えればよいだけです。

  1. atom や VSCode など、任意のエディター内で invokeNetwork.js ファイルを開きます。request 変数を見つけて、以下に示すように編集します。この変更により、createCar チェーンコードが呼び出されて、作成する自動車を説明する一連の引数が渡されるようになります。変更後の request 変数は以下のようになります。
    var request = {
      chaincodeId: 'fabcar',
      fcn: 'createCar',
      args: ['CAR10', 'Honda', 'Accord', 'Black', 'Dave'],
      txId: tx_id
    };
  2. ファイルを保存してから、node invokeNetwork.js を使用して編集後のコマンドを実行します。期待される出力は以下のとおりです。


    Sucessfully sent Proposal and received ProposalResponse: Status - 200

    Failed to invoke successfully :: TypeError : fabric_client.getEventHub is not a function が出力されることがありますが、これはHyperledger Fabricのバージョンの差異によるマイナーエラーであり、Ledgerへの書き込み自体は成功しています)

    この後は実験として、別の名前や所有者を設定して新しい自動車をレジャー上で作成してみてください。「Channel Overview (チャネルの概要)」を表示すると、新しい自動車を作成するたびに新しいブロックが追加されることを確認できます。

  3. 自動車の所有者を変更するには、changeCarOwner トランザクションを使用して invokeNetwork.js 内の request 変数を変更します。以下に、一例を示します。
    var request = {
      chaincodeId: 'fabcar',
      fcn: 'changeCarOwner',
      args: ['CAR10', 'MGK'],
      txId: tx_id
    };

    ファイルを保存してから、node invokeNetwork.js を使用してコマンドを再度実行します。期待される出力は以下のとおりです。


    Sucessfully sent Proposal and received ProposalResponse: Status - 200

    Failed to invoke successfully :: TypeError : fabric_client.getEventHub is not a function が出力されることがありますが、これはHyperledger Fabricのバージョンの差異によるマイナーエラーであり、Ledgerへの書き込み自体は成功しています)

    レジャーに保管された新しい自動車を確認するには、再び queryNetwork.js コマンドを実行します。CAR10 の所有者が「Dave」から「MGK」に変更されたことを確認できるはずです。

    すべての自動車ではなく、単一の自動車のクエリーを実行する場合は、queryNetwork.js コマンドに含まれる request 変数を以下のように変更してから、コマンドを再実行します。

    const request = {
      chaincodeId: 'fabcar',
      fcn: 'queryCar',
      args: ['CAR10']
    };

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

    > node queryNetwork.js
    Successfully loaded user1 from persistence
    Query has completed, checking results
    Response is 
    {"colour":"Black","make":"Honda","model":"Accord","owner":"MGK"}

まとめ

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

謝辞

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

次のステップ

  • このチュートリアルで Hyperledger Fabric の「fabcar」サンプルをデプロイしたので、次は Hyperledger Composer を使用してビジネス・ネットワークをゼロから作成してください。その方法は、よく読まれている IBM Developer のチュートリアル・シリーズ「Hyperledger Composer の基礎」(Steve Perry 著) で説明しています。
  • 毎月 1 回配信される IBM Developer の Blockchain ニュースレターで最新情報を入手してください。最新号はこのリンク先のページでチェックできます。ニュースレターを購読するには、このリンク先のページにアクセスしてください。
  • このリンク先のページでさまざまなコード・パターンを参照できます。このページには、複雑な問題を解決する際のロードマップに加え、概要、アーキテクチャー図、コード・リポジトリー、その他の資料が揃っています。
  • このリンク先の IBM Developer Blockchain Developer Center にアクセスしてください。ここには、ビジネス向けブロックチェーン・ソリューションを開発してデプロイするための無料のツールとチュートリアルが揃っているだけでなく、コードとコミュニティー・サポートも入手できます。

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


コメント

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

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