Move —— Counter 部署与交互

合约写好后需要部署到链上才能使用。本文介绍如何使用 Sui CLI 发布智能合约、调用合约函数与链上对象交互,以及理解 Package ID(代码地址)和 Object ID(数据地址)的区别。

1. 准备工作

确保当前环境有足够的 Gas(测试币)。

1
2
3
# 检查当前地址和余额
sui client active-address
sui client gas

2. 发布合约 (Publish)

将代码编译并上传到 Sui 区块链。

1
2
# 发布命令 (如果在测试网,确保 gas 预算足够)
sui client publish --gas-budget 100000000

输出解读: 发布成功后,控制台会输出大量信息。我们需要找到 ObjectChanges 部分,重点关注一个 published 类型的对象 ID。

  • Package ID (包 ID):这是你代码在链上的地址。后续调用函数都要用它。
    • 请将此 ID 记录下来,假设为 0xPackageID

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

4. 修改对象 (Increment)

我们要调用 increment 函数,让计数器 +1。

  • 难点:函数定义是 fun increment(counter: &mut Counter)
  • 传参:我们需要告诉 CLI,修改哪一个计数器。所以必须传入刚才记录的 0xCounterID
1
2
# --args 后面跟参数
sui client call --package 0xPackageID --module counter --function increment --args 0xCounterID --gas-budget 10000000

验证: 你可以去 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 交互

  1. Publish (发布):获得 Package ID (代码的地址)。
  2. Call Create (创建):获得 Object ID (数据对象的地址)。
  3. Call Mutate (使用):传入 Object ID 来修改特定对象的数据。