跳到主要内容

结构体

以关键字 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 值可以被存储到全局 状态。可以在钱包内主动转移

原始类型自带三种能力 copydropstore