消息

在本节中,我们描述了 tokenfactory 消息的处理过程及其对应的状态更新。

消息

CreateDenom

根据代币创建者地址和 subdenom 创建一个代币名称 factory/{creator address}/{subdenom}Subdenom 可以包含 [a-zA-Z0-9./]

message MsgCreateDenom {
  string sender = 1 [ (gogoproto.moretags) = "yaml:\"sender\"" ];
  string subdenom = 2 [ (gogoproto.moretags) = "yaml:\"subdenom\"" ];
}

状态修改:

  • 使用 denom 创建费用从创建者地址为社区池提供资金,该费用在 Params 中设置。

  • 通过 bank keeper 设置 DenomMetaData

  • 为给定的 denom 设置 AuthorityMetadata,以存储为创建的 denom factory/{creator address}/{subdenom} 设置的管理员。管理员自动设置为消息发送者(Msg sender)。

  • denom 添加到 CreatorPrefixStore,该存储中保持每个创建者创建的 denom 状态。

Mint

特定 denom 的铸造仅允许当前管理员进行。注意,当前管理员默认为 denom 的创建者。

message MsgMint {
  string sender = 1 [ (gogoproto.moretags) = "yaml:\"sender\"" ];
  cosmos.base.v1beta1.Coin amount = 2 [
    (gogoproto.moretags) = "yaml:\"amount\"",
    (gogoproto.nullable) = false
  ];
}

状态修改:

  • 安全检查以下内容:

    • 检查 denom 的铸造是否通过 tokenfactory 模块创建

    • 检查消息发送者是否为 denom 的管理员

    • 通过 bank 模块为 denom 铸造指定数量的代币

Burn

燃烧特定代币的操作仅允许当前管理员执行。请注意,当前管理员默认是代币创建者。

message MsgBurn {
  string sender = 1 [ (gogoproto.moretags) = "yaml:\"sender\"" ];
  cosmos.base.v1beta1.Coin amount = 2 [
    (gogoproto.moretags) = "yaml:\"amount\"",
    (gogoproto.nullable) = false
  ];
}

状态修改

  1. 对以下内容进行安全检查:

    1. 检查代币铸造是否通过tokenfactory模块创建

    2. 检查消息发送者是否为该代币的管理员

  2. 通过bank模块燃烧指定数量的代币

ChangeAdmin

更改代币的管理员。请注意,只有当前代币的管理员才能调用此操作。

message MsgChangeAdmin {
  string sender = 1 [ (gogoproto.moretags) = "yaml:\"sender\"" ];
  string denom = 2 [ (gogoproto.moretags) = "yaml:\"denom\"" ];
  string newAdmin = 3 [ (gogoproto.moretags) = "yaml:\"new_admin\"" ];
}

SetDenomMetadata

为特定代币设置元数据仅允许由该代币的管理员执行。此操作允许覆盖bank模块中的代币元数据。

message MsgChangeAdmin {
  string sender = 1 [ (gogoproto.moretags) = "yaml:\"sender\"" ];
  cosmos.bank.v1beta1.Metadata metadata = 2 [ (gogoproto.moretags) = "yaml:\"metadata\"", (gogoproto.nullable)   = false ];
}

状态修改

  1. 检查消息发送者是否为该代币的管理员

  2. 修改AuthorityMetadata状态条目以更改代币的管理员

链上的预期:

链上地址的bech32前缀最大长度为16个字符。 这是由于代币有128字节的最大长度限制,该限制由SDK强制执行,并且我们将longest_subdenom设置为44字节。 一个token factory代币的代币名称为:factory/{creator address}/{subdenom} 拆解成子组件后,包含以下部分:

  • len(factory) = 7

  • 2 * len("/") = 2

  • len(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_subdenomlongest_chain_addr_prefix之间分配这60字节的选择是有些任意的。考虑到以下因素:

  • 根据BIP-0173,技术上一个32字节地址(‘数据字段’)的最长HRP为31字节。(来自encode(data) = 59字节,最大长度为90字节)

  • subdenom应至少为32字节,以便哈希可以存储其中

  • 更长的subdenoms对于创建人类可读的代币名称非常有帮助

  • 链地址应尽量保持较小。到目前为止,Cosmos中最长的HRP为11字节(persistence

为了明确起见,目前设置为:

  • len(longest_subdenom) = 44

  • len(longest_chain_addr_prefix) = 16

请注意,如果SDK增加代币的最大长度限制(128字节),这些限制应当随之增加。因此,不要让代码依赖于这些最大长度来进行解析。

Last updated