Skip to main content

Public Account Key

AccountKeyPublic is used for accounts having one public key. If an account has an AccountKeyPublic object, the transaction validation process is done like below:

Import necessary classes from the Web3j and kaia libraries(web3j-ext).

Create a Web3j instance with the specified BAOBAB_URL

Also, you can change the default provider. For example, using the alchemy provider.

Create a credential from a key pair which is a public key type

Gas price and gas limit settings

Set the sender address equal to the loaded credential's address

Get chain ID from the network

Set the receiver address equal to any valid address

Get the nonce for the sender's address

Set the value to transfer

Set transaction type as VALUE_TRANSFER

Create a raw transaction for value transfer

Sign the transaction

Send the signed transaction to kaia network

Recover the sender address from signed transaction and compare it to the from address

Shut down the Web3j instance

SignTxWithPubkeyExample.java

package org.web3j.example.accountKey;
import org.web3j.tx.response.PollingTransactionReceiptProcessor;
import org.web3j.tx.response.TransactionReceiptProcessor;
import org.web3j.example.keySample;
import java.io.IOException;
import java.math.BigInteger;
import org.web3j.crypto.KlayCredentials;
import org.web3j.crypto.KlayRawTransaction;
import org.web3j.crypto.KlayTransactionEncoder;
import org.web3j.crypto.transaction.type.TxType;
import org.web3j.crypto.transaction.type.TxType.Type;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.response.EthChainId;
import org.web3j.protocol.http.HttpService;
import org.web3j.protocol.kaia.Web3j;
import org.web3j.protocol.kaia.core.method.response.KlayRecoverFromTransactionResponse;
import org.web3j.utils.Numeric;
import org.web3j.protocol.core.methods.response.EthSendTransaction;
/**
*
*/
public class SignTxWithPubkeyExample implements keySample {
/**
*
*/
public static void run() throws Exception {
Web3j web3j = Web3j.build(new HttpService(keySample.BAOBAB_URL));
KlayCredentials credentials1 = KlayCredentials.create(keySample.PUBLIC_KEY_privkey,
keySample.PUBLIC_KEY_address);
BigInteger GAS_PRICE = BigInteger.valueOf(50000000000L);
BigInteger GAS_LIMIT = BigInteger.valueOf(6721950);
String from = credentials1.getAddress();
EthChainId EthchainId = web3j.ethChainId().send();
long chainId = EthchainId.getChainId().longValue();
String to = "0x000000000000000000000000000000000000dead";
BigInteger nonce = web3j.ethGetTransactionCount(from, DefaultBlockParameterName.LATEST).send()
.getTransactionCount();
BigInteger value = BigInteger.valueOf(100);
TxType.Type type = Type.VALUE_TRANSFER;
KlayRawTransaction raw = KlayRawTransaction.createTransaction(
type,
nonce,
GAS_PRICE,
GAS_LIMIT,
to,
value,
from);
byte[] signedMessage = KlayTransactionEncoder.signMessage(raw, chainId, credentials1);
String hexValue = Numeric.toHexString(signedMessage);
EthSendTransaction transactionResponse = web3j.ethSendRawTransaction(hexValue).send();
System.out.println("TxHash : \n " + transactionResponse.getResult());
String blockNumber = "latest";
KlayRecoverFromTransactionResponse response = web3j.klayRecoverFromTransaction(hexValue, blockNumber)
.send();
System.out.println("Original address : " + from);
System.out.println("Result address : " + response.getResult());
web3j.shutdown();
}
}

output

❯ java SignTxWithPubkeyExample.java
TxHash :
0xcb3c9869bdb600e6fdb74fe06a727900f8beb3126b5a8e899e29d5fbba7873f6
Original address : 0xe15cd70a41dfb05e7214004d7d054801b2a2f06b
Result address : 0xe15cd70a41dfb05e7214004d7d054801b2a2f06b