我有一个由两个组织组成的Hyperledger Fabric网络:Org1和Org2。发现已启用。私有数据收集用于保护敏感数据。特别是只有一个Org2成员可以访问的私有数据集合。当我尝试提交需要访问仅Org2私有数据的事务时,我发现它也发送到Org1的对等方以得到认可:
const gateway = new Gateway();
await gateway.connect(ccp, { wallet, identity: userName, discovery: { enabled: true, asLocalhost: false } });
const network = await gateway.getNetwork(channelName);
const contract = await network.getContract(contractName);
await contract.createTransaction(command).setTransient(transient).submit();
使用的连接配置文件未列出来自Org2的对等方,但我的猜测是,Node SDK通过发现从Org1中找到了对等方,并将交易建议发送给他们。 Org1中的对等日志显示它无法访问私有数据,这是预期的:
2019-11-21T12:03:03.684Z ERROR [contracts-spi/chaincodefromcontract.js]
{"message":"GET_STATE failed: transaction ID: 25f22c0abd0318b2ec1da06ae28b90a8e6af55e6d0ea825461938cce8b2d0801: private data matching public hash version is not available. Public hash version = {BlockNum: 951, TxNum: 4}, Private data version = <nil>","stack":"Error: GET_STATE failed: transaction ID: 25f22c0abd0318b2ec1da06ae28b90a8e6af55e6d0ea825461938cce8b2d0801: private data matching public hash version is not available. Public hash version = {BlockNum: 951, TxNum: 4}, Private data version = <nil>\n at parseResponse (/usr/local/src/node_modules/fabric-shim/lib/handler.js:751:15)\n at MsgQueueHandler.handleMsgResponse (/usr/local/src/node_modules/fabric-shim/lib/handler.js:136:40)\n at ClientDuplexStream.<anonymous> (/usr/local/src/node_modules/fabric-shim/lib/handler.js:290:46)\n at emitOne (events.js:116:13)\n at ClientDuplexStream.emit (events.js:211:7)\n at addChunk (_stream_readable.js:263:12)\n at readableAddChunk (_stream_readable.js:250:11)\n at ClientDuplexStream.Readable.push (_stream_readable.js:208:10)\n at Object.onReceiveMessage (/usr/local/src/node_modules/grpc/src/client_interceptors.js:1292:19)\n at InterceptingListener.recvMessageWithContext (/usr/local/src/node_modules/grpc/src/client_interceptors.js:607:19)"}
2019-11-21T12:03:03.684Z ERROR [lib/handler.js] [channel123-25f22c0a]Calling chaincode Invoke() returned error response [Error: GET_STATE failed: transaction ID: 25f22c0abd0318b2ec1da06ae28b90a8e6af55e6d0ea825461938cce8b2d0801: private data matching public hash version is not available. Public hash version = {BlockNum: 951, TxNum: 4}, Private data version = <nil>]. Sending ERROR message back to peer
相似的输出也显示在客户端。仅在客户端应用程序中,它是警告而不是错误。
2019-11-21T15:15:53.165Z - warn: [DiscoveryEndorsementHandler]: _build_endorse_group_member >> G2:0 - endorsement failed - Error: transaction returned with failure: Error: GET_STATE failed: transaction ID: 0b3e90c745535af7520ffab7b82b041394d409850cb5efff96071c24f5f75817: private data matching public hash version is not available. Public hash version = {BlockNum: 957, TxNum: 0}, Private data version = <nil>
尽管有上述错误/警告,但交易成功。将对分类帐和私人数据收集进行预期的更新。
问题是:是否可以从客户端进行控制,考虑到私有数据,哪些对等方用于特定交易的认可?
我发现Channel.getEndorsementPlan(endorsement_hint)
可以正确识别哪些对等方可以访问特定的链码和私有数据集合。可以使用此函数的输出来控制Transaction.submit()
的行为吗?
答案 0 :(得分:1)
允许您定位特定对等点的代码位于网关(高级api)代码库中,但不幸的是,它不在当前版本为1.4.4的sdk节点中。希望在某个时候将发布1.4.5版本的版本。可以在npm上找到fabric-node-sdk的较新快照版本,您可以立即尝试。作为参考,如果您在此处查看参考文档https://fabric-sdk-node.github.io/release-1.4/module-fabric-network.Transaction.html,则应该看到一个名为setEndorsingPeers
的方法。这应该使您可以为交易执行对等目标。测试中使用的示例可以在https://github.com/hyperledger/fabric-sdk-node/blob/bf8c663fbbb9adeeb872b27eb8ccec60c03af6de/test/typescript/integration/network-e2e/invoke.ts#L954
node-sdk低级api(客户端/通道接口)确实具有发现和确定集合的功能,但是无法通过网关/网络/合同接口使用(目前尚无代码) )。这是有关https://fabric-sdk-node.github.io/release-1.4/tutorial-discovery.html使用方法的参考,但是Client / Channel API不支持钱包或为您处理事件,因此您需要自己进行身份处理和事件处理。