写一下个人对sui move里的4种能力和部分设计模式的理解,如有误请勘正
Sui Move 通过四种能力(Abilities)控制类型的操作权限,确保资源安全性和链上行为可控性:
作用:允许类型作为链上对象(Object)存在,必须包含 UID 字段以唯一标识对象。
示例:定义链上资产时,需标记为 key 以存储到全局状态:
struct Token has key { id: UID, balance: u64 }
作用:允许类型嵌套在其他结构中存储到链上,通常与 key 配合使用,只有拥有store的对象才可以作为动态字段中的子对象。
示例:动态字段中的子对象需具备 store:
struct Wallet has key { id: UID, coins: vector<Coin> } // Coin 需有 store
作用:允许类型被复制,适用于非资源型数据(如事件)。
注: 1.复制后的对象与原对象完全相互独立的,修改其中一个不会影响另一个。
2.普通结构体(非 Sui 对象)没有唯一标识符(如 UID),因此无法通过链上 ID 区分原对象和副本。而Sui 对象都是有key能力的,key能力和copy是冲突的,唯一标识和复制操作相冲突挺合理的
作用:允许类型在作用域结束时自动销毁,避免资源泄漏。
示例:一次性见证者(OTW)需 drop 确保唯一性:
struct OTW has drop {} // 只能被使用一次
简单点说就是要生成一个对象时必须使用的参数,可以保证模块内的结构体只能由本模块创建
见证者中的特例,只能使用一次,使用后自动销毁 一次性见证者用于某些需要确保某些类型的实例只能被创建一次的场景,创建一次实例之后OTW自动销毁,可以用来保证一些结构体的唯一性,譬如AdminCap
特点 无能力约束:Hot Potato 结构体不赋予任何能力(无 key、store、copy、drop),因此无法被存储到链上、复制或自动丢弃。 强制消费:必须在事务中传递并销毁该结构体,否则编译报错,必须完成回调。 使用场景:原子性操作(就是要么全部完成,要么完全不执行)
特点 1.定义包含目标对象 UID 的结构体作为指针,通过 UID 间接操作目标对象。 2.自身具有key属性,被指针指着的对象也须拥有key属性 作用 不直接持有目标对象,而是通过 UID 建立逻辑关联,避免了资产所有权的传递,同时仅存储 资产的UID(32 字节),比存储完整对象更节省链上资源
drop用来保证只能使用一次
轻量级、跨模块的对象引用,适用于需要高灵活性的场景(存储id指针会比存储整个资产节省不少gas)
用于记录的临时数据
链上可用且可以做类型嵌套的数据,通常是资产
这两个组合都是不可以使用的的,个人理解是key作为唯一标识符可以确定一个特定的对象,如果具有copy能力那就会有副本,就无法唯一确定了;而且具有key能力的对象大多是链上资产,带上drop能力会导致意外销毁资产
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!