本系列想尽量以快速上手的目的来讲解 Solana。并且在实践的过程中穿插新概念。
又开了一个新坑,开始写 Solana 系列,本系列想尽量以快速上手的目的来讲解 Solana。并且在实践的过程中穿插新概念。
以下指令有时效性,以官方手册为主。
安装流程:
## 安装 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
. "$HOME/.cargo/env"
rustc --version
## 安装 Solana CLI
sh -c "$(curl -sSfL https://release.anza.xyz/stable/install)"
echo 'export PATH="$HOME/.local/share/solana/install/active_release/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
solana --version
## 更新 Solana
agave-install update
安装完 Solana CLI,等下我们要用到的 spl-token CLI 也安装好了。
查看安装的版本。
solana -V
spl-token -V
在本篇文章中,我们主要学习命令行来创建 Token。并不是说只能用 CLI 来创建,也可以使用 solana/web3.js。
Solana 同样有网页版的编辑器。在其中创建好钱包,并切换开发者网络,就可以直接使用 spl-token
命令。而在自己的电脑终端,需要先配置网络和钱包,之后在使用 spl-token
命令。
以下是在自己终端配置网络和钱包。也可以跳过看具体的 spl-token
命令,在 https://beta.solpg.io/ 在线使用,并部署到开发者网络。
Solana的网络环境分成开发者网、测试网、主网三类,官方RPC地址分别是:
DevNet: https://api.devnet.solana.com TestNet: https://api.testnet.solana.com MainNet: https://api.mainnet-beta.solana.com
使用 DevNet:
solana config set --url https://api.devnet.solana.com
创建账号:
solana-keygen new --force
# 之后需要你输入密码
# 设置好密码后,将会提示 keypair 被存放的路径,以及其对应的 BIP39 的助记词
# 并且会显示当前账号的 pubkey,也可以使用以下命令来查看
solana-keygen pubkey
在这里简单使用一些指令
显示当前钱包地址
solana address
申请水龙头
solana airdrop 5
查看当前钱包余额
solana balance
查看账户信息
solana account 5NhLjdFKocoRMqic9sqAe5TxLagJCoCBunzg51ioMYot
Public Key: 5NhLjdFKocoRMqic9sqAe5TxLagJCoCBunzg51ioMYot
Balance: 5 SOL
Owner: 11111111111111111111111111111111 // 系统地址
Executable: false // 并非可执行的,属于个人地址
Rent Epoch: 18446744073709551615 // 租赁期限
使用 spl-token -h
和 spl-token create-token -h
查看我们创建 Token 的选项,这里就不全列出来了,读者可自行查看。
USAGE:
spl-token [FLAGS] [OPTIONS] <SUBCOMMAND>
USAGE:
spl-token create-token [FLAGS] [OPTIONS] [TOKEN_KEYPAIR]
假如,现在我们需要创建一个 6 位小数的 Token,命令如下:
➜ spl-token create-token --decimals 6
Creating token CSNbBCYXVcDj4U7YMV1otuL6xtAiaARDA6Zz3ApGUKFj under program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
Address: CSNbBCYXVcDj4U7YMV1otuL6xtAiaARDA6Zz3ApGUKFj
Decimals: 6
Signature: 5kLjwFbvK8LBMS5fYytf3hd4geHsKXahJxt6WAeyEZumvidWxCtr1xiRj2XiTvze2ju3Uv5uBW23EwkPHPxNh1t8
不传 --decimals
就默认 9 位。
其中,Address 是 token mint 地址,相当于以太坊的代币地址。
现在开始铸造代币,使用 spl-token mint -h
查看铸造的相关参数。
USAGE:
spl-token mint [FLAGS] [OPTIONS] <TOKEN_MINT_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]
我们账户地址为 5NhLjdFKocoRMqic9sqAe5TxLagJCoCBunzg51ioMYot,现在想给这个地址铸造代币。
spl-token mint CSNbBCYXVcDj4U7YMV1otuL6xtAiaARDA6Zz3ApGUKFj 10000000 5NhLjdFKocoRMqic9sqAe5TxLagJCoCBunzg51ioMYot
会发现报错了。
Error: "Account 5NhLjdFKocoRMqic9sqAe5TxLagJCoCBunzg51ioMYot is owned by 11111111111111111111111111111111, not configured program id TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
因为在 Solana 中,一个账户还需要有专门的 token account
去存相应的代币,并且一个 token account
只存一种 token。
所以,我们需要先给我们的账户创建 token 为 CSNbBCYXVcDj4U7YMV1otuL6xtAiaARDA6Zz3ApGUKFj 对应的 token account
。
spl-token create-account CSNbBCYXVcDj4U7YMV1otuL6xtAiaARDA6Zz3ApGUKFj
Creating account Ckn7Lgg5rWDF7zPuB5TpdGFrMMyDX4R76J9jMCu4T1uV
得到我们这个账户存放这个 token 对应的 token account
: Ckn7Lgg5rWDF7zPuB5TpdGFrMMyDX4R76J9jMCu4T1uV
现在重新来 mint。
spl-token mint CSNbBCYXVcDj4U7YMV1otuL6xtAiaARDA6Zz3ApGUKFj 10000000 Ckn7Lgg5rWDF7zPuB5TpdGFrMMyDX4R76J9jMCu4T1uV
Minting 10000000 tokens
Token: CSNbBCYXVcDj4U7YMV1otuL6xtAiaARDA6Zz3ApGUKFj
Recipient: Ckn7Lgg5rWDF7zPuB5TpdGFrMMyDX4R76J9jMCu4T1uV
有了代币后,我们第一想到的是进行转账,使用 spl-token transfer -h
来查看转账的参数。
USAGE:
spl-token transfer [FLAGS] [OPTIONS] <TOKEN_MINT_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_WALLET_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>
先使用以下命令创建第二个账户。
solana-keygen new --outfile ~/.config/solana/id2.json
===========================================================================
pubkey: DioJjiAuBPZp5hQB3GuedGXGq5bKpJWSeJ2C4cneq5Cs
===========================================================================
Save this seed phrase and your BIP39 passphrase to recover your new keypair:
addict industry theme alley raise edit stone output wreck knife deer pistol
===========================================================================
给 id2 领取空投。
solana airdrop 5 --keypair ~/.config/solana/id2.json
然后对这个地址转 100 个代币:
# --from 后面跟上 token account
spl-token transfer CSNbBCYXVcDj4U7YMV1otuL6xtAiaARDA6Zz3ApGUKFj 100 DioJjiAuBPZp5hQB3GuedGXGq5bKpJWSeJ2C4cneq5Cs --from Ckn7Lgg5rWDF7zPuB5TpdGFrMMyDX4R76J9jMCu4T1uV
注意,我们在以太坊中,输入的参数默认都是以 wei 作为单位,但是在 solana 中,可以输入小数。
也会发现报错了。
Transfer 100 tokens
Sender: Ckn7Lgg5rWDF7zPuB5TpdGFrMMyDX4R76J9jMCu4T1uV
Recipient: DioJjiAuBPZp5hQB3GuedGXGq5bKpJWSeJ2C4cneq5Cs
Recipient associated token account: 38SiT4KDEdfEBfV6ZKhCNqueecueEqDomkFzgWsVXz3S
因为我们填的收款地址是钱包地址,而不是对方的 token account
。根据提示,添加 --fund-recipient
。
➜ spl-token transfer CSNbBCYXVcDj4U7YMV1otuL6xtAiaARDA6Zz3ApGUKFj 100 DioJjiAuBPZp5hQB3GuedGXGq5bKpJWSeJ2C4cneq5Cs --from Ckn7Lgg5rWDF7zPuB5TpdGFrMMyDX4R76J9jMCu4T1uV --fund-recipient
Transfer 100 tokens
Sender: Ckn7Lgg5rWDF7zPuB5TpdGFrMMyDX4R76J9jMCu4T1uV
Recipient: DioJjiAuBPZp5hQB3GuedGXGq5bKpJWSeJ2C4cneq5Cs
Recipient associated token account: 38SiT4KDEdfEBfV6ZKhCNqueecueEqDomkFzgWsVXz3S
Funding recipient: 38SiT4KDEdfEBfV6ZKhCNqueecueEqDomkFzgWsVXz3S
Signature: 4Y5XYbNpmQpfUgDU5Vi2VGKQgbTM5JRaUKnQRMF8NhDqP3QRBsKr4shiWH46UtPqdZkKX3awApteLhWXTbGkFysM
使用 spl-token authorize -h
查看使用说明。
USAGE:
spl-token authorize [FLAGS] [OPTIONS] <TOKEN_ADDRESS> <AUTHORITY_TYPE> <AUTHORITY_ADDRESS>
放弃 mint 权限。
spl-token authorize CSNbBCYXVcDj4U7YMV1otuL6xtAiaARDA6Zz3ApGUKFj mint --disable
重新 mint 一次试试。
spl-token mint CSNbBCYXVcDj4U7YMV1otuL6xtAiaARDA6Zz3ApGUKFj 10000000 Ckn7Lgg5rWDF7zPuB5TpdGFrMMyDX4R76J9jMCu4T1uV
Minting 10000000 tokens
Token: CSNbBCYXVcDj4U7YMV1otuL6xtAiaARDA6Zz3ApGUKFj
Recipient: Ckn7Lgg5rWDF7zPuB5TpdGFrMMyDX4R76J9jMCu4T1uV
Error: Client(Error { request: Some(SendTransaction), kind: RpcError(RpcResponseError { code: -32002, message: "Transaction simulation failed: Error processing Instruction 0: custom program error: 0x5", data: SendTransactionPreflightFailure(RpcSimulateTransactionResult { err: Some(InstructionError(0, Custom(5))), logs: Some(["Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]", "Program log: Instruction: MintToChecked", "Program log: Error: the total supply of this token is fixed", "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4147 of 4147 compute units", "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA failed: custom program error: 0x5"]), accounts: None, units_consumed: Some(4147), return_data: None, inner_instructions: None }) }) })
mint 失败,说明铸造权限已经关闭。
并且从浏览器中的 Porfile Summary
可以看到没有 Update Authority
这一栏。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!