Sui.

帖子

分享您的知识。

article banner.
harry phan.
Apr 12, 2025
文章

✏️ Sui Move 中的亲子物品

在 Sui Move 中,对象可以拥有其他对象,就像账户拥有的对象一样. 这为开发人员开辟了新的设计模式(和一些问题). 在本指南中,我将把 Sui Move 中的父子对象概念分为四个部分:

  1. Sui Move 亲子概念简介
  2. 对象访问控制和接收机制 3.使用 public_receive 进行跨模块儿童管理
  3. 灵魂绑定逻辑和退货收据模式

最后,你将了解如何嵌套对象,如何通过 transfer:: receive 检索子对象,使用 public_receive 跨模块管理子对象,甚至创建回旋回其所有者的灵魂绑定对象.

Sui Move 亲子概念简介

###什么是父对象和子对象?

在 Sui 中,每个对象都有一个唯一的 ID 和一个 所有者. 通常,所有者是一个地址(例如用户的账户),但所有者也可以是另一个对象.

如果对象 A 拥有对象 B,我们称对象 A 为父对象,B 为子对象. 子级是对象所有的,而不是地址所有的.

传输到对象:Sui 实际上并没有在幕后区分地址和对象 ID ——两者都只是 32 字节的标识符. 这意味着你可以像转移到用户地址一样将一个对象转移到另一个对象的 ID. 当你这样做时,你实际上是在将一个对象嵌套在父对象中. Sui 的运行时将孩子的所有者字段设置为父母的 ID(而不是地址)

那么为什么这很酷呢?

因为子级保留自己的唯一 ID 并独立存在于存储空间中,但现在它已绑定到父级. 这就像给你的朋友一个独特的收藏品来存放在他们的储物柜里——收藏品会保留自己的身份证件并且可以被追踪,但你朋友的储物柜现在被列为其所有者.

区分唯一对象与嵌套对象和子对象很重要:

-**唯一对象(地址所有):**地址拥有的常规对象(例如用户账户). 这是默认情况——比如直接存放在用户钱包中的 NFT、硬币等. 每个都有唯一的 ID,存储空间最高. -**嵌套(封装)对象:**存储在另一个对象的数据中的对象(例如,作为结构中的字段). 在这种情况下,内部对象是封装的不是单独的顶级实体. 它不会按其 ID 显示在全局存储中,因为它是父级字节内容的一部分. 在 Sui 中,如果您在未进行特殊处理的情况下将一个对象作为字段放在另一个对象中,则该对象会被封装. -**子对象(对象拥有者):**由另一个对象拥有的对象 但未直接包装在其字段中. 子对象仍然是存储空间中的一个单独的顶级对象(有自己的 ID 和数据),父对象的 ID 作为所有者记录在子元数据中. 这意味着您可以通过孩子的ID(具有正确的权限)查询或访问孩子. 它不是物理上嵌入到家长的内容中,只是逻辑上所有的. 用我们的比喻,就像你把你的收藏品交给朋友保管一样,它仍然有单独的标签和可追踪,只是存放在他们的储物柜里.

创建子对象(通过传输)而不是对其进行包装的好处是,子对象的 ID 仍然可以从外部访问. 例如,资源管理器或钱包可以按 ID 列出子对象,而包装的对象在其父对象之外不可见.

即使子对象在所有者之间移动或嵌套在不同的父对象中,它们也能保持稳定的 ID. 这对于链上库存或 “钱包里面的钱包” 模式之类的东西非常有用,在这些模式中,你希望容器对象可以容纳许多其他人仍然可以单独引用的物品

所有权和访问权限:如果一个对象归另一个对象所有,则通常只有父对象的所有者才能访问或使用子对象. 这是一种动态授权. 例如,如果 Alice 拥有父对象 P,而 P 拥有子对象 C,则只有 Alice(或 Alice 签署的交易)可以操作 C. Sui 强制执行此操作,因此拥有父对象就像持有其所有子对象的密钥一样 🔑.

也许你知道:

Sui 的转移到对象功能本质上赋予了我们 树状对象所有权. 父母可以有许多孩子(这些孩子可以有自己的孩子,形成等级制度). 这是通过将对象 ID 视为传输地址来实现的. 我们有:

-地址拥有的对象(普通的唯一对象), -对象拥有的对象(子对象,仍是顶级对象,但与父对象绑定), -封装的对象(嵌套在另一个对象的数据中,而不是顶层).

在接下来的文章中,我们将了解如何实际检索子对象或与子对象进行交互(因为它们不能像地址拥有的对象那样直接访问),以及如何围绕它们执行规则.

  • Sui
  • Move
3
分享
评论
.
我们使用 cookie 确保您在我们的网站上获得最佳体验。
更多信息