了解 Solana 的铸币账户和代币账户
Solana dApp 开发提出了一些新的挑战,特别是对于那些像我一样之前有过类似以太坊开发经验的人,其中智能合约包括代码和状态存储。在 Solana 世界中,程序不包含任何数据,而是引用可以存储数据的帐户。对于开发人员来说,这是一个巨大的范式变化,但它极大地有助于提高性能,因为这使得程序能够并发运行,只要它们不访问相同的帐户数据。
另一个优点是,无需为每个新代币部署新程序,而使用 ERC-20 标准时通常会出现这种情况。事实上,令牌的功能始终是相同的,不同的是与特定令牌关联的数据。因此,Solana 开发人员包含了一个已部署的标准代币计划,可供任何人用于创建、铸造、交易甚至销毁代币。
一张图片说明一切
下图说明了令牌计划、其使用的账户以及相关角色之间的关系:
第一个元素是令牌程序本身,它已经部署并可供使用。
铸币账户
当有人想要创建一个新的代币时,他使用create-token
函数来初始化一个新的Mint账户,其中包含有关该代币的基本信息:mint-authority
是被授权铸造此令牌的公钥 (pubkey),freeze-authority
可以冻结令牌帐户(将在下面描述) ,以及一些附加数据,例如代币的总supply
、decimals
和isInitialized
标志。该帐户存储有关令牌以及谁对其具有权限的一般信息。请注意,没有有关特定个人持有代币的数据。这些存储在令牌帐户中。
代币账户
令牌账户保存了与公钥拥有的令牌相关的信息。然而,所有权关系会有点混乱。令牌账户本身由令牌程序拥有,并且是令牌程序通过账户内的所有者(owner)、关闭权限(close-authority)和委派字段(delegate)来控制对这些令牌的访问。所有者是可以花费/转移令牌的公钥,关闭权限可以关闭账户,而所有者可以授予委派公钥使用最多委派数量的令牌。除了这些字段,还有一些标志:isInitialized(是否已初始化)、isFrozen(是否已冻结)、isNative(是否为原生令牌)。默认情况下,令牌账户在创建时被初始化,不被冻结,并且不是原生令牌。之前,我们看到铸币账户定义了一个冻结权限,该权限有权冻结用户账户中的令牌。通常情况下,冻结权限为空(全零)。在这种情况下,没有人可以冻结令牌账户中持有的相应令牌。
理论太多了,让我们在实践中看看这一切
Solana CLISolana CLI
我们将使用 Solana 工具套件与 Token 程序进行交互。你可以在这里得到它:
安装 Solana 工具套件 | 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
创建铸币账户
spl-token
程序中的 create-token
函数创建 mint 帐户。默认情况下,初始供应量为零,冻结权限为空。以下命令创建 Mint 帐户,将其 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
区块链的一个有趣之处在于,任何人都可以查看帐户的原始十六进制内容。让我们使用以下命令检查 mint 帐户:
solana account $ALICE_TOKEN
下图显示了示例输出:
前 6 行是帐户的元数据,显示其公钥、余额、所有者、是否可执行、租金纪元和长度。如前所述,铸币账户的所有者是Token程序。公钥是在创建帐户期间生成的,并唯一标识给定的令牌。一小笔余额(从付费方转入)被分配给该账户以“支付租金”,这在 Solana 世界中是在区块链中存储账户数据的成本。该金额的计算符合“免租金”最低金额,因此只要帐户持有该最低金额,实际上就不需要支付租金。
其余行显示帐户包含的十六进制原始数据。 mint-authority
的 pubkey 是前 32 个突出显示的字节。稍晚一点的 09
是 decimals
字段。在这种情况下,freeze-authority
为空(归零)。
以下节点单行显示了 ALICE 的 base58 公钥的十六进制版本,以证实:
node -e 'console.log(require("bs58").decode("TULnhBExK6hwmrmGfzcMSeDH58qCttzugnWakbmERva"))'
创建代币账户
任何想要持有任何代币的用户都需要相应代币的代币帐户。令牌帐户是使用 spl-token
的 create-account
子命令创建的,如下所示:
spl-token create-account \
--owner $PK_ALICE \
--fee-payer $KP_ALICE $ALICE_TOKENALICE_ALICETOKENACCOUNT=<token account pubkey>
查看代币帐户的原始内容也很有趣:
solana account $ALICE_ALICETOKENACCOUNT
图5中的元数据显示了分配给该代币账户的公钥、免租存储的余额、所有者是代币程序等。红色框中突出显示的是薄荷帐户公钥(使用 node -e ‘console.log(require(“bs58”).decode(“3XspNCGyc2iD2jvwb7XMBCCqkSiztJEtv3Swv5nRa56Q”))’
进行检查),绿色框是令牌所有者,在本例中是我们已经知道的 ALICE 的 pubkey。
值得庆幸的是,为了满足未来的需求,spl-token
实用程序包含一个子命令来为我们解码令牌帐户。命令是:
spl-token account-info --address $ALICE_ALICETOKENACCOUNT
它返回解码后的信息,如下所示:
铸造代币
铸币机构可以为任何用户铸造代币。此过程会更新用户的余额(在代币帐户中)和供应量(在铸币帐户中)。为了铸造代币,我们使用 spl-token
的 mint
子命令,如下所示:
spl-token mint $ALICE_TOKEN 41394 $ALICE_ALICETOKENACCOUNT \
--fee-payer $KP_ALICE \
--mint-authority $KP_ALICE
它产生这样的输出:
如果我们查看代币账户,我们会看到更新后的金额,如下图所示:
下面一行让我们验证十六进制值。请注意与令牌小数相对应的 9 个零。另请注意,数字值在令牌帐户中以 little-endian 顺序存储。
node -e 'a=41394000000000; console.log(a.toString(16))'
造币厂账户也会更新以反映总供应量:
当然,spl-token
提供了子命令来检查 pubkey 的总供应量和余额:
spl-token balance --address $ALICE_ALICETOKENACCOUNT
spl-token supply $ALICE_TOKEN
其中,给出以下结果:
燃烧代币
当代币经济政策规定时,可能有必要销毁代币。 Alice 可以使用 spl-token
的子命令 <sd1>burn 销毁自己的代币,如下所示:
spl-token burn $ALICE_ALICETOKENACCOUNT 394 \
--fee-payer $KP_ALICE \
--owner $KP_ALICE
图 11 说明了燃烧并检查之后的余额和供应情况:
关闭代币账户
如果 Alice 不再使用该特定代币,她可以关闭该代币账户并取回剩余的 SOL 余额。请注意,关闭帐户之前余额必须为零。以下是关闭令牌帐户的命令:
spl-token close \
--address $ALICE_ALICETOKENACCOUNT \
--fee-payer $KP_ALICE \
--owner $KP_ALICE
图 12 说明了关闭账户并显示了 SOL 余额的增加,因为代币账户的剩余余额被转回给 Alice。
此后,该帐户将被删除,释放区块链中的相应空间,如图 13 所示:
结束语
我们讨论了 Solana 区块链中铸币和代币账户的概念元素,并通过命令行工具说明了它们的操作。这只是冰山一角,还有更多操作,例如冻结铸币账户,这对于创建 NFT 和处理授权至关重要。也许,为未来的分期付款提供了大量的材料。
要了解更多信息,官方文档是一个很好的起点:
Docs代币计划 | Solana 程序库文档
本文由SlerfTools翻译,转载请注明出处。
SlerfTools是专为Solana设计的工具箱,致力于简化区块链操作,提供无编程全可视化界面,使发币、管理流动性和无代码创建Dapp等复杂过程变得安全简单。