IOTA 学习笔记(九):最小 Counter 合约在 Localnet 上的完整演示
上一期我们介绍了如何在本地启动 IOTA Localnet,并通过 CLI 进行网络、地址、对象和交易管理。掌握了 Localnet 的使用后,我们可以结合 Move 合约和对象模型,做一个完整的实验——在本地部署和测试最小 Counter 合约。
这一期我们将展示整个流程,包括:
Move package 构建和发布
Counter 对象创建
调用 increment 函数修改对象
查询对象状态和版本
1. 准备 Counter Move 合约
最小 Counter 合约示例:
module hello::counter { use iota::object::{Self, UID}; use iota::transfer; use iota::tx_context::{Self, TxContext}; public struct Counter has key { id: UID, value: u64, } public entry fun create(ctx: &mut TxContext) { let counter = Counter { id: object::new(ctx), value: 0, }; transfer::transfer(counter, tx_context::sender(ctx)); } public entry fun increment(counter: &mut Counter) { counter.value = counter.value + 1; } public fun value(counter: &Counter): u64 { counter.value } }Counter has key:允许 Counter 成为链上对象id: UID:对象唯一标识create:创建对象并分配给交易发送者increment:修改对象 valuevalue:读取对象 value
将该模块保存到counter.move文件中,放在 Move package 的sources/目录下。
2. 构建和发布 Package
在 package 根目录执行构建命令:
move build成功后,通过 CLI 发布 package:
iota move publish --path ./ --signer <SIGNER>--path ./:Move package 路径<SIGNER>:交易发送者地址或私钥
发布成功后,会生成 Package ID,例如:
Package ID: 0xabc123...这个 ID 后续用于函数调用。
3. 创建 Counter 对象
通过 CLI 调用create函数:
iota move call --package 0xabc123 --module counter --function create执行成功后,会在本地链上生成一个 Counter 对象,并将其所有权分配给当前交易发送者。
查询对象列表或特定对象:
iota object list iota object get <OBJECT_ID>输出示例:
Object ID: 0xdef456... Type: Counter Owner: iota1q... Version: 1 value: 0Version: 1 表示对象的初始版本
value: 0 初始计数值
4. 调用 increment 函数修改对象
将 Counter 对象传入increment函数:
iota move call --package 0xabc123 --module counter --function increment --args <OBJECT_ID>执行后,Counter 对象 value 加 1,同时版本号增加:
Object ID: 0xdef456... Version: 2 value: 1可以重复调用多次,每次 version +1,value 累加。
5. 查询 Counter 当前状态
通过 CLI 查询对象状态:
iota object get <OBJECT_ID>输出显示:
Object ID
当前 Owner
Version
Data(value)
Previous Transaction
例如:
Object ID: 0xdef456... Type: Counter Owner: iota1q... Version: 3 value: 2 Previous Transaction: 0x123abc...每次调用 increment 都会生成新的版本,Previous Transaction 记录上一次操作。
6. 交易与对象版本关系
每次交易修改对象时:
交易读取旧版本对象
执行 Move 函数逻辑
创建对象新版本
更新对象状态在链上
CLI 查询显示 Version 增加,Previous Transaction 更新,这清楚反映了对象模型和交易的关联。
7. 小结
通过本地 Localnet 和 CLI,我们完成了一个最小 Counter 合约的完整实验流程:
构建并发布 Move package
调用 create 创建对象
调用 increment 修改对象
查询对象状态和版本
这一流程展示了:
Move 合约如何创建和操作对象
CLI 如何提交交易并查看结果
对象模型如何通过 version 和 Previous Transaction 追踪状态变化
掌握这一流程后,就可以进一步实验共享对象、Coin 对象、Package 升级和更复杂的 Move 合约逻辑。
下一期,我们将讲共享对象与多用户交互实验,演示多个用户如何在 Localnet 中操作同一个共享对象,并观察共识排序和对象版本变化。
