Nhảy đến nội dung chính

Implicit Account

Background

Các implicit account làm việc tương tự như các account Bitcoin/Ethereum.

  • Chúng cho phép bạn đặt account ID trước khi tạo bằng cách generate ra key-pair ED25519 một cách cục bộ.
  • Key-pair này có một public key map với account ID.
  • Account ID là một hex viết thường của public key.
  • Một ED25519 Public key chứa 32 byte, map với 64 ký tự của account ID.
  • Secret key tương ứng cho phép bạn sign các transaction thay cho account này sau khi nó được tạo trên chain.

Đặc điểm kỹ thuật

Tạo một account local

Với mục đích của bản demo này, chúng ta sẽ sử dụng betanet network.

Cài đặt betanet network

export NEAR_ENV=betanet

Tạo một key-pair đầu tiên

near generate-key tmp1

Ví dụ output

Generated key pair with ed25519:BGCCDDHfysuuVnaNVtEhhqeT4k9Muyem3Kpgq2U1m9HX public key

It generates a key-pair for tmp1 account ID. The new public key is ed25519:BGCCDDHfysuuVnaNVtEhhqeT4k9Muyem3Kpgq2U1m9HX.

Một public key của NEAR được biểu diễn bởi <curve>:<data>.

  • Curve is either ed25519 or secp256k1. For implicit accounts we only support ed25519.
  • Data is a base58 encoding of the public key. For ed25519 it contains 32 bytes.

Command này đã tạo ra một key-pair và lưu trữ nó ở local tại:

~/.near-credentials/betanet/tmp1.json

Chi tiết hơn về key-pair

Chạy command này để hiển thị nội dung của tệp key-pair:

cat ~/.near-credentials/betanet/tmp1.json

Nội dung:

{"account_id":"tmp1","public_key":"ed25519:BGCCDDHfysuuVnaNVtEhhqeT4k9Muyem3Kpgq2U1m9HX","private_key":"ed25519:4qAABW9HfVW4UNQjuQAaAWpB21jqoP58kGqDia18FZDRat6Lg6TLWdAD9FyvAd3PPQLYF4hhx2mZAotJudVjoqfs"}

As you can see, it's a valid json-file and public key matches the one we generated. The private_key is a secret/private key of the key pair that can be used to sign transactions with the corresponding public key.

Convert một public key thành một account ID.

Hãy convert một public key của NEAR từ chuỗi ed25519:BGCCDDHfysuuVnaNVtEhhqeT4k9Muyem3Kpgq2U1m9HX

Cách dễ nhất là sử dụng near-cli tương tác với repl thông qua console

1) Bắt đầu với near repl:

near repl

2) Gán base58 public key bằng một local constant:

const pk58 = 'ed25519:BGCCDDHfysuuVnaNVtEhhqeT4k9Muyem3Kpgq2U1m9HX'

3) Bây giờ hãy parse public key và convert nó tới hex trên cùng một dòng:

nearAPI.utils.PublicKey.fromString(pk58).data.hexSlice()

Kết quả là một account ID có dạng hex (không bao gồm '):

'98793cd91a3f870fb126f66285808c7e094afcfc4eda8a970f6648cdf0dbd6de'

Bây giờ account ID mới là 98793cd91a3f870fb126f66285808c7e094afcfc4eda8a970f6648cdf0dbd6de.

4) Chúng ta đưa account ID cho ai đó và bảo họ transfer các token.

Di chuyển key-pair tạm thời

Cuối cùng, chúng ta cần chuyển tmp1.json key-pair tới account ID thật, để near-cli có thể sử dụng nó để sign các transaction.

Đầu tiên hãy export account ID tới một bash env variable:

export ACCOUNT="98793cd91a3f870fb126f66285808c7e094afcfc4eda8a970f6648cdf0dbd6de"

Bây giờ bạn có thể chuyển file tmp1.json:

mv ~/.near-credentials/betanet/tmp1.json ~/.near-credentials/betanet/$ACCOUNT.json

NOTE: While .json key-pair file still contains the "account_id":"tmp1", it's okay. Because near-cli doesn't care.

Giả sử bạn đã nhận các token trên account mới của mình, bạn có thể transfer từ nó sử dụng command dưới đây:

near $ACCOUNT <receiver> <amount>

Bạn cũng có thể thay thế $ACCOUNT với account ID thật của mình, ví dụ.

near send 98793cd91a3f870fb126f66285808c7e094afcfc4eda8a970f6648cdf0dbd6de <receiver> <amount>

Transfer tới 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>

Bổ sung: convert public key sử dụng python (dành cho mục đích học tập)

Chúng ta sẽ sử dụng python3 (version 3.5+) với thư viện base58 để thực hiện lại flow phía trên.

Bạn có thể cài thư viện này với pip3:

pip3 install --user base58

Khởi động trình thông dịch python3:

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'

Bây giờ hãy import base58:

import base58

Cuối cùng, hãy convert base58 publickey của chúng ta tới các byte và sau đó là hex:

base58.b58decode(pk58).hex()

Kết quả:

'98793cd91a3f870fb126f66285808c7e094afcfc4eda8a970f6648cdf0dbd6de'

Cách này tạo ra cho chúng ta cùng một account ID giống như sử dụng near-cli, vì vậy nó được khuyến khích.

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.