Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ch02-03 Sui 对象:owned、shared、immutable

返回本章

先建立手感

这一节用“Sui 对象:owned、shared、immutable”训练 Move 手感:先看对象和资源能不能被复制、丢弃、转移,再回到 DeepBook 里判断为什么这些限制有实际价值。

Move 对照

先用下面几处源码建立 Move 概念的落点。这里不追完整协议流程,只确认类型、ability、对象、事件和测试入口如何在真实项目中出现。

读这些文件时,把语法点和真实对象放在一起看:ability、泛型、对象 ID、事件和测试入口分别承担什么约束。

拆开来看

owned object 由一个地址拥有,例如普通 Coin<T>、权限 cap、某些用户对象。它适合用户独占操作,但高频使用时可能遇到并发和锁定问题。

shared object 可被多人在交易中引用。DeepBook 的 PoolBalanceManager 都是需要重点理解的共享状态。Pool 定义在 packages/deepbook/sources/pool.moveBalanceManager 定义在 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 有什么不同?