为什么在hyperledger / fabric -sdk-node项目test / integration / invoke.js invokeChaincode方法中需要所有对等方在提案时获得相同的结果?

时间:2017-10-13 10:41:39

标签: node.js blockchain hyperledger-fabric hyperledger

在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状态代码,它取决于代言同行'决定它是否合法的政策。 例如,如果一个对等体关闭,这不是认可对等体,则提议将始终具有由对等体发送的一个错误。然后调用将永远不会成功。 我不认为这是正确的做法,这真的很奇怪。这有什么问题吗?

1 个答案:

答案 0 :(得分:1)

这个想法是为了实现(在提交时通过验证)需要来自多个组织的签名的认可策略,您需要多个对等体(来自不同的组织)来签署相同的有效负载。这就是为什么要进行比较。

那说 - 这是正确的,这取决于认可政策。