在Hyperledger Fabric中,我在同一个链代码中加载了两个契约(两个控制器)。在对等CLI上,我设法只调用我在代码中加载的第一个合同方法。
“调用chaincode Invoke()返回错误响应[错误:你已经要求调用一个不存在的函数:createPost]。将ERROR消息发送回peer”
我的index.ts(typescript):export const contract:any [] = [stController,PostController];
2019-03-25T21:11:23.217Z INFO [contracts-spi/chaincodefromcontract.js] Metadata is :
{ contracts:
{ stController:
{ name: 'stController',
contractInstance: { name: 'stController', default: true },
transactions:
[ { name: 'initLedger' },
{ name: 'queryStDoc' },
{ name: 'createStDoc' },
{ name: 'queryAllStDocs' },
{ name: 'queryStByOwner' },
{ name: 'changeStOwner' },
{ name: 'cancel' } ],
info: { title: '', version: '' } },
PostController:
{ name: 'PostController',
contractInstance: { name: 'PostController' },
transactions: [ { name: 'createPost' }, { name: 'deletePost' } ],
info: { title: '', version: '' } },
'org.hyperledger.fabric':
{ name: 'org.hyperledger.fabric',
contractInstance: { name: 'org.hyperledger.fabric' },
transactions: [ { name: 'GetMetadata' } ],
info: { title: '', version: '' } } },
info: { version: '1.0.0', title: 'sget' },
components: { schemas: {} } }
我没有在Typescript中做过这个,但我在JavaScript中做了同样的事情 - 我在两个合同中都使用了一个超类型来获取命名空间来区分合同。 (在我的例子中,我有重复的功能名称 - 2份Fabcar。)
constructor() {
super('org.example.car');
}
constructor() {
super('org.example.rob');
}
然后我调用cli中的函数如下:
peer chaincode invoke -o orderer.example.com:7050 -C mychannel -c '{"Args":["org.example.car:queryCar","CAR2"]}' -n fcnstest
和
peer chaincode invoke -o orderer.example.com:7050 -C mychannel -c '{"Args":["org.example.rob:changeCarOwner","CAR2","Rob"]}' -n fcnstest
Commercial Paper tutorial有一个使用命名空间/超类型的例子。但它也是Javascript而不是打字稿。