Prerequisite Readings
Cosmos SDK Accounts
Learn about account structure in Cosmos SDK
Ethereum Accounts
Understand Ethereum account model
Creating Accounts
To create one account you can either create a private key, a keystore file (a private key protected by a password), or a mnemonic phrase (a string of words that can access multiple private keys). Aside from having different security features, the biggest difference between each of these is that a private key or keystore file only creates one account. Creating a mnemonic phrase gives you control of many accounts, all accessible with that same phrase. Cosmos blockchains, like the Cosmos Hub, support creating accounts with mnemonic phrases, otherwise known as hierarchical deterministic key generation (HD keys). This allows the user to create accounts on multiple blockchains without having to manage multiple secrets. HD keys generate addresses by taking the mnemonic phrase and combining it with a piece of information called a derivation path. Blockchains can differ in which derivation path they support. To access all accounts from an mnemonic phrase on a blockchain, it is therefore important to use that blockchain’s specific derivation path.Representing Accounts
The terms “account” and “address” are often used interchangeably to describe crypto wallets. In the Cosmos SDK, an account designates a pair of public key (PubKey) and private key (PrivKey). The derivation path defines what the private key, public key, and address would be. The PubKey can be derived to generate various addresses in different formats, which are used to identify users (among other parties) in the application. A common address form for Cosmos chains is the bech32 format (e.g.cosmos1...
). Addresses are also associated with messages to identify the sender of the message.
The PrivKey is used to generate digital signatures to prove that an address associated with the PrivKey approved of a given message. The proof is performed by applying a cryptographic scheme to the PrivKey, known as Elliptic Curve Digital Signature Algorithm (ECDSA), to generate a PubKey that is compared with the address in the message.
EVM Accounts
Cosmos EVM defines its own customAccount
type to implement a HD wallet that is compatible with Ethereum type addresses. It uses Ethereum’s ECDSA secp256k1 curve for keys (eth_secp265k1
) and satisfies the EIP84 for full BIP44 paths. This cryptographic curve is not to be confused with Bitcoin’s ECDSA secp256k1 curve.
The root HD path for EVM-based accounts is m/44'/60'/0'/0
. It is recommended to use the Coin type 60
to support Ethereum type accounts, unlike many other Cosmos chains that use Coin type 118
(list of coin types
The custom Cosmos EVM EthAccount satisfies the AccountI
interface from the Cosmos SDK auth module and includes additional fields that are required for Ethereum type addresses:
SetCodeHash
functionality.
For more information on Ethereum accounts head over to the x/vm module.
Addresses and Public Keys
BIP-0173 defines a new format for segregated witness output addresses that contains a human-readable part that identifies the Bech32 usage. There are 3 main types of HRP for theAddresses
/PubKeys
available by default on the Cosmos EVM:
Purpose: Identify users (e.g., transaction senders)
- Curve:
eth_secp256k1
- Address Prefix:
cosmos
- Pubkey Prefix:
cosmospub
- Address Length: 20 bytes
- Pubkey Length: 33 bytes (compressed)
Address formats for clients
EthAccount
can be represented in both Bech32 (e.g. cosmos1...
) and hex (0x...
) formats for Ethereum’s Web3 tooling compatibility.
The Bech32 format is the default for Cosmos-SDK queries and transactions, while the hex format is used for Ethereum compatibility.
Address conversion
Theevmd debug addr <address>
can be used to convert an address between hex and bech32 formats:
Key output
The Cosmos SDK Keyring output (i.e
evmd keys
) only supports addresses and public keys in Bech32 format.keys show
command with the flag --bech <type>
to obtain different address formats:
Querying an Account
You can query an account address using CLI, gRPC, REST, or JSON-RPC:For JSON-RPC methods, see
eth_accounts
and personal_listAccounts
documentation.