消息
在本节中,我们描述了 tokenfactory
消息的处理过程及其对应的状态更新。
消息
CreateDenom
根据代币创建者地址和 subdenom 创建一个代币名称 factory/{creator address}/{subdenom}
。Subdenom 可以包含 [a-zA-Z0-9./]
。
状态修改:
使用 denom 创建费用从创建者地址为社区池提供资金,该费用在
Params
中设置。通过 bank keeper 设置
DenomMetaData
。为给定的 denom 设置
AuthorityMetadata
,以存储为创建的denom factory/{creator address}/{subdenom}
设置的管理员。管理员自动设置为消息发送者(Msg sender)。将 denom 添加到
CreatorPrefixStore
,该存储中保持每个创建者创建的 denom 状态。
Mint
特定 denom 的铸造仅允许当前管理员进行。注意,当前管理员默认为 denom 的创建者。
状态修改:
安全检查以下内容:
检查 denom 的铸造是否通过
tokenfactory
模块创建检查消息发送者是否为 denom 的管理员
通过 bank 模块为 denom 铸造指定数量的代币
Burn
燃烧特定代币的操作仅允许当前管理员执行。请注意,当前管理员默认是代币创建者。
状态修改:
对以下内容进行安全检查:
检查代币铸造是否通过
tokenfactory
模块创建检查消息发送者是否为该代币的管理员
通过
bank
模块燃烧指定数量的代币
ChangeAdmin
更改代币的管理员。请注意,只有当前代币的管理员才能调用此操作。
SetDenomMetadata
为特定代币设置元数据仅允许由该代币的管理员执行。此操作允许覆盖bank
模块中的代币元数据。
状态修改:
检查消息发送者是否为该代币的管理员
修改
AuthorityMetadata
状态条目以更改代币的管理员
链上的预期:
链上地址的bech32
前缀最大长度为16个字符。
这是由于代币有128字节的最大长度限制,该限制由SDK强制执行,并且我们将longest_subdenom
设置为44字节。
一个token factory
代币的代币名称为:factory/{creator address}/{subdenom}
拆解成子组件后,包含以下部分:
len(factory)
= 72 * len("/")
= 2len(longest_subdenom)
len(creator_address)
=len(bech32(longest_addr_length, chain_addr_prefix))
当前最长地址长度为32字节。由于SDK的错误修正设置,这意味着len(bech32(32, chain_addr_prefix)) = len(chain_addr_prefix) + 1 + 58
。将所有部分相加,总长度约束为128:
128 = 7 + 2 + len(longest_subdenom) + len(longest_chain_addr_prefix) + 1 + 58
。
因此,len(longest_subdenom) + len(longest_chain_addr_prefix) = 128 - (7 + 2 + 1 + 58) = 60
。
关于如何在longest_subdenom
和longest_chain_addr_prefix
之间分配这60字节的选择是有些任意的。考虑到以下因素:
subdenom
应至少为32字节,以便哈希可以存储其中更长的
subdenoms
对于创建人类可读的代币名称非常有帮助链地址应尽量保持较小。到目前为止,Cosmos中最长的HRP为11字节(
persistence
)
为了明确起见,目前设置为:
len(longest_subdenom)
= 44len(longest_chain_addr_prefix)
= 16
请注意,如果SDK增加代币的最大长度限制(128字节),这些限制应当随之增加。因此,不要让代码依赖于这些最大长度来进行解析。
Last updated