すべてのプロダクト
Search
ドキュメントセンター

Blockchain as a Service:フィルターの使用

最終更新日:Jan 19, 2025

クラウドサービス統合トリガーを構成する際に、トリガーのフィルターを構成して、ブロックチェーンデータをフィルタリングおよび処理できます。ブロックチェーンイベントのさまざまなデータ構造については、「Fabric サンプルメッセージ」を参照してください。フィルター式の構文については、「jq ツール 基本構文」を参照してください。

次の例では、フィルターを使用してブロックチェーンイベントを選別および前処理する方法について説明します。この例では、Function Compute トリガーが使用されます。環境を準備するには、次の手順を実行する必要があります。

  1. クラウドサービス統合サンプルコード をダウンロードします。

  2. Function Compute ツール Serverless Devs をインストールします。詳細については、「Serverless Devs の概要とインストール方法」をご参照ください。

  3. event-with-filter ディレクトリに移動し、s deploy を実行して関数を Function Compute にデプロイします。

  4. Function Compute コンソール にログインし、新しく作成された関数 LoggerFunc のログクエリを有効にします。Enable log queries

  5. チェーンコードをデプロイする」を参照して、サンプルチェーンコード taskmgr をチャネルにデプロイします。

  6. クラウドサービス統合トリガーを構成します。

    1. ヘルプドキュメントを参照して、Function Compute インスタンスに関する情報を入力します。

    2. 詳細オプションで、サンプルシナリオに基づいてフィルター式を入力します。

  7. blockchain2sms ディレクトリに移動し、main.js のパラメーターをコメントに基づいて変更し、REST API アドレス、更新トークン、チャネル名、およびスマートコントラクト名を入力します。詳細については、「REST API を使用する」をご参照ください。

  8. npm install を実行して依存パッケージをインストールし、node main.js を実行してサンプルトランザクションを開始します。

  9. Function Compute ログを表示し、イベントの内容を確認します。

サンプルシナリオ

1. 特定の条件を満たすイベントのみをプッシュする

スマートコントラクトイベント名が event-create-task であるイベントのみをプッシュします。

  • イベントタイプ: コントラクト

  • フィルター構成: select(.name=="event-create-task")

  • プッシュされたデータの例:

{
  "content": "eyJuYW1lIjoidGFzay0xNTgwOTcxODQyOTM3IiwiY3JlYXRvciI6ImUyZWhtZnFhc3RoTVNQLm9jdG9wdXNfMjY4NDJfMTIzNDU2Nzg5MDEyMzQiLCJyZXF1aXJlcyI6WyJlMmVobWZxYXN0aE1TUC5vY3RvcHVzXzI2ODQyXzEyMzQ1Njc4OTAxMjM0Il0sImFwcHJvdmVkIjpudWxsLCJkZXNjcmlwdGlvbiI6IuekuuS+i+S7u+WKoe+8jHJlcXVpcmVzIOmFjee9ruWuoeaJueS7u+WKoeWujOaIkOmcgOimgemCo+S6m+eUqOaIt+WQjOaEj+OAgueUqOaIt+aPj+i/sOS4uiAn57uE57uHTVNQLueUqOaIt+WQjeensCcifQ==",
  "id": "contract-131-ca144c3385f56a429b9e8874173f7c97fbb49de69f931aec583ec50222a3a2ed",
  "instance_id": "csi-e2ehmfqasth-bcw7tzao2dzeo",
  "name": "event-create-task",
  "network": "channel3",
  "platform": "Fabric",
  "type": 8
}

2. 特定の有効なトランザクションイベントのみをプッシュする

スマートコントラクト taskmgr に送信された有効なトランザクションのみをプッシュします。

  • イベントタイプ: Tx

  • フィルター構成: select(.content.to=="taskmgr" and .content.state=="VALID")

  • プッシュされたデータの例:

    {
    "content": {
      "events": [
        "event-create-task"
      ],
      "from": "e2ehmfqasthMSP.octopus_26842_12345678901234",
      "id": "3a2e0e375c6ee0d9c6c20d756e787db44d50bfeba51f22d8f262dd1556dedba0",
      "input": "[\"create\",\"task-1580971842937\",\"{\\n \\\"requires\\\": [\\\"e2ehmfqasthMSP.octopus_26842_12345678901234\\\"],\\n \\\"description\\\": \\\"Sample task. Task completion requires the approval of certain users. The user is described as 'Organization MSP. User name'\\\"\\n }\"]",
      "state": "VALID",
      "to": "taskmgr"
    },
    "id": "tx-128-3a2e0e375c6ee0d9c6c20d756e787db44d50bfeba51f22d8f262dd1556dedba0",
    "instance_id": "csi-e2ehmfqasth-bcw7tzao2dzeo",
    "name": "3a2e0e375c6ee0d9c6c20d756e787db44d50bfeba51f22d8f262dd1556dedba0",
    "network": "channel3",
    "platform": "Fabric",
    "type": 2
    }

3. イベントコンテンツの一部のみをプッシュする

イベント名 event-create-task を持つスマートコントラクトイベントのコンテンツのみをプッシュします。

  • イベントタイプ: コントラクト

  • フィルター構成: select(.name=="event-create-task") | .content

  • プッシュされたデータの例:

    "eyJuYW1lIjoidGFzay0xNTgwOTcxODQyOTM3IiwiY3JlYXRvciI6ImUyZWhtZnFhc3RoTVNQLm9jdG9wdXNfMjY4NDJfMTIzNDU2Nzg5MDEyMzQiLCJyZXF1aXJlcyI6WyJlMmVobWZxYXN0aE1TUC5vY3RvcHVzXzI2ODQyXzEyMzQ1Njc4OTAxMjM0Il0sImFwcHJvdmVkIjpudWxsLCJkZXNjcmlwdGlvbiI6IuekuuS+i+S7u+WKoe+8jHJlcXVpcmVzIOmFjee9ruWuoeaJueS7u+WKoeWujOaIkOmcgOimgemCo+S6m+eUqOaIt+WQjOaEj+OAgueUqOaIt+aPj+i/sOS4uiAn57uE57uHTVNQLueUqOaIt+WQjeensCcifQ=="

4. ブロックチェーンの書き込み情報を取得する

すべてのキーの書き込み情報のみをプッシュします。情報は、スマートコントラクト taskmgr によって生成された有効なトランザクションに含まれている必要があります。

  • イベントタイプ: Tx

  • フィルター構成: select(.content.state=="VALID" and .content.to=="taskmgr") | .content.data.data.actions.[0].payload.action.proposal_response_payload.extension.results.ns_rwset[] | select(.namespace=="taskmgr") | .rwset.writes

  • プッシュされたデータの例:

    [{"is_delete":false,"key":"\u0000e2ehmfqasthMSP.octopus_26842_12345678901234\u0000task-1581479306267\u0000","value":"eyJuYW1lIjoidGFzay0xNTgwOTcxODQyOTM3IiwiY3JlYXRvciI6ImUyZWhtZnFhc3RoTVNQLm9jdG9wdXNfMjY4NDJfMTIzNDU2Nzg5MDEyMzQiLCJyZXF1aXJlcyI6WyJlMmVobWZxYXN0aE1TUC5vY3RvcHVzXzI2ODQyXzEyMzQ1Njc4OTAxMjM0Il0sImFwcHJvdmVkIjpudWxsLCJkZXNjcmlwdGlvbiI6IuekuuS+i+S7u+WKoe+8jHJlcXVpcmVzIOmFjee9ruWuoeaJueS7u+WKoeWujOaIkOmcgOimgemCo+S6m+eUqOaIt+WQjOaEj+OAgueUqOaIt+aPj+i/sOS4uiAn57uE57uHTVNQLueUqOaIt+WQjeensCcifQ=="}]

5. 特定のキーを監視する

スマートコントラクト taskmgr によって生成された有効なトランザクションを監視して、特定のキーの値の変更を確認します。

  • イベントタイプ: Tx

  • フィルター構成: select(.content.state=="VALID" and .content.to=="taskmgr") | .content.data.data.actions.[0].payload.action.proposal_response_payload.extension.results.ns_rwset[] | select(.namespace=="taskmgr") | .rwset.writes[] | select(.key=="special_key")

  • プッシュされたデータの例:

    {"is_delete":false,"key":"special_key","value":"MTA="}

5. データをデータベーステーブルにエクスポートする

フィルターを介して特定のブロックチェーンデータをデータベーステーブルにエクスポートできます。データはフィルターによって処理および変換されてオブジェクト配列になり、各オブジェクトは挿入されるレコードを表します。オブジェクトキーはテーブルの列名で、オブジェクト値はテーブルデータです。

[
  {
    "columnName1": "value1",
    "columnName2": "value2",
    "columnName3": "value3",
  },
  {
    "columnName1": "value3",
    "columnName2": "value4",
    "columnName3": "value5",
  },
  ...
]

スマートコントラクト taskmgr によって書き込まれた有効なトランザクションコンテンツを以下のテーブルにエクスポートします。

  • テーブル構造:

    • プライマリキー: (event_idnamespacekey)

    • event_id: イベント ID

    • namespace: スマートコントラクトの名前

    • key: キーのコンテンツ

    • value: Base64 エンコーディングの値のコンテンツ

    • create_time: 書き込み時刻

    • tx_id: トランザクション ID

    • is_delete: これが削除操作であるかどうか

    • creator: この操作の開始者

  • フィルター構成: select(.content.state=="VALID" and .content.to=="taskmgr") | .id as $eventID | .content.id as $txID | .content.from as $creator | content.data.header.channel_header.timestamp as $createTime | .content.data.data.actions.[0].payload.action.proposal_response_payload.extension.results.ns_rwset | ap(.namespace as $namespace | .rwset.writes | map( .event_id = $eventID | .namespace = $namespace | .tx_id = $txID | .create_time = $createTime | .creator = $creator )) | dd

  • イベントタイプ: Tx

  • エクスポートされたデータのサンプル:

    [
    {
      "event_id": "tx-128-3a2e0e375c6ee0d9c6c20d756e787db44d50bfeba51f22d8f262dd1556dedba0",
      "namespace": "taskmgr",
      "tx_id": "3a2e0e375c6ee0d9c6c20d756e787db44d50bfeba51f22d8f262dd1556dedba0",
      "is_delete": false,
      "key": "\u0000e2ehmfqasthMSP.octopus_26842_12345678901234\u0000task-1581479306267\u0000",
      "value": "eyJuYW1lIjoidGFzay0xNTgwOTcxODQyOTM3IiwiY3JlYXRvciI6ImUyZWhtZnFhc3RoTVNQLm9jdG9wdXNfMjY4NDJfMTIzNDU2Nzg5MDEyMzQiLCJyZXF1aXJlcyI6WyJlMmVobWZxYXN0aE1TUC5vY3RvcHVzzI2ODQyXzEyMzQ1Njc4OTAxMjM0Il0sImFwcHJvdmVkIjpudWxsLCJkZXNjcmlwdGlvbiI6IuekuuS+i+S7u+WKoe+8jHlcXVpcmVzIOmFjee9ruWuoeaJueS7u+WKoeWujOaIkOmcgOimgemCo+S6m+eUqOaIt+WQjOaEj+OAgueUqOaIt+aPj+i/sOS4uiAn57uE57uHTVNQLueUqOaIt+WQjeensCcifQ==",
      "create_time": "2020-02-06T06:50:42.267092Z",
      "creator": "e2ehmfqasthMSP.octopus_26842_12345678901234"
    }
    ]