【问题标题】:How to query a chaincode from outside an organization如何从组织外部查询链码
【发布时间】:2019-05-19 16:39:10
【问题描述】:

我有 4 个组织:

  • Org1 -- 2 对等
  • Org2 -- 2 对等
  • OrgCam -- 0 个对等方,1 个客户端
  • OrgView -- 0 个对等方,1 个客户端

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 的链码?

【问题讨论】:

  • 大部分连接信息都存储在连接配置文件 json 中。你试过检查吗?
  • 我不认为connection.json 是这里的问题,当我尝试使用 Org1 客户端查询 Org1 对等方时,一切正常。

标签: hyperledger-fabric hyperledger


【解决方案1】:

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

让我们说清楚

链码不“属于”组织。链码属于通道并具有特定的背书策略。

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

一个组织只能与一个链码交互,如果它拥有一个对等点,该对等点是拥有链码的通道的成员。


回答

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

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

此外,您不能使用 OrgCam 客户端证书与 Org1 对等方交互,因为 Org1 对等方不知道/不接受该证书。只有 Org1 明确定义的客户端可以与 org1 对等方交互。

【讨论】:

  • 我知道配置可能会令人困惑。这是因为我试图涵盖一个特定的极端案例,但我不想离题。 belong Iment installed 在 Org1 的对等体上。我将编辑问题。
  • OrgCam 和 OrgView 根本没有任何对等点,它们只有客户端。不过我不认为你的说法是正确的。 OrgCam 可以与 Org1 的对等方交互。看看here,最后几行。 应用程序可以连接到其组织中的对等点,也可以连接到另一个组织中的对等点,具体取决于所需分类帐交互的性质。 [...]
  • @Zanna_37 可用的链码必须在通道上安装和实例化。如果是刚安装的话是正常的。正如我所说,对于连接到组织对等点,只有当对等点熟知客户端证书时才有可能。否则,您将无法通过。
  • 链码仅安装在 Org1 的对等节点上,并在通道上实例化。此外,据我所知,我设法从 OrgCam 的客户端连接到 Org1 的对等体,而没有明确指定任何证书。
【解决方案2】:

我终于做到了。

1.

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

必须改为:

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

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

2.

如果正在使用私有数据,请务必在 collections_config.json 文件中删除字段 "memberOnlyRead""memberOnlyWrite" (1) 或将其设置为 false。 p>

例子:

[
 {
   "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 的对等点作为锚点对等点。 p>


  • (1):"memberOnlyWrite" 尚不可用。见here
  • (2):“空”是指没有安装任何链码。

【讨论】:

    猜你喜欢
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多