ch02-03 Sui 对象:owned、shared、immutable
先建立手感
这一节用“Sui 对象:owned、shared、immutable”训练 Move 手感:先看对象和资源能不能被复制、丢弃、转移,再回到 DeepBook 里判断为什么这些限制有实际价值。
Move 对照
先用下面几处源码建立 Move 概念的落点。这里不追完整协议流程,只确认类型、ability、对象、事件和测试入口如何在真实项目中出现。
- packages/deepbook/sources/pool.move
- packages/deepbook/sources/balance_manager.move
- packages/deepbook/sources/registry.move
- packages/deepbook/sources/helper/big_vector.move
读这些文件时,把语法点和真实对象放在一起看:ability、泛型、对象 ID、事件和测试入口分别承担什么约束。
拆开来看
owned object 由一个地址拥有,例如普通 Coin<T>、权限 cap、某些用户对象。它适合用户独占操作,但高频使用时可能遇到并发和锁定问题。
shared object 可被多人在交易中引用。DeepBook 的 Pool 和 BalanceManager 都是需要重点理解的共享状态。Pool 定义在 packages/deepbook/sources/pool.move,BalanceManager 定义在 packages/deepbook/sources/balance_manager.move。
immutable object 发布后只读。Move package 本身可按不可变依赖理解。应用构造 PTB 时必须知道对象类型,因为 owned object 需要作为输入消耗或借用,shared object 需要共享对象引用,immutable package 通过函数 target 引用。
阅读补充
DeepBook 中最常见的 shared object 是 Pool 和 Registry 相关状态,常见 owned object 是用户持有的 cap 或 BalanceManager 管理入口。immutable package 则提供代码和类型定义,交易调用时通过 package/module/function 定位。
判断对象类别时,除了看定义中的 has key,还要看创建后是 transfer 给地址、share 成共享对象,还是作为 package 发布后的不可变代码存在。不同类别决定交易是否需要所有权、是否会形成共享对象并发边界。
Move 判断
- 写交易参数时把 owned、shared、immutable 分组列出。
- shared object 需要考虑版本和并发访问,owned object 需要考虑签名者和所有权。
- 不要把 package ID 当成普通对象余额来查询。
练习问题
- Pool 和 BalanceManager 在访问模式上有什么差异?
- 为什么 shared object 更容易成为并发边界?
- package ID 与普通 owned object 有什么不同?