IOTA 学习笔记(九):最小 Counter 合约在 Localnet 上的完整演示

上一期我们介绍了如何在本地启动 IOTA Localnet,并通过 CLI 进行网络、地址、对象和交易管理。掌握了 Localnet 的使用后,我们可以结合 Move 合约和对象模型,做一个完整的实验------在本地部署和测试最小 Counter 合约。

这一期我们将展示整个流程,包括:

  1. Move package 构建和发布

  2. Counter 对象创建

  3. 调用 increment 函数修改对象

  4. 查询对象状态和版本


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. 交易与对象版本关系

每次交易修改对象时:

  1. 交易读取旧版本对象

  2. 执行 Move 函数逻辑

  3. 创建对象新版本

  4. 更新对象状态在链上

CLI 查询显示 Version 增加,Previous Transaction 更新,这清楚反映了对象模型和交易的关联。


7. 小结

通过本地 Localnet 和 CLI,我们完成了一个最小 Counter 合约的完整实验流程:

  1. 构建并发布 Move package

  2. 调用 create 创建对象

  3. 调用 increment 修改对象

  4. 查询对象状态和版本

这一流程展示了:

  • Move 合约如何创建和操作对象

  • CLI 如何提交交易并查看结果

  • 对象模型如何通过 version 和 Previous Transaction 追踪状态变化

掌握这一流程后,就可以进一步实验共享对象、Coin 对象、Package 升级和更复杂的 Move 合约逻辑。

下一期,我们将讲 共享对象与多用户交互实验,演示多个用户如何在 Localnet 中操作同一个共享对象,并观察共识排序和对象版本变化。

相关推荐
m0_380167147 天前
面向开发者的Top10加密货币数据API(2026年最新)
大数据·人工智能·区块链
2601_959480157 天前
Moneta Markets亿汇:“比特币高位修复风险偏好”
区块链
m0_380167148 天前
加密货币价格 API、市场数据 API 与 分析 API 有什么区别?
人工智能·ai·区块链
LedgerNinja8 天前
AEGET:提升决策效率,助力交易者建立清晰的交易体系
区块链
2601_961963388 天前
Spring Boot集成电子签章的7个典型问题与解决方案:从入门到生产级实践
大数据·人工智能·spring boot·python·区块链·智能合约
zhuhai_xigedian8 天前
物联网技术在源网荷储系统中的创新应用
大数据·运维·人工智能·区块链·能源
2601_959480158 天前
Moneta Markets亿汇:“比特币长期预期继续升温”
区块链
2601_961963389 天前
数据室里的“第一道锁”:电子保密协议(NDA)签署与防泄漏机制全解析
网络·人工智能·安全·金融·区块链·政务
HavenlonLabs9 天前
重塑链上未来的隐形基石:长期主义下的生态演进
大数据·人工智能·安全·区块链
LedgerNinja9 天前
2026美国5月未季调CPI年率
区块链