ENDORSEMENT_POLICY_FAILURE 在私有数据的情况下在 hyperledger fabric 中
ENDORSEMENT_POLICY_FAILURE in hyperledger fabric in case of private data
我们正在开展一个项目,我们在其中使用最新的私人数据收集。
我们是 运行 kubernetes 设置中的同行。我们有一个如下所述的集合配置,
{
"name": "Org1_PDC2",
"policy": "OR ('Org1.member')",
"requiredPeerCount": 0,
"maxPeerCount": 2,
"memberOnlyRead": true,
"memberOnlyWrite": true,
"blockToLive": 0,
"endorsementPolicy": {
"signaturePolicy": "OR('Org1.member')"
}
}
我们在频道中有 2 个组织,每个组织有 2 个同行。由于我们已经提到了“Org1_PDC2”的背书策略只需要来自 Org1 的签名。但我们看到交易也发送到 Org2 的 peer1。但它在 org2 中失败,因为它无法访问“Org1_PDC2”。我们还从 nodejs 应用程序观察到,当我们提交交易时,它给了我们一个 endorsementPolicy Failure 并且我可以在 Org1 的 peer1 日志中看到链码执行成功但是在 Org1 日志的 peer2 中我看到错误为
2020-11-02 13:18:24.249 UTC [gossip.privdata] fetchPrivateData -> DEBU 566a286 Total members that fit some digest: []
2020-11-02 13:18:24.249 UTC [gossip.privdata] fetchPrivateData -> WARN 566a287 Do not know any peer in the channel( mychannel ) that matches the policies , aborting
2020-11-02 13:18:24.249 UTC [gossip.privdata] populateFromRemotePeers -> WARN 566a288 Failed fetching private data from remote peers for dig2src:
2020-11-02 13:18:25.249 UTC [gossip.privdata] RetrievePvtdata -> DEBU 566a28b Could not fetch all missing collection private write sets from remote peers for block [291588] channel=mychannel
2020-11-02 13:18:25.249 UTC [gossip.privdata] prepareBlockPvtdata -> WARN 566a28c Could not fetch all missing eligible collection private write sets for block [291588]. Will commit block with missing private write sets:[txID: 6d14a881ecc6b437f553fc5df7f8fd29d10d92f22f752a2488fc382d535b62e8, seq: 0, namespace: mycc, collection: Org1_PDC2, hash: b8317508d3b677563bb5119626eabfc866ad561358e2d1a7116749d86c952ebe
] channel=mychannel
我们在 nodejs 应用程序中使用发现选项,选项为
await gateway.connect(connectionProfile, {discovery: { enabled: true, asLocalhost: false}});
const network = await gateway.getNetwork('mychannel');
const contract = await network.getContract(contractName);
并且在org1客户端的连接配置文件中,我们只保留了org1和orderer的peer信息。我们从客户端调用任何事务时得到的错误消息是
[TransactionEventHandler]: strategyFail: commit failure for transaction "e7080f63ff9be02002d2723b7431b1e9f236c8119c7c37e7dd21bf924a8a5b7a": TransactionError: Commit of transaction e7080f63ff9be02002d2723b7431b1e9f236c8119c7c37e7dd21bf924a8a5b7a failed on peer peer1.org1.svc.cluster.local with status ENDORSEMENT_POLICY_FAILURE
在使用该合约调用交易之前,您可能需要让客户端 SDK 了解链代码使用 contract.addDiscoveryInterest()
访问的集合,如本教程页面所述:
https://hyperledger.github.io/fabric-sdk-node/release-2.2/tutorial-discovery-fabric-network.html
如果不成功,您可以使用transaction.setEndorsingOrganizations()
明确设置用于背书的组织:
我们正在开展一个项目,我们在其中使用最新的私人数据收集。 我们是 运行 kubernetes 设置中的同行。我们有一个如下所述的集合配置,
{
"name": "Org1_PDC2",
"policy": "OR ('Org1.member')",
"requiredPeerCount": 0,
"maxPeerCount": 2,
"memberOnlyRead": true,
"memberOnlyWrite": true,
"blockToLive": 0,
"endorsementPolicy": {
"signaturePolicy": "OR('Org1.member')"
}
}
我们在频道中有 2 个组织,每个组织有 2 个同行。由于我们已经提到了“Org1_PDC2”的背书策略只需要来自 Org1 的签名。但我们看到交易也发送到 Org2 的 peer1。但它在 org2 中失败,因为它无法访问“Org1_PDC2”。我们还从 nodejs 应用程序观察到,当我们提交交易时,它给了我们一个 endorsementPolicy Failure 并且我可以在 Org1 的 peer1 日志中看到链码执行成功但是在 Org1 日志的 peer2 中我看到错误为
2020-11-02 13:18:24.249 UTC [gossip.privdata] fetchPrivateData -> DEBU 566a286 Total members that fit some digest: []
2020-11-02 13:18:24.249 UTC [gossip.privdata] fetchPrivateData -> WARN 566a287 Do not know any peer in the channel( mychannel ) that matches the policies , aborting
2020-11-02 13:18:24.249 UTC [gossip.privdata] populateFromRemotePeers -> WARN 566a288 Failed fetching private data from remote peers for dig2src:
2020-11-02 13:18:25.249 UTC [gossip.privdata] RetrievePvtdata -> DEBU 566a28b Could not fetch all missing collection private write sets from remote peers for block [291588] channel=mychannel
2020-11-02 13:18:25.249 UTC [gossip.privdata] prepareBlockPvtdata -> WARN 566a28c Could not fetch all missing eligible collection private write sets for block [291588]. Will commit block with missing private write sets:[txID: 6d14a881ecc6b437f553fc5df7f8fd29d10d92f22f752a2488fc382d535b62e8, seq: 0, namespace: mycc, collection: Org1_PDC2, hash: b8317508d3b677563bb5119626eabfc866ad561358e2d1a7116749d86c952ebe
] channel=mychannel
我们在 nodejs 应用程序中使用发现选项,选项为
await gateway.connect(connectionProfile, {discovery: { enabled: true, asLocalhost: false}});
const network = await gateway.getNetwork('mychannel');
const contract = await network.getContract(contractName);
并且在org1客户端的连接配置文件中,我们只保留了org1和orderer的peer信息。我们从客户端调用任何事务时得到的错误消息是
[TransactionEventHandler]: strategyFail: commit failure for transaction "e7080f63ff9be02002d2723b7431b1e9f236c8119c7c37e7dd21bf924a8a5b7a": TransactionError: Commit of transaction e7080f63ff9be02002d2723b7431b1e9f236c8119c7c37e7dd21bf924a8a5b7a failed on peer peer1.org1.svc.cluster.local with status ENDORSEMENT_POLICY_FAILURE
在使用该合约调用交易之前,您可能需要让客户端 SDK 了解链代码使用 contract.addDiscoveryInterest()
访问的集合,如本教程页面所述:
https://hyperledger.github.io/fabric-sdk-node/release-2.2/tutorial-discovery-fabric-network.html
如果不成功,您可以使用transaction.setEndorsingOrganizations()
明确设置用于背书的组织: