我有一个场景,我需要从链代码函数(比如更新)调用一些其他(说查询)函数。 hyperledger结构是否为此提供任何接口。例如:
...
async query(stub, args) {
}
async update(stub, args) {
if(condition) {
call query();
}
}
...
我在接下来的帖子上尝试了答案,但它没有用。 how to invoke chaincode function from itself to record sub transactions。虽然通过使用invokeChaincode()我可以从另一个链代码调用函数。
提前致谢。
Chaincode代码:
let Chaincode = class {
async Init(stub) {
return shim.success();
}
async Invoke(stub) {
let ret = stub.getFunctionAndParameters();
console.info(ret);
let method = this[ret.fcn];
if (!method) {
throw new Error('Received unknown function ' + ret.fcn + ' invocation');
}
try {
let payload = await method(stub, ret.params);
return shim.success(payload);
} catch (err) {
return shim.error(err);
}
}
async init(stub, args) {
if (args.length != 1) {
throw new Error('Invalid args. Expects no args');
}
}
async query(stub, args) {
...
}
async dummy(stub, args) {
return Buffer.from('Hello');
}
async update(stub, args) {
...
let resp = await dummy(); // gives error
//let resp = await stub.invokeChaincode('cc2', ['dummy'] ); // working
console.log(resp)
...
}
};
shim.start(new Chaincode());
作为替代方法,我正在安装并实例化具有两个名称的相同链码,例如cc1和cc2在同一通道上说ch1。然后我正在使用:
invokeChaicode('cc2', ['function', 'arg1', arg2]);
来自chaincode one(cc1)。
但问题是我需要在同一个通道上使用不同的名称安装和实例化两次相同的链码。
欢迎任何其他见解。
有时我们应该认为它更简单。好吧,答案是:直接调用它。例如:我们有两个函数A和B.
func (s *SmartContract) A(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {}
func (s *SmartContract) B(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {}
如果我们想在函数B中调用函数A,就这样做
func (s *SmartContract) B(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {
s.A(APIstub,args)
}