首页 > 解决方案 > 在 Hyperledger Fabric NodeJS 智能合约中实例化链码后,如何防止调用“init”函数?

问题描述

我正在编写一个简单的 NodeJS 智能合约。它有一个init在链码被实例化时将被调用的方法:

'use strict';
const { Contract } = require('fabric-contract-api');
const shim = require('fabric-shim');

class BlueCoinContract extends Contract {
  async init(ctx){
    console.info('============= START : Init =============');
    :
    :
    console.info('============= END : Init =============');
  }

  :
  :
}

要实例化链码,我使用以下命令:

peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n blue-coin -l "$CC_RUNTIME_LANGUAGE" -v 1.0 -c '{"Args":["init"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"

Args属性需要指定方法的名称(即是init),以便在实例化期间调用它。

我最初认为该init方法只能在实例化期间调用,因为该init方法可能包含将初始化世界状态中的某些值的代码(例如,将值设置为零)。

但是,我意识到init可以通过调用 invoke 命令在初始化之外调用相同的方法:

peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n blue-coin -c '{"function":"init","Args":[]}'

如果用户可以在init初始化之后执行命令,则存在世界状态中的值将被重新初始化为其初始值的风险。

有没有办法防止这种情况?一旦调用该方法,我正在考虑将 a 保存flag在世界状态中。init通过这种方式,我可以让该init方法flag首先检查并在检测到它已经存在时抛出错误(即,因为它之前已经被调用过)。

有比我描述的更可接受/更合适的解决方案吗?

标签: node.jshyperledger-fabric

解决方案


如果您尝试使用调用再次初始化链代码,您将获得无效的智能合约函数名称。

贝娄是一个解释为什么

  • 初始化后,只有在我们升级链码时才能再次初始化链码。
  • 这就是链码存根接口的设计方式,链码存根接口公开函数 init 和调用以与链码运行时交互。
  • 存根接口的一个实例由 init 和调用函数作为参数接收。
  • 现在基于在 init/invoke 的 args 中收到的存根对象,我们在链码中构建函数,例如 createCar、deleteCar。

推荐阅读