上一期我们介绍了如何在本地启动 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:修改对象 value -
value:读取对象 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: 0
-
Version: 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 中操作同一个共享对象,并观察共识排序和对象版本变化。