5 개 조직 A, B, C, D, E가있는 하이퍼 레저 패브릭 1.4.4에 네트워크가 있습니다.이 5 개 조직으로 채널을 만들고 보증 정책과는 별개이기 때문에 조직 A와 조직 B에 체인 코드를 설치했습니다. .
다음은 보증 정책입니다.
{"identities":[{"role":{"name":"member","mspId":"AMSP"}},{"role":{"name":"member","mspId":"BMSP"}},{"role":{"name":"member","mspId":"CMSP"}},{"role":{"name":"member","mspId":"DMSP"}},{"role":{"name":"member","mspId":"EMSP"}}],"policy":{"2-of":[{"signed-by":0},{"signed-by":1}]}}
체인 코드를 호출하기 위해 아래 구성의 게이트웨이를 사용하고 있습니다.
const walletPath = path.join('wallet' );
const wallet = new FileSystemWallet(walletPath);
let connectionOptions = {
identity: userName,
wallet: wallet,
discovery: { enabled:true, asLocalhost: true },
eventHandlerOptions: {
commitTimeout: 100,
strategy: DefaultEventHandlerStrategies.NETWORK_SCOPE_ALLFORTX
}
};
logger.debug('Connecting to Fabric gateway');
await gateway.connect(clientConnectionProfileJson, connectionOptions);
const network = await gateway.getNetwork(channelName);
const contract = await network.getContract(chaincodeName , contractName);
const transaction = contract.createTransaction(functionName);
await transaction.submit(<arguments>);
이것은 클라이언트 수준에서 얻는 오류입니다.
2021-02-17T05:28:13.063Z - warn: [TransactionEventHandler]: _strategyFail: strategy fail for transaction "9be4da8b1d52ddde804d6c7c08d134ef4b6ac2043cbe0258b5b4c921424c9f04": TransactionError: Peer a-org-peer1.a-org.com:7051 has rejected transaction "9be4da8b1d52ddde804d6c7c08d134ef4b6ac2043cbe0258b5b4c921424c9f04" with code "ENDORSEMENT_POLICY_FAILURE"
이것은 모든 피어 로그에서 보는 것입니다.
2021-02-17 05:28:12.313 UTC [vscc] Validate -> ERRO 0db VSCC error: stateBasedValidator.Validate failed, err validation of endorsement policy for chaincode {chaincodeName} in tx 26:0 failed: signature set did not satisfy policy
몇 가지 조사 끝에 조직 피어가 거래를 원장에 커밋하려고 할 때 발생하는 오류라는 것을 발견했으며 서명 세트가 정책을 충족하지 않음을 발견했습니다.
계속해서 getTransactionByID 메서드를 사용하여 트랜잭션 개체를 살펴 보았습니다. 올바른 서명 인증서를 가진 두 개의 보증인 MSP가 있음을 확인했습니다. 이러한 인증서는 A 및 B 조직의 피어 중 하나에 속합니다. 따라서 검색 서비스는 피어를 올바르게 식별했으며 심지어 피어도 트랜잭션을 승인했지만 트랜잭션이 커밋되지 않는 이유는 확실하지 않습니다.
내가 여기서 무엇을 놓치고 있습니까?
서명이 올바른지 어떻게 확인할 수 있습니까?
요청이 특정 보증 피어로 이동해야한다고 게이트웨이에 명시 적으로 말하기 위해 아래 코드를 사용했습니다.
const walletPath = path.join('wallet' );
const wallet = new FileSystemWallet(walletPath);
let connectionOptions = {
identity: userName,
wallet: wallet,
discovery: { enabled: true , asLocalhost: true },
eventHandlerOptions: {
commitTimeout: 100,
strategy: DefaultEventHandlerStrategies.NETWORK_SCOPE_ALLFORTX
}
};
logger.debug('Connecting to Fabric gateway');
await gateway.connect(clientConnectionProfileJson, connectionOptions);
const network = await gateway.getNetwork(channelName);
const channel = network.getChannel();
let endorsingPeers = [];
endorsingPeers.push(channel.getChannelPeer('a-org-peer1.a-org.com'));
endorsingPeers.push(channel.getChannelPeer('b-org-peer1.b-org.com'));
// Get addressability to org.cargoesnetwork.ebilloflading contract
// Use chaincodeName that is used for installing
const contract = await network.getContract(chaincodeName , contractName);
const transaction = contract.createTransaction(functionName).setEndorsingPeers(endorsingPeers);
await transaction.submit(<arguments>);
운이 없습니다. 동일한 보증 정책 실패로 트랜잭션이 여전히 실패합니다. 보증인 서명 인증서가 올바르게 존재하는 경우 트랜잭션 개체를 확인했습니다. 존재하지만 여전히 동일한 오류가 있습니다.
호기심 때문에 보증 정책을 두 조직에서 하나의 조직으로 만 변경했으며 모든 것이 예상대로 작동했습니다. 이 문제는 정책에 두 개 이상의 보증 조직이 포함 된 경우에만 존재합니다.
이 문제를 디버깅하는 데 도움을주세요.
ENDORSEMENT_POLICY_FAILURE는 여러 가지 이유로 발생할 수 있습니다. 첫 번째는 이미 확인한 서명이 충분하지 않다는 것입니다. 또 다른 이유는 모든 서명이 전송 된 제안과 일치하지 않기 때문입니다.
1.4 게이트웨이 API에서 제안이 수신되고 제안이 주문자에게 전송되기 전에 모두 일치하는지 비교하지 않습니다. SDK는 모든 서명과 수신 된 제안 중 하나를 보냅니다. 서명은 각 피어의 개별 제안 응답에 생성됩니다.
해당 제안이 일치하지 않으면 (체인 코드가 결정적이지 않음을 의미 함) 해당 서명 중 하나는 괜찮지 만 다른 하나는 주문자에게 보낸 제안과 일치하지 않기 때문에 그렇지 않습니다.
각 피어가 서로 다른 응답을 생성 할 수 있기 때문에 체인 코드가 결정적인지 확인합니다. 예를 들어 비 결정적 체인 코드의 예는 새 날짜를 만들고이를 세계 상태에 저장하는 곳입니다. 각 피어는 약간 다른 날짜 값을 생성하여 응답이 다릅니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다