Accounts
Crypto Wallets (or Accounts) can be created and represented in unique ways on different blockchains. For developers who interface with account types on Guru, e.g. during wallet integration on their dApp frontend, it is therefore important to understand that accounts on Guru are implemented to be compatible with Ethereum type addresses.
Prerequisite Readings
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, 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. guru1...).
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.
Guru Accounts
Guru defines its own custom Account 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 Evmos-based accounts is m/44'/60'/0'/0.
Guru uses the Coin type 60 to support Ethereum type accounts,
unlike many other Cosmos chains that use Coin type 118 (list of coin types)
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.
Guru uses the following HRP (human readable prefix) as the base HRP:
| Network | Mainnet | Testnet |
|---|---|---|
| Guru | guru | guru |
There are 3 main types of HRP for the Addresses/PubKeys available by default on Guru:
- Addresses and Keys for accounts, which identify users (e.g. the sender of a
message). They are derived using theeth_secp256k1curve. - Addresses and Keys for validator operators, which identify the operators of validators. They are derived using
the
eth_secp256k1curve. - Addresses and Keys for consensus nodes, which identify the validator nodes participating in consensus. They are
derived using the
ed25519curve.
| Address bech32 Prefix | Pubkey bech32 Prefix | Curve | Address byte length | Pubkey byte length | |
|---|---|---|---|---|---|
| Accounts | guru | gurupub | eth_secp256k1 | 20 | 33 (compressed) |
| Validator Operator | guruvaloper | guruvaloperpub | eth_secp256k1 | 20 | 33 (compressed) |
| Consensus Nodes | guruvalcons | guruvalconspub | ed25519 | 20 | 32 |
Address formats for clients
EthAccount can be represented in both Bech32 (guru1...)
and hex (0x...) formats for Ethereum's Web3 tooling compatibility.
The Bech32 format is the default format for Cosmos-SDK queries and transactions through CLI and REST
clients. The hex format on the other hand, is the Ethereum common.Address representation of a
Cosmos sdk.AccAddress.
- Address (Bech32):
guru10jmp6sgh4cc6zt3e8gw05wavvejgr5pwggsdaj - Address (EIP55 Hex):
0x7CB61D4117AE31A12E393A1CFA3BAC666481D02E - Compressed Public Key:
{"@type":"/cosmos.evm.crypto.v1.ethsecp256k1.PubKey","key":"A5LuwPzowaWjWd3y1cekZnOLw/w4twRtgbgU05gR1a/d"}
Address conversion
The gurud debug addr <address> can be used to convert an address between hex and bech32 formats. For example:
$ gurud debug addr guru10jmp6sgh4cc6zt3e8gw05wavvejgr5pwggsdaj
Address: [124 182 29 65 23 174 49 161 46 57 58 28 250 59 172 102 100 129 208 46]
Address (hex): 7CB61D4117AE31A12E393A1CFA3BAC666481D02E
Bech32 Acc: guru10jmp6sgh4cc6zt3e8gw05wavvejgr5pwggsdaj
Bech32 Val: guruvaloper10jmp6sgh4cc6zt3e8gw05wavvejgr5pwrdtkut
Bech32 Con: guruvalcons10jmp6sgh4cc6zt3e8gw05wavvejgr5pwh7c2s2
$ gurud debug addr 7CB61D4117AE31A12E393A1CFA3BAC666481D02E
Address: [124 182 29 65 23 174 49 161 46 57 58 28 250 59 172 102 100 129 208 46]
Address (hex): 7CB61D4117AE31A12E393A1CFA3BAC666481D02E
Bech32 Acc: guru10jmp6sgh4cc6zt3e8gw05wavvejgr5pwggsdaj
Bech32 Val: guruvaloper10jmp6sgh4cc6zt3e8gw05wavvejgr5pwrdtkut
Bech32 Con: guruvalcons10jmp6sgh4cc6zt3e8gw05wavvejgr5pwh7c2s2
Key output
The Cosmos SDK Keyring output (i.e gurud keys) only supports addresses and public keys in Bech32 format.
We can use the command gurud keys show with the flag --bech <type> (acc|val|cons) to
obtain the addresses and keys as mentioned above.
$ gurud keys show mykey --bech acc
- address: guru10jmp6sgh4cc6zt3e8gw05wavvejgr5pwggsdaj
name: mykey
pubkey: '{"@type":"/cosmos.evm.crypto.v1.ethsecp256k1.PubKey","key":"A5LuwPzowaWjWd3y1cekZnOLw/w4twRtgbgU05gR1a/d"}'
type: local
$ gurud keys show mykey --bech val
- address: guruvaloper10jmp6sgh4cc6zt3e8gw05wavvejgr5pwrdtkut
name: mykey
pubkey: '{"@type":"/cosmos.evm.crypto.v1.ethsecp256k1.PubKey","key":"A5LuwPzowaWjWd3y1cekZnOLw/w4twRtgbgU05gR1a/d"}'
type: local
$ gurud keys show mykey --bech cons
- address: guruvalcons10jmp6sgh4cc6zt3e8gw05wavvejgr5pwh7c2s2
name: mykey
pubkey: '{"@type":"/cosmos.evm.crypto.v1.ethsecp256k1.PubKey","key":"A5LuwPzowaWjWd3y1cekZnOLw/w4twRtgbgU05gR1a/d"}'
type: local
Querying an Account
You can query an account address using the CLI, gRPC or
Command Line Interface
# NOTE: the --output (-o) flag will define the output format in JSON or YAML (text)
$ gurud q auth account $(gurud keys show mykey -a) -o text
account:
type: /cosmos.auth.v1beta1.BaseAccount
value:
address: guru10jmp6sgh4cc6zt3e8gw05wavvejgr5pwggsdaj
public_key:
type: /cosmos.evm.crypto.v1.ethsecp256k1.PubKey
value:
key: A5LuwPzowaWjWd3y1cekZnOLw/w4twRtgbgU05gR1a/d
sequence: "1"
Cosmos gRPC and REST
# GET /cosmos/auth/v1beta1/accounts/{address}
curl -X GET "http://localhost:10337/cosmos/auth/v1beta1/accounts/guru10jmp6sgh4cc6zt3e8gw05wavvejgr5pwggsdaj" -H "accept: application/json"
JSON-RPC
To retrieve the Ethereum hex address using Web3,
use the JSON-RPC eth_accounts
or personal_listAccounts endpoints:
# query against a local node
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}' -H "Content-Type: application/json" http://localhost:8545
curl -X POST --data '{"jsonrpc":"2.0","method":"personal_listAccounts","params":[],"id":1}' -H "Content-Type: application/json" http://localhost:8545