실행환경: 맥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());
}
}