{"content":{"title":"Moveinscription 源码系列（三）","body":"继续学习 Movescriptions 合约源码。\r\n\r\n## 1. epoch_bus_factory 模块\r\n\r\n这个模块主要是用来部署“MOVE”铭文，提供 mint 功能\r\n以前版本的`MOVE`铭文是在`movescription::init`函数中部署的，现在改了，需要主动调用\r\n此外，还为`TICK_NAME`铭文提供接口\r\n\r\n### 1.1 结构体\r\n\r\n```rust\r\nstruct EpochRecord has store {\r\n  epoch: u64,\r\n  start_time_ms: u64,\r\n  players: vector<address>,\r\n  locked_sui: Table<address, Balance<SUI>>,\r\n}\r\n\r\nstruct EpochBusFactory has store {\r\n  init_locked_sui: u64,\r\n  start_time_ms: u64,\r\n  epoch_count: u64,\r\n  epoch_amount: u64,\r\n  current_epoch: u64,\r\n  epoch_records: Table<u64, EpochRecord>,\r\n}\r\n```\r\n\r\n很明显这两个结构体是用来记录 `epoch` 的。\r\n以前版本，这个功能是 `TickRecord.epoch_records` 字段来记录。现在拆分到了单独的结构体中\r\n接下来讲解函数的时候我们会看到怎么使用这个结构体\r\n\r\n### 1.2 `MOVE`铭文起源\r\n\r\n原始版本在`movedescription::init`函数中部署 `MOVE`，这个版本有所不同，改成了在 `deploy_move_tick` 函数中部署\r\n此版本不影响主网上的原始版本。\r\n这个函数将在 `init.move` 合约的 `init_protocol` 函数中统一调用\r\n\r\n```rust\r\npublic fun deploy_move_tick(deploy_record: &mut DeployRecord, ctx: &mut TxContext)\r\n```\r\n\r\n函数内部还是调用了 `movescription` 合约中的部署函数来完成功能\r\n`let tick_record = movescription::internal_deploy_with_witness(...)`\r\n\r\n新版本中 MOVE 铭文用来铸造别的内置铭文\r\n\r\n### 1.3 部署自定义铭文\r\n\r\n这个版本发生了改变，在本合约中部署其他类型铭文，不再需要 `MOVE` 铭文，而是需要 `TICK` 铭文\r\n`TICK` 铭文的来源是 `tick_factory` 模块，后面会详细讲到。\r\n\r\n部署铭文的函数调用关系如下：\r\n`public entry fun deploy` --> `public fun do_deploy` --> `tick_factory::do_deploy`\r\n\r\n`do_deploy` 函数会校验 `tick_name` 是否为`TICK`，限制了只能使用`TICK`铭文铸造新铭文。\r\n部署新铭文的玩法除了变成消耗 `TICK` 铭文外，和之前版本相同。铭文消耗之后会将里面锁定的 `SUI` 返回给玩家\r\n\r\n另外，这个版本的部署逻辑有一个明显的改变。之前版本中记录 `epoch` 的字段在 `new TickRecord` 的时候就会创建，现在新建的 `TickRecordV2` 中没有该字段，要通过 `after_deploy` 函数添加\r\n\r\n```rust\r\nfun after_deploy(\r\n  tick_record: TickRecordV2,\r\n  total_supply: u64,\r\n  init_locked_sui: u64,\r\n  start_time_ms: u64,\r\n  epoch_count: u64, ctx: &mut TxContext)\r\n```\r\n\r\n这个函数将在每个 `deploy` 操作后调用，在新建的 `TickRecordV2` 结构体上添加动态字段，字段值为 `EpochBusFactory` 对象，字段名调用以下函数获取：\r\n\r\n```rust\r\npublic fun type_to_name<T>() : String {type_name::into_string(type_name::get_with_original_ids<T>())}\r\n```\r\n\r\n其中 `T` 就是 `EpochBusFactory` 对象的类型\r\n\r\n### 1.4 `mint` 函数\r\n\r\n和之前版本相比，`mint` 的逻辑和功能都没有改变，只是最后分发铭文的代码放到了`movescription::do_mint_with_witness`函数中，对于玩家来说，打铭文的玩法和之前没有任何变化，彩蛋也相同。\r\n\r\n此外，本合约同样提供了升级版本的函数，如`migrate_tick_record_to_v2`，升级逻辑和 `Movescriptions`模块中的基本类似，这里不再赘述。\r\n\r\n## 2. tick_factory 模块\r\n\r\n这个合约主要用来创建 `TICK` 铭文，并消耗 `TICK` 铭文用来部署新的铭文。\r\n\r\n### 2.1 部署`TICK`铭文。\r\n\r\n`public fun deploy_tick_tick(deploy_record: &mut DeployRecord, ctx: &mut TxContext)`\r\n和部署 `MOVE` 铭文基本相同，这个函数将在 `init` 模块的 `init_protocol` 函数中统一调用。\r\n\r\n1. 铸造 TICK 铭文\r\n\r\n   ```rust\r\n   public fun do_mint(\r\n     tick_tick_record: &mut TickRecordV2,\r\n     locked_move: Movescription,\r\n     tick_name: vector<u8>,\r\n     clock: &Clock,\r\n     ctx: &mut TxContext) : Movescription\r\n   ```\r\n\r\n   这个函数是消耗 `MOVE` 来铸造 `TICK` 铭文的函数，`locked_move` 必须是 `MOVE` 铭文。\r\n   函数将铸造一个 `amount=1`，`SUI=0 `的 `TICK` 铭文，并把 `locked_move` 铭文锁进去\r\n   这个\"锁进去\"指的是使用上一篇文章中提到的铭文嵌套的方式，将 `MOVE` 铭文嵌套进 `TICK`\r\n   当然，当 `TICK` 铭文被 `burn` 销毁后，`MOVE` 会被返回给钱包。\r\n\r\n   新版本的合约在部署新铭文的时候，多了一个流程，即 `MOVE` --> `TICK` --> `新铭文`\r\n\r\n2. 部署新的铭文\r\n   前面讲 `epoch_bus_factory` 合约部署新铭文的时候，要调用 `tick_factory::do_deploy`\r\n\r\n   ```rust\r\n   public fun do_deploy<W: drop>(\r\n     deploy_record: &mut DeployRecord,\r\n     tick_tick_record: &mut TickRecordV2,\r\n     tick_name_movescription: Movescription,\r\n     total_supply: u64,\r\n     burnable: bool,\r\n     _witness: W,\r\n     clk: &Clock,\r\n     ctx: &mut TxContext\r\n   ) : TickRecordV2\r\n   ```\r\n\r\n   部署新铭文要消耗 `TICK` 铭文，这个函数将 `burn` 掉 `tick_name_movescription` 铭文，然后部署新的铭文。\r\n   要注意，这个新铭文的名称使用的是 `tick_name_movescription` 中的 `metadata.content`，而不是其中的 `tick` 字段。\r\n   所以新版本的合约，不再直接消耗 `MOVE` 铭文部署新铭文，而改成了消耗 `TICK`。\r\n\r\n3. 销毁铭文\r\n\r\n通用的销毁逻辑。\r\n\r\n## 3. name_factory 模块\r\n\r\n这个模块和上面的 `tick_factor`模块 逻辑非常相似，主要功能是：\r\n\r\n1.部署 `NAME` 铭文\r\n\r\n2.铸造 `NAME` 铭文\r\n\r\n3.销毁 `NAME` 铭文\r\n\r\n区别在于，`TICK` 铭文用来部署别的铭文，而 `NAME` 铭文用来表达个人或者组织的 `Name`\r\n个人或组织的名称记录在 `NAME` 铭文的 `matadata`中。\r\n\r\n`TICK` 铭文 业务流程为：\r\n`MOVE --> TICK:{tick:\"TICK\",metadata:要部署的铭文名称} --> 部署铭文`\r\n\r\n`NAME` 业务流程为：\r\n`MOVE -->NAME:{tick:\"NAME\",metadata:个人或者组织的名称}`\r\n\r\n> [项目方关于 NAME 铭文的解释](https://github.com/movescriptions/MIPs/issues/17)\r\n\r\n## 总结\r\n\r\n智能铭文 `Movescriptions` 项目的主要模块分析完毕了\r\n新版本的合约中，一共有 4 种内置铭文，分别是\"MOVE\",\"TICK\",\"NAME\",\"TEST\"。\r\n其中 `TEST` 是用来测试的，我们并不关注\r\n`TICK` 用来部署铭文，`NAME` 是`用户 id`，各有用途\r\n整个合约比之前复杂很多，考虑了更多的安全性和扩展性。"},"author":{"user":"https://learnblockchain.cn/people/18893","address":null},"history":null,"timestamp":1711415194,"version":1}