LoginSignup
0
0

More than 3 years have passed since last update.

Hyperledger Fabricのチェーンコード内で関数を呼び出したい人生だった

Last updated at Posted at 2019-06-27

チェーンコードで関数呼び出しできない!!!!????

チェーンコードを書いていたある日のこと、
JavaScriptで普段やるように関数の呼び出しを書いていたんですが,,,

あれ?
呼び出せない...
例えば以下のような感じ
InitとInvokeは省略してます。

chaincode.js

let Chaincode = class {

   async foo(stub, args){
      this.hoge(stub,args);
   }

   async hoge(stub, args){
      //何らかの処理...
   }


}

shim.start(new Chaincode());

あれ、と思って色々試してみたんですが、出来ない

色々検索してみると似たような質問がちらほら

う〜ん、なんか普通には出来ないっぽい。
そんな不便なことある?

そもそも何でこんなことをやろうとしているのかというと、
一度のトランザクションで複数のドキュメントをCouchDBに保存しに行きたい、ということです。

別々にチェーンコードを外から呼び出せばいいじゃんって一瞬思いましたが、それだとエラーが起きた時にロールバックが出来ない。

試したこと1:stub.invokeChaincodeを使う

先ほどの質問の回答にあった方法を試してみました。
stub.invokeChaincodeの詳細については公式ドキュメントをご覧ください。
公式ドキュメント

本来stub.invokeChaincodeは
チェーンコードから別のチェーンコードを呼び出したい時に使うみたいですが
同じチェーンコードを指定すればいけるのだろうか。

さっきの質問の回答にも、自分自身を呼び出したいときはmodifyしないといけない、みたいなことが書いてありました。

そこで色々試してみました。
例えば

chaincode.js

   async foo(stub, args){
      /*
      newArgs = {
        fcn:"hoge"
        params:[{パラメータ}]
      }
      */
      await stub.invokeChaincode("チェーンコード名", newArgs);
   }

   async hoge(stub, args){
      //何らかの処理...
   }

しかしうまくいかず。
関数自体は呼び出せているけれど
no ledger context
みたいなエラーが出てた気がする。

試したこと2:Chaincodeクラスの外に置いてみる

サンプルのチェーンコードをみてみるとqueryなんかはクラスの外に置いてあるので
ダメ元でやってみましたがダメでした。

呼べるには呼べるのとチェーンコードのInvokeはsuccessfulと帰ってくるのですがステートには記録されていない
奇妙だ・・・

やっぱりステートを変える関数はChaincodeクラス内でしか呼べないんでしょうか。

結局・・・

結局一つの関数に全ての処理をまとめて書いたら難なくいけました。

いやでも流石になんか手はある気がするんだけどな〜
まだHyperledger Fabricのトランザクションの中でチェーンコードがどういう挙動をするのかとか、
ステートDBとの関係とか、
細かいところが詰め切れてないので、
そこらへんまで理解できればもしかしたら解決策が見つかったり、
本当に出来ないのだとすれば、仕様上仕方ないよね、ってことがわかったりするんだろうか。
それとも僕がやろうとしていることがアンチパターンなのだろうか。

ドキュメント読みます

おしまい

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0