如何从组织外部查询链码
How to query a chaincode from outside an organization
我有 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 的链代码?
我对你的配置有点困惑,但我会尽力回答。
说清楚
链码不会"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) 或设置为 false
在 collections_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" 我的意思是没有安装任何链代码。
我有 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 的链代码?
我对你的配置有点困惑,但我会尽力回答。
说清楚
链码不会"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) 或设置为 false
在 collections_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" 我的意思是没有安装任何链代码。