文章详细介绍了在Solana区块链上开发去中心化应用(dApp)时面临的挑战,特别是与以太坊智能合约开发的不同之处。文章重点讲解了Solana的Token Program、Mint Accounts和 Token Accounts的概念,并通过实际操作演示了如何使用Solana CLI工具创建和管理这些账户。
Solana dApp 开发带来了一些新的挑战,特别是对于那些像我一样有过类似以太坊开发经验的人来说,智能合约既包含代码又包含状态存储。在 Solana 的世界中,程序不包含任何数据,而是引用可以存储数据的账户。对于开发人员来说,这是一个巨大的范式转变,但这极大地帮助提高了性能,因为只要程序不访问相同的账户数据,它们就可以并发运行。
另一个好处是,与通常使用 ERC-20 标准时不同,不需要为每个新代币部署新的程序。事实上,代币的功能总是相同的,不同的是与特定代币相关的数据。因此,Solana 开发者已经包含了一个标准的 代币程序,已经部署完毕,任何人都可以使用它来创建、铸币、交易甚至销毁代币。
下图说明了代币程序、它使用的账户以及相关角色之间的关系:
图 1:代币程序、相关账户和角色(使用 Sketchboard.io 制作)
第一个元素是代币程序本身,它已经部署完毕并可以使用。
当有人想要创建一个新代币时,他会使用 create-token
函数来初始化一个新的 Mint 账户,该账户包含代币的基本信息:mint-authority
是一个被授权铸造该代币的公钥 (pubkey),freeze-authority
可以冻结代币账户(将在下面描述),以及一些附加数据,如代币的总 supply
,decimals
的数量,以及 isInitialized
标志。该账户存储了有关代币及其权限的通用信息。注意到这里没有关于特定个人代币持有量的数据。这些数据存储在 代币账户 中。
代币账户 保存了由 pubkey 拥有的代币信息。然而,所有权关系会有点混乱。代币账户本身由代币程序拥有,代币程序通过账户中的 owner
、close-authority
和 delegate
字段控制对这些代币的访问。owner
是能够花费/转移代币的 pubkey,close-authority
可以关闭账户,owner
可以授权 delegate
pubkey 花费最多 delegatedAmount
的代币。除了这些字段外,还有一些标志:isInitialized
、isFrozen
、isNative
。默认情况下,代币账户在创建时被初始化,不会被冻结,并且不是本地的。之前我们看到,mint 账户定义了一个 freeze-authority
,它有权冻结用户账户中的代币。通常,freeze-authority
为 null(全零)。在这种情况下,没有人可以冻结代币账户中持有的相应代币。
我们将使用 Solana 工具套件与代币程序进行交互。你可以在这里获取它:
安装完成后,我们可以配置工具套件以连接到 devnet,如下所示:
solana config set --url devnet
用户需要一个密钥对(即 公钥及其对应的私钥)来持有 SOL 并与 Solana 区块链进行交易。他们还需要持有一些 SOL 以支付网络费用。幸运的是,开发网络会“空投”少量 SOL 给任何请求的人。
让我们首先使用工具套件中的 solana-keygen
命令创建一个密钥对:
solana-keygen new -o ~/.config/solana/kp_alice.json
KP_ALICE=~/.config/solana/kp_alice.json
PK_ALICE=`solana address -k $KP_ALICE`
echo $PK_ALICE
环境变量 KP_ALICE 和 PK_ALICE 分别指包含私钥的文件和公钥的值。
然后,为这个账户请求空投,并使用以下命令检查余额:
solana airdrop 1 $PK_ALICE
solana balance $PK_ALICE
图 1:获取空投并检查余额
spl-token
程序中的 create-token
函数创建 mint account。默认情况下,初始供应量为零,冻结权限为 null。以下命令创建铸币账户,将其 pubkey 存储在 ALICE_TOKEN 变量中,并显示代币的供应量和 Alice 在支付费用后的 SOL 余额:
spl-token create-token \
--mint-authority $KP_ALICE \
--fee-payer $KP_ALICE
ALICE_TOKEN=<token address>
spl-token supply $ALICE_TOKEN
solana balance $PK_ALICE
图 2:创建铸币账户
Solana 区块链的一个有趣之处在于,任何人都可以查看账户的原始十六进制内容。让我们使用以下命令检查 mint account:
solana account $ALICE_TOKEN
以下图显示了示例输出:
图 3:铸币账户的内容
前六行是账户的元数据,显示其 pubkey、余额、所有者、是否可执行、租金Epoch和长度。如前所述,铸币账户的所有者是 Token 程序。公钥是在创建账户时生成的,并唯一标识给定的代币。一个小余额(从费用支付者转移)被分配给该账户以“支付租金”,在 Solana 世界中,这就是存储账户数据在区块链上的成本。该金额被计算为匹配“免租”最低值,因此只要账户保持此最低值,实际上就不需要支付租金。
其余行显示账户包含的十六进制原始数据。mint-authority
的 pubkey 是前 32 个高亮字节。稍后的 09
是 decimals
字段。在这种情况下,freeze-authority
是 null(全为零)。
以下节点一行代码显示 ALICE 的 base58 公钥的十六进制版本,以进行验证:
node -e 'console.log(require("bs58").decode("TULnhBExK6hwmrmGfzcMSeDH58qCttzugnWakbmERva"))'
任何希望持有特定代币的用户,都需要为相应的代币创建一个 token account。代币账户使用 spl-token
的 create-account
子命令创建,如下所示:
spl-token create-account \
--owner $PK_ALICE \
--fee-payer $KP_ALICE $ALICE_TOKENALICE_ALICETOKENACCOUNT=<token account pubkey>
图 4:创建代币账户
查看代币账户的原始内容也很有趣:
solana account $ALICE_ALICETOKENACCOUNT
图 5:代币账户的原始内容
图 5 中的元数据显示分配给该代币账户的公钥、免租存储的余额、所有者是 Token 程序等。红框中高亮的是铸币账户的 pubkey(使用 node -e ‘console.log(require(“bs58”).decode(“3XspNCGyc2iD2jvwb7XMBCCqkSiztJEtv3Swv5nRa56Q”))’
进行检查),绿色框是代币所有者,在这种情况下是 ALICE 的 pubkey,我们已经知道。
幸运的是,为了满足未来的需求,spl-token
工具包括一个子命令来解码代币账户。该命令是:
spl-token account-info --address $ALICE_ALICETOKENACCOUNT
这将返回解码的信息,如下所示:
图 6:解码的代币账户信息
铸币权限可以为任何用户铸造代币。此过程会更新用户的余额(在代币账户中)和供应量(在铸币账户中)。要铸造代币,我们使用 spl-token
的 mint
子命令,如下所示:
spl-token mint $ALICE_TOKEN 41394 $ALICE_ALICETOKENACCOUNT \
--fee-payer $KP_ALICE \
--mint-authority $KP_ALICE
这将产生如下输出:
图 7:铸造代币
如果我们查看代币账户,我们将看到更新后的金额,如下图所示:
图 8:代币账户中的余额
以下一行代码让我们验证十六进制值。请注意,9 个零对应于代币的小数位数。还要注意,数值在代币账户中以 小端 顺序存储。
node -e 'a=41394000000000; console.log(a.toString(16))'
铸币账户也会更新以反映总供应量:
当然,spl-token
提供子命令来检查总供应量和某个 pubkey 的余额:
spl-token balance --address $ALICE_ALICETOKENACCOUNT
spl-token supply $ALICE_TOKEN
这将给出以下结果:
图 10:用户代币余额和代币供应量
当代币经济政策要求时,可能需要销毁代币。Alice 可以使用 spl-token
的 burn
子命令销毁自己的代币,如下所示:
spl-token burn $ALICE_ALICETOKENACCOUNT 394 \
--fee-payer $KP_ALICE \
--owner $KP_ALICE
图 11 说明了销毁代币并检查余额和供应量的过程:
图 11:销毁代币,检查余额和供应量
如果 Alice 不再使用这个特定的代币,她可以关闭代币账户并取回剩余的 SOL 余额。请注意,关闭账户之前余额必须为零。关闭代币账户的命令如下:
spl-token close \
--address $ALICE_ALICETOKENACCOUNT \
--fee-payer $KP_ALICE \
--owner $KP_ALICE
图 12 说明了关闭账户的过程,并显示 SOL 余额的增加,反映代币账户剩余余额被转回给 Alice。
图 12:关闭代币账户并返回 SOL 余额
之后,账户被删除,释放了区块链中的相应空间,如图 13 所示:
图 13:关闭的账户被删除
我们讨论了 Solana 区块链中铸币账户和代币账户的概念元素,并通过命令行工具展示了它们的操作。这只是冰山一角,还有许多其他操作,如冻结铸币账户,这对于创建 NFT 至关重要,以及处理委托。也许,这为未来的内容提供了丰富的材料。
- 原文链接: medium.com/@jorge_london...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!