2019の10日目の記事です。Fabricを利用する予定です。Fabricのブロックをモニタリングとして利用できるEventサービスについて、仕様とサンプルプログラムと共に紹介したいと思います。Blockchainは1.2を利用しているため、1.2の仕様で説明したいと思います。Fabricの仕様EventサービスについてEventサービスは、Peerが下記の情報を取得した際、クライアントアプリケーションが随時情報を取得できる仕組みになっています。Fabricは、チャンネルごとに分かれてブロックを生成します。Fabric上のEventを全て監視する場合は、それぞれのチャンネルごとにEventサービスの設定を行う必要があります。SDKで作成する場合、本記事の内容を参考にするより、fabric-network.Networkクラスの利用を検討してください。eventsに記載があります。SDKを用いて使用する場合、ChannelEventHubクラスを用いることで、Eventサービスを利用することができます。このChannelEventHubクラスのオブジェクト化には、下記の3通りが存在します。peer)Channel.newChannelEventHub(peer)Channel.getChannelEventHubsForOrg(mspid)ただし、上記で使用するchannelオブジェクトを生成する際、Clientオブジェクトにて、MSPに所属するユーザーのUserオブジェクトを事前に取得・設定しておく必要がある。Peerとの接続設定ChannelEventHubを用いてPeerからEventの情報を取得するには、ChannelEventHubオブジェクトを利用してPeerに接続する必要があります。この際、ChannelEventHub.connect(full_block)を利用します。引数のfull_blockは、booleanを指定します。このfull_blockの設定により、PeerからEventの情報を取得する際、情報全てを取得するか、一部の情報のみ取得するか変更されます。ブロック情報を取得する場合、full_blockがfalseだと、下記のようなトランザクションの一覧しか取得できません。options)を利用します。各引数の説明は下記になります。ChaincodeEventを取得するChaincodeのIDを指定する。Chaincode内でChaincodeStub.SetEventで指定したイベント名を指定する。ChaincodeEventを取得するたびに実行する関数。ChaincodeEventの情報、およびChaincodeEventが発行されたブロック番号、トランザクションID、実行結果が引数として渡される。ブロックを取得する際にエラーが発生した場合に実行する関数。エラーオブジェクトが引数になる。ブロック取得時の設定また、RegistrationOptsクラスのフィールドは、下記の通りです。取得するブロックの開始位置。現在の先頭ブロックよりも小さい数字である必要がある。設定がない場合は、現在の先頭のブロックから取得する設定となる。ブロックの取得を終了する数字。現在の先頭ブロックよりも大きい必要がある。この設定で指定したブロックを取得すると、onEventを実行しない設定となる。ChannelEventHub.unregister()実行時に、Peerへの接続を自動的に削除する設定。endBlockが設定されている場合はtrue、設定されていない場合はfalseにしないとエラーが発生する。ChannelEventHub.disconnect()実行時に、Peerからの接続を自動的に切断する設定。endBlockが設定されている場合はtrue、設定されていない場合はfalseにしないとエラーが発生する。options)を利用します。各引数の説明は下記になります。トランザクションを取得するたびに実行する関数。取得したトランザクションのID、実行結果、ブロックの高さが引数として渡される(参考)。トランザクションを取得する際にエラーが発生した場合に実行する関数。エラーオブジェクトが引数になる。トランザクション取得時の設定RegistrationOptsオブジェクトの各フィールドの説明については、ChaincodeEventでの説明と同様になります。options)を利用します。各引数の説明は下記になります。ブロックを取得するたびに実行する関数。取得したブロック情報が引数になる。ブロックを取得する際にエラーが発生した場合に実行する関数。エラーオブジェクトが引数になる。ブロック取得時の設定RegistrationOptsオブジェクトの各フィールドの説明については、ChaincodeEventでの説明と同様になります。サンプルコードChaincodeEventHubを用いて、ブロックをモニタリングして標準出力に表示するサンプルコードは下記になります。process.env.USER_ARTIFACT_PATHには、管理者ユーザーの秘密鍵と証明書が配置しています。FabricのEventサービスと、その利用方法について紹介しました。SDKについては、v1.4を境に大幅な変更があるため、公式ページのTutorialsやサンプルリポジトリのfabcarを参考に実装する方が望ましいです。Composerの開発メンバーが主導してコントリビュートを行うため、Node.jsが最初で、その後にJava等で実装する方針と聞いてます。このため、今後は、実装時期や基盤のバージョンに応じてライブラリを随時検討し直し、アップデートをかける必要があります(現状、LTSも1年ほどで切れてしまう問題もあります。