UID 和 ID
在 Sui Move 中,UID 和 ID 是管理和标识 Sui 对象的核心机制。
- UID 是对象的不可变唯一标识符,确保对象在 Sui 网络中具有独一无二的身份。
- ID 是对地址的封装,用于引用特定对象,但没有硬性要求必须指向现有对象。
UID
UID (Unique Identifier) 是 Sui 对象的核心属性,其唯一性确保对象在网络中的标识不可重复使用。
UID 的定义
在 sui::object
模块中,UID 是对 ID 的封装,而 ID 又是对 address 的封装。
move
// File: sui-framework/sources/object.move
/// UID 是对象的唯一标识符
public struct UID has store {
id: ID
}
/// ID 是地址的封装
public struct ID has store, drop {
bytes: address
}
- UID 是不可变的,即使对象被销毁,其对应的 UID 也不能重复使用。
- ID 是一种通用标识符,本质上是一个地址类型。
生成 UID
新的 UID 是从交易哈希 (tx_hash) 和索引 (index) 派生而来的:
- 每次创建新 UID 时,索引递增,确保唯一性。
- Sui 验证器会拒绝未在同一交易中创建的 UID,防止重复使用或滥用。
示例:通过 object::new
生成 UID
move
use sui::tx_context;
use sui::object;
public fun create_uid_example(ctx: &mut tx_context::TxContext): UID {
object::new(ctx)
}
- 生成 UID 需要可变引用
&mut TxContext
,这是因为创建新 UID 会修改交易上下文中的ids_created
计数器。
UID 的生命周期
- UID 的创建:通过
object::new(ctx)
创建。 - UID 的销毁:通过
object::delete(uid)
销毁。
move
use sui::object;
struct Character {
id: UID,
}
public fun delete_uid_example(ctx: &mut tx_context::TxContext) {
let char = Character { id: object::new(ctx) };
let Character { id } = char; // 解包结构体
object::delete(id); // 销毁 UID
}
注意:UID 只能在值被解包后销毁,确保对象生命周期的完整性。
UID 的特殊用法
- 保留 UID:解包对象结构后,UID 可以独立存储,供其他对象或模块使用。
- 删除证明:提供对象已删除的证明,通过交换奖励机制激励删除操作。例如,某些框架可以忽略对象的部分限制,专门验证 UID 删除后的状态。
ID
ID 是 Sui Move 中的基础类型,是对 address 的简单封装。
ID 的功能和定义
- 用于表示对象的引用或地址。
- 可以通过
to_id(address)
从地址生成 ID。
move
use sui::object;
public fun create_id_from_address(addr: address): ID {
object::to_id(addr)
}
ID 的灵活性
- ID 不强制指向有效对象,它可以是任意地址。
- 通常用作引用对象的轻量化方式,但不会附带 UID 的不可变特性。
UID 和 ID 的重要性
UID 和 ID 是 Sui Move 对象管理中不可或缺的组件,分别用于标识和引用对象。
- 唯一标识:
- UID 确保对象身份唯一,支持安全的跟踪和管理。
- 所有权和权限控制:
- UID 关联对象所有权,防止未经授权的访问和修改。
- 对象交互:
- ID 允许合约快速引用对象,便于执行复杂逻辑。
总结
- UID 是对象的唯一标识符,通过
object::new
生成,保障每个对象的独特身份。 - ID 是对地址的封装,灵活性较高,用于指向对象但不保证唯一性。
- 理解 UID 和 ID 的概念对于开发安全、高效的 Sui Move 智能合约至关重要。
通过合理使用 UID 和 ID,可以实现对象的精确管理和高效交互,是构建复杂 Sui 应用的基础。