在区块链的世界里,去中心化的交易体验一直是备受关注的焦点。今天,咱们就一起来深入了解一下基于 Sui 平台的 Move 语言所编写的kiosk
模块代码,看看它是如何打造出安全、去中心化且无需信任的交易环境的。
在区块链的世界里,去中心化的交易体验一直是备受关注的焦点。今天,咱们就一起来深入了解一下基于 Sui 平台的 Move 语言所编写的
kiosk
模块代码,看看它是如何打造出安全、去中心化且无需信任的交易环境的。
想象一下,有一个虚拟的 “售货亭”(Kiosk),它就像是一个特殊的场所,可以用来存放和交易各种各样的数字资产。不过呢,这些资产得满足一个条件,那就是它们的创建者要为其实现一个叫做TransferPolicy
的东西,有了这个,资产才能在这个 “售货亭” 里顺利地进行各种交易操作哦。
Kiosk
结构体
这个结构体就好比是售货亭本身啦。它里面记录了好多关键的信息呢,像id
,这就相当于售货亭的独一无二的 “身份证号”,方便我们识别它。还有profits
,这是用来存放通过销售资产所获得的利润的,而且是以SUI
(Sui 平台的原生资产)为单位的余额哦。owner
字段则清楚地标明了这个售货亭归谁所有,也就是所有者的地址啦。另外,item_count
记录着目前存放在这个售货亭里的物品数量。不过要注意哦,还有个allow_extensions
字段,它原本是用来控制是否允许一些扩展功能的,但现在已经被标记为弃用了呢。KioskOwnerCap
结构体
这可以看作是一把特殊的 “钥匙”,拥有了它,就意味着你获得了在这个售货亭里进行一些重要操作的权利呀,比如往里面放置物品、把物品取出来,或者把物品列出来准备售卖等等。它有两个重要的部分,一个是id
,同样是个唯一的标识,另一个就是for
字段,它关联着对应的那个售货亭的ID
,就好像这把 “钥匙” 只能开特定的那扇 “售货亭” 的门一样呢。PurchaseCap
结构体
这个结构体的作用可不小哦,它就像是给物品上了一把特殊的 “锁”,并且规定了只有满足一定条件(支付不低于某个min_price
的价格)才能把物品从售货亭里买走呢。这里面包含了像id
(自己的唯一标识)、kiosk_id
(所属售货亭的ID
)、item_id
(被锁定的那个物品的ID
)以及前面提到的最低购买价格min_price
这些重要信息哦。代码里还定义了一堆常量,它们呀,就像是一个个小小的 “警示牌”。比如说ENotOwner
,要是你不是售货亭的所有者,却想做只有所有者才能做的事儿,那这个 “警示牌” 就亮起来啦,系统就会知道出问题了。再比如EIncorrectAmount
,要是你付的钱和物品标的价格不一样,那这个常量对应的错误就会被触发,告诉大家金额对不上啦。其他的常量也都各自对应着不同的不符合预期的操作情况呢。
Item
结构体
把它想象成是贴在每个放在售货亭里的物品上的一个小标签,用来表明这个物品在这个售货亭的 “身份” 哦,方便我们通过它去找到和操作对应的物品呢。Listing
结构体
这个就更有意思啦,它像是一个写着物品售卖信息的牌子呢。上面有个is_exclusive
的标识,如果是true
,那就意味着这个物品是独占式列出的,得拿着特殊的 “钥匙”(PurchaseCap
)才能买;要是false
,就是普通的列出,可以按照常规方式购买啦。而且它还关联着物品的ID
和对应的价格等信息哦。Lock
结构体
这就是一个很严肃的 “禁止取出” 的标签啦,一旦物品被贴上这个标签,那就说明它暂时不能被从售货亭里取出来了,只能通过列出然后交易(用PurchaseCap
)的方式才能让它离开售货亭哦。ItemListed
结构体
每当售货亭的所有者把一个物品列出来准备售卖的时候,就会产生这样一个事件,就好像在交易的路上留下了一个小脚印一样。而且呀,这个事件还很聪明,它是类型索引的,这意味着我们可以很方便地在整个网络里去找到特定类型的物品的售卖报价呢。ItemPurchased
结构体
当有买家成功地从售货亭里买走了物品,这个事件就被触发啦,它记录着这次交易的关键信息,不管是用常规的购买方式,还是通过那种带PurchaseCap
的独占式购买方式,都会留下这个交易完成的 “痕迹” 哦,方便我们去跟踪网络上所有已经完成的销售情况呢。ItemDelisted
结构体
要是所有者又不想卖某个物品了,把它从售卖列表里撤下来,那这个事件就会出现啦,就好像把之前留下的那个售卖的 “脚印” 给擦掉了一样,用来告诉大家这个物品现在不卖啦。default
函数
这个函数可厉害了,它就像一个神奇的魔法棒,一挥就能创建出一个全新的、按照默认配置来的售货亭哦。而且创建完之后,发送这个创建请求的人就自动变成了售货亭的所有者啦,同时这个售货亭还会被设置成可以共享的状态呢。new
函数
和default
函数有点类似,不过它更像是一个精细的 “工匠”,能创建出一个新的售货亭以及与之完美匹配的那把 “钥匙”(KioskOwnerCap
),并且会把售货亭的各个字段都仔仔细细地初始化好哦。close_and_withdraw
函数
当售货亭完成了它的使命,里面也没有物品了,而且还是未共享的状态时,拿着那把 “钥匙”(KioskOwnerCap
)的所有者就可以通过这个函数把售货亭关掉,然后把里面存着的利润取出来啦,哪怕利润是 0 也可以哦,就好像把这个售货亭彻底收拾干净,把剩下的钱拿走一样呢。set_owner
和set_owner_custom
函数
这两个函数就像是售货亭的 “管理员权限设置” 按钮一样。set_owner
可以把售货亭的所有者改成当前发起交易的那个人,而set_owner_custom
更灵活一些,能按照你指定的自定义地址来改变售货亭的所有者哦,不过前提都是得拿着对应的 “钥匙”(通过KioskOwnerCap
验证)才行呀,不然可没这个权限呢。place
函数
想象一下你是售货亭的主人,手里拿着 “钥匙”(KioskOwnerCap
),就可以用这个函数把各种各样符合要求的物品放到售货亭里啦,不过系统会很严格地检查一下,只有真正的所有者才能执行这个放东西的操作哦,就像门口有个严格的 “保安” 在核实身份一样呢。lock
函数
这个函数不仅能把物品放进售货亭,还会给物品加上一个特殊的 “锁”(发布Lock
)呢,加了锁之后,这个物品就只能通过特定的列出方式(list
或者list_with_purchase_cap
)才能继续进行交易啦。而且呀,为了防止物品被永远锁在里面出不来,还得确保这个物品有对应的TransferPolicy
才行哦,不然就麻烦啦。take
函数
要是你想把售货亭里的物品取出来,就得用这个函数啦。但这可不是随随便便就能取的哦,系统会进行好多项检查呢,得确认你是所有者,物品没被锁着,也不是那种独占列出不能取的状态,而且这个物品确实就在售货亭里存在着,这些条件都满足了,才能顺利地把物品取出来哦。list
函数
作为售货亭的主人,想把物品拿出来售卖,标个价格让人来买,那就用这个函数啦。它会先检查一下你是不是真的所有者,确认之后就把物品的售卖信息设置好,然后还会发出一个 “我要卖这个东西啦” 的信号(ItemListed
事件),让大家都知道这个物品可以买了哦。place_and_list
函数
这个函数可方便啦,它把前面说的先放物品进售货亭,再把物品列出来售卖这两个步骤合并成了一个操作,就像一个快捷通道一样,让整个操作流程变得更简单高效了呢。delist
函数
要是你改变主意不想卖某个物品了,就可以用这个函数把它从售卖列表里撤下来哦,不过也得是所有者才能操作呢,撤下来之后还会发出一个 “不卖这个东西啦” 的信号(ItemDelisted
事件),把之前留下的售卖信息给清理掉哦。purchase
函数
买家要出手买东西的时候就靠这个函数啦,它会处理支付给物品所有者钱的事儿,然后请求把物品转移到对应的地方(比如买家的 “售货亭”),而且在这个过程中还会涉及到处理一个TransferRequest
的东西,只有把这个处理好了,交易才能真正完成哦,交易完成后还会发出一个 “交易成功啦” 的信号(ItemPurchased
事件)呢。list_with_purchase_cap
函数
这个函数能创建出一个很特别的 “购买钥匙”(PurchaseCap
),有了这个 “钥匙”,持有者就能以不低于指定的最低价格去购买那个被锁定的物品啦,而且物品会以独占式的方式列出来,别人没这个 “钥匙” 可就买不了哦。purchase_with_cap
函数
当买家拿着这个特殊的 “购买钥匙”(PurchaseCap
)来买东西的时候,就用这个函数啦。它会先检查一下支付的钱够不够最低价格,是不是对应这个售货亭的物品等等,都没问题了就完成购买操作,更新售货亭的相关状态,同时也会发出 “交易成功啦” 的信号(ItemPurchased
事件)呢。return_purchase_cap
函数
要是买家拿着 “购买钥匙” 又不想买了,就可以用这个函数把 “钥匙” 还回去哦,还回去之后对应的物品就又能按照别的方式操作啦,不过要注意哦,这个 “钥匙” 只能还到它原本所属的那个售货亭里,不然系统可不会答应呢,操作就会被中止啦。withdraw
函数:
作为售货亭的所有者,想要把赚的钱取出来的时候就用这个函数啦。你可以指定取多少钱出来,也可以直接把所有利润都取走哦,不过系统会很负责地检查一下,你取的钱不能比现在售货亭里存着的利润还多呀,不然可就不合理啦。
lock_internal
函数:
这是一个在幕后默默工作的函数哦,它专门负责给物品加上 “锁”,让物品不能被随便取走,同时还会把物品妥妥地放到售货亭里,就像一个细心的仓库管理员在整理物品并且给它们上好安全锁一样呢。place_internal
函数:
这个函数就是单纯地把物品放到售货亭里,然后还会很认真地把物品数量给增加一下,记录好现在售货亭里又多了个物品啦。uid_mut_internal
函数:
它主要是用来获取对售货亭的那个ID
(UID
)的可变访问权限的,就像是拿到了可以修改售货亭 “身份证号” 相关信息的权限一样,但这个权限可不是随便用的哦,只有在符合一定条件下才行呢。还有一堆函数呢,它们有的可以帮我们看看物品是不是在售货亭里呀,有没有被锁着呀,是不是已经列出来准备卖了呀,是独占列出还是普通列出等等这些状态。另外一些函数则可以让我们获取到售货亭的各种详细信息,比如所有者是谁、里面放了几个物品、现在赚了多少利润等等。而且对于KioskOwnerCap
和PurchaseCap
这两个重要的 “钥匙” 结构体,也有对应的函数可以去获取它们里面各个字段的信息哦,方便我们随时掌握它们的情况呢。
borrow
函数:
有时候我们可能只是想临时借用一下售货亭里的物品看看,不做修改,那这个函数就派上用场啦,只要物品在售货亭里,任何时候都可以用这个函数去借来看看哦,就像从图书馆借本书看看一样,不会对原物品做什么改变呢。borrow_mut
函数:
要是你想对借出来的物品做些修改,那就得用这个函数啦,不过它有个要求,就是这个物品得没有被列出来准备卖才行哦,不然可不能借出来修改呢,毕竟都准备卖了,就不能随便乱动啦。borrow_val
函数:
这个函数也是把物品从售货亭里取出来借用,但它多了个保证,就是你之后得把物品还回去哦,同样也是要求物品没被列出来才能操作呢,取出来的时候还会给你一个特殊的 “借条”(Borrow
结构体),方便后面还东西的时候用呀。return_val
函数:
前面用borrow_val
借了东西,看完用完了就得用这个函数把物品还回去啦,而且得按照 “借条”(Borrow
结构体)上的信息准确地还到对应的售货亭里哦,不然系统可就不认账啦,这也是为了保证整个借用过程的规范性呢。总之呀,这段kiosk
模块的代码就像一个设计精巧的机器,各个部分紧密配合,通过各种各样的授权检查、状态管理以及事件记录机制,为我们打造出了一个完整又安全的数字资产交易系统,让在 Sui 平台上的交易体验既可靠又能被清晰地追踪呢。希望通过这样深入浅出的讲解,大家对这个代码有了更清楚的认识哦!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!