sui -move
Sui-PTB (可编程交易模块)
官方文档地址:https://docs.sui.io/concepts/transactions/prog-txn-blocks
PTB概述
PTB 全称 Programmable Transaction Block(可编程交易模块),在Sui上,交易不仅仅是资产流动的基本记录,交易由多个命令组成,这些命令在输入上执行,定义交易的结果。
PTB允许用户在单个交易中调用多个Move函数,管理其对象和管理其代币,而无需发布新的Move包,是生成交易的一种轻量灵活的方式,同时其执行组合的交易模式减少了gas fee 。
PTB 的组成
每个PTB由单独的交易命令组成,这里的交易命令有:
TransferObjects
- 将一组对象转移到指定地址。
SplitCoins
- 将一个硬币拆分成多个硬币。
MakeMoveVec
- 构建一个 Move 类型的向量。
MoveCall
- 调用指定的 Move 函数。
Publish
- 发布指定的模块。
Upgrade
- 升级已有的模块或包。
每个交易命令按顺序执行,您可以在任何后续交易命令中使用前一个交易命令的结果。所有交易命令在一个块中的效果,特别是对象修改或转移,会在事务结束时以原子方式应用。如果一个交易命令失败,整个块都会失败,并且命令的任何效果都不会被应用
主要通过前端来整合并连续实施多个操作,即操作前端来实现交易的添加和合约的调用
PTB的使用
前端
1 | //创建可编程事务块 (PTB) |
terminal
1 | sui client ptb |
Sui -client 命令速查
Sui-Dapp kit 套件
1 | npm i --save @mysten/dapp-kit @mysten/sui @tanstack/react-query |
创建 Dapp
https://sdk.mystenlabs.com/dapp-kit/create-dapp
1 | npm create @mysten/dapp |
Typescript SDK
coin::value
和 coin::into_balance
不同:
coin::value
:用于获取一个
Coin
的数值。它是一个公共的 getter 函数,可以返回
Coin
的具体数值。代码签名为:
1
public fun value<T>(self: &coin::Coin<T>): u64
这个函数不会改变
Coin
的状态,只是读取其数值。
coin::into_balance
:用于将一个
Coin
解构为Balance
。这个函数会消耗
Coin
对象,并返回其内部的Balance
。代码签名为:
1
public fun into_balance<T>(coin: coin::Coin<T>): balance::Balance<T>
使用这个函数后,**
Coin
不再存在,而是转换为了Balance
**。
这两个函数的主要区别在于一个是读取操作(value
),另一个是转换操作(into_balance
)。如果你想获取 Coin
的数值而不改变其状态,使用 value
;如果你需要将 Coin
转换为 Balance
,使用 into_balance
。
& 和直接传参和&mut 的区别
在 Move 中,&
、直接传参和 &mut
的区别主要在于所有权和可变性:
引用(&):
- 传递的是对象的不可变引用。
- 允许在函数中读取对象,但不能修改。
- 不会转移对象的所有权。
直接传参:
- 传递的是对象本身。
- 转移对象的所有权到函数中。
- 函数可以消耗对象(例如,销毁或转移)。
可变引用(&mut):
- 传递的是对象的可变引用。
- 允许在函数中读取和修改对象。
- 不会转移对象的所有权,但允许修改其状态。
选择使用哪种方式取决于你的具体需求:
- 使用
&
当你只需要读取对象而不修改。 - 使用
&mut
当你需要在函数中修改对象。 - 使用直接传参当你需要转移对象的所有权或消耗它。
各类transfer的区别与使用
方法 | 生成的方法 | 属性 |
---|---|---|
transfer | 独享对象 | key |
public_transfer | 独享对象 | key + store |
freeze_object | 共享对象-常量 | key |
public_freeze_object | 共享对象-常量 | key + store |
share_object | 共享对象 | key |
public_share_object | 共享对象 | key + store |