Solana铸币账户和代币账户

在 Solana 世界中,程序不包含任何数据,而是引用可以存储数据的帐户。因此,为了使用标准的链上程序Token Program发行代币,涉及到两种新的账户:铸币账户(Mint Account)和代币账户(Token Account)。

Solana铸币账户和代币账户
一键发币: SOL | BNB | ETH | BASE | Blast | ARB | OP | POLYGON | AVAX | FTM | OK

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

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

1、一张图说明一切

下图说明了Token Program、其使用的账户以及相关角色之间的关系:

图 1:Token Program、相关帐户和角色

第一个元素是Token Program本身,它已经部署并可供使用。

  • Mint Account

当有人想要创建一个新的代币时,他使用 create-token 函数来初始化一个新的 Mint  Account,其中包含有关该代币的基本信息: 铸币机构,即被授权铸造该代币的公钥(pubkey), 可以冻结代币帐户的 Freeze Authority(将在下面描述),以及一些附加数据,例如代币的总供应量、小数位数和 isInitialized 标志。 该帐户存储有关代币以及谁对其具有权限的一般信息。 请注意,没有有关特定个人持有代币的数据。 这些存储在 Token Account 中。

  • Token Account

Token Account保存有关公钥拥有的代币的信息。 不过,所有权关系变得有点混乱。 Token Account本身由 Token Program拥有, Token Program使用帐户内的所有者、关闭权限和委托字段来控制对这些令牌的访问。 所有者是可以花费/转移代币的公钥,关闭权限可以关闭帐户,所有者可以授予委托公钥以花费最多委托数量的代币。 除了这些字段之外,还有一些标志:isInitialized、isFrozen、isNative。 默认情况下,`Token Account`在创建时初始化,不会冻结,也不是原生的。 之前,我们看到 Mint Account定义了一个 Freeze Authority,该权限有权冻结用户账户中的代币。 很多时候, Freeze Authority为空(全部为零)。 在这种情况下,任何人都无法冻结代币账户中持有的相应代币。

2、实战Solana代币发行

理论太多了,让我们在实践中看看这一切。

我们将使用 Solana 工具套件与 Token 程序进行交互。 你可以在这里得到它。

安装后,我们可以配置工具套件以连接到 devnet,如下所示:

solana config set --url devnet

2.1 创建用户帐户

用户需要密钥对(即公钥及其相应的私钥)来持有 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_ALICEPK_ALICE 分别指包含私钥的文件和公钥的值。

然后,为该帐户请求空投并使用以下命令检查余额:

solana airdrop 1 $PK_ALICE
solana balance $PK_ALICE
图1:获取空投并查看余额

2.2 创建Mint Account

spl-token 程序中的 create-token 函数创建 mint account。 默认情况下,初始供应量为零,冻结权限为空。 以下命令创建 mint 帐户,将其公钥存储在 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 帐户:

solana account $ALICE_TOKEN

下图显示了示例输出:

前 6 行是帐户的元数据,显示其公钥、余额、所有者、是否可执行、租金纪元和长度。 如前所述,mint账户的所有者是Token程序。 公钥是在创建帐户期间生成的,并唯一标识给定的代币。 一小笔余额(从付费方转入)被分配给该账户以“支付租金”,这在 Solana 世界中是在区块链中存储账户数据的成本。 该金额的计算符合“免租金”最低金额,因此只要帐户持有该最低金额,实际上就不需要支付租金。

其余行显示帐户包含的十六进制原始数据。  Mint Authority的公钥是前 32 个突出显示的字节。 稍后一点的 09 是小数字段。 在这种情况下, Freeze Authority为空(归零)。

以下节点单行显示了 ALICE 的 base58 公钥的十六进制版本,以证实:

node -e 'console.log(require("bs58").decode("TULnhBExK6hwmrmGfzcMSeDH58qCttzugnWakbmERva"))'

2.3 创建Token Account

任何想要持有任何给定代币的用户都需要一个对应代币的代币账户。 Token Account是使用 spl-token 的 create-account 子命令创建的,如下所示:

spl-token create-account \
    --owner $PK_ALICE \
    --fee-payer $KP_ALICE $ALICE_TOKEN
ALICE_ALICETOKENACCOUNT=<token account pubkey>
图 4:创建Token Account

查看 Token Account的原始内容也很有趣:

图 5:Token Account的原始内容

图5中的元数据显示了分配给该代币账户的公钥、免租存储的余额、所有者是代币程序等。 红框中突出显示的是mint帐户pubkey,你可以使用如下命令来检查:

node -e 'console.log(require(“bs58”).decode(“3XspNCGyc2iD2jvwb7XMBCCqkSiztJEtv3Swv5nRa56Q”))'

绿框是令牌所有者,在此 例子是我们已经知道的 ALICE 的公钥。

值得庆幸的是,为了满足未来的需求,spl-token 实用程序包含一个子命令来为我们解码 Token Account。 命令是:

spl-token account-info --address $ALICE_ALICETOKENACCOUNT

它返回解码后的信息,如下所示:

图6:解码后的Token Account信息

2.4 铸造代币

铸币机构可以为任何用户铸造代币。 此过程会更新用户的余额(在代币帐户中)和供应量(在铸币帐户中)。 为了铸造代币,我们使用 spl-tokenmint 子命令,如下所示:

spl-token mint $ALICE_TOKEN 41394 $ALICE_ALICETOKENACCOUNT \
    --fee-payer $KP_ALICE \
    --mint-authority $KP_ALICE

它产生这样的输出:

图 7:铸造代币

如果我们查看 Token Account,我们会看到更新后的金额,如下图所示:

图8:Token Account余额

下面一行让我们验证十六进制值。 请注意与代币小数相对应的 9 个零。 另请注意,数字值在 Token Account中以 little-endian 顺序存储:

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

Mint Account也会更新以反映总供应量:

图 9:Mint Account中的总供应量

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

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

这将给出以下结果:

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

2.5 销毁代币

当代币经济政策规定时,可能有必要销毁代币。 Alice 可以使用 spl-token 子命令 burn 来销毁自己的代币,如下所示:

spl-token burn $ALICE_ALICETOKENACCOUNT 394 \
    --fee-payer $KP_ALICE \
    --owner $KP_ALICE

下图说明了销毁并检查之后的余额和供应情况:

图 11:销毁代币,检查余额和供应量

2.6 关闭Token Account

如果 Alice 不再使用该特定代币,她可以关闭该代币账户并取回剩余的 SOL 余额。 请注意,关闭帐户之前余额必须为零。 以下是关闭 Token Account的命令:

spl-token close \
    --address $ALICE_ALICETOKENACCOUNT \
    --fee-payer $KP_ALICE \
    --owner $KP_ALICE

图 12 说明了关闭账户并显示了 SOL 余额的增加,因为代币账户的剩余余额被转回给 Alice。

图 12:关闭Token Account并返回 SOL 余额

此后,该帐户将被删除,释放区块链中的相应空间,如下图所示:

图 13:已关闭的帐户被删除

3、结束语

我们讨论了 Solana 区块链中铸币账户(mint account)和代币账户(token account)的概念元素,并通过命令行工具说明了它们的操作。 这只是冰山一角,还有更多操作,例如冻结铸币账户,这对于创建 NFT 和处理授权至关重要。 也许,为未来的分期付款提供了大量的材料。


原文链接:Understanding Solana’s Mint Accounts and Token Accounts

DefiPlot翻译整理,转载请标明出处

通过 NowPayments 打赏