【发布时间】:2020-03-17 14:02:23
【问题描述】:
我有一个包含两个组织的 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() 的行为?
【问题讨论】:
-
我知道这并没有多大帮助,但是 - 作为记录,Go SDK 支持这一点。对等方允许这样的查询。您可以将发现查询的提示传递给要使用集合的对等方,它将过滤掉不在集合中的对等方。见hyperledger-fabric.readthedocs.io/en/release-1.4/…
-
这种使用发现来查询集合的能力在节点sdk中可用,但不能通过网关接口(即高级api)。您可以切换到使用低级 api(客户端/通道实例)并从那里开始。网关实现(当发布新版本时)不使用发现工具,而只是允许您自己指定对等点,这不是很有用,但我想确实可以让您实现所需的目标。
标签: hyperledger-fabric hyperledger