AdminCap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module design::admin;

use sui::transfer::transfer;
public struct AdminCap has key {

    id: UID,

}
public struct Door has drop {

    status: bool,

}
fun init(ctx: &mut TxContext) {

    let admin = AdminCap { id: object::new(ctx) };

    transfer(admin, ctx.sender());

}
  • 一个对象,传入使用的函数
  • 权限控制

Witness

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
module design::wit;

use std::ascii::{string, String};
use sui::transfer::transfer;

public struct Mi has drop {}
public struct House has key {

    id: UID,

    name: String,

}



public fun create_house(_: Mi, ctx: &mut TxContext): House {

    House { id: object::new(ctx), name: string(b"dd") }

}

fun init(ctx: &mut TxContext) {
    let mi = Mi {};
    let house = create_house(mi, ctx);
    transfer(house, ctx.sender())

}

-没有字段,只有drop能力

  • 一次性见证
  • OTW(一次性见证)
    • 只能被创建一次
    • 没有字段,只有drop能力
    • 模块名大写

hot-potato

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
module design::potato;

use sui::coin::Coin;

use sui::transfer::public_transfer;



public struct Receipt {

    price: u64,

}

public struct POTATO has drop {}

public struct House has key {

    id: UID,

    model: u8,

}



public fun buy_house(model: u8, ctx: &mut TxContext): (Receipt, House) {

    (Receipt { price: model as u64*1000 }, House { id: object::new(ctx), model })

}



public fun pay_receipt(receipt: Receipt, payment: Coin<POTATO>) {

    let Receipt { price } = receipt;

    public_transfer(payment, @0x1111);

}
  • 结构体没有任何能力
  • 必须依靠外部创建结构体
  • 必须依靠外部销毁结构体