Sui Move 学习:Object & 四种能力
type
status
date
slug
summary
tags
category
icon
password
学习内容
Siu 是如何处理资产所有权
在Sui上,Object是数据储存的基本单位,通过定义,创建和管理这些代表用户资产级的可编程对象。
Object type (对象类型)
Sui 定义的每个对象都会用有key 和 UID。在区块链浏览器查看,可以看到五个基本参数 — owner,objectId, type, version, 最后一个交易摘要。 我们还可以通过其他字段来定义object 完善功能。
Object ownership (对象所有权)
Sui链上的,每个对象都有一个owner字段,它决定了对象在事务中的使用方式。
Address-owned (地址所有)
地址所有对象限制了访问权限,只有对应地址的所有者才能对其进行操作。
Dynamic fields (动态字段)
Sui的动态字段和对象是动态添加和删除的,动态字段允许我们根据需要调整对象的机构,按需消耗gas。
Fields 可以存储任务课存储的值,Object Fields 只能存具有 key 能力的对象
Immutable 不可变
不能被更改,转移活着删除,这类对象没有所有者,可以被任何人使用。
Shared 共享
0x2::transfer::share_object
共享对象需要 key 能力,可被公开访问和使用。
下面例子是创建一个销售甜甜圈的商店,每个人都需要访问商店菜才能购买。
Wrapped 包裹
在Move,可以通过将
结构
类型的字段放入另一个字段来组织数据结构。- 数据结构嵌套
- Move 中的结构体嵌套
- 需要
store
能力
结构体的组合和使用十分重要。
直接包装
- 直接将 Sui 对象作为字段
- 包装对象不能单独存在
- 只能通过包装对象访问
- 无法形成循环包装
- 支持解包
- 对象 ID 在包装与解包中保持不变
在这两个结构题中,Bar是一个普通结构体,Fo是一个Sui对象(具有
key
能力)。如果将
Bar
类型的 Sui 对象放入 Foo
类型的 Sui 对象中,则对象类型 Foo
将包装对象类型 Bar
。对象类型 Foo
是包装器或包装对象在 Sui 中,为了将一个结构体类型嵌入到另一个结构体类型中,被嵌入的类型必须具有
store
能力。而当结构体类型被嵌入到具有 key
能力的 Sui 对象结构体中时,它也成为一个 Sui 对象类型。通过 Option
包装
- 灵活性
- 可选的包装对象
- 可更换的包装内容
通过 vector
包装
- 同类型对象的集合包装
- 类似于
Option
包装
Sui Move 中有四种能力控制特定类型的值如何使用(赋予的权限)。
类型的值如何被使用,这些能力是:copy、drop、store 和 key。
相当于游戏中的职业,法师,射手等,具有不同的技能,职责就不同。
drop
允许在不再需要的某个结构题将其删除,没有drop能力是不允许被忽略的,防止被随意丢弃。这个能力也是为了防止资产泄漏或错误处理。而具有单个
drop
能力的结构称为 Witness。copy
我们可以使用
copy
自定义类型来允许实例被复制。copy
在Move中允许类型的实例或值被复制,但Move的资源模型默认是不允许复制的。copy
能力允许隐式和显式复制。隐式复制发生在赋值操作中,而显式复制可以通过解引用操作符实现。copy能力通常搭配drop能力一起使用。
在move中,所有的原生类型和标准库中定义的类型都具有
copy
和 drop
能力,并且有Move编译器进行内存管理。key
允许结构体被存储,并且第一个字段为
UID
类型,确保对象的唯一性和非可丢弃性。可以直接由账户或者地址拥有。具有key能力,就不能有
drop
和copy
。又因为UID
的存在,Move的原生类型和标准类型都没有key
能力,这能力仅适用于Sui框架和自定义的类型。Store
store
能力在 Move 中能将数据持久化存储在区块链上,它可以允许开发者在Move模块中定义存储和检索的数据结构。store
与 key
的关系
store
能力通常与 key
能力一起使用。key
能力用于访问和修改存储在区块链上的数据。在 Move 中,每个存储的数据项都对应一个唯一的 key
。key
用于指向存储在区块链上的数据项的位置。
store
能力通过key
来读取和写入数据。
因此,
store
能力需要 key
来操作存储的数据,两者是紧密相关的。通过 key
,程序可以定位到特定的数据项,并通过 store
能力对其进行读写操作。