트랜잭션 개체에 충분한 보증이 포함 된 경우에도 사용하여 체인 코드를 호출하는 동안 ENDORSEMENT_POLICY_FAILURE

jkalwar

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>);
        

운이 없습니다. 동일한 보증 정책 실패로 트랜잭션이 여전히 실패합니다. 보증인 서명 인증서가 올바르게 존재하는 경우 트랜잭션 개체를 확인했습니다. 존재하지만 여전히 동일한 오류가 있습니다.

호기심 때문에 보증 정책을 두 조직에서 하나의 조직으로 만 변경했으며 모든 것이 예상대로 작동했습니다. 이 문제는 정책에 두 개 이상의 보증 조직이 포함 된 경우에만 존재합니다.

이 문제를 디버깅하는 데 도움을주세요.

david_k

ENDORSEMENT_POLICY_FAILURE는 여러 가지 이유로 발생할 수 있습니다. 첫 번째는 이미 확인한 서명이 충분하지 않다는 것입니다. 또 다른 이유는 모든 서명이 전송 된 제안과 일치하지 않기 때문입니다.

1.4 게이트웨이 API에서 제안이 수신되고 제안이 주문자에게 전송되기 전에 모두 일치하는지 비교하지 않습니다. SDK는 모든 서명과 수신 된 제안 중 하나를 보냅니다. 서명은 각 피어의 개별 제안 응답에 생성됩니다.

해당 제안이 일치하지 않으면 (체인 코드가 결정적이지 않음을 의미 함) 해당 서명 중 하나는 괜찮지 만 다른 하나는 주문자에게 보낸 제안과 일치하지 않기 때문에 그렇지 않습니다.

각 피어가 서로 다른 응답을 생성 할 수 있기 때문에 체인 코드가 결정적인지 확인합니다. 예를 들어 비 결정적 체인 코드의 예는 새 날짜를 만들고이를 세계 상태에 저장하는 곳입니다. 각 피어는 약간 다른 날짜 값을 생성하여 응답이 다릅니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관