如何从组织外部查询链码

How to query a chaincode from outside an organization

我有 4 个组织:

Org1 的节点上安装了链代码,可以访问一些仅对 Org1 可用的私有数据。

作为 OrgCam 的客户端,我想访问安装在 Org1 节点上的链码。

当我尝试这样做时:

const result = await contract.evaluateTransaction('getPoints','ID1');

发生此错误

2019-05-19T15:20:20.084Z - error: [SingleQueryHandler]: evaluate: message=No peers available to query. Errors: [], stack=FabricError: No peers available to query. Errors: []
    at SingleQueryHandler.evaluate (/home/zanna/fabric-samples/first-network/clientCode/node_modules/fabric-network/lib/impl/query/singlequeryhandler.js:39:17)
    at Transaction.evaluate (/home/zanna/fabric-samples/first-network/clientCode/node_modules/fabric-network/lib/transaction.js:246:29)
    at Contract.evaluateTransaction (/home/zanna/fabric-samples/first-network/clientCode/node_modules/fabric-network/lib/contract.js:172:39)
    at main (/home/zanna/fabric-samples/first-network/clientCode/camera.js:41:39)
    at <anonymous>, name=FabricError
Failed to evaluate transaction: FabricError: No peers available to query. Errors: []

我的问题是:即使我不是 Org1 的客户端,我如何查询 Org1 的链代码?

我对你的配置有点困惑,但我会尽力回答。

说清楚

链码不会"belong"组织。一个链码属于一个通道并且有特定的背书策略。

考虑到这一点,您可以说链码属于通道成员的对等点。

只有当组织拥有一个节点,该节点是具有链代码的通道的成员时,它才能与链代码交互。


回答

您没有提供有关您频道的任何信息。考虑到你的错误,我想你没有将 OrgCam 对等体加入到 Org1 对等体部署链代码的通道。

您的 OrgCam 节点不是通道的一部分,您无法查询通道的链码。

此外,您不能使用 OrgCam 客户端证书与 Org1 对等方交互,因为该证书不是由 Org1 对等方 known/accepted 颁发的。只有 Org1 明确定义的客户端可以与 org1 对等方交互。

我终于做到了。

1.

const result = await contract.evaluateTransaction('getPoints','ID1');

必须改为:

const result = await contract.submitTransaction('getPoints','ID1');

为了从外部组织中的同行那里获取信息。

2.

如果使用私有数据,重要的是必须删除字段 "memberOnlyRead""memberOnlyWrite" (1) 或设置为 falsecollections_config.json 文件中。

示例:

[
 {
   "name": "collectionFacepoints",
   "policy": "OR('Org1MSP.member')",
   "requiredPeerCount": 2,
   "maxPeerCount": 2,
   "blockToLive": 0,
   "memberOnlyRead": false
 }
]

3.

gateway.connect(connectionProfile, connectionOptions) 中,重要的是将 discovery.enable=true 添加到 connectionOptions

示例:

await gateway.connect(
  connectionProfile,
  {
    wallet,
    identity: identityConfig.identityLabel,
    discovery: {
      enabled: true,
      asLocalhost: true
    },
    eventHandlerOptions: {
      strategy: DefaultEventHandlerStrategies.NETWORK_SCOPE_ALLFORTX
    }
  }
);

4.

不幸的是,来自 OrgCam 的客户端似乎无法直接查询安装在 org1 节点中的链码,但可以添加一个空的 (2) OrgCam 节点作为锚点。


  • (1): "memberOnlyWrite" 尚不可用。见 here.
  • (2): "empty" 我的意思是没有安装任何链代码。