아래 예제에서 functionCallData.getBytes()가 Numeric.hexStringToByteArray(functionCallData)로 수정되었습니다.
caver-java로 컨트랙트 함수를 호출하는 방법은 두가지입니다. 하나는 Function 객체를 사용하여 트랜잭션을 수동으로 생성, 서명하는 방법, 그리고 다른 하나는 컨트랙트 객체를 사용하는 방법입니다.
예시로 남겨주신 코드는 이더리움에서 Function 객체를 사용하여 트랜잭션을 직접 생성하고 서명하는 코드입니다. 해당 방식은 caver-java로 다음과 같이 프로그래밍 할 수 있습니다.
// Common variables
int chainId = ChainId.BAOBAB_TESTNET;
DefaultBlockParameter blockParameter = DefaultBlockParameterName.LATEST;
BigInteger gasLimit = new DefaultGasProvider().getGasLimit();
// KlayCredentials senderCredential = KlayCredentials.create("private_key");
// Caver caver = Caver.build("URL of the Klaytn network you connect to (e.g., https://api.baobab.klaytn.net:8651/ for Baobab)");
// Using Function object
try {
// String contractAddress = "put_your_contract_address";
// Function function = new Function(...); // your Function object
// Using web3j FunctionEncoder is fine
String functionCallData = FunctionEncoder.encode(function);
// Get your nonce; refactor this as getNonce() if you want
BigInteger nonce = caver.klay().getTransactionCount(senderCredential.getAddress(), blockParameter).send().getValue();
// Explicitly create a transaction of type SmartContractExecutionTransaction
TxType tx = SmartContractExecutionTransaction
.create(senderCredential.getAddress(),
contractAddress,
BigInteger.ZERO,
Numeric.hexStringToByteArray(functionCallData),
gasLimit)
.nonce(nonce)
.build();
// This is your signed raw transaction
String rawTx = tx.sign(senderCredential, chainId).getValueAsString();
TransactionManager manager = new TransactionManager.Builder(caver, senderCredential)
.setTransactionReceiptProcessor(new PollingTransactionReceiptProcessor(caver, 1000, 10))
.setChaindId(chainId)
.build();
KlayTransactionReceipt.TransactionReceipt receipt = manager.executeTransaction(rawTx);
System.out.println(receipt);
} catch (Exception e) {
// handle exceptions
}
컨트랙트 객체를 사용할 경우 보다 간결하게 프로그래밍이 가능합니다. 컨트랙트 객체의 생성방법은 다음을 참조하시기 바랍니다.
// Same common variables are required
try {
// Using contract object instead of creating Function object manually.
// For this example, I used a simple example contract called Count to illustrate the use of the class.
// Use caver-java command line to generate contract class.
Count contract = Count.load(
contractAddress,
caver,
senderCredential,
chainId,
new DefaultGasProvider()
);
KlayTransactionReceipt.TransactionReceipt receipt = contract.setCount(BigInteger.valueOf(10)).send();
// Alternatively, you can use sendAsync().
// CompletableFuture<KlayTransactionReceipt.TransactionReceipt> future = contract.setCount(BigInteger.valueOf(10)).sendAsync();
// KlayTransactionReceipt.TransactionReceipt receipt = future.get();
System.out.println(receipt);
} catch (Exception e) {
// handle exceptions
}