Implicit accounts work similarly to Bitcoin/Ethereum accounts.
- They allow you to reserve an account ID before it's created by generating a ED25519 key-pair locally.
- This key-pair has a public key that maps to the account ID.
- The account ID is a lowercase hex representation of the public key.
- An ED25519 Public key contains 32 bytes that maps to 64 characters account ID.
- The corresponding secret key allows you to sign transactions on behalf of this account once it's created on chain.
Creating an account locally
For a purpose of this demo, we'll use the
Generating a key-pair first
near generate-key tmp1
Generated key pair with ed25519:BGCCDDHfysuuVnaNVtEhhqeT4k9Muyem3Kpgq2U1m9HX public key
It generates a key-pair for
tmp1 account ID. The new public key is
NEAR's string representation of a public key is
- Curve is either
secp256k1. For implicit accounts we only support
- Data is a base58 encoding of the public key. For
ed25519it contains 32 bytes.
This command generated a key-pair locally and stored it locally at:
Viewing the key-pair
Run this command to print the content of the key-pair file:
As you can see, it's a valid json-file and public key matches the one we generated.
private_key is a secret/private key of the key pair that can be used to sign transactions with the corresponding public key.
Converting a public key to an account ID.
Let's convert a public key from NEAR string representation
The easiest way is to use
near-cli with interactive console
- Store your base58 public key to a local constant:
const pk58 = 'ed25519:BGCCDDHfysuuVnaNVtEhhqeT4k9Muyem3Kpgq2U1m9HX'
- Now let's parse the public key and convert it to the hex in one line:
The output string is the account ID in hex (without
Now the new account ID is
- We can now give this account ID to someone and ask them to transfer tokens.
Moving the temporary key-pair
Finally, we need to move
tmp1.json key-pair to the real account ID, so that
near-cli can use it to sign transactions.
Let's first export our account ID to a bash env variable:
Now we can move the
mv ~/.near-credentials/betanet/tmp1.json ~/.near-credentials/betanet/$ACCOUNT.json
.json key-pair file still contains the
"account_id":"tmp1", it's okay. Because
near-cli doesn't care.
Assuming you've received tokens on your new account, you can transfer from it using the following command:
near $ACCOUNT <receiver> <amount>
You can also replace
$ACCOUNT with your actual account ID, e.g.
near 98793cd91a3f870fb126f66285808c7e094afcfc4eda8a970f6648cdf0dbd6de <receiver> <amount>
Transferring to the implicit account
Let's say someone gives you their account ID
0861ea8ddd696525696ccf3148dd706c4fda981c64d8a597490472594400c223. You can just transfer to it by running:
near <your_account_id> 0861ea8ddd696525696ccf3148dd706c4fda981c64d8a597490472594400c223 <amount>
BONUS: Converting public key using python (for learning purposes)
For this flow we'll use
python3 (with version
You can install this library with
pip3 install --user base58
Start python3 interpreter:
The first thing is to get the data part from the public key (without
ed25519: prefix). Let's store it in a variable
pk58 = 'BGCCDDHfysuuVnaNVtEhhqeT4k9Muyem3Kpgq2U1m9HX'
Now let's import base58:
Finally, let's convert our base58 public key representation to bytes and then to hex:
This gives us the same account ID as
near-cli, so this is encouraging.