Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hyperledger fabric 提交使用私有数据的交易时如何选择背书对等方_Hyperledger Fabric_Hyperledger - Fatal编程技术网

Hyperledger fabric 提交使用私有数据的交易时如何选择背书对等方

Hyperledger fabric 提交使用私有数据的交易时如何选择背书对等方,hyperledger-fabric,hyperledger,Hyperledger Fabric,Hyperledger,我有一个Hyperledger结构网络,有两个组织:Org1和Org2。发现已启用。私有数据收集用于保护敏感数据。特别是,只有Org2的成员才能访问一个私有数据收集。当我试图提交只需要访问Org2私有数据的事务时,我发现它也会发送给Org1的对等方进行背书: const gateway = new Gateway(); await gateway.connect(ccp, { wallet, identity: userName, discovery: { enabled: true, asLo

我有一个Hyperledger结构网络,有两个组织: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的对等点,但我猜节点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-21T12:03:03.684Z错误[contracts spi/chaincodefromcontract.js]
{“message”:“GET_STATE failed:事务ID:25f22c0abd0318b2ec1da06ae28b90a8e6af55e6d0ea825461938cce8b2d0801:与公共哈希版本匹配的私有数据不可用。公共哈希版本={BlockNum:951,TxNum:4},私有数据版本=,“stack”:错误:获取\ u状态失败:事务ID:25f22c0abd0318b2ec1da06ae28b90a8e6af55e6d0ea825461938cce8b2d0801:与公共哈希版本匹配的私有数据不可用。公共哈希版本={BlockNum:951,TxNum:4},私有数据版本=\n在parseResponse(/usr/local/src/node\ u modules/fabric shim/lib/handler.js:751:15)\n位于MsgQueueHandler.handleMsgResponse(/usr/local/src/node_modules/fabric shim/lib/handler.js:136:40)\n位于ClientDuplexStream。(/usr/local/src/node_modules/fabric shim/lib/handler.js:290:46)\n位于emitOne(events.js:116:13)\n位于ClientDuplexStream.emit(events.js:211:7)\n位于addChunk(\u stream\u.js:263:12)\n在readableAddChunk(\u stream\u readable.js:250:11)\n在ClientDuplexStream.readable.push(\u stream\u readable.js:208:10)\n在Object.onReceiveMessage(/usr/local/src/node\modules/grpc/src/client\u interceptors.js:1292:19)\n在InterceptingListener.recvMessageWithContext(/usr/local/src/node\u modules/grpc/src/client\u interceptors.js:607:19)})
2019-11-21T12:03:03.684Z错误[lib/handler.js][channel123-25f22c0a]调用chaincode Invoke()返回错误响应[ERROR:GET_STATE failed:transaction ID:25f22c0abd0318b2ec1da06ae2b90a8e6af55e6d0ea825461938cce8b2d0801:与公共哈希版本匹配的私有数据不可用。公共哈希版本={BlockNum:951,TxNum:4},专用数据版本=]。正在将错误消息发送回对等方
类似的输出也显示在客户端。仅在客户端应用程序中,它是警告而不是错误

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>
2019-11-21T15:15:53.165Z-警告:[发现域处理程序]:\u build\u annoard\u group\u member>>G2:0-背书失败-错误:返回失败的事务:错误:GET\u状态失败:事务ID:0b3e90c745535af7520ffab7b82b041394d409850cb5efff96071c24f5f75817:与公共哈希版本匹配的私有数据不可用。公共哈希版本={BlockNum:957,TxNum:0},私有数据版本=
尽管存在上述错误/警告,但交易成功。将执行对分类账和私人数据收集的预期更新

问题是:考虑到私有数据,是否有可能从客户端控制哪些对等点用于特定交易的背书


我发现
Channel.getEndorsementPlan(背书提示)
可以正确识别哪些对等方可以访问特定的链码和私有数据收集。是否可以使用此函数的输出来控制
Transaction.submit()的行为

允许您针对特定对等方的代码位于网关中(高级api)代码库,但不幸的是,它不在当前版本的node sdk(当前为1.4.4)中。希望在某个时候,将发布一个1.4.5版本,该版本将包含此代码。npm上可能有较新的fabric node sdk快照版本,您现在可以试用。如果您查看参考文档,请参阅re您应该看到一个名为
setEndorsingPeers
的方法。这应该允许您为事务执行对等目标。可以在此处找到测试中使用的示例


node sdk低级api(客户端/通道接口)确实具有发现和确定集合的能力,但网关/网络/合同接口无法提供这种能力(目前还没有相关代码)。这里是一个如何使用它的参考,但客户端/通道API不支持钱包或为您处理事件,因此您需要自己进行身份处理和事件处理。

我知道这没有多大帮助,但是-作为记录,Go SDK支持这一点。对等方允许此类查询。您可以向discov传递提示ery查询到要使用集合的对等方,它将筛选出不在集合中的对等方。请参阅,此使用发现查询集合的功能在节点sdk中可用,但不通过网关接口(即高级api)提供。您可以切换到使用低级api(客户端/通道实例)网关实现(当发布新版本时)不使用发现功能,而只是允许您自己指定对等点,这没有那么有用,但我认为确实允许您实现所需。David,因此没有人在node SDK客户端实现此支持?自2018年以来,服务器端就支持此支持……我已更新了我的答案,@yacovm感谢您的提醒out discovery Support collection discovery感谢您@david_k的回答。实际上,
Transaction.setEndorsingPeers()
是我的第一次尝试,但在运行时我被告知“Transaction.setEndorsingPeers()不是函数“:-)官方API文档和官方API实现之间的差异是如此令人讨厌…无论如何,我接受你的答案,并等待1。