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 中操作同一个共享对象,并观察共识排序和对象版本变化。

相关推荐
开源量化GO2 小时前
期货量化订不到行情:天勤合约代码与交易所符号写法
python·区块链
Upsy-Daisy2 小时前
IOTA 学习笔记(十):交易与 PTB,可编程交易块怎么理解?
人工智能·区块链
cmes_love18 小时前
美股和港股的量化笔记-从下载逐笔tick到合成分钟
笔记·区块链
TechubNews18 小时前
數碼港「區塊鏈與數字資產試點資助計劃」︰賦能創新結算 助力穩定幣基建
区块链
2601_9594801519 小时前
Moneta Markets亿汇:“比特币持仓变化牵动市场”
区块链
品牌数字化增长观察1 天前
名酒年轻化探索中,数字资产如何重构消费连接?
区块链·数字
想你依然心痛1 天前
HarmonyOS 6(API 23)实战:基于悬浮导航、沉浸光感与HMAF的“链界智脑“——PC端AI智能体沉浸式区块链智能合约审计与DeFi风控管理工作台
人工智能·区块链·ar·harmonyos·智能体
Upsy-Daisy2 天前
IOTA 学习笔记(五):对象模型是理解 IOTA 的关键
区块链
阿狸猿2 天前
论区块链技术及应用
区块链