Skip to main content

Role-based Account Key

AccountKeyRoleBased represents a role-based key. If an account has an AccountKeyRoleBased object and the transaction type is one except account update, the validation process is done according to each roles like below:

Import extend from web3py_ext to extend web3 to kaia web3

Import necessary utils from eth_account, web3py_ext and cytools

Create a Web3 instance with the specified kaia Baobab testnet URL

Also, you can change the provider URL from baobab to allthatnode.

Load 3 accounts from private key

Creating an empty transaction of type TxType.ACCOUNT_UPDATE. You can use empty_tx util to get a tx with default fields filled.

Merge additional fields like sender and keys into the empty tx by using the merge util.

In this case, the account key to update is the role-based key and the possible key type of each role is the legacy, public or multisig.

You can use the compressed_key util to set each role key. It will extract the compressed public key from the key

Use fill_transaction to add more params to transaction object like gas limit...

You can use the to_pretty util to print the formatted tx.

Sign the account update tx type. You must sign it with the loaded update_role account

Sending the signed transaction to the network and waiting receipt until it is completely executed in the blockchain

web3_account_update_role_based.py

from web3py_ext import extend
from web3 import Web3
from eth_account import Account
from web3py_ext.klaytn_account.utils import compressed_key
from web3py_ext.klaytn_account.account_key import KeyType
from web3py_ext.transaction.transaction import (
empty_tx,
fill_transaction,
TxType
)
from web3py_ext.utils.klaytn_utils import (
to_pretty,
bytes_to_hex_str
)
from cytoolz import merge
w3 = Web3(Web3.HTTPProvider(
'https://public-en-kairos.node.kaia.io'
))
def web3_account_update_role_based():
# Just for testing, user1 and user2 have the same key
tx_role = Account.from_key("0xc9668ccd35fc20587aa37a48838b48ccc13cf14dd74c8999dd6a480212d5f7ac");
update_role = Account.from_key("0x9ba8cb8f60044058a9e6f815c5c42d3a216f47044c61a1750b6d29ddc7f34bda");
fee_payer_role = Account.from_key("0x0e4ca6d38096ad99324de0dde108587e5d7c600165ae4cd6c2462c597458c2b8");
account_update_tx = empty_tx(TxType.ACCOUNT_UPDATE)
account_update_tx = merge(account_update_tx, {
'from' : update_role.address, # 0x5bd2fb3c21564c023a4a735935a2b7a238c4ccea
'key' : {
'type': KeyType.ROLE_BASED,
'keys' : {
'roleTransactionKey': {
'type': KeyType.PUBLIC,
'key': compressed_key(tx_role)
},
'roleAccountUpdateKey': {
'type': KeyType.PUBLIC,
'key': compressed_key(update_role)
},
'roleFeePayerKey': {
'type': KeyType.PUBLIC,
'key': compressed_key(fee_payer_role)
}
}
}
})
account_update_tx = fill_transaction(account_update_tx, w3)
print(to_pretty(account_update_tx))
# sign the kaia specific transaction type with web3py
signed_tx = Account.sign_transaction(account_update_tx, update_role.key)
print('\nrawTransaction:', bytes_to_hex_str(signed_tx.rawTransaction))
tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
print('tx hash: ', tx_hash, 'receipt: ', tx_receipt)
web3_account_update_role_based()

output

❯ py web3_account_update_role_based.py
{
"from": "0x5bD2fb3c21564C023A4A735935a2B7A238C4cCEA",
"gas": 159000,
"gasPrice": 50000000000,
"nonce": 52,
"chainId": 1001,
"type": 32,
"key": {
"type": 5,
"keys": {
"roleTransactionKey": {
"type": 2,
"key": "0x03f26489914098c5da51f0f646e3000da4d6197217df082b4f7ce1530f0a0cbf2a"
},
"roleAccountUpdateKey": {
"type": 2,
"key": "0x0263021199702b9fefca617bdcb2a9ed4a810dfa8d270d4e804a1e778450e63ec3"
},
"roleFeePayerKey": {
"type": 2,
"key": "0x03dc9dccbd788c00fa98f7f4082f2f714e799bc0c29d63f04d48b54fe6250453cd"
}
}
}
}
rawTransaction: 20f8da34850ba43b740083026d18945bd2fb3c21564c023a4a735935a2b7a238c4cceab86f05f86ca302a103f26489914098c5da51f0f646e3000da4d6197217df082b4f7ce1530f0a0cbf2aa302a10263021199702b9fefca617bdcb2a9ed4a810dfa8d270d4e804a1e778450e63ec3a302a103dc9dccbd788c00fa98f7f4082f2f714e799bc0c29d63f04d48b54fe6250453cdf847f8458207f5a089c7e842c90cb3639a929b4d012b13b68ea680543ec31a05b53863580e93de4ba05ad477c3edf141c7f88a87ba12249500eff7532a448f33a6325d95c831f51d47
tx hash: 0x523877191b60450bf48ef29db40ee7191a0c5525af3255bea191c02970c088c7 receipt: AttributeDict({'blockHash': HexBytes('0xf51f2bd1926578bf912353f6eea1b025271706eb83c438429184759dae902f5b'), 'blockNumber': 150554144, 'contractAddress': None, 'cumulativeGasUsed': 81000, 'effectiveGasPrice': 25000000000, 'from': '0x5bD2fb3c21564C023A4A735935a2B7A238C4cCEA', 'gasUsed': 81000, 'logs': [], 'logsBloom': HexBytes('0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'), 'status': 1, 'to': '0x5bD2fb3c21564C023A4A735935a2B7A238C4cCEA', 'transactionHash': HexBytes('0x523877191b60450bf48ef29db40ee7191a0c5525af3255bea191c02970c088c7'), 'transactionIndex': 0, 'type': 0})