[提交使用私有数据的交易时如何选择背书的对等人

问题描述 投票:1回答:1

我有一个由两个组织组成的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()的行为?

hyperledger-fabric hyperledger
1个回答
0
投票

代码可以执行此操作,但是不幸的是,它不在节点sdk的当前版本1.4.4中。希望在某个时候将发布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还具有发现和确定集合的功能,但是不能通过网关/网络/合同接口,而是可以通过客户端/通道接口来使用。这里是有关如何使用它的参考https://fabric-sdk-node.github.io/release-1.4/tutorial-discovery.html,但是Client / Channel API不支持钱包或为您处理事件,因此您需要自己进行身份处理和事件处理。

© www.soinside.com 2019 - 2024. All rights reserved.