了解 Solana 的铸币账户和代币账户

Solana dApp 开发提出了一些新的挑战,特别是对于那些像我一样之前有过类似以太坊开发经验的人,其中智能合约包括代码和状态存储。在 Solana 世界中,程序不包含任何数据,而是引用可以存储数据的帐户。对于开发人员来说,这是一个巨大的范式变化,但它极大地有助于提高性能,因为这使得程序能够并发运行,只要它们不访问相同的帐户数据。

另一个优点是,无需为每个新代币部署新程序,而使用 ERC-20 标准时通常会出现这种情况。事实上,令牌的功能始终是相同的,不同的是与特定令牌关联的数据。因此,Solana 开发人员包含了一个已部署的标准代币计划,可供任何人用于创建、铸造、交易甚至销毁代币。

一张图片说明一切

下图说明了令牌计划、其使用的账户以及相关角色之间的关系:

Token Program, Accounts and Roles
图 1:代币计划、相关帐户和角色(使用 Sketchboard.io 制作)

第一个元素是令牌程序本身,它已经部署并可供使用。

铸币账户

当有人想要创建一个新的代币时,他使用create-token函数来初始化一个新的Mint账户,其中包含有关该代币的基本信息:mint-authority 是被授权铸造此令牌的公钥 (pubkey),freeze-authority 可以冻结令牌帐户(将在下面描述) ,以及一些附加数据,例如代币的总supplydecimalsisInitialized标志。该帐户存储有关令牌以及谁对其具有权限的一般信息。请注意,没有有关特定个人持有代币的数据。这些存储在令牌帐户中。

代币账户

令牌账户保存了与公钥拥有的令牌相关的信息。然而,所有权关系会有点混乱。令牌账户本身由令牌程序拥有,并且是令牌程序通过账户内的所有者(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
图1:获取空投并查看余额

创建铸币账户

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
图2:创建铸币账户

区块链的一个有趣之处在于,任何人都可以查看帐户的原始十六进制内容。让我们使用以下命令检查 mint 帐户

solana account $ALICE_TOKEN

下图显示了示例输出:

图3:铸币账户的内容

前 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>
图 4:创建令牌帐户

查看代币帐户的原始内容也很有趣:

solana account $ALICE_ALICETOKENACCOUNT
Figure 5: Raw content of a token account图 5:代币账户的原始内容

图5中的元数据显示了分配给该代币账户的公钥、免租存储的余额、所有者是代币程序等。红色框中突出显示的是薄荷帐户公钥(使用 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 个零。另请注意,数字值在令牌帐户中以 little-endian 顺序存储。

node -e 'a=41394000000000; console.log(a.toString(16))'

造币厂账户也会更新以反映总供应量:

Figure 9: Total supply in the mint account图 9:铸币账户中的总供应量

当然,spl-token 提供了子命令来检查 pubkey 的总供应量和余额:

spl-token balance --address $ALICE_ALICETOKENACCOUNT
spl-token supply $ALICE_TOKEN

其中,给出以下结果:

图 10:用户代币余额和代币供应量

燃烧代币

当代币经济政策规定时,可能有必要销毁代币。 Alice 可以使用 spl-token 的子命令 <​​sd1>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 和处理授权至关重要。也许,为未来的分期付款提供了大量的材料。

要了解更多信息,官方文档是一个很好的起点:

Docs代币计划 | Solana 程序库文档
💡
原文链接:GooseAcademy
本文由SlerfTools翻译,转载请注明出处。

SlerfTools专为Solana设计的工具箱,致力于简化区块链操作,提供无编程全可视化界面,使发币管理流动性无代码创建Dapp等复杂过程变得安全简单。