个人最近学习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和ownercap
调用new函数并把ownercap传递给发信息的人
一个把东西存入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的状态接触掉,第二行是实现解除存储关系
锁住,锁住的物品无法用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里
设置价格放进列表,然后出售
df::add(&mut self.id, Listing { id, is_exclusive: false }, price);
由这一行代码实现,原理为把listing结构体添加到dynamic_field里面
就是place和list一次性实现
从列表里面取出,也就是不再出售,但是仍然存储在kiosk里面
df::remove<Listing, u64>(&mut self.id, Listing { id, is_exclusive: false });
由这一行代码实现,原理为把listing结构体移除 list_with_purchase_cap
用
dof::borrow(&self.id, Item { id })
实现不可变借出
用
dof::borrow_mut(&**mut** self.id, [Item](
实现可变借出
borrow
用于只读访问动态字段中的数据,返回一个引用,而不转移所有权
borrow_mut
则同样返回一个引用,且不转移所有权,但是是可变访问
(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对象的存在,单一次原子化操作里面需要同时调用这两个函数,否则编译会出错
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,并且支付
用 coin::take(&mut self.profits, amount, ctx) 来实现提取收益
用 profits.into_coin(ctx) 来提取收益,同时把kiosk和ownercap都删除
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!