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 new credentials from PUBLIC_KEY key pairs

Create a Web3j instance with the specified BAOBAB_URL

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

Gas price and gas limit settings

Get chain ID from the network

Get the nonce for the sender's address

Generate a new account key for account update from created public key

Set transaction type as ACCOUNT_UPDATE

Create a raw transaction for account update

Sign the transaction

Send the signed transaction to kaia network

Wait for the transaction to be completed and get the transaction receipt

Shut down the Web3j instance

Decode the raw transaction to get the transaction type

AccountUpdateWithPubKeyExample.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.account.AccountKeyPublic;
import org.web3j.crypto.transaction.type.TxType;
import org.web3j.crypto.transaction.type.TxTypeAccountUpdate;
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.core.methods.response.EthSendTransaction;
import org.web3j.protocol.kaia.Web3j;
import org.web3j.protocol.http.HttpService;
import org.web3j.utils.Numeric;
import org.web3j.protocol.kaia.core.method.response.TransactionReceipt;
public class AccountUpdateWithPubKeyExample {
public static void run() throws Exception {
KlayCredentials credentials = KlayCredentials.create(keySample.PUBLIC_KEY_privkey, keySample.PUBLIC_KEY_address);
Web3j web3j = Web3j.build(new HttpService(keySample.BAOBAB_URL));
BigInteger GAS_PRICE = BigInteger.valueOf(50000000000L);
BigInteger GAS_LIMIT = BigInteger.valueOf(6721950);
String from = credentials.getAddress();
EthChainId EthchainId = web3j.ethChainId().send();
long chainId = EthchainId.getChainId().longValue();
BigInteger nonce = web3j.ethGetTransactionCount(from, DefaultBlockParameterName.LATEST).send()
.getTransactionCount();
BigInteger newPubkey = credentials.getEcKeyPair().getPublicKey();
AccountKeyPublic accountkey = AccountKeyPublic.create(newPubkey);
TxType.Type type = Type.ACCOUNT_UPDATE;
KlayRawTransaction raw = KlayRawTransaction.createTransaction(
type,
nonce,
GAS_PRICE,
GAS_LIMIT,
from,
accountkey);
byte[] signedMessage = KlayTransactionEncoder.signMessage(raw, chainId, credentials);
String hexValue = Numeric.toHexString(signedMessage);
EthSendTransaction transactionResponse = web3j.ethSendRawTransaction(hexValue).send();
System.out.println("TxHash : \n " + transactionResponse.getResult());
String txHash = transactionResponse.getResult();
int DEFAULT_POLLING_ATTEMPTS_PER_TX_HASH = 40;
int DEFAULT_BLOCK_TIME = 1 * 1000;
long DEFAULT_POLLING_FREQUENCY = DEFAULT_BLOCK_TIME;
TransactionReceiptProcessor transactionReceiptProcessor = new PollingTransactionReceiptProcessor(web3j,
DEFAULT_POLLING_FREQUENCY, DEFAULT_POLLING_ATTEMPTS_PER_TX_HASH);
org.web3j.protocol.core.methods.response.TransactionReceipt ethReceipt = transactionReceiptProcessor
.waitForTransactionReceipt(txHash);
System.out.println("Receipt from eth_getTransactionReceipt : \n" + ethReceipt);
TransactionReceipt receipt = web3j.klayGetTransactionReceipt(txHash).send().getResult();
System.out.println("Receipt from klay_getTransactionReceipt : \n" + receipt);
web3j.shutdown();
TxTypeAccountUpdate rawTransaction = TxTypeAccountUpdate.decodeFromRawTransaction(signedMessage);
System.out.println("TxType : " + rawTransaction.getKlayType());
}
}

output

❯ java AccountUpdateWithPubKeyExample.java
TxHash :
0x45737947e3cd5812a426150ec35b687239e2444baac3b26173c98295bdde318d
Receipt from eth_getTransactionReceipt :
TransactionReceipt{transactionHash='0x45737947e3cd5812a426150ec35b687239e2444baac3b26173c98295bdde318d', transactionIndex='0x2', blockHash='0x2cf21f03340bb37ce103d692cfe9bba51046c061a9d4474369cdcac1b338e13d', blockNumber='0x908fa16', cumulativeGasUsed='0x5daef', gasUsed='0xa028', contractAddress='null', root='null', status='0x1', from='0xa2a8854b1802d8cd5de631e690817c253d6a9153', to='0xa2a8854b1802d8cd5de631e690817c253d6a9153', logs=[], logsBloom='0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', revertReason='null', type='0x0', effectiveGasPrice='0x5d21dba00'}
Receipt from klay_getTransactionReceipt :
class TransactionReceipt {
blockHash: 0x2cf21f03340bb37ce103d692cfe9bba51046c061a9d4474369cdcac1b338e13d
blockNumber: 0x908fa16
codeFormat: null
contractAddress: null
feePayer: null
feePayerSignatures: []
feeRatio: null
from: 0xa2a8854b1802d8cd5de631e690817c253d6a9153
gas: 0x66919e
effectiveGasPrice: 0x5d21dba00
gasPrice: 0xba43b7400
gasUsed: 0xa028
humanReadable: null
key: 0x02a103dc9dccbd788c00fa98f7f4082f2f714e799bc0c29d63f04d48b54fe6250453cd
input: null
logs: []
logsBloom: 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
nonce: 0x3e3
senderTxHash: 0x45737947e3cd5812a426150ec35b687239e2444baac3b26173c98295bdde318d
signature: []
status: 0x1
txError: null
to: null
transactionHash: 0x45737947e3cd5812a426150ec35b687239e2444baac3b26173c98295bdde318d
transactionIndex: 0x2
type: TxTypeAccountUpdate
typeInt: 32
value: null
}
TxType : ACCOUNT_UPDATE