Implicit Accounts
Backgroundโ
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.
Specificationsโ
Creating an account locallyโ
For the purpose of this demo, we'll use the betanet
network.
Set betanet
networkโ
export NEAR_ENV=betanet
Generating a key-pair firstโ
near generate-key --saveImplicit
Example Output
Seed phrase: lumber habit sausage used zebra brain border exist meat muscle river hidden
Key pair: {"publicKey":"ed25519:AQgnQSR1Mp3v7xrw7egJtu3ibNzoCGwUwnEehypip9od","secretKey":"ed25519:51qTiqybe8ycXwPznA8hz7GJJQ5hyZ45wh2rm5MBBjgZ5XqFjbjta1m41pq9zbRZfWGUGWYJqH4yVhSWoW6pYFkT"}
Implicit account: 8bca86065be487de45e795b2c3154fe834d53ffa07e0a44f29e76a2a5f075df8
Storing credentials for account: 8bca86065be487de45e795b2c3154fe834d53ffa07e0a44f29e76a2a5f075df8 (network: testnet)
Saving key to '~/.near-credentials/testnet/8bca86065be487de45e795b2c3154fe834d53ffa07e0a44f29e76a2a5f075df8.json'
Using the Implicit Accountโ
We can export our account ID to a bash env variable:
export ACCOUNT="8bca86065be487de45e795b2c3154fe834d53ffa07e0a44f29e76a2a5f075df8"
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 send 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 send <your_account_id> 0861ea8ddd696525696ccf3148dd706c4fda981c64d8a597490472594400c223 <amount>
BONUS: Converting public key using python (for learning purposes)โ
For this flow we'll use python3
(with version 3.5+
) with base58
library.
You can install this library with pip3
:
pip3 install --user base58
Start python3 interpreter:
python3
The first thing is to get the data part from the public key (without ed25519:
prefix). Let's store it in a variable pk58
:
pk58 = 'BGCCDDHfysuuVnaNVtEhhqeT4k9Muyem3Kpgq2U1m9HX'
Now let's import base58:
import base58
Finally, let's convert our base58 public key representation to bytes and then to hex:
base58.b58decode(pk58).hex()
Output:
'98793cd91a3f870fb126f66285808c7e094afcfc4eda8a970f6648cdf0dbd6de'
This gives us the same account ID as near-cli
, so this is encouraging.
Note: The default network for near-cli
is testnet
. If you would like to change this to mainnet
or betanet
, please see near-cli
network selection for instructions.