当前位置: 首页 > news >正文

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

http://www.rkmt.cn/news/1454477.html

相关文章:

  • 通达信缠论插件:3分钟实现自动画中枢的终极解决方案
  • 自己动手丰衣足食-自己动手修改GBA ROM游戏文件
  • OData 入门与详解:从基础到企业
  • 如何在10分钟内构建专业级Arduino音频应用:终极嵌入式音频库指南
  • 深度解析:CloudBeaver云数据库管理平台架构设计与生产部署实战
  • 从一次线上故障复盘说起:我是如何用wrk定位Nginx配置瓶颈,并将QPS提升3倍的
  • Cricut Joy 2 彩虹套装降至 119.99 美元,入门级手工机实现个性化礼物定制!
  • 从零打造模块化3D打印LED光墙:设计、制作与编程全指南
  • Echarts柱状图标签(label)位置终极优化指南:从内置配置到自定义算法的避坑实践
  • 告别游戏卡顿:ACE-Guard资源限制器的轻松解决方案
  • WarcraftHelper完全指南:魔兽争霸3优化神器让你的游戏体验焕然一新
  • 3分钟快速上手:通达信缠论可视化插件完整指南
  • 旧蓝牙音箱改造无线充电器:DIY桌面娱乐中心全攻略
  • 校园出入口车辆行人实时追踪与安全预警系统(含速度测算和碰撞风险提示)
  • 手把手教你用TinyGrad跑通LLaMA:一个‘极简主义’深度学习框架的实战评测
  • 告别增量编码器!MT6825绝对式磁编码器在STM32上的两种接法:PWM模式与SPI模式深度对比
  • 产学研合作模式解析:从微软与IMDEA联合研究中心看技术转化路径
  • 3步精准定位Windows热键冲突:hotkey-detective技术架构与实战指南
  • 14|测试基础与精准测试思想:平台最终服务的是测试决策
  • 2026磁轴键盘实测|IQUNIX EV63 电竞键盘性能标杆
  • 告别拖拽式布局:用SceneBuilder 21.0 + IntelliJ IDEA 2023.3高效设计JavaFX界面(附FXML最佳实践)
  • 广东市政水沟盖板选型攻略:耐用性与性价比如何兼得? - 品牌优选官
  • 基于Arduino与图形化编程的随机任务转盘设计与实现
  • 别只看mAP!用YOLOv5n/v8n/v6n/v9c实测烟雾检测,聊聊训练收敛速度和显存占用的那些事儿
  • virtio-win Windows半虚拟化驱动深度解析:架构设计与性能优化技术实现
  • 2026年6月南通搬家公司口碑榜TOP5权威排名 - 幸福生活序曲
  • 韬定律被吹成“中国版摩尔定律“?别急着自嗨,先看看这五个致命真相
  • Google SEO第三周:网站站内基础优化——决定排名快慢的核心基建
  • SukiUI完整指南:5分钟打造专业级Avalonia桌面应用
  • PUBG-Logitech罗技鼠标宏自动压枪:从入门到精通的完整实战指南