取り急ぎ忘れないように、書きかけです。
peer chaincode invoke (query) で呼ぶとき
-c オプションでJSON文字列を指定。
このJSONにはプロパティ Function (メソッド名) と Args (引数) を指定できる。
例えばメソッド f を引数 arg1 および arg2 で呼びたいならこうする:
peer chaincode invoke \
-o orderer.example.com:7050 \
-C mychannel \
-n mycc \
-c '{"Function":"f", "Args":["arg1","arg2"]}' \
--waitForEvent
実は、内部ではメソッド名は引数の一部として処理されているので、これと等価である。
peer chaincode invoke \
-o orderer.example.com:7050 \
-C mychannel \
-n mycc \
-c '{"Args":["f","arg1","arg2"]}' \
--waitForEvent
基本的には、引数はバイト列の配列としてチェーンコードに渡されるが、文字列の配列として受け取るメソッドなどが用意されている。
なお、プロパティ名はcase insensitiveのようで、Function の代わりに function でも動くことは確認した。
(Args はやってない)
Node.js のクライアント (Hyperledger Fabric SDK for Node.js) で呼ぶとき
古いAPIと新しいのがあるが、ここでは新しいほうの場合を紹介。
ここでは、チェーンコードの実装側は Contract インタフェースを実装して作られていると仮定する。
fabric-network で呼ぶとき
このとき、呼ぶ側は
const response = await contract.evaluateTransaction('f', 'arg1', 'arg2')
とする。いずれも文字列を与える。JSのオブジェクトをそのまま渡せるかと思ったら失敗したので stringify してから渡そう。
このとき、受け取る側はメソッド名に対応するメソッドが自動的に呼ばれる (これは例外的。Goでチェーンコード書いたりしたときは、特に自動ではディスパッチしてくれない。メソッド名は単なる第0引数)
マニュアルには引数は JSON.parse されると書いてあるように自分には読めたが、実際にはただの文字列として渡されるので自分でparseしよう。
ちなみに、上記の
Contractを使うチェーンコードではメタデータを渡せて、そこで引数のシグネチャをJSONスキーマで指定できる。
スキーマを指定し、かつそこにobjectと型が書かれている時にはJSON.parseされるらしいが、未確認である。
fabric-client で呼ぶとき
ちょっと忘れたので思い出したら書く
peer chaincode instantiate で指定したとき
最近知ったのだが、Contract ベースで実装したときに呼ぶ初期化メソッドを -c で指定できる。
この場合、-c で指定したメソッド (と引数) が初期化メソッドとしてinstantiate直後に呼ばれることが確認できた。
(instantiateトランザクションと同じトランザクションか別なのかは未確認)
なお、Goで書いたり Chaincode ベースで書いたチェーンコードをinstantiateする場合には、-c で指定した内容が init() や Init() に、そのまま配列として渡される。