怎样确定 Solana spl 代币的最大供应量

本文介绍了 solana SPL 代币数量的底层运算逻辑,以及列出了代币精度和最大供应量之间的关系表。

在数字计算中,处理小数时常见问题是精度损失,因为计算机使用二进制系统存储数字,而二进制不总是能精确表示小数。例如,若商品价格为 0.99 元,顾客需要支付 1 元,使用浮点数据类型进行运算可能会因为二进制表示的局限而导致不精确的结果。

所以在金融系统中,为了避免浮点运算的精度损失,一般是用整数来做运算。

那么如何使用整数来代替浮点运算?

假如商品价格为 0.99 元,顾客支付 1 元

如果设定代币精度为 2,底层处理的存储和运算逻辑是 100 - 99 = 1 如果设定代币精度为 3,底层处理的存储和运算逻辑是 1000 - 990 = 10

在页面显示时,只需要简单的处理一下精度问题,

当精度为 2 ,前端展示结果等于 1 的小数点前移 2 位展示 0.01 当精度为 3, 前端展示结果等于 10 的小数点前移 3 位展示 0.01

精度定的越高,页面能展示的小数位数也越多。

SPL 代币的精度和供应量

在Solana的SPL-Token程序中,使用 u64来存储和运算代币数量,我们在前端填写的发行量最终经过精度转换结果,u64 能表示的最大整数位是 18446744073709551615

一般 spl 代币的精度是 0 - 9 之间

如果精度是0 ,那么代币的最大发行量是 18446744073709551615 ,但是对应的,代币能表示的最小数值是 1,因此 0 精度一般被用来发行 NFT 。

遵循下面公式,最大发行量 = u64:MAX / (10 ^ 精度)

以下是精度和最大供应量的表格

精度 最大供应量
9 18446744073.709551615
8 184467440737.09551615
7 1844674407370.9551615
6 18446744073709.551615
5 184467440737095.51615
4 1844674407370955.1615
3 18446744073709551.615
2 184467440737095516.15
1 1844674407370955161.5
0 18446744073709551615

为了验证上面数据正确性,在solana dev网络做一组实验:

// 发行一个精度为 6 的代币
% spl-token create-token --decimals 6 
Creating token 5wYhtgLtowkvYeEXoYpCeGvdUHjqsQPvKqM1Qy6gpFSv under program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA

Address:  5wYhtgLtowkvYeEXoYpCeGvdUHjqsQPvKqM1Qy6gpFSv
Decimals:  6

Signature: 4vYp1XVFsUm1hZyy5iMZ8kCkUyQVeAbWawbjXuvKzApM5W4CvAZ4QeBLt1qqjGuQuhamEeyqwT7yqBGTXJSd2tD

// 为代币创建一个账户
% spl-token create-account 5wYhtgLtowkvYeEXoYpCeGvdUHjqsQPvKqM1Qy6gpFSv
Creating account 9n7hfWBmNRaJhcBCkimALDJWsrz7tSDb6aGbABxY4du3

Signature: 3Gmz91EXAbGgn3RaQiYVe8MV7ixhSaHPWnzaHqXSeYTG8ie1ZJytctr25fxM43Uh9DWtEDRE2ffhvbycWiKpB2BS

// 按照 6 的最大发行量 mint 代币
% spl-token mint 5wYhtgLtowkvYeEXoYpCeGvdUHjqsQPvKqM1Qy6gpFSv 18446744073709.551615
Minting 18446744073709.55 tokens
  Token: 5wYhtgLtowkvYeEXoYpCeGvdUHjqsQPvKqM1Qy6gpFSv
  Recipient: 9n7hfWBmNRaJhcBCkimALDJWsrz7tSDb6aGbABxY4du3

Signature: 3B3DHfu1EJAR8qo22yo7bLUyFzJnbkWCFCkCb8KMfsPXKjZvZSimTdsoYMCKg6km1G7B6iZfQVHtc7HQgRnn4scb

// 获取代币余额,余额显示正确
% spl-token balance 5wYhtgLtowkvYeEXoYpCeGvdUHjqsQPvKqM1Qy6gpFSv
18446744073709.551615

// 按照精度6最小值继续进行增发
% spl-token mint 5wYhtgLtowkvYeEXoYpCeGvdUHjqsQPvKqM1Qy6gpFSv 0.000001             
Minting 0.000001 tokens
  Token: 5wYhtgLtowkvYeEXoYpCeGvdUHjqsQPvKqM1Qy6gpFSv
  Recipient: 9n7hfWBmNRaJhcBCkimALDJWsrz7tSDb6aGbABxY4du3
Error: Client(Error { request: Some(SendTransaction), kind: RpcError(RpcResponseError { code: -32002, message: "Transaction simulation failed: Error processing Instruction 0: custom program error: 0xe", data: SendTransactionPreflightFailure(RpcSimulateTransactionResult { err: Some(InstructionError(0, Custom(14))), logs: Some(["Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]", "Program log: Instruction: MintToChecked", "Program log: Error: Operation overflowed", "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4306 of 200000 compute units", "Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA failed: custom program error: 0xe"]), accounts: None, units_consumed: Some(4306), return_data: None }) }) })

可以看到 18446744073709.551615 已经是精度 6 的最大发行量,再继续增加就会报出溢出的错误。


Solana 发币教程: 一分钟在Solana链创建代币教程

点赞 0
收藏 0
分享

0 条评论

请先 登录 后评论
Satoshi Nakamoto
Satoshi Nakamoto
0x73f1...aaC7
区块链技术爱好者