Cloud Functions を利用してブロックチェーンにデータを送信する

概要

このチュートリアルで、クラウド関数を使用してデバイスとアプリケーションをブロックチェーンに接続する方法を学んでください。このチュートリアルでは付属の 2 つのクラウド関数のコードを基に、手順に従ってクラウド関数をデプロイし、テストします。この手順を完了すると。ブロックチェーン資格情報を Cloudant データベース内に保管して、それらの資格情報によって安全にトランザクションをブロックチェーンに送信できるようになります。これらのクラウド関数を使用すれば、ビジネス目標を満たすリッチなデータ・ソースを確保するために、Webhook 対応の任意のアプリケーションまたはデバイスから独自のブロックチェーン・スマート・コントラクトにトランザクションを送信できます。

学習の目的

このチュートリアルでは、ブロックチェーンへの接続を可能にするクラウド関数を作成し、テストする手順を説明します。このチュートリアルを完了すると、以下の成果物を手に入れられます。

  • IBM Blockchain Platform クライアントとして機能する一連の IBM Cloud Functions。
  • トランザクションを安全に IBM Blockchain Platform インスタンスに送信するためのテスト環境。

前提条件

このチュートリアルに従うには、IBM Cloud アカウント、IBM Blockchain Platform インスタンス、Docker、ローカル・マシン上にインストールされた Node.js が必要です。また、REST を呼び出すための curl、Postman、Node-RED などのテスト・ユーティリティーも必要になります。このチュートリアルでは、テスト・ユーティリティーとして Postman を使用する方法を説明します。

手順を開始する前に、このチュートリアルで使用できるよう、以下のプロダクトを準備してください。

注: IBM Blockchain Platform インスタンスを無料の Kubernetes クラスターにデプロイするには、30 日間無料の Kubernetes クラスターと、同じく 30 日間無料の IBM Blockchain Platform インスタンスを使用できます。無料の Kubernetes クラスターは 30 日が経過すると自動的に削除されます。

クラウド関数を作成するには、Docker と Node.js が必要です。これらのツールは、クラウド関数を IBM Cloud アカウントにアップロードする前に、クラウド関数のランタイム環境に適切な node_modules ディレクトリーを作成する際にも使用します。

所要時間

上記の前提条件がすべてインストールされていれば、約 45 分でこのチュートリアルを完了できるはずです。

ステップ 1. リポジトリーのクローンを作成する

git clone https://github.com/IBM/ibm-cloud-functions-serverless-blockchain.git

注: このチュートリアルではすべてのディレクトリーを、このプロジェクトのベース・ディレクトリー ibm-cloud-functions-serverless-blockchain を基準とした相対パスとして記載しています。

ステップ 2. IBM Cloud CLI をインストールする

このインストール手順に従って、IBM Cloud Functions コマンド・ライン・インターフェース (CLI) をインストールします。以下のテスト・アクションを実行して ~/.wskprops が正しいアカウントを指していることを確認してください。

ibmcloud fn action invoke /whisk.system/utils/echo -p message hello --result

ステップ 3. 付属のクラウド関数をデプロイする

send-to-blockchain クラウド関数を IBM Cloud アカウントにデプロイする

  1. カレント・ディレクトリーを send-to-blockchain クラウド関数のディレクトリーに変更します。

     cd cloud-functions/send-to-blockchain
    
  2. send-to-blockchain.js ファイルの 8 行目 (const dbUrl = "<add-your-cloudant-url-here>" と示されている行) に Cloudant URL を追加し、ファイルを保存します。

  3. クラウド関数を実行するマシンで使用しているオペレーティング・システムを使用して、node_modules ディレクトリーを生成します。それには、以下のコマンドを変更せずにそのまま実行します。

    docker run -it -v $PWD:/nodejsAction openwhisk/action-nodejs-v8 /bin/bash
    
  4. コンテナー内で npm i を実行した後、exit を実行します。

  5. アクションのソース・コードとアクション用に生成された node_modules ディレクトリーを圧縮します。

    zip -r action.zip *
    
  6. IBM Cloud アカウント内でアクションを作成します。

     ibmcloud wsk action create send-to-blockchain \--kind nodejs:8 action.zip
    

store-credentials-cloudant クラウド関数を IBM Cloud アカウントにデプロイする

  1. カレント・ディレクトリーを store-credentials-cloudant クラウド関数のディレクトリーに変更します。

     cd cloud-functions/store-credentials-cloudant
    
  2. store-credentials-cloudant.js ファイルの 7 行目 (const dbUrl = "<add-your-cloudant-url-here>" と示されている行) に Cloudant URL を追加し、ファイルを保存します。

  3. クラウド関数を実行するマシンで使用しているオペレーティング・システムを使用して、node_modules ディレクトリーを生成します。それには、以下のコマンドを変更せずにそのまま実行します。

    docker run -it -v $PWD:/nodejsAction openwhisk/action-nodejs-v8 /bin/bash
    
  4. コンテナー内で npm i を実行した後、exit を実行します。

  5. アクションのソース・コードとアクション用に生成された node_modules ディレクトリーを圧縮します。

    zip -r action.zip *
    
  6. IBM Cloud アカウント内でアクションを作成します。

    ibmcloud wsk action create store-credentials-cloudant \--kind nodejs:8 action.zip
    

ステップ 4. クラウド関数の API 鍵と URL を取得する

  1. ブラウザーで IBM Cloud にナビゲートし、ウィンドウの左上隅にあるナビゲーション・メニューから「Functions」を選択します。
  2. Functions」メニューで「Actions (アクション)」をクリックし、send-to-blockchain アクションを選択します。
  3. 表示される次のパネルのメニューで「Endpoints (エンドポイント)」をクリックし、「API-KEY (API 鍵)」を選択します。
  4. CF-based API key for this namespace (この名前空間の CF ベースの API 鍵)」セクションにある目のアイコンをクリックして API 鍵を表示し、それをコピーします。
  5. コピーした API 鍵の値を保存します。この値は、クラウド関数に対する Postman REST 呼び出しを構成する際に必要になります。
  6. 同じセクションで、URL の値をコピーして保存します。
  7. Functions」メニューに戻って「Actions (アクション)」をクリックし、store-credentials-cloudant アクションを選択します。
  8. 表示される次のパネルのメニューで「Endpoints (エンドポイント)」をクリックします。
  9. CF-based API key for this namespace (この名前空間の CF ベースの API 鍵)」セクションで、URL の値をコピーして保存します。この値は、以降のステップでクラウド関数に対する Postman REST 呼び出しを構成する際に必要になります。

ステップ 5. 付属のブロックチェーン・スマート・コントラクトをインストールする

この手順に従って、IBM Blockchain Platform インスタンス内のピア上に tutorials/cf-send-to-blockchain/iot-shipping-contract.cds スマート・コントラクトをインストールし、初期化します。

ステップ 6. ブロックチェーンの資格情報と接続プロファイルをダウンロードする

  1. この手順に従って、コントラクト用の接続プロファイルをダウンロードします。
  2. IBM Blockchain Platform ユーザー・インターフェースで「Wallet (ウォレット)」をクリックし、ブロックチェーンに接続するユーザーを選択してから「Export (エクスポート)」をクリックします (このチュートリアルのためだけに IBM Blockchain Platform インスタンスを作成した場合、Org1 admin 資格情報を使用してください)。

ステップ 7. 付属の Postman コレクションをインストールして構成する

Postman コレクションをインポートする

Postman ユーザー・インターフェースで「Import (インポート)」をクリックし、tutorials/cf-send-to-blockchain/BlockchainCloudFunctions.postman_collection.json ファイルをインポートします。

環境をインポートする

Postman ユーザー・インターフェースで、環境設定の歯車アイコンをクリックして「Manage Environments (環境の管理)」ページを表示します。「Import (インポート)」をクリックし、tutorials/cf-send-to-blockchain/cloud-functions.postman_environment.json ファイルをインポートします。

環境を構成する

  1. インポートした「cloud-functions」環境を選択して定義済み Postman 環境変数を表示します。
  2. ダウンロードしたブロックチェーン接続プロファイルを開き、その内容全体をコピーして、Postman 環境の connectonJson の値として貼り付けます。
  3. ダウンロードした資格情報ファイルを開き、private_key の値をコピーして、Postman 環境の privateKey の値として貼り付けます。
  4. 同じ資格情報ファイルから cert の値をコピーし、Postman 環境の userCert の値として貼り付けます。

注: 資格情報ファイル内の name の値を記録してください。以降のステップで、この値が必要になります。

ステップ 8. ブロックチェーン資格情報を IBM Cloudant 内に保管する

REST 呼び出し許可を設定する

  1. Postman にインポートした「Blockchain Cloud Functions」コレクションを選択します。
  2. Create or update credentials (資格情報を作成または更新)」REST 呼び出しを選択します。
  3. Authorization (許可)」タブを選択します。
  4. Basic Auth (基本認証)」を選択し、ステップ 4 で保存した API 鍵を指定します。API 鍵は user:password の形で構成されています。コロンの前の部分を「Username (ユーザー名)」フィールドにコピーし、コロンの後の部分を「Password (パスワード)」フィールドにコピーします。

URL をクラウド関数 URL に設定する

Create or update credentials (資格情報を作成または更新)」REST 呼び出しの「URL」フィールドを、ステップ 4 で取得した store-credentials-cloudant アクションの URL で更新します。

リクエストのパラメーターを設定する

リクエストの「Body (本文)」タブをクリックし、JSON を以下のように編集します。

{  
  "id": "admin-myFabric",  
  "contract": "iot-shipping-contract",  
  "username": "admin",  
  "cert": {{userCert}},  
  "key": {{privateKey}},  
  "connection": {{connectionJson}}
}

注: 上記のコードに含まれている id には、任意の値を指定できます (この値が各トランザクションで送信されます)。username には、ステップ 7 で資格情報ファイルから記録したユーザーの名前を指定します。表示名がユーザー名と一致しない場合 (例えば、IBM Blockchain Platform 内でのユーザーの表示名は Org1 admin であっても、そのユーザーにはユーザー資格情報として admin を使用している場合)、リクエスト本文に含まれる username には admin を指定してください。

リクエストを送信する

変更内容を保存してから「Send (送信)」をクリックします。これで、資格情報が Cloudant データベース内に保管されます。ブロックチェーンにトランザクションを送信するたびに、この保管された資格情報を使用することになります。

ステップ 9. トランザクションをブロックチェーンに送信する

REST 呼び出し許可を設定する

  1. Postman にインポートした「Blockchain Cloud Functions」コレクションに含まれる「Send transaction (トランザクションを送信)」REST 呼び出しを選択します。
  2. Authorization (許可)」タブを選択します。
  3. Basic Auth (基本認証)」を選択し、ステップ 4 で保存した API 鍵を指定します。

URL をクラウド関数 URL に設定する

Send transaction (トランザクションを送信)」REST 呼び出しの「URL」フィールドを、ステップ 4 で取得した send-to-blockchain アクションの URL で更新します。

リクエストのパラメーターを設定する

リクエストの「Body (本文)」タブをクリックし、JSON を編集して、ステップ 8 で使用した id の値を指定します (これにより、トランザクションをブロックチェーンに送信する際に使用する資格情報が指定されます)。

{  
  "id": "admin-myFabric",  
  "fcn": "createShipment",  
  "args": [ "1000", "Shipment of widgets",
    "30.2672", "97.7431", "103", ".35" ]
}

リクエストを送信する

変更内容を保存してから「Send (送信)」をクリックします。これで、トランザクションがブロックチェーンに送信されます。args に格納される最初の値は発送 ID です。トランザクションを送信するたびに、発送 ID を変更します。他のフィールドは (格納される順で)、description、latitude、longitude、temperature、humidity です。

ステップ 10. ブロックチェーン内の新しいブロックを検索する

  1. IBM Blockchain Platform ユーザー・インターフェースで「Channels (チャネル)」をクリックします。
  2. ブロックチェーン・ネットワークをセットアップしたときに作成したチャネルをクリックします。
  3. Block History (ブロック履歴)」までスクロールダウンし、最新のブロックをクリックします。
  4. 表示されるそのブロックのトランザクション・リスト内で、最新のトランザクションをクリックして、前のステップで送信したトランザクションを表示します。

まとめ

お疲れさまでした!このチュートリアルを通して、クラウド関数を呼び出してブロックチェーン資格情報を Cloudant データベース内に保管する方法、さらに別のクラウド関数を呼び出してこれらの資格情報を使用してトランザクションを安全にブロックチェーンに送信する方法を把握できたはずです。この同じ 2 つのクラウド関数を使用すれば、ビジネス目標を達成するために、Webhook 対応のあらゆるアプリケーションまたはデバイスから任意のデータをブロックチェーン・スマート・コントラクトに送信できます。

次のステップとして、send-to-blockchain クラウド関数内のリスナー・コードを使用して、ブロックチェーン・スマート・コントラクトからイベントを受け取る方法を探ってください。