当前位置: 首页 > 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.jsqmd.com/news/943026/

相关文章:

  • C语言基础入门到进阶:变量、函数、指针与内存管理一文讲透
  • 通达信缠论插件:3分钟实现自动画中枢的终极解决方案
  • 绕过小米社区5级限制:一个Python脚本+替换系统App的BL解锁思路拆解
  • 3串锂电池保护芯片PW7126搭配四颗PW4406A构成6A方案
  • 通达信缠论插件终极指南:5分钟让复杂技术分析变简单
  • 自己动手丰衣足食-自己动手修改GBA ROM游戏文件
  • OData 入门与详解:从基础到企业
  • PostgreSQL 中 now() 函数事务内行为异常,clock_timestamp() 成解决方案
  • 如何在10分钟内构建专业级Arduino音频应用:终极嵌入式音频库指南
  • IOTA 学习笔记(十):交易与 PTB,可编程交易块怎么理解?
  • 别再让单例坑了你!深入理解Unity中MonoBehaviour单例的销毁时机与内存管理
  • 某汽车品牌自燃事件的危机公关全程
  • 深度解析:CloudBeaver云数据库管理平台架构设计与生产部署实战
  • Honey Select 2终极汉化优化补丁:三步搞定完整游戏体验升级
  • 基于ESP8266与GPS模块的宠物追踪器:物联网全栈开发实践
  • 如何用Unlock-Music免费解锁音乐文件:浏览器端解密完整指南
  • Arduino DS1307 RTC与OLED时钟项目:从I2C通信到时间显示全解析
  • Joy-Con Toolkit:5大核心功能解锁任天堂Switch手柄的隐藏潜力
  • 从Macvlan到Ipvlan:在K8s和Docker里选对虚拟网络模式的避坑指南
  • OData V4.01 完整查询语法速查表
  • 15|测试用例与代码映射:平台怎么知道哪个用例测过哪段代码?
  • ZYNQ-7020软硬协同电磁超声测厚方案:含伪随机编码激励、匹配滤波压缩与微伏级回波时延提取
  • 告别盲操作!手把手教你用AutoSar Dcm配置UDS 0x31例程控制(附RID参数详解)
  • 如何用3步实现Elsevier投稿状态智能追踪:科研工作者的终极效率工具
  • 从一次线上故障复盘说起:我是如何用wrk定位Nginx配置瓶颈,并将QPS提升3倍的
  • 保姆级教程:在Proxmox VE 8上用OSX-PROXMOX脚本装macOS Monterey(附VNC远程避坑指南)
  • 从游戏地形到有限元分析:Delaunay三角剖分在Unity与COMSOL中的高效应用与避坑指南
  • 舆情监测数据的真实性困境
  • 别再只会用AT指令了!手把手教你用Python脚本自动化测试NB-IoT模块(附源码)
  • Cricut Joy 2 彩虹套装降至 119.99 美元,入门级手工机实现个性化礼物定制!