Caver-java에서 get-started 예제 실행 중 오류 문의드립니다!

실행환경: 맥OS bigsur
caver-java version: com.klaytn.caver:core:1.5.0

https://ko.docs.klaytn.com/bapp/sdk/caver-java/getting-started
caver-java에서 나와 있는 예제로 klay전송하기를 테스트해보려하는데요~

javascript기준으로 소스 코드를 만드신 것 같습니다! (import 구문 추가 및 사용된 메소드 확인이 필요해보입니다!)

  • 이부분은 어찌 저찌 해서 제가 import는 했는데요~

valueTransfer에서 sign하는 부분에서

  • fillTransaction 메소드에서
    • nonce, chainId, gasPrice가 없다고 하면서 runtime exception이 발생됩니다

해당 부분은 어떻게 처리해야하는지 문의드립니다!

ps. 참고차 제 코드 첨부드립니다

package com.christoper.jin.klaytn.service;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.klaytn.caver.Caver;
import com.klaytn.caver.methods.response.Bytes32;
import com.klaytn.caver.methods.response.TransactionReceipt;
import com.klaytn.caver.transaction.response.PollingTransactionReceiptProcessor;
import com.klaytn.caver.transaction.response.TransactionReceiptProcessor;
import com.klaytn.caver.transaction.type.ValueTransfer;
import com.klaytn.caver.utils.Utils;
import com.klaytn.caver.wallet.keyring.AbstractKeyring;
import com.klaytn.caver.wallet.keyring.KeyStore;
import com.klaytn.caver.wallet.keyring.KeyringFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.web3j.crypto.CipherException;
import org.web3j.protocol.ObjectMapperFactory;
import org.web3j.protocol.exceptions.TransactionException;

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;

@Slf4j
@Service
public class KlaytnService {

    public void sendingKLAY() throws IOException, CipherException, TransactionException {
        Caver caver = new Caver(Caver.BAOBAB_URL);

        //keystore json 파일을 읽음.
        File file = new File("/Users/hyungeun.jin/Desktop/klaytn_baobab/keystore-0x3a31e4d502081cf7ebfaab52586bf29f6fbbf708-2022-1-24.json");

        // keystore 복호화.
        ObjectMapper objectMapper = ObjectMapperFactory.getObjectMapper();
        KeyStore keyStore = objectMapper.readValue(file, KeyStore.class);
        AbstractKeyring keyring = KeyringFactory.decrypt(keyStore, "password");//이부분은 실행 때에는 제 패스워드 입력해서 정상으로 넘어갔습니다~ caver.wallet.keyring.decrypt(keyStore, "password");

        // caver wallet에 추가
        caver.wallet.add(keyring);

        BigInteger value = new BigInteger(Utils.convertToPeb(BigDecimal.ONE, "KLAY"));

        // 자산 이전 트랜잭션 생성
//        ValueTransfer valueTransfer = caver.transaction.valueTransfer.create(
//                TxPropertyBuilder.valueTransfer()
//                        .setFrom(keyring.getAddress())
//                        .setTo("0x8084fed6b1847448c24692470fc3b2ed87f9eb47")
//                        .setValue(value)
//                        .setGas(BigInteger.valueOf(25000))
//        );
        ValueTransfer valueTransfer = new ValueTransfer.Builder()
                .setFrom(keyring.getAddress())
                .setTo("0x8084fed6b1847448c24692470fc3b2ed87f9eb47")
                .setValue(value)
                .setGas(BigInteger.valueOf(25000))
                .build();

        // 트랜잭션 서명
        valueTransfer.sign(keyring);

        // Klaytn으로 트랜잭션 전송
        Bytes32 result = caver.rpc.klay.sendRawTransaction(valueTransfer.getRawTransaction()).send();
        if(result.hasError()) {
            throw new RuntimeException(result.getError().getMessage());
        }

        // 트랜잭션 영수증 확인
        TransactionReceiptProcessor transactionReceiptProcessor = new PollingTransactionReceiptProcessor(caver, 1000, 15);
        TransactionReceipt.TransactionReceiptData transactionReceipt = transactionReceiptProcessor.waitForTransactionReceipt(result.getResult());
        log.debug("result hash: {} ", transactionReceipt.getBlockHash());
    }
}

안녕하세요.
일단 예제 코드에 나와있는 코드와 다른 것 같은데요. 정확하게 타이핑한 거 맞으실까요?
caver-java의 최신버전(1.6.3)을 사용해서 klaytn docs에 있는 예제를 테스트해보시면 될 것 같습니다.

추가로 설명드리자면,
fillTransaction() 하는 역할은, chainId, gasPrice, nonce를 Klaytn node를 통해 조회하여 자동으로 채워주는 역할을 합니다. 하지만 작성자분의 코드를 보면 ValueTransfer instance를 생성 시 Klaytn node에 조회하기 위한 klay instance를 넣어주는 부분이 없습니다.

ValueTransfer 객체를 생성 시에 setKlaytnCall()이라는 함수를 통해 klay instance를 넣어주거나 caver-java의 최신버전을 사용하여, 예제 소스에 있는 코드를 그대로 따라해보시기 바랍니다.

1 Like

@kingwang09

GitHub - klaytn/caver-java-examples 레포도 확인해보시면 좋을 거 같습니다.
caver-java-examples/CaverExample.java at master · klaytn/caver-java-examples · GitHub 요 시나리오를 참고해주세요 :slight_smile:

감사합니다.

빠르게 답변해주셔서 감사합니다!

말씀해주신 caver-java 1.6.3으로 바꾸니 klaytn docs에 있는 예제 그대로 import되네요!

다만, 이제 Caver.BAOBAB_URL 이 없는 것으로 나오네요!
테스트를 진행하기 위해서는 반드시 endpoint node를 실행해야하는지요~?

@kingwang09

Public Node API - KAS Docs 등이 있으니 참고 부탁드립니다.

운영중이신 노드가 없을 때 위와 같이 퍼블릭 노드를 사용하시면 테스트 가능하십니다.

https://klaytnapi.com 와 같은 서비스를 사용하시는 것도 방법입니다.


가이드에 나와있는 의존성 버전을 수정 부탁 드립니다