Metering Collection Tool とは?
「Metering Collection Tool」は、Corda Enterpriseが提供する署名数カウントツールです。期間指定やFlow指定でより詳細な情報を取得することができます。また、「Metering Collection Tool」をNotaryで実行するとNotaryの署名件数も出力します。
本稿では、テスト環境のノードおよびNotaryに「Metering Collection Tool」のデプロイから署名件数の表示のデモを行います。
導入
環境要件 & 前提
本稿のデモで使用するcorda.jarおよび corda-tools-metering-collector .jarは以下の通りです。
・ corda-4.3.3.jar
・ corda-tools-metering-collector-4.3.3.jar
また、本稿で使用するSampleFlowの一覧は以下の通りです。
Flow | Description | 必要署名 |
IssueSampleFlow | Stateを発行する | 実行ノード |
TransferSampleFlow | Stateをあるノードからあるノードへ移転する | 移転元ノー ド + 移転先ノード( + Notary ) |
SettleSampleFlow | 任意のLinear IDのStateを償却する | 実行ノード ( + Notary ) |
デプロイ
「Metering Collection Tool」は、jarファイル「 corda-tools-metering-collector-[version].jar 」を各ノードのcordappsディレクトリ配下に格納します。(ツールですが、性質としては他のFlowやContractに近いです)
例:ノード「PartyA」のcordappディレクトリ配下に格納した例
2020/06/09 15:54:57 root@ubuntu-01 : /home/corda/Upgrade/PartyA
# pwd
/home/corda/Upgrade/PartyA
2020/06/09 15:55:01 root@ubuntu-01 : /home/corda/Upgrade/PartyA
# ls -l
total 79238
drwxrwxrwx 1 root root 0 Jun 9 15:26 additional-node-infos
drwxrwxrwx 1 root root 0 Jan 24 12:20 artemis
drwxrwxrwx 1 root root 0 Jan 24 12:20 brokers
drwxrwxrwx 1 root root 0 Jun 9 15:24 certificates
-rwxr-xr-x 1 root root 80811783 May 18 20:34 corda-4.3.3.jar
drwxrwxrwx 1 root root 0 Jun 9 15:16 cordapps
drwxrwxrwx 1 root root 4096 Jun 9 15:25 logs
-rwxr-xr-x 1 root root 3926 Apr 14 12:47 my-config-file.xml
-rwxr-xr-x 1 root root 6030 Jun 9 15:25 network-parameters
-rwxr-xr-x 1 root root 668 Apr 24 12:34 node.conf
-rwxr-xr-x 1 root root 5570 Jun 9 15:26 nodeInfo-F8F4874D91506034E6298B4EAA3321AE8FD8C79B34492D8BD7479148F385251D
-rwxr-xr-x 1 root root 294912 Jun 9 15:32 persistence.mv.db
-rwxr-xr-x 1 root root 10518 Jun 9 15:25 persistence.trace.db
-rwxr-xr-x 1 root root 4 Jun 9 15:25 process-id
drwxrwxrwx 1 root root 0 Jan 10 19:35 shell-commands
drwxrwxrwx 1 root root 0 Jan 24 12:20 ssh
2020/06/09 15:55:03 root@ubuntu-01 : /home/corda/Upgrade/PartyA
# ls -l ./cordapps/
total 154
drwxrwxrwx 1 root root 0 Jan 10 19:35 config
-rwxr-xr-x 1 root root 9182 Jun 9 09:54 contracts-0.1.jar
-rwxr-xr-x 1 root root 116508 May 18 20:36 corda-tools-metering-collector-4.3.3.jar → corda-tools-metering-collectorのjar
-rwxr-xr-x 1 root root 30906 Jun 9 09:54 workflows-0.1.jar
2020/06/09 15:55:08 root@ubuntu-01 : /home/corda/Upgrade/PartyA
起動
通常のノード起動と同様corda.jarを実行します。
# java -jar corda-4.3.3.jar
デモ実行
PartyAの署名数確認
PartyAノード起動直後に以下のコマンドを実行します。
# start MeteringCollectionFlow startDate: 2020-06-09, daysToCollect: 7, page: 1
まだ、取引を行っていないため、totalCountには0が表示されます。
PartyAにてState発行 & 署名数確認
PartyAにてStateを発行し、その後PartyAの署名総件数を確認します。
# flow start com.template.flows.IssueSampleFlow$InitiatorFlow holder : "PartyA", price : 100
# start MeteringCollectionFlow startDate: 2020-06-09, daysToCollect: 7, page: 1
totalCountが1にカウントアップしていることが確認できます。なお、MeteringCollectionFlowはデータベースの書き込み回数を抑えるため取引ごとに署名数をカウントアップせず、一定時間に書き込まれた署名を集約してデータベースに書き込みます。そのため実行タイミングによっては、署名数の結果が反映されていない場合があります。その時は数秒~数十秒程度、時間をおいてから再実行してください。
PartyAからPartyBにState移転 & 署名数確認
PartyAからPartyBにStateを発行し、その後PartyAとPartyBとNotrayの署名総件数を確認します。
PartyAで実行
# flow start com.template.flows.TransferSampleFlow$InitiatorFlow stateLinearId : 直前に発行したStateのLinearID, holder : "PartyB"
# start MeteringCollectionFlow startDate: 2020-06-09, daysToCollect: 7, page: 1

PartyBで実行
start MeteringCollectionFlow startDate: 2020-06-09, daysToCollect: 7, page: 1

Notaryで実行
start NotaryCollectionFlow startDate: 2020-06-09, daysToCollect: 7

各ノードのtotalCountがそれぞれ1カウントアップしていることが確認できました。
PartyBにてState償却 & 署名数確認
PartyBにてStateを償却し、その後PartyBとNotaryの署名総件数を確認します。
PartyBで実行
# flow start com.template.flows.SettleSampleFlow$InitiatorFlow stateLinearId : 償却するStateのLinearID, holder : "PartyB"

# start MeteringCollectionFlow startDate: 2020-06-09, daysToCollect: 7, page: 1

Notaryで実行
# start NotaryCollectionFlow startDate: 2020-06-09, daysToCollect: 7

PartyBとNotaryのtotalCountがそれぞれ1カウントアップしていることが確認できました。
その他
引数 filterByを使用することで CorDappsやhashを条件にカウンタを抽出することができます。
具体的にはfilterByに抽出する条件、続くfilterに値を設定し抽出条件を生成します。
filterby | filter | 備考 |
CORDAPP_NAMES | CorDappの名前を指定します。 |
CorDappの名前を指定します。 |
CORDAPP_HASHES | CorDappのHash値を指定します。 | CorDappの名前を指定します。 「run nodeDiagnosticInfo 」で表示された「 jarHash 」の値を入力設定します。 |
以下、filterByにCORDAPP_NAMESの設定例です。
# start MeteringCollectionFlow startDate: 2020-06-09, daysToCollect: 7, filterBy: CORDAPP_NAMES, filter: ["Template Flows"], page: 1
Corda Enterprise4.5で何が変わったか?
Corda Enterprise4.5にてMetering Collection Toolには、以下のような機能追加がありました。
・署名収集要求を行ったノード(以下:自ノード)と自ノードからの署名収集を許可したノード
(以下:相手ノード)の署名数を収集できるようになりました。
なお、相手ノードからの収集には、自ノードと相手ノードでコンフィグを設定が必要です。
(「Configuration fileの設定」の項を参照)
・シェル実行時の出力形式が、直感的な表示に改善
・RPCを介したデータ取得のためのAPIの提供
本稿では、相手ノードに自ノードの署名収集を許可するためのコンフィグの設定から、
複数ノードからの署名件数のデモ(MultiAggregatedCollectionFlow、MultiFilteredCollectionFlow)を
行います。
※デプロイの方法や基本的な使用方法(MeteringCollectionFlowやNotaryCollectionFlow)に関しては、
以前のバージョンと変わりません。
コンフィグの設定
Metering Collection Tool4.5は、複数の相手ノードから署名を収集することが可能です。
この機能を使用するには自ノードと相手ノードでコンフィグを設定する必要があります。
コンフィグのファイル名
Metering Collection Toolのコンフィグファイル名には命名規約があり、
「Metering Collection Toolのjarファイル名.conf」と設定します。本稿では「corda-tools-metering-collector-4.5.jar」を使用しているため、ファイル名は「corda-tools-metering-collector-4.5.conf」に
なります。
コンフィグの配置
コンフィグファイルの配置はcordappsフォルダ配下の「config」ディレクトリに設定します。
cordapps/
corda-tools-metering-collector-4.5.jar
config/
corda-tools-metering-collector-4.5.conf
コンフィグの反映
コンフィグはCordaノード起動と同時にアタッチされます。よって、ノード起動中にコンフィグを
修正した場合は、ノードの再起動が必要です。
コンフィグのパラメータ
コンフィグに設定するパラメータは、大きく「network_collectors」と「cordapp_collectors」に
分類することができます。
・network_collectors
署名収集を許可するノードを設定します。設定には必ず自ノードも含めます。
以下、コンフィグファイルの例です。
"access_configuration" : {
"network_collectors" : ["O=Node01,L=Tokyo,C=JP", "O=Node02,L=Tokyo,C=JP"]
}
「network_collectors」にノード設定すると、全ての署名収集を許可します。
特定のFlowに関して署名収集を許可したい場合は、後述の「cordapp_collectors」を設定します。
・cordapp_collectors
特定のFlowに関しての署名収集を許可したい場合に設定します。以下の条件に分類できます。
by_name:収集を許可するCorDappsの名前を設定します。
by_hash:収集を許可するCorDappsのHash値を設定します。
by_signature:収集を許可するCorDappsのCorda.jarの署名鍵のハッシュ値を設定します。
「by_name」や「by_hash」、「by_signature」に設定する値は、FlowのCorDappsのjarファイルの
情報を設定します。これらは「RetrieveCordappDataFlow」により取得できます。
以下、コンフィグファイルの例です。
"cordapp_collectors" : {
"by_name" : {
"Template Flows" : ["O=Node01,L=Tokyo,C=JP", "O=Node02,L=Tokyo,C=JP"]
},
"by_hash" : {
"5A23CBC404F08C8834638008B4EE8B9C6F9021BFD5C23F31C7404355AB5133BE" :
["O=Node01,L=Tokyo,C=JP", "O=Node02,L=Tokyo,C=JP"]
},
"by_signature" : {
"25F95E8FD52BD8F9574B4B0E86A49B19CB0725D7227D9E136AED0FCB266C886F" :
["O=Node01,L=Tokyo,C=JP", "O=Node02,L=Tokyo,C=JP"]
}
}
}
複数ノードからの署名件数収集
MultiAggregatedCollectionFlow
ネットワーク上の複数のノードから集約された署名件数を 収集します。
start com.r3.corda.metering.MultiAggregatedCollectionFlow period: {value: 1mon}, destinations: [node01, node02]
MultiFilteredCollectionFlow
ネットワーク上の複数のノードから署名件数を 収集します。「MultiAggregatedCollectionFlow」との違いは、こちらは出力する署名を条件によってフィルタリングできる点です。また出力される情報も細分化されています。
flow start com.r3.corda.metering.MultiFilteredCollectionFlow period: {value: 1mon}, destinations: [node01, node02], filter: {filterBy: CORDAPP_HASHES, values: [5A23CBC404F08C8834638008B4EE8B9C6F9021BFD5C23F31C7404355AB5133BE]}, txTypes: [NORMAL]
結論
複数ノードの署名を簡単に集められるようになったため、Business Network Operatorにとっては
大変便利な機能だと思います。直感的な出力になった部分も、嬉しい改善点です。日々の署名件数
カウントに是非ご活用ください。