Move —— Counter 部署与交互
合约写好后需要部署到链上才能使用。本文介绍如何使用 Sui CLI 发布智能合约、调用合约函数与链上对象交互,以及理解 Package ID(代码地址)和 Object ID(数据地址)的区别。
1. 准备工作
确保当前环境有足够的 Gas(测试币)。
1 | # 检查当前地址和余额 |
2. 发布合约 (Publish)
将代码编译并上传到 Sui 区块链。
1 | # 发布命令 (如果在测试网,确保 gas 预算足够) |
输出解读: 发布成功后,控制台会输出大量信息。我们需要找到 ObjectChanges 部分,重点关注一个 published 类型的对象 ID。
- Package ID (包 ID):这是你代码在链上的地址。后续调用函数都要用它。
- 请将此 ID 记录下来,假设为
0xPackageID。
- 请将此 ID 记录下来,假设为
3. 创建对象 (Create)
我们要调用 create 函数。
- 语法:
sui client call --package <PACKAGE_ID> --module <MODULE_NAME> --function <FUNCTION_NAME> --gas-budget 10000000 - 参数:
create函数只需要ctx,而ctx是系统自动注入的,不需要我们手动传参。
1 | sui client call --package 0xPackageID --module counter --function create --gas-budget 10000000 |
输出解读: 在 ObjectChanges 中,你会看到一个 created 的对象。
- Object ID (对象 ID):这是新诞生的 Counter 对象的 ID。
- 请将此 ID 记录下来,假设为
0xCounterID。
- 请将此 ID 记录下来,假设为
4. 修改对象 (Increment)
我们要调用 increment 函数,让计数器 +1。
- 难点:函数定义是
fun increment(counter: &mut Counter)。 - 传参:我们需要告诉 CLI,修改哪一个计数器。所以必须传入刚才记录的
0xCounterID。
1 | # --args 后面跟参数 |
验证: 你可以去 Sui Explorer (浏览器) 输入 0xCounterID,查看它的 value 字段是否变成了 1。
5. 错误处理测试
尝试多次调用 increment。 当 value 变成 11 时,CLI 会报错: MoveAbort(..., 0) -> 这里的 0 就是我们代码里定义的 const EValueTooLarge: u64 = 0。
6. 销毁对象 (Delete)
最后,清理链上对象。
1 | sui client call --package 0xPackageID --module counter --function delete --args 0xCounterID --gas-budget 10000000 |
结果: 执行成功后,再去浏览器搜 0xCounterID,会显示 Deleted (已删除)。
7. 总结:CLI 交互
- Publish (发布):获得 Package ID (代码的地址)。
- Call Create (创建):获得 Object ID (数据对象的地址)。
- Call Mutate (使用):传入 Object ID 来修改特定对象的数据。