node.js - 在 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
首先检查并在检测到它已经存在时抛出错误(即,因为它之前已经被调用过)。
有比我描述的更可接受/更合适的解决方案吗?
解决方案
如果您尝试使用调用再次初始化链代码,您将获得无效的智能合约函数名称。
贝娄是一个解释为什么
- 初始化后,只有在我们升级链码时才能再次初始化链码。
- 这就是链码存根接口的设计方式,链码存根接口公开函数 init 和调用以与链码运行时交互。
- 存根接口的一个实例由 init 和调用函数作为参数接收。
- 现在基于在 init/invoke 的 args 中收到的存根对象,我们在链码中构建函数,例如 createCar、deleteCar。
推荐阅读
- sql - 使用 TOP () 时出现 T-SQL 查询错误 - 但在拉取完整查询时不会出现
- javascript - 如何使用 muuri-react 库过滤元素
- rust - Proptest:生成向量向量的策略
- unit-testing - 使用 golang prometheus testutil 进行单元测试
- prometheus - 如何配置 spring-micrometer 标签
- kotlin - Kotlin if 条件习语
- r - 等值线图相当于 Wolfram Alpha 的
- text - 如何在pygame的屏幕上显示文本
- scheme - 方案:可能是 SICP 中的一个错字。1.3.2. 我对吗?
- php - Bootstrap:因为当我选择一个复选框时,另一个被标记?用 php 回显