在hyperledger / fabric-sdk-node项目中,test / integration / invoke.js测试文件,invokeChaincode方法。 我发现,当渠道将交易提案发送给所有同行时,它会检查所有同行'响应,只有当它们与状态代码200完全相同时,才会发送事务。
...
}).then((nothing) => {
tx_id = client.newTransactionID(the_user);
// send proposal to endorser
var request = {
chaincodeId : e2e.chaincodeId,
fcn: 'move',
args: ['a', 'b','100'],
txId: tx_id,
};
return channel.sendTransactionProposal(request);
}, (err) => {
t.fail('Failed to enroll user \'admin\'. ' + err);
throw new Error('Failed to enroll user \'admin\'. ' + err);
}).then((results) => {
var proposalResponses = results[0];
var proposal = results[1];
var header = results[2];
var all_good = true;
for(var i in proposalResponses) {
let one_good = false;
let proposal_response = proposalResponses[i];
if( proposal_response.response && proposal_response.response.status === 200) {
t.pass('transaction proposal has response status of good');
one_good = channel.verifyProposalResponse(proposal_response);
if(one_good) {
t.pass(' transaction proposal signature and endorser are valid');
}
} else {
t.fail('transaction proposal was bad');
}
all_good = all_good & one_good;
}
if (all_good) {
// check all the read/write sets to see if the same, verify that each peer
// got the same results on the proposal
all_good = channel.compareProposalResponseResults(proposalResponses);
t.pass('compareProposalResponseResults exection did not throw an error');
if(all_good){
t.pass(' All proposals have a matching read/writes sets');
}
else {
t.fail(' All proposals do not have matching read/write sets');
}
}
if (all_good) {
// check to see if all the results match
...
据我了解,我认为定价服务是检查提案的责任,而不是同行。它并不总是需要所有同行和#39;提案是200状态代码,它取决于代言同行'决定它是否合法的政策。 例如,如果一个对等体关闭,这不是认可对等体,则提议将始终具有由对等体发送的一个错误。然后调用将永远不会成功。 我不认为这是正确的做法,这真的很奇怪。这有什么问题吗?
答案 0 :(得分:1)
这个想法是为了实现(在提交时通过验证)需要来自多个组织的签名的认可策略,您需要多个对等体(来自不同的组织)来签署相同的有效负载。这就是为什么要进行比较。
那说 - 这是正确的,这取决于认可政策。