{"author":{"address":"0xbdd3203FeD7bC268DC76BFF731E78C73f76053C1","user":"https://learnblockchain.cn/people/17384"},"content":{"body":"# 前言\r\n\r\n在区块链开发的语境下，数据的存储和管理方式至关重要。而 Move 语言作为一种专为区块链设计的编程语言，以其灵活的语法和强大的能力系统，成为 Sui 区块链的核心语言。本文将围绕 Move 语言中的结构体展开，解析其在 Sui 区块链中的应用，包括结构体的语法、UTXO 模型的实现，以及对象所有权管理的六种方法，为开发者提供实用的参考。\r\n\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/12/hTtY8mF7675ad5aed970c.png)\r\n\r\n---\r\n# Move 共学活动：快速上手 Move 开发\r\n为了帮助更多开发者快速了解和掌握 Move 编程语言，**Move 共学**活动由 **HOH 社区**、**HackQuest**、**OpenBuild**、**KeyMap** 联合发起。该活动旨在为新手小白提供一个良好的学习平台，带领大家一步步熟悉 Move 语言，并了解如何将其应用到 Web3 开发中。\r\n\r\n通过与 Move 领域的专业导师们合作，参与者可以快速掌握 Move 语言的基础知识，逐步向更复杂的应用开发进阶。无论是区块链初学者，还是有一定开发经验的工程师，都能从中获益。\r\n\r\n**资源链接：**\r\n- [sui官方文档🚪](https://docs.sui.io/)：获取关于 Sui 链的详细文档，包括开发指南、API 参考等。\r\n- [move学习B站视频🚪](https://www.bilibili.com/video/BV1BMD8Y2EfE/)：通过 B 站的视频教程，跟随导师学习 Move 编程语言的基础与进阶。\r\n- [letsmove仓库🚪](https://github.com/move-cn/letsmove)：这是一个 Move 学习资源的 GitHub 仓库，包含了各种示例代码和教程，帮助开发者掌握 Move 语言。\r\n\r\n\r\n---\r\n\r\n# 一·、 Move 语言中的结构体\r\n\r\n在 Move 编程语言中，结构体（struct）是一种核心的用户自定义类型，用于描述特定的数据模型。在区块链的开发中，结构体往往用来定义资产、对象等状态数据。\r\n\r\n**定义结构体的基本语法**：\r\n\r\n```move\r\nmodule example::MyModule {\r\n    struct MyStruct has key, store {\r\n        field1: u64,\r\n        field2: address,\r\n    }\r\n\r\n    public fun new_my_struct(value: u64, addr: address): MyStruct {\r\n        MyStruct { field1: value, field2: addr }\r\n    }\r\n}\r\n```\r\n\r\n* **`key` 能力**：允许结构体实例作为全局存储的键，支持对其唯一标识。\r\n* **`store` 能力**：允许将结构体存储到全局存储中。\r\n* **`copy` 和 `drop` 能力**：控制是否可以复制或销毁结构体实例。\r\n\r\n在 Sui 区块链中，Move 语言通过这些能力赋予了结构体管理存储状态和对象生命周期的强大功能。\r\n\r\n# 二、 Sui 区块链中的 UTXO 模型\r\n\r\nSui 的核心设计基于 UTXO（Unspent Transaction Output）模型，这使得每个对象都可以被唯一标识和管理。这一设计主要体现在以下几点：\r\n\r\n* **对象的存储**： Sui 区块链在全局维护了一个 `Map` 数据结构，用于存储所有链上对象：\r\n\r\n  ```move\r\n  Map\u003cID, object\u003e\r\n  ```\r\n\r\n  其中：\r\n\r\n  * `ID` 是对象的唯一标识符（`object id`）。\r\n  * `object` 是与该 ID 关联的数据实体。\r\n\r\n* **对象的唯一性**： 每个对象在链上的生命周期都通过其唯一的 `object id` 管理，确保无冲突的存储和检索。\r\n\r\n* **高效操作**： 通过全局 Map 数据结构，开发者可以快速查找到对象并执行转移、冻结、共享等操作。\r\n\r\n# 三、 所有权相关方法\r\n\r\nSui 为对象的管理提供了六种所有权相关方法，这些方法针对不同的应用场景处理对象的独占性、共享性及操作权限。\r\n\r\n以下是方法的分类及其特性（包括附加的属性）：\r\n\r\n| 方法                       | 生成的方法     | 属性            |\r\n| ------------------------ | --------- | ------------- |\r\n| **transfer**             | 独享对象      | `key`         |\r\n| **public_transfer**      | 独享对象      | `key + store` |\r\n| **freeze_object**        | 共享对象 - 常量 | `key`         |\r\n| **public_freeze_object** | 共享对象 - 常量 | `key + store` |\r\n| **share_object**         | 共享对象      | `key`         |\r\n| **public_share_object**  | 共享对象      | `key + store` |\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n以下是 Sui 区块链 Move 语言中关于对象所有权的六种核心方法的更深入详细解析。这些方法对开发者而言，提供了灵活的对象管理能力，可适配各种复杂的链上场景。\r\n\r\n***\r\n\r\n## **3.1 transfer**\r\n\r\n### 功能描述\r\n\r\n`transfer` 方法将对象从当前所有者转移给其他地址，操作完成后，原所有者将失去对该对象的控制权。**独享对象**的转移仅需 `key` 属性支持。\r\n\r\n### 语法\r\n\r\n```move\r\ntransfer\u003cObjectType\u003e(object: ObjectType, recipient: address);\r\n```\r\n\r\n### 参数解析\r\n\r\n* **`object`**：被转移的对象实例。\r\n* **`recipient`**：接收对象的地址。\r\n\r\n### 应用场景\r\n\r\n* **NFT 转移**：当用户将 NFT 从自己的账户转移给其他用户时。\r\n* **点对点资产转移**：适用于需要明确所有权的独享对象。\r\n\r\n### 示例代码\r\n\r\n```move\r\nmodule example::transfer_demo {\r\n    use sui::transfer;\r\n\r\n    public fun execute_transfer(object: MyNFT, to: address) {\r\n        transfer\u003cMyNFT\u003e(object, to);\r\n    }\r\n}\r\n```\r\n\r\n***\r\n\r\n## **3.2 public_transfer**\r\n\r\n### 功能描述\r\n\r\n`public_transfer` 是 `transfer` 的扩展版本，增加了对公共模块的支持。它允许开发者在任何模块中调用此方法进行对象转移，因此需额外具备 `store` 能力。\r\n\r\n### 语法\r\n\r\n```move\r\npublic_transfer\u003cObjectType\u003e(object: ObjectType, recipient: address);\r\n```\r\n\r\n### 参数解析\r\n\r\n与 `transfer` 方法一致。\r\n\r\n### 应用场景\r\n\r\n* **跨模块调用**：开发者希望在模块间处理对象的转移。\r\n* **去中心化市场**：例如 NFT 市场合约需要从卖家账户转移对象到买家账户。\r\n\r\n### 示例代码\r\n\r\n```move\r\nmodule marketplace::public_transfer_demo {\r\n    use sui::public_transfer;\r\n\r\n    public fun transfer_object(object: MyNFT, to: address) {\r\n        public_transfer\u003cMyNFT\u003e(object, to);\r\n    }\r\n}\r\n```\r\n\r\n***\r\n\r\n## **3.3 freeze_object**\r\n\r\n### 功能描述\r\n\r\n`freeze_object` 方法将对象设置为只读状态。被冻结的对象不可修改，但仍能被读取。此方法适用于需要临时冻结资产的场景。\r\n\r\n### 语法\r\n\r\n```move\r\nfreeze_object\u003cObjectType\u003e(object: \u0026ObjectType);\r\n```\r\n\r\n### 参数解析\r\n\r\n* **`object`**：被冻结的对象引用。\r\n\r\n### 应用场景\r\n\r\n* **托管资产**：当资产需要进入冻结状态（如法律或多方共识）时。\r\n* **锁仓机制**：限制资产在指定时间段内的使用权。\r\n\r\n### 示例代码\r\n\r\n```move\r\nmodule example::freeze_demo {\r\n    use sui::freeze_object;\r\n\r\n    public fun lock_asset(object: \u0026MyAsset) {\r\n        freeze_object\u003cMyAsset\u003e(object);\r\n    }\r\n}\r\n```\r\n\r\n***\r\n\r\n## **3.4 public_freeze_object**\r\n\r\n### 功能描述\r\n\r\n`public_freeze_object` 是 `freeze_object` 的扩展版本，增加了 `store` 能力，支持跨模块调用。\r\n\r\n### 语法\r\n\r\n```move\r\npublic_freeze_object\u003cObjectType\u003e(object: \u0026ObjectType);\r\n```\r\n\r\n### 参数解析\r\n\r\n与 `freeze_object` 方法一致。\r\n\r\n### 应用场景\r\n\r\n* **共享模块的冻结功能**：当多个模块需要调用冻结功能时，使用此方法以提高兼容性。\r\n\r\n### 示例代码\r\n\r\n```move\r\nmodule marketplace::public_freeze_demo {\r\n    use sui::public_freeze_object;\r\n\r\n    public fun lock_asset_public(object: \u0026MyAsset) {\r\n        public_freeze_object\u003cMyAsset\u003e(object);\r\n    }\r\n}\r\n```\r\n\r\n***\r\n\r\n## **3.5 share_object**\r\n\r\n### 功能描述\r\n\r\n`share_object` 将对象设为共享模式，允许多个账户同时访问该对象。共享对象不可由单一地址独占。\r\n\r\n### 语法\r\n\r\n```move\r\nshare_object\u003cObjectType\u003e(object: ObjectType);\r\n```\r\n\r\n### 参数解析\r\n\r\n* **`object`**：需要共享的对象实例。\r\n\r\n### 应用场景\r\n\r\n* **协作平台**：允许多个用户共同访问和修改某些链上资源。\r\n* **多方治理**：如 DAO 组织共享的治理代币或资源。\r\n\r\n### 示例代码\r\n\r\n```move\r\nmodule example::share_demo {\r\n    use sui::share_object;\r\n\r\n    public fun enable_sharing(object: MyResource) {\r\n        share_object\u003cMyResource\u003e(object);\r\n    }\r\n}\r\n```\r\n\r\n***\r\n\r\n## **3.6 public_share_object**\r\n\r\n### 功能描述\r\n\r\n`public_share_object` 是 `share_object` 的扩展版本，支持在公共模块中对对象进行共享设置，需额外具备 `store` 能力。\r\n\r\n### 语法\r\n\r\n```move\r\npublic_share_object\u003cObjectType\u003e(object: ObjectType);\r\n```\r\n\r\n### 参数解析\r\n\r\n与 `share_object` 方法一致。\r\n\r\n### 应用场景\r\n\r\n* **模块化开发**：当开发者需要跨模块共享对象。\r\n* **公共资源**：如分布式网络中的共享存储。\r\n\r\n### 示例代码\r\n\r\n```move\r\nmodule marketplace::public_share_demo {\r\n    use sui::public_share_object;\r\n\r\n    public fun enable_public_sharing(object: MyResource) {\r\n        public_share_object\u003cMyResource\u003e(object);\r\n    }\r\n}\r\n```\r\n\r\n***\r\n\r\n## 关键区别与对比\r\n\r\n| **方法**                 | **功能**        | **适用场景**       | **能力需求**      |\r\n| ---------------------- | ------------- | -------------- | ------------- |\r\n| `transfer`             | 独享对象的转移       | 点对点转移、链上资产交易   | `key`         |\r\n| `public_transfer`      | 可跨模块调用的独享对象转移 | NFT 市场或模块间资产转移 | `key + store` |\r\n| `freeze_object`        | 冻结对象，设为只读状态   | 锁仓、托管、冻结资产     | `key`         |\r\n| `public_freeze_object` | 可跨模块调用的冻结对象   | 模块共享冻结功能       | `key + store` |\r\n| `share_object`         | 设置对象为共享模式     | 多方协作、共享资产      | `key`         |\r\n| `public_share_object`  | 可跨模块调用的共享对象设置 | 公共资源管理、模块共享    | `key + store` |\r\n\r\n***\r\n\r\n## 深入分析\r\n\r\n1. **共享与独享的对比**：\r\n\r\n   * **独享对象**需明确的单一所有权，适合需要责任归属的场景（如资产所有者）。\r\n   * **共享对象**允许多方同时访问和修改，适用于协作或共管场景。\r\n\r\n2. **能力属性的影响**：\r\n\r\n   * `key` 表示对象具有唯一标识能力。\r\n   * `store` 属性允许对象的持久化存储并可跨模块调用。\r\n\r\n3. **冻结操作的价值**：\r\n\r\n   * 冻结可以确保某些关键对象在特定条件下不可修改，提供安全性。\r\n\r\n通过灵活组合这些方法，开发者可以在 Sui 区块链中实现复杂的对象管理逻辑，满足去中心化应用的多样化需求。\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n\r\n# 四、 示例代码\r\n\r\n以下代码展示了如何创建一个对象，并通过 `transfer` 和 `share_object` 操作它：\r\n\r\n```move\r\nmodule sui::ObjectExample {\r\n    struct MyObject has key, store {\r\n        id: u64,\r\n        value: u64,\r\n    }\r\n\r\n    public fun create_object(id: u64, value: u64): MyObject {\r\n        MyObject { id, value }\r\n    }\r\n\r\n    public fun transfer_object(obj: MyObject, recipient: address) {\r\n        transfer(obj, recipient);\r\n    }\r\n\r\n    public fun share_my_object(obj: MyObject) {\r\n        share_object(obj);\r\n    }\r\n}\r\n```\r\n\r\n# 五、总结\r\n\r\nSui 区块链的 UTXO 模型为链上对象的管理提供了独特的方式，而 Move 语言通过其强大的结构体功能以及多种操作方法，使开发者可以灵活实现对象的状态管理和所有权变更。理解这些概念并掌握它们的用法，将极大提升开发效率，为去中心化应用的开发奠定坚实的基础。\r\n\r\n通过本文，你可以更深入地了解 Sui 的核心设计理念，特别是如何高效地利用这些工具管理链上对象。","title":"独占还是共享？Sui 区块链对象所有权的六种管理方式全解析"},"history":null,"timestamp":1734012178,"version":1}