Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Solana command line #344

Open
chochinlu opened this issue Dec 3, 2021 · 0 comments
Open

Solana command line #344

chochinlu opened this issue Dec 3, 2021 · 0 comments
Labels

Comments

@chochinlu
Copy link
Owner

chochinlu commented Dec 3, 2021

場外教學

https://www.brianfriel.xyz/how-to-create-a-token-on-solana/ token外場教學

不管 FT 或是 NFT 都是利用 SPL(Solana Program Library)建立的

代幣跟以太坊的很像, 差別是:

One key difference, however, is that Solana does not require you to deploy a new contract for each token you create. Instead, it simply requires you to send instructions to the Token Program and it will create and mint tokens on your behalf.
你不用每次建立一個token都要部署一個新的合約, 你只要送指令(instructions)到 Token Program, 該program就會幫你建造和鑄造代幣

要理解 Solana account model, account 就像是一個儲存桶, 可以存任何東西, 從token 到 program state(integers, strings, public keys)都可以, 甚至program本身

每個account有自己的owner, 一個owner可以擁有多種不同的accounts

account除了有owner的address外, 也有自己的address方便識別

Vanity Address: 產生可以方便識別的address

$ spl-token create-token --enable-freeze

加了 --enable-freeze 才有凍結該代幣的權限, 不然一但鑄造了, 就無法凍結

具體來說, spl-token 執行了兩條instructions(指令):

  1. To create a new account (this is carried out by the System Program) 創建一個新帳戶(這由系統程序執行)
  2. To recognize this new account as a Token Mint 將此新帳戶識別為令牌鑄幣廠

Solana將兩個instructions(指令)綁到同一個transaction中

流程就是這樣, 我們的account告訴token program要做token, 那system program會先建立一個新帳戶,
然後 token program就會接著把該system program建立的新帳戶做初始化的狀態

查看transaction 會發現, 我們自己的account會被扣掉約 0.31usd(台幣約9塊) 的 SOL, 然後被扣掉的這些SOL, 主要都流到了我們建立的鑄造廠mint account

相對於其他交易(transaction), 建立account的費用是高很多的, why? 因為建立一個新的account, 我們要求所有的validators節點追蹤儲存在account中的所有資訊, 為了彌補這種資源消耗, Solana收取基於時間和空間的費用, 叫做rent(租金)

如果該account沒有符合最低rent需求, 就會被關閉

為了避免這樣, 幾乎所有account都付一次性的費用(標記該account為 rent-exempt), 這樣就可以永久存活

查看該代幣mint account, 會發現兩個 Mint Authority 和 Freeze Authority, 原則上一開始就是一開始建立該鑄造廠的人

注意 mint account一開始沒有任何供應量supply, mint account只是儲存描述該token的metadata, 並沒有持有實際token

$ spl-token mint <PASTE-YOUR-MINT-ADDRESS-HERE> 1000000000

這樣會有錯誤:

Minting 1000000000 tokens
  Token: <YOUR-MINT-ADDRESS>
  Recipient: <SOME-NEW-ADDRESS>
Account could not be parsed as token account: pubkey=<SOME-NEW-ADDRESS>

Recipient address是新的沒看過的,

會報錯是說這個account不能被解析為token account

在 Solana 上,我們的代幣餘額都存儲在自己獨特的賬戶中。 這種帳戶叫做 Associated Token Accounts

這個衍生出來的account只被當作為一般的account, 所以需要修正一下:

spl-token create-account <PASTE-YOUR-MINT-ADDRESS-HERE>

有ok的, 在solana explorer上面就會標記為 Token Account

新建立的token都會被標記為 Unknown Token, 如果你要註冊你的名字和logo, 你就要提交程式碼到 Solana-labs的 token-list 裏面:

  • 更新 assets/mainnet
  • 更新 src/tokens/solana.tokenlist.json

如果你要在devnet加上logo和名字, 那麼要加上 chainId 為 103

同場加映logo顏色表:
綠: #3AEEAA
藍綠: #55A6C6
紫紅: #CF2CFC

尋找特定名字開頭的keypair

solana-wallet solana-keygen grind --starts-with park:1 --ignore-case
Searching with 8 threads for:
	1 pubkey that starts with 'park' and ends with ''
Searched 1000000 keypairs in 5s. 0 matches found.
Searched 2000000 keypairs in 11s. 0 matches found.
Searched 3000000 keypairs in 18s. 0 matches found.
Searched 4000000 keypairs in 24s. 0 matches found.
Searched 5000000 keypairs in 30s. 0 matches found.
Searched 6000000 keypairs in 37s. 0 matches found.
Searched 7000000 keypairs in 43s. 0 matches found.
Searched 8000000 keypairs in 50s. 0 matches found.
Searched 9000000 keypairs in 56s. 0 matches found.
Searched 10000000 keypairs in 63s. 0 matches found.
Searched 11000000 keypairs in 70s. 0 matches found.
Searched 12000000 keypairs in 77s. 0 matches found.
Searched 13000000 keypairs in 84s. 0 matches found.
Searched 14000000 keypairs in 90s. 0 matches found.
Searched 15000000 keypairs in 98s. 0 matches found.
Wrote keypair to Parknbq9NiXKJhdZQpeq1eRfnJc8KWBBJMyicpNNx8K.json

--start-with 尋找開頭為 park 的, 只列出第一個符合的address, 忽略大小寫

建立給 Token 的 Address: (後面加上我們建立的keypair)

spl-token create-token [FLAGS] [OPTIONS] [--] [TOKEN_KEYPAIR]

Transferring Tokens

我們發送一個instruction給 token program, 裡面有一個叫做 transfer的 command

token program 通知 system program 幫我們要發送的對象建立一個associated account 給我們的對象, 該account的owner當然就設定為我們要發送的對象

然後我們的token mint就會transfer 指定數量的token過去

Freezing Tokens

可以凍結或是解凍 associated token account

Burning Tokens

spl-token burn

摘要

建立一個token並且mint之後,

在 user account 可以查詢 token list

token mint 會出現 supply 的數量

(associated) token account 會出現 token balance

CLI

https://spl.solana.com/token

CLI整理

CLI是更新最快的, 用這個可以確認到最新的功能

spl-tokensolana 共用 config設定檔

set cluster RPC URL:

$ solana config set --url https://api.devnet.solana.com

建立新的keypair: https://docs.solana.com/wallet-guide/file-system-wallet

$ mkdir ~/my-solana-wallet
$ solana-keygen new --outfile ~/my-solana-wallet/my-keypair.json
~ solana config get
Config File: ...../config.yml
RPC URL: https://api.devnet.solana.com
WebSocket URL: wss://api.devnet.solana.com/ (computed)
Keypair Path: ...../my-keypair.json
Commitment: confirmed

Set keypair :

$ solana config set --keypair ${HOME}/...../my-keypair.json

查看 keypair:

~ solana-keygen pubkey .......t/my-keypair.json
4..................W

airdrop:

$ solana airdrop 1

create token:

~ spl-token create-token
Creating token 8..........g

Signature: 6.................N

explorer.solana.com 查看, 可以看到目前supply為 0 , 或是利用:

~ spl-token supply 8...........g
0

所以我們需要鑄造Mint token, 首先需要建立一個account來放鑄造好的token

~ spl-token create-account 8........g
Creating account 9........r

Signature: 4.....K

這個account一開始應該是空的: (注意是用token address查, 不是用該account address查詢)

~ spl-token balance 8......g
0

建立好account, 就可以 mint了:

~ spl-token mint 8...........g 100
Minting 100 tokens
  Token: 8.........g
  Recipient: 9..........r  //就是我們建立的account

Signature: 2.......q

這樣再度查詢的時候, token supply為100, 該account的token balance也為100 :

~ spl-token supply 8Yd77bbZEaedi3bxqdaQHv7XEQCnGgDQELZ2CToCQMxg
100~ spl-token balance 8Yd77bbZEaedi3bxqdaQHv7XEQCnGgDQELZ2CToCQMxg
100

查看一下目前擁有的代幣種類:

~ spl-token accounts
Token                                         Balance
---------------------------------------------------------------
8..........g  100
8..........C  100
So11111111111111111111111111111111111111112   0.99796072

Wrap native SOL in a SOL token account:

~ spl-token wrap 1
Wrapping 1 SOL into 5.......k

Signature: E.............6

這個 5.......k 是一個 Token Account

查看solana explorer 會發現, 該 Token Account 的 Owner 為我們剛所創建的my-keypair.json的account 4.......W

wrap 進去的 1顆SOL 被分為: Token balance (SOL) 數量為 0.997960720, 和 Rent-exempt reserve (SOL) , 數量為 0.002039280, 加起來為1

查看 4..................W 的交易紀錄, 就會看到是從 4..................W 轉了1顆SOL 到 5.......k 這個token account

注意在 4..................W 被扣掉的是. 1顆SOL + fee (0.000005 SOL)

5.......k 存入了一顆SOL

這個token有兩個account , 一個是存放mint好的token , 一個是存放放入的SOL

把token轉給其他帳戶:

~ spl-token transfer --fund-recipient 8...g 50 G.....Z
Transfer 50 tokens
  Sender: 9...r
  Recipient: G....Z
  Recipient associated token account: H.....G
  Funding recipient: H.........G (0.00203928 SOL)

Signature: 5..............K

一樣, 你要轉過去的address也要有可以存放該token的account才行, 如果還沒有, 需要加上 --fund-recipient 參數, 會順便建立receiver關聯的可存該token的account , 例如這裡receiver為 G....Z , 他的可存該token的account為 H.....G

注意用這個方式, 費用是由sender承擔

查看一下該token account的狀態:

~ spl-token accounts 8.....g
Balance
-------------
50~ spl-token accounts 8.....g -v  // 擁有該token 的 account列表
Account                                       Balance
-------------------------------------------------------------
9.........r  50

彼此這些關聯的token account 可以互相轉帳

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant