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 개의 상태 코드가 될 필요는 없다. 그것은 가치있는 것인지를 결정하는 보증인의 정책에 달려있다. 예를 들어 하나의 피어가 다운 된 경우 (승인 피어가 아닌 경우) 제안서에는 항상 피어에서 보낸 하나의 오류가 있습니다. 그러면 호출은 결코 성공하지 못합니다. 나는 이것을하는 것이 옳은 방법이라고 생각하지 않는다. 그것은 정말로 이상하다. 거기에 문제가 있습니까?
이것은 올바른 분석이며 오탐 (false positive)을 유발할 수 있으므로 테스트가 제대로 작성되지 않았습니다. 이상적으로, 보증 정책은 동료들로부터 충분한 일관된 응답이 있는지 여부를 결정할 것이며 이는 신청서와 주문자 모두에서 점검 될 것입니다. 원한다면 JIRA https://jira.hyperledger.org/issues/?filter=10136에서 결함을여십시오. 고침을 환영하겠습니다 .-) – christo4ferris
답장을 보내 주셔서 감사합니다. 당신이 말했듯이, 모든 동료 200 상태 코드 확인의 보증인을 제거하면 발주자 서비스는 제안서가 승인 정책을 충족하는지 계속 확인합니다. 맞습니까? 그런데 jira를 방문하여 로그인 할 계정이 없음을 알았습니다. 나는 github에서 문제의 허가를 열 수 있다고 생각합니다. –
피어는 VSCC (시스템 체인 코드 유효성 검사)를 통해 트랜잭션을 실행할 때이를 확인합니다. – christo4ferris