有关于kiosk的学习笔记(sui move)

  • obj3ct
  • 发布于 2天前
  • 阅读 342

个人最近学习kiosk的一点笔记

Sui 的 Kiosk 模块是一个用于管理数字资产(NFT 或其他对象)的模块,提供了一系列功能来帮助用户安全地存储、交易和转移资产。Kiosk 模块的核心思想是将资产放在一个“Kiosk”中,通过权限控制和策略管理来实现灵活的资产管理。

这里面基本的机制就是存放在kiosk里且未被list的对象可以随时使用并修改,而存放在kiosk里且已经被list的对象则只可以被购买和不变借用

结构体

Kiosk 自助售卖终端

id: sui::object::UID
profits: sui::balance::Balance<sui::sui::SUI>
owner: address
item_count: u32

可见kiosk存在id,profits,owner,item_count4个字段,是一个资金池,可以使用withdraw实现提取资金,同时用item_count来确认内置对象个数

KioskOwnerCap

id: sui::object::UID
for: sui::object::ID

for字段指向kiosk的id字段

PurchaseCap

id: sui::object::UID
kiosk_id: sui::object::ID
item_id: sui::object::ID
min_price: u64

Borrow 一个重要的hot potato结构体,保证了borrow_val和return_val在一次原子化操作中进行,防止遗忘归还

Item Listing Lock 通过这三个结构体和df以及dof两个库的调用,kiosk实现了lock、list等需要nft和kiosk的发生连接的功能

注: df指的是dynamc_field dof指的是dynamc_object_field

ItemListed ItemPurchased ItemDelisted 这三个结构体基本是只在assert语句里面调用到的,用于验证状态

函数及其实现的功能

kiosk本体相关

new

创建kiosk和ownercap

default

调用new函数并把ownercap传递给发信息的人

存入&取出

place&take

一个把东西存入kiosk另一个取出kiosk

dof::add(&mut self.id, Item { id: object::id(&item) }, item)

实现存入

df::remove_if_exists<Listing, u64>(&mut self.id, Listing { id, is_exclusive: false });
dof::remove(&mut self.id, Item { id })

实现取出,第一行是实现把list的状态接触掉,第二行是实现解除存储关系

lock

锁住,锁住的物品无法用take取出,其他和place一致 调用lock_internal

public(package) fun lock_internal<T: key + store>(self: &mut Kiosk, item: T) {
    df::add(&mut self.id, Lock { id: object::id(&item) }, true);
    self.place_internal(item)
}

lock的实现逻辑为生成一个Lock 结构体并将 item 的锁信息(Lock 结构体)添加到 Kiosk 的动态字段中,同时还调用place_internal存放进kiosk里

出售

list

设置价格放进列表,然后出售

    df::add(&mut self.id, Listing { id, is_exclusive: false }, price);

由这一行代码实现,原理为把listing结构体添加到dynamic_field里面

place_and_list

就是place和list一次性实现

delist

从列表里面取出,也就是不再出售,但是仍然存储在kiosk里面

    df::remove<Listing, u64>(&mut self.id, Listing { id, is_exclusive: false });

由这一行代码实现,原理为把listing结构体移除 list_with_purchase_cap

调用

borrow&borrow_mut

dof::borrow(&self.id, Item { id })

实现不可变借出

dof::borrow_mut(&**mut** self.id, [Item](

实现可变借出

borrow 用于只读访问动态字段中的数据,返回一个引用,而不转移所有权 borrow_mut则同样返回一个引用,且不转移所有权,但是是可变访问

borrow_val&return_val

(dof::remove(&mut self.id, Item { id }), Borrow { kiosk_id: object::id(self), item_id: id })

通过创建Borrow这个hot potato对象来实现原子化操作

let Borrow { kiosk_id, item_id } = borrow;
dof::add(&mut self.id, Item { id: item_id }, item);

实现析构hot potato对象并把借出物品添加回kiosk的dof 由于borrow这个hot potato对象的存在,单一次原子化操作里面需要同时调用这两个函数,否则编译会出错

购买

purchase

    let price = df::remove<Listing, u64>(&mut self.id, Listing { id, is_exclusive: false });
    let inner = dof::remove<Item, T>(&mut self.id, Item { id });
    self.item_count = self.item_count - 1;
    df::remove_if_exists<Lock, bool>(&mut self.id, Lock { id });
    coin::put(&mut self.profits, payment);

购买时从动态字段里删除list、item和lock,并且支付

purchase_with_cap

收益相关

withdraw

用 coin::take(&mut self.profits, amount, ctx) 来实现提取收益

close_and_withdraw

用 profits.into_coin(ctx) 来提取收益,同时把kiosk和ownercap都删除

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
obj3ct
obj3ct
江湖只有他的大名,没有他的介绍。