首页 > 解决方案 > 如何在对等 cli 中调用不同合约的方法

问题描述

在 Hyperledger Fabric 中,我在同一个链码(两个控制器)中加载了两个合约。在对等 CLI 上,我设法只调用了我在代码中加载的第一个合约方法。

“调用链代码 Invoke() 返回错误响应 [错误:您要求调用不存在的函数:createPost]。将错误消息发送回对等方”

我的 index.ts (typescript): export const contracts: 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: {} } } 

标签: hyperledger-fabrichyperledger

解决方案


我没有在 Typescript 中这样做,但我在 JavaScript 中做了同样的事情——我在两个合约中都使用了超类型来获取命名空间来区分合约。(在我的示例中,我有重复的函数名称 - Fabcar 的 2 个副本。)

    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

商业票据教程有一个使用命名空间/超类型的示例。但它也是 Javascript 而不是打字稿。


推荐阅读