2017-10-13 8 views
1

hyperledger/fabric-sdk-node 프로젝트에서 test/integration/invoke.js 테스트 파일, invokeChaincode 메소드. 채널에서 거래 제안서를 모든 피어에게 보냈을 때 모든 피어의 응답을 확인하고 모두 동일한 상태 코드 200 인 경우에만 트랜잭션을 전송하는 것으로 나타났습니다.왜 hyperledger/fabric-sdk-node 프로젝트 테스트/통합/invoke.js invokeChaincode 메소드에서 모든 피어가 제안서를 제출할 때 동일한 결과가 필요합니까?

... 
}).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 
... 

필자는 동배가 아닌 제안서를 확인하는 것이 주문자 서비스의 책임이라고 생각합니다. 그리고 모든 피어들의 제안이 항상 200 개의 상태 코드가 될 필요는 없다. 그것은 가치있는 것인지를 결정하는 보증인의 정책에 달려있다. 예를 들어 하나의 피어가 다운 된 경우 (승인 피어가 아닌 경우) 제안서에는 항상 피어에서 보낸 하나의 오류가 있습니다. 그러면 호출은 결코 성공하지 못합니다. 나는 이것을하는 것이 옳은 방법이라고 생각하지 않는다. 그것은 정말로 이상하다. 거기에 문제가 있습니까?

+0

이것은 올바른 분석이며 오탐 (false positive)을 유발할 수 있으므로 테스트가 제대로 작성되지 않았습니다. 이상적으로, 보증 정책은 동료들로부터 충분한 일관된 응답이 있는지 여부를 결정할 것이며 이는 신청서와 주문자 모두에서 점검 될 것입니다. 원한다면 JIRA https://jira.hyperledger.org/issues/?filter=10136에서 결함을여십시오. 고침을 환영하겠습니다 .-) – christo4ferris

+0

답장을 보내 주셔서 감사합니다. 당신이 말했듯이, 모든 동료 200 상태 코드 확인의 보증인을 제거하면 발주자 서비스는 제안서가 승인 정책을 충족하는지 계속 확인합니다. 맞습니까? 그런데 jira를 방문하여 로그인 할 계정이 없음을 알았습니다. 나는 github에서 문제의 허가를 열 수 있다고 생각합니다. –

+0

피어는 VSCC (시스템 체인 코드 유효성 검사)를 통해 트랜잭션을 실행할 때이를 확인합니다. – christo4ferris

답변

1

아이디어는 여러 조직의 서명이 필요한 승인 정책 (커밋시 유효성 검사를 통과)을 수행하려면 동일한 페이로드에 서명하기 위해 여러 조직 (다른 조직의 피어)이 필요하다는 것입니다. 이것이 비교가 된 이유입니다.

그건 그렇습니다. 그것이 보증 정책에 달려 있다고 말하는 것은 맞습니다.