Hyperledger Fabric 2.3+Caliper V0.5测试报错求助:节点背书不匹配
问题场景
使用Hyperledger Fabric 2.3测试网络搭配Caliper V0.5开展性能测试时,出现无有效节点响应错误,具体提示为Peer endorsements do not match,导致提交交易失败。已确认所有Fabric组件运行正常,怀疑配置文件存在问题,相关配置如下:
基准测试配置
test: name: basic-contract-benchmark description: test benchmark workers: number: 2 rounds: - label: readAsset description: Read asset benchmark txDuration: 30 rateControl: type: fixed-load opts: #tps: 25 transactionLoad: 2 workload: module: workload/readAsset.js arguments: assets: 10 contractId: basic
网络配置
name: Calier test version: "2.0.0" caliper: blockchain: fabric channels: - channelName: channel1 contracts: - id: basic organizations: - mspid: Org1MSP identities: certificates: - name: 'User1' clientPrivateKey: path: '../fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/663cf2aa45619b05d8c8200020f90d7931dcc08f15b8b152a16c6ea7e344e8d5_sk' clientSignedCert: path: '../fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/cert.pem' connectionProfile: path: '../fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/connection-org1.yaml' discover: true
排查与解决步骤
1. 验证合约背书策略
Fabric测试网默认部署的basic合约,背书策略通常为AND('Org1MSP.peer', 'Org2MSP.peer'),即需要Org1和Org2的peer共同背书。若Caliper仅配置了Org1的身份,无法获取Org2的背书签名,会直接触发Peer endorsements do not match错误。
验证命令:
在Org1的peer环境中执行:
peer chaincode query -C channel1 -n basic -c '{"Args":["getPolicy"]}'
若返回的策略包含多个组织,需补充对应组织的身份配置。
2. 补充多组织身份配置
修改Caliper网络配置,添加Org2的身份信息,确保Caliper能从符合背书策略的所有组织获取背书:
organizations: - mspid: Org1MSP identities: certificates: - name: 'User1' clientPrivateKey: path: '../fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/663cf2aa45619b05d8c8200020f90d7931dcc08f15b8b152a16c6ea7e344e8d5_sk' clientSignedCert: path: '../fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/cert.pem' connectionProfile: path: '../fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/connection-org1.yaml' discover: true - mspid: Org2MSP identities: certificates: - name: 'User1' clientPrivateKey: path: '../fabric-samples/test-network/organizations/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/keystore/[替换为Org2 User1的私钥文件名]_sk' clientSignedCert: path: '../fabric-samples/test-network/organizations/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/signcerts/cert.pem' connectionProfile: path: '../fabric-samples/test-network/organizations/peerOrganizations/org2.example.com/connection-org2.yaml' discover: true
3. 确认交易类型与代码逻辑
测试标签为readAsset,属于查询类交易,理论上无需多节点背书(使用evaluateTransaction)。若报错提示提交交易失败,需检查workload/readAsset.js中的代码逻辑:
- 确保使用
evaluateTransaction执行查询:await contract.evaluateTransaction('readAsset', assetId); - 若误使用
submitTransaction(用于写入类交易),则必须满足背书策略,否则会触发背书不匹配错误。
4. 检查Peer节点数据一致性
确认Org1和Org2的peer均已加入channel1,且数据同步正常:
- 查看peer加入的通道:
peer channel list - 在两个组织的peer环境下分别查询同一资产,确认数据一致:
peer chaincode query -C channel1 -n basic -c '{"Args":["readAsset","asset1"]}'
5. 验证自动发现配置有效性
discover: true会让Caliper自动发现网络节点,需确保connection-org1.yaml和connection-org2.yaml中的节点地址正确(测试网默认是localhost端口),且Caliper运行环境能正常访问这些节点。
内容的提问来源于stack exchange,提问作者RajeshKaushal

