结构体
以关键字 struct
定义结构体
struct User {
name: String,
age: u8
}
Object
Object
在 Sui 上存储,并维护了一个全局的 Map
数据结构 Map<ID,object>
, 使用结构体定义, 需要满足
- 拥有
key
能力 - 第一个字段为 id, 且类型必须是
sui::object::UID
// 商场会员模块
module market::member {
use sui::object;
use sui::object::UID;
use sui::tx_context::TxContext;
// 定义会员对象
struct Member has key {
id: UID,
level: u8 // 会员等级
}
// 升级为会员
public fun upgrade(level: u8, ctx: &mut TxContext): Member {
Member {
id: object::new(ctx),
level,
}
}
}
Object
有一个 32 字节的全局唯一 ID。对象 ID 源自创建对象的交易摘要和对交易生成的 ID 数量进行编码的计数器。 一个 8 字节无符号整数版本,随着每个读取或写入它的事务单调增加。 一个 32 字节的交易摘要,指示包含此对象作为输出的最后一笔交易。 一个 21 字节的所有者字段,指示如何访问此对象。对象所有权将在下一节中详细解释
每个Object
都有一个所有者字段。有以下 4 种所有权
地址所有
创建的 Object
可以转移到一个地址。转移后,即归该地址所有。
use sui::object::UID;
use sui::transfer;
use sui::tx_context::{Self, TxContext};
use sui::object;
struct Obj has key {
id: UID,
}
fun init(ctx: &mut TxContext) {
let obj = Obj {
id: object::new(ctx)
};
transfer::transfer(obj, tx_context::sender(ctx))
}
另一个 Object 所有
一个 Object
可以由另一个 Object
拥有。
use sui::object::{UID};
use sui::tx_context::{TxContext, sender};
use sui::object;
use sui::transfer;
struct A has key,store{
id:UID
}
struct B has key { // B 拥有 A
id:UID,
a: A
}
fun init(ctx:& mut TxContext){
let a = A{
id:object::new(ctx)
};
let b = B{
id:object::new(ctx),
a
};
transfer::transfer(b,sender(ctx));
}
不可变常量
不能改变不可变对象,并且不可变对象没有单一所有者。任何人都可以在 Sui Move 调用中使用不可变对象。
use sui::object::UID;
use sui::transfer;
use sui::tx_context::{Self, TxContext};
use sui::object;
struct Obj has key {
id: UID,
}
fun init(ctx: &mut TxContext) {
let obj = Obj {
id: object::new(ctx)
};
transfer::freeze_object(obj);
}
共享
对象可以共享,这意味着任何人都可以读取或写入该对象。
use sui::object::UID;
use sui::transfer;
use sui::tx_context::{Self, TxContext};
use sui::object;
struct Obj has key {
id: UID,
}
fun init(ctx: &mut TxContext) {
let obj = Obj {
id: object::new(ctx)
};
transfer::share_object(obj);
}
能力
类型有四种能力:
copy
值可以被复制。内部每个字段都需要有 copy 能力drop
在作用域范围结束后值被丢弃key
在全局存储操作中值可以被用作键值。可以被拥有。内部每个字段都需要有 store 能力store
值可以被存储到全局 状态。可以在钱包内主动转移
原始类型自带三种能力 copy
、drop
、store