{"content":{"title":"明晰Sui Move中的易混概念：UID、ID、Address 的区别","body":"## 引言\r\n在 Sui Move 中，UID、ID、Address 是三个密切相关的概念，容易令人混淆。本文旨在通过阅读 Sui::Object 模块来澄清它们之间的区别与联系。\r\n\r\n## Sui::Object 模块\r\n\r\n首先，Address 是 Sui Move 的基础类型之一，长度为 32 字节，用于标识链上账户或对象的唯一地址。\r\n\r\n```rust\r\nstruct ID has copy, drop, store {\r\n    bytes: Address\r\n}\r\n```\r\n\r\nID 是一个封装了 Address 类型的结构体，具有 copy 和 store 特性，这样可以在链上存储。但是 ID 不能用于标识唯一的对象，因为它具有 copy 特性，任何人都可以复制拥有相同 Address 的 ID，并且可以随意丢弃。\r\n\r\n```rust\r\n\r\nstruct UID has store {\r\n    id: ID,\r\n}\r\n```\r\nUID 封装了 ID，它不能被复制，也不能被随意丢弃（只能调用 object::delete() 删除），并且与 ID 不同的是，它只能由交易上下文 ctx 创建（调用 object::new(ctx)）。因此，它可以唯一地标识一个对象。\r\n\r\n## 例子\r\n让我们阅读 Sui Move 示例中的例子，以更好地理解它们的区别，以及这样设计的原因。\r\n\r\n```rust\r\nstruct Lock<T: store + key> has key {\r\n    id: UID,\r\n    locked: Option<T>\r\n}\r\n\r\n\r\nstruct Key<phantom T: store + key> has key, store {\r\n    id: UID,\r\n    for: ID,\r\n}\r\n```\r\nLock 用于封装对象，Key 用于解封。\r\n\r\n```rust\r\n\r\npublic entry fun create<T: store + key>(obj: T, ctx: &mut TxContext) {\r\n    let id = object::new(ctx);\r\n    let for_id = object::uid_to_inner(&id);\r\n\r\n    transfer::share_object(Lock<T> {\r\n        id,\r\n        locked: option::some(obj),\r\n    });\r\n\r\n    transfer::transfer(Key<T> {\r\n        for: for_id,\r\n        id: object::new(ctx)\r\n    }, tx_context::sender(ctx));\r\n}\r\n```\r\n可以看到 Key 结构体中的 for 属性存储了 Lock 的 ID，表示这是哪一把锁的钥匙，因为 UID 是唯一的，不能被复制存储。\r\n```solidity\r\n    public fun unlock<T: store + key>(\r\n        lock: &mut Lock<T>,\r\n        key: &Key<T>,\r\n    ): T {\r\n        assert!(option::is_some(&lock.locked), ELockIsEmpty);\r\n        assert!(&key.for == object::borrow_id(lock), EKeyMismatch);\r\n\r\n        option::extract(&mut lock.locked)\r\n    }\r\n```\r\n\r\n在解锁时，将key中的for属性，和从lock的uid中的id比对，确定钥匙与锁是否匹配。如果匹配，才能将其中的对象取出。\r\n## 总结\r\n* Address 是链上账户或对象的唯一标识。\r\n* ID 是封装了 Address 的结构体，具有 copy 和 store 特性，可在链上存储，但不可用于唯一标识对象。\r\n* UID 封装了 ID，不可复制和随意丢弃，只能由交易上下文创建，可用于唯一标识对象。\r\n\r\n<!--StartFragment-->\r\n\r\nMove语言学习交流QQ群: 79489587\\\r\nSui官方中文开发者电报群: <https://t.me/sui_dev_cn>\r\n\r\n<!--EndFragment-->"},"author":{"user":"https://learnblockchain.cn/people/18488","address":null},"history":"bafkreicrvmnxyjrokaaxxb3voveyzgq53pcllunvshbbxf2ljp65zoprmu","timestamp":1709393978,"version":1}