图解Sui Move标准库——类型名称(type_name)

  • rzexin
  • 发布于 14小时前
  • 阅读 83

Sui Move标准库类型名称(type_name)模块提供了获取类型字符串名称、解析其组成信息及运行时反射等功能,有助于通过对类型的判断,构造更加健壮安全的合约代码。

图解Sui Move标准库——类型名称(type_name)

1 模块说明

std::type_name 提供了获取类型字符串名称、解析其组成信息及运行时反射等功能,有助于通过对类型的判断,构造更加健壮安全的合约代码。

  • 获取类型信息:将 Move 类型转换为字符串表示
  • 判断基础类型:检测是否为基础数据类型
  • 提取地址:从类型名中解析包地址
  • 获取模块名:从类型名中提取模块标识
  • 字符串转换TypeName 与字符串之间的转换
  • 运行时反射: 支持动态类型检查和处理

2 源码路径

type_name.move

3 方法图解

Clipboard_Screenshot_1750778062.png

4 方法说明

分类 函数名 参数 功能描述
动态类型获取 get<T> 无参数 返回类型T的TypeName,使用首次定义的PackageID
get_with_original_ids<T> 无参数 返回类型T的TypeName,使用原始的PackageID,不受升级影响
类型检查 is_primitive self: &TypeName 判断TypeName是否为简单类型
信息提取 get_address self: &TypeName 获取类型名的地址字符串(Base16编码)
get_module self: &TypeName 获取类型名的模块名称
内部字符串访问 borrow_string self: &TypeName 获取TypeName内部字符串的引用
into_string self: TypeName 获取TypeName内部字符串的值

5 代码示例

5.1 升级前代码

module cookbook::bookself {
    use sui::event;
    use std::ascii::String;
    use std::type_name::{Self, TypeName};

    public struct BookShelf has key {
        id: UID,
    }

    fun init(ctx: &mut TxContext) {
        transfer::share_object(
            Bookshelf{
                id: object::new(ctx),
            }
        );
    }

    public struct EventPrimitiveTypes has copy, drop {
        bool_type_name: String,
        u8_type_name: String,
        u256_type_name: String,
        address_type_name: String,
        vector_type_name: String,
        u8_is_primitive: bool,
        book_shelf_is_primitive: bool,
    }

    public struct EventInfo has copy, drop {
        type_name_address: String,
        type_name_module: String,
    }

    public entry fun emit_primitive_types() {
        event::emit(EventPrimitiveTypes{
            bool_type_name: type_name::get<bool>().into_string(),
            u8_type_name: type_name::get<u8>().into_string(),
            u256_type_name: type_name::get<u256>().into_string(),
            address_type_name: type_name::get<address>().into_string(),
            vector_type_name: type_name::get<vector<u8>>().into_string(),
            u8_is_primitive: type_name::get<u8>().is_primitive(),
            book_shelf_is_primitive: type_name::get<Bookshelf>().is_primitive(),
        })
    }

    public entry fun emit_get_info() {
        event::emit(EventInfo{
            type_name_address: type_name::get<Bookshelf>().get_address(),
            type_name_module: type_name::get<Bookshelf>().get_module(), 
        })
    }
}
  • 部署后,记录关键信息
export PACKAGE_ID=0xa2bf2b8207708d9d4e7c57e3d035537ca80e490240340369ed0837f40f231fe2
export UPGRADE_CAP=0x8655cc8ea0c7b79abac0f15157c81c25b0a72b66efcdec32d8c8aa914faea1aa
  • 调用抛出基本类型事件接口
$ sui client call --package $PACKAGE_ID --module bookself --function emit_primitive_types

Clipboard_Screenshot_1750778082.png

  • 调用抛出地址和模块名事件接口
$ sui client call --package $PACKAGE_ID --module bookself --function emit_get_info

Clipboard_Screenshot_1750778094.png

5.2 升级后代码

为了展示get<T>get_with_original_ids<T>的区别,先对合约进行升级。以下升级合约代码忽略了部分升级前的代码。

module cookbook::bookself {
    use sui::event;
    use std::ascii::String;
    use std::type_name::{Self, TypeName};

    public struct BookShelf has key {
        id: UID,
    }

    // 书本结构定义
    public struct Book has key {
        id: UID,
        // 书本标题
        title: String,
    }

    ......

    public struct EventTypeName has copy, drop {
        defining_id_type: String,
        original_id_type: String,
    }

    public entry fun compare_get_methods<T>() {
        let defining_id_type = type_name::get<T>();
        let original_id_type = type_name::get_with_original_ids<T>();

        event::emit(EventTypeName{
           defining_id_type: defining_id_type.into_string(),  
           original_id_type: original_id_type.into_string(),
        });
    }
}
  • 执行升级命令
sui client upgrade --upgrade-capability $UPGRADE_CAP
  • 升级后,记录关键信息
export PACKAGE_V2_ID=0x2e1a39d4c09dfbb9ac5820716df1ef6f4b3c2de3d33b769b819e41a4a7d2311d
  • 执行命令
$ sui client call --package $PACKAGE_V2_ID --module bookself --function compare_get_methods --type-args ${PACKAGE_V2_ID}::bookself::Book
  • 通过事件内容看到区别

Clipboard_Screenshot_1750778107.png

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
rzexin
rzexin
0x6Fa5...8165
江湖只有他的大名,没有他的介绍。