Move —— Sui 合约 (Counter)
通过实现一个完整的计数器(Counter)智能合约,学习 Sui 对象的生命周期管理。本文涵盖对象的创建、修改和销毁逻辑,以及 TxContext(交易上下文)、entry 函数和 assert! 断言的实际使用方式。
1. 核心概念
1.1 TxContext (交易上下文)
在 Sui 的函数中,TxContext 通常作为最后一个参数传递。它有两个核心作用:
- 身份识别:知道是谁发起了交易 (
tx_context::sender(ctx)). - ID 生成:为新对象生成全局唯一的 UID (
object::new(ctx)).- 注意:因为生成 ID 会改变上下文内部的状态,所以必须传
&mut TxContext。
- 注意:因为生成 ID 会改变上下文内部的状态,所以必须传
1.2 entry 函数
普通函数 fun 只能被其他 Move 代码调用。
如果希望函数能被 钱包 或 CLI 直接调用(比如用户点击”铸造”按钮),必须在 fun 前加上 entry 关键字。
2. 业务逻辑流程
我们要实现一个计数器 (Counter),包含三个功能:
- 创建 (Mint):创建一个
Counter对象,并把所有权交给发送者。 - 增加 (Increment):让计数器 +1。为了演示错误处理,我们规定最大值不能超过 10。
- 销毁 (Burn):彻底销毁这个计数器对象。
3. Counter 合约
1 | // 使用常量定义错误码 |
4. 总结:对象操作范式
| 操作 | 函数参数写法 | 核心 API | 说明 |
|---|---|---|---|
| 创建 | ctx: &mut TxContext |
object::new(ctx) |
需要 Context 生成 ID。 |
| 转移 | obj: T |
transfer::transfer |
必须拥有对象所有权。 |
| 修改 | obj: &mut T |
直接修改字段 | 传入可变引用。 |
| 销毁 | obj: T |
object::delete(id) |
必须解构并销毁 UID。 |