Caver java로 contract 내부 메소드 호출 했는데 오류가 발생했는데 원인이 어떻게 되는지 모르겟습니다

안녕하세요.

제가 배포한 contract내부의 메소드를 호출하였는데 오류가 발생해서 문의드립니다.
기존 호출했을 때는 정상적인 메소드인 것도 확인하였고

from 지갑의 토큰 수량도 부족하지 않는 점, feePayer의 klay수량도 부족하지 않은 점도 확인하였습니다.

  • 정상적인 케이스
txHash : 0xd197ebc23b5d6bd03f5f0b085c2b9b0f3ba92350a3d556c14c7c044438c1c697

{"jsonrpc":"2.0","id":6,"result":{"blockHash":"0xe5c328baa4cf1ec3e70e6521da6c1607fb959951bbb98f7efca9cefe700e4995","blockNumber":"0x478cfdc","contractAddress":null,"from":"0x87d6312c30c48d0e37dc6d11092dd596fb221d3d","gas":"0x1312d00","gasPrice":"0x5d21dba00","gasUsed":"0x1abf4","input":"0x35bce6e4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c9f2cafec88d88b4cce5f21c458e05e859538f7a0000000000000000000000000f2cfdf15910afa3de5a168b6e21514074896b3d000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002540be40000000000000000000000000000000000000000000000000000000002540be400","logs":[{"address":"0x0bbcd245044c507ba1c9c3011d69b33ff3cbc7ed","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x00000000000000000000000087d6312c30c48d0e37dc6d11092dd596fb221d3d","0x000000000000000000000000c9f2cafec88d88b4cce5f21c458e05e859538f7a"],"data":"0x00000000000000000000000000000000000000000000000000000002540be400","blockNumber":"0x478cfdc","transactionHash":"0xd197ebc23b5d6bd03f5f0b085c2b9b0f3ba92350a3d556c14c7c044438c1c697","transactionIndex":"0x0","blockHash":"0xe5c328baa4cf1ec3e70e6521da6c1607fb959951bbb98f7efca9cefe700e4995","logIndex":"0x0","removed":false},{"address":"0x0bbcd245044c507ba1c9c3011d69b33ff3cbc7ed","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x00000000000000000000000087d6312c30c48d0e37dc6d11092dd596fb221d3d","0x0000000000000000000000000f2cfdf15910afa3de5a168b6e21514074896b3d"],"data":"0x00000000000000000000000000000000000000000000000000000002540be400","blockNumber":"0x478cfdc","transactionHash":"0xd197ebc23b5d6bd03f5f0b085c2b9b0f3ba92350a3d556c14c7c044438c1c697","transactionIndex":"0x0","blockHash":"0xe5c328baa4cf1ec3e70e6521da6c1607fb959951bbb98f7efca9cefe700e4995","logIndex":"0x1","removed":false}],"logsBloom":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000001000800000000000008000000000000000000000000000000200000000000000000000000000800000000000000000000001000000a000000000800000040000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000002000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000","nonce":"0x108","senderTxHash":"0xd197ebc23b5d6bd03f5f0b085c2b9b0f3ba92350a3d556c14c7c044438c1c697","signatures":[{"V":"0x7f6","R":"0x2f5618926942bbacdff297906c9af8ab7cc322197151700afbddd7f608fdf755","S":"0x80a3359c696ae5ca1b08cca9730f1861ebab56676e69cc07b813437a361db6b"}],"status":"0x1","to":"0x0bbcd245044c507ba1c9c3011d69b33ff3cbc7ed","transactionHash":"0xd197ebc23b5d6bd03f5f0b085c2b9b0f3ba92350a3d556c14c7c044438c1c697","transactionIndex":"0x0","type":"TxTypeSmartContractExecution","typeInt":48,"value":"0x0"}}
  • 오류케이스
txHash : 0x71db116d25adc0c87d1e3246443e9b21ceb2c4c3368eee23393097a2b9a9f372
{"jsonrpc":"2.0","id":6,"result":{"blockHash":"0x0f86b834cf08c438e06c55d20ce921a01257db1e7495990592eb9ef1755926b1","blockNumber":"0x478d026","contractAddress":null,"feePayer":"0x77c8db5694685e96b0543106f28387f1fc74bb66","feePayerSignatures":[{"V":"0x7f5","R":"0xb4ffcad63effd677a2acb7306f0fa906c654be06c7d6ca87d888a35f1146592d","S":"0x455fa985123c585575dd6737bcd6b0f48008fac445d78036d0941a42f8992cba"}],"from":"0x0efddef3542fe35a516ccf000aeeccc96d81f326","gas":"0x1312d00","gasPrice":"0x5d21dba00","gasUsed":"0xe442","input":"0x35bce6e4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000008dca68a7dc727a6ae623ad633efb720d966d460900000000000000000000000030f645dcce248679dbb51024c85865bcbed9b7f800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000de0b6b3a7640000","logs":[],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","nonce":"0x8","senderTxHash":"0xe0745b6e636e662bf3dc99455b90ca08453ca35ad5d57dafd8cdee0a333cff13","signatures":[{"V":"0x7f5","R":"0x7088e8d214200672a4651c3c838778dc53b7a93e1823854b7ae3d7a3ad85741a","S":"0x6675ea12a527e6209d755bbc33e32d37b07e7b50fe6b137dfe0a9fffd739f6b3"}],"status":"0x0","to":"0x0bbcd245044c507ba1c9c3011d69b33ff3cbc7ed","transactionHash":"0x71db116d25adc0c87d1e3246443e9b21ceb2c4c3368eee23393097a2b9a9f372","transactionIndex":"0x0","txError":"0x9","type":"TxTypeFeeDelegatedSmartContractExecution","typeInt":49,"value":"0x0"}}

이렇게 응답을 받았습니다

오류케이스의 txHash값을 scope에서 조회했을 때 Fail : ErrExecutionReverted - uint(0x09) 오류를 확인하여 문의드립니다.

안녕하세요.

정상적인 케이스와 오류 케이스의 전달하신 input값이 다른데요.
위 에러는 Contract Function 실행하다가 revert된 경우를 이야기합니다.

배포하신 스마트 컨트랙트 코드와 실행한 함수와 전달한 파라미터로 고려해보시기 바랍니다.

@Kale

네 감사합니다 확인해보겠습니다.

@Kale

오전에 코드와 함수의 전달 파라미터를 확인해 보았는데 제대로 전달하는 것은 확인했습니다.

Contract contract = KIP7.create(caver, kip7Json.getAbi().toString(),  "0x0bbcd245044c507ba1c9c3011d69b33ff3cbc7ed");

        SendOptions sendOptions = new SendOptions(deployerKeyring.getAddress());
        sendOptions.setFeeDelegation(false);
        sendOptions.setGas(BigInteger.valueOf(20000000));

        ArrayList<String> targetWallet = new ArrayList<>();
        ArrayList<BigInteger> amount = new ArrayList<>();

        String convertAmount = caver.utils.convertToPeb("1", Utils.KlayUnit.KLAY);

        for(String address : walletAddress){
            targetWallet.add(address);
            amount.add(new BigInteger(convertAmount));
        }

        TransactionReceipt.TransactionReceiptData receiptData = contract.getMethod("transferMulti").send(Arrays.asList(targetWallet, amount), sendOptions);
        log.info("### result : {}", receiptData.getTransactionHash());

위 소스는 단위테스트 하면서 성공한 소스이고

AbstractKeyring feePayerKeyring = KeyringFactory.decrypt(keyStore, keystorePw);
        caver.wallet.add(feePayerKeyring);
        contract.setWallet(caver.wallet);

        ArrayList<String> targetWallet = new ArrayList<>();
        ArrayList<BigInteger> targetAmount = new ArrayList<>();

        for(String address : toList){
            targetWallet.add(address);
        }

        for(String amount : amountList){
            targetAmount.add(new BigInteger(caver.utils.convertToPeb(amount, Utils.KlayUnit.KLAY)));
        }

        String input = contract.encodeABI("transferMulti", targetWallet, targetAmount);
        FeeDelegatedSmartContractExecution feeDelegatedSmartContractExecution =  new FeeDelegatedSmartContractExecution.Builder()
                .setKlaytnCall(caver.rpc.klay)
                .setFrom(fromKeyring.getAddress())
                .setTo(contractAddress)
                .setGas(GAS_LIMIT)
                .setInput(input)
                .setFeePayer(feePayerKeyring.getAddress())
                .build();

        caver.wallet.sign(fromKeyring.getAddress(), feeDelegatedSmartContractExecution);
        caver.wallet.signAsFeePayer(feePayerKeyring.getAddress(), feeDelegatedSmartContractExecution);
        String decoded = feeDelegatedSmartContractExecution.getRLPEncoding();

        Bytes32 txHash_executed = caver.rpc.klay.sendRawTransaction(decoded).send();
        TransactionReceiptProcessor receiptProcessor = new PollingTransactionReceiptProcessor(caver, 1000, 15);
        TransactionReceipt.TransactionReceiptData receiptData = receiptProcessor.waitForTransactionReceipt(txHash_executed.getResult());

        result.put("txHash", receiptData.getTransactionHash());

이 소스는 테스트 하면서 오류가 발생한 소스 입니다.
transferMulti는 컨트랙트소스의 Function을 호출하였습니다

1번째 소스에서는 정상적으로 호출하여서 동일한 값을 2번째 소스에 전달하여 호출하였는데 오류가 발생해서 문의드립니다

안녕하세요.

SDK에서 스마트 컨트랙트와 상호작용 하는 부분은 Smart contract를 호출하기 위한 Transaction data를 만들고 전송하는 기능이 주역할 입니다.

유닛 테스트를 통해 잘 성공한 것을 보니 스마트 컨트랙트에 트랜잭션이 잘 전송된 것처럼 된 것처럼 보이는데, 스마트 컨트랙트의 함수를 호출하기위한 트랜잭션을 보낼때 고려해야되는 요소들이 여러개가 있을 것이라고 생각합니다. 그 요소를 잘 고려해보시기 바랍니다.

직접 스마트 컨트랙트를 배포하고, 함수도 실행해보셨으니 @ToTheMoon 님께서 더 잘 아실 거라고 생각합니다.

@Kale

아… 확인해보니 권한설정 문제였습니다.