Caver-java에서 TransactionReceipt가 null인 경우는 어떤 문제인가요?

안녕하세요, 먼저 질문해 주셔서 감사합니다.

확인해 본 결과, caver-java에서 Smart Contract 클래스와 관련된 버그로 확인되었습니다.
현재 버그 수정을 위한 변경 사항이 반영 되었으며, 이를 포함하여 rc버전으로 배포되었습니다.
관련된 PR은 링크 참고 부탁드립니다.
(PR : https://github.com/klaytn/caver-java/pull/77)

먼저 caver-java를 v1.3.2-rc.1 이상의 버전으로 사용하셔야 합니다.
질문에 올려 주신 코드를 바탕으로 수정한 이후 제대로 동작하는 테스트 코드를 작성하여 아래에 남깁니다.

    caver = Caver.build("http://0.0.0.0:7551"); // SCN URL

    Quantity chainId = caver.klay().getChainID().send();

    KlayCredentials testCredential = KlayCredentials.create("0xa70b79a6b587d257a4850767898d5f13e9417b6236b9af70880b1e8641e71fd8");
    KlayCredentials toCredential = KlayCredentials.create(Keys.createEcKeyPair());

    // Deploy smart contract
    JasmineTokenContract contractForDeployment = JasmineTokenContract.deploy(
            caver,
            testCredential,
            chainId.getValue().intValue(),
            new DefaultGasProvider(caver),
            "Jasmine",
            "JAS",
            BigInteger.valueOf(18),
            BigInteger.valueOf(100_000_000)
    ).send();

    // Load Smart Contract
    JasmineTokenContract contract = JasmineTokenContract.load(contractForDeployment.getContractAddress(), caver, testCredential, chainId.getValue().intValue(), *new DefaultGasProvider(caver)*);

    // Testing call method
    String name = contract.name().send();
    System.out.println("Token Contract name : " + name);

    // Testing send method
    KlayTransactionReceipt.TransactionReceipt transactionReceipt = contract.transfer(toCredential.getAddress(), BigInteger.ONE).send();

    if (transactionReceipt != null) {
        System.out.println("[TX HASH]:"+transactionReceipt.getTransactionHash());
    }

작성해 주신 코드에서 수정해 주셔야 하는 부분은 DefaultGasProvider를 생성할 때에 “new DefaultGasProvider(caver)” 이런 방식으로 caver를 파라미터로 전송해 주셔야 합니다.

먼저 질문하신 상황은 Gas unit price가 25Ston이 아닌 노드와 인터랙션 할 때에 생기는 문제입니다.
caver-java에서는 default로 gas price를 25Ston으로 세팅하고 있습니다.
또한 SmartContract 클래스에서는 gasProvider를 파라미터로 받으나, 실제로 트랜잭션을 생성할 때에 gasProvider의 gasPrice를 사용하고 있지 않는 버그 때문에 발생하는 문제였습니다.

위에 링크로 남긴 PR에는 이러한 버그들을 해결하였으며, new DefaultGasProvider(caver) 이렇게 caver를 defaultGasProvider에 파라미터로 전송하는 경우, Node에게 gasPrice를 물어보는 RPC콜을 날려 이 결과 값으로 gasPrice를 세팅하도록 변경되었습니다.

이해가 잘 안되시거나, 추가적인 질문 사항이 있는 경우 편하게 댓글로 남겨주세요 :slight_smile:

3개의 좋아요