对象模型
在Sui中,存储的基本单位是对象。与许多其他区块链不同,这里的存储围绕着包含键值存储的账户中心展开,Sui的存储围绕着可以通过唯一ID在链上寻址的对象。智能合约是一个对象(称为Sui Move包),这些智能合约操纵Sui网络上的对象:
- Sui Move包:一组Sui Move字节码模块。每个模块都有一个在包内是唯一的名称。包的链上ID和模块名称的组合唯一标识模块。在将智能合约发布到Sui时,包是发布的单位。发布了包对象后,它是不可变的,永远无法更改或删除。包对象可以依赖于先前发布到Sui的其他包对象。
- Sui Move对象:由Sui Move包中的特定Sui Move模块管理的类型数据。每个对象值都是一个包含原始类型(如整数和地址)、其他对象和非对象结构的结构。
对象元数据
每个Sui对象都具有以下元数据:
- 32字节的全局唯一ID。对象ID是从创建对象的交易的摘要和编码交易生成的ID数量的计数器派生的。
- 8字节无符号整数版本,随着每次修改它的事务而单调递增(参见 对象和包版本)。
- 32字节事务摘要,指示上次将此对象作为输出包含在内的交易。
- 33字节所有者字段,指示如何访问此对象。有关更多信息,请参阅 对象所有权。
除了常见的元数据之外,对象还有一个特定于类别的、可变大小的内容字段,其中包含一个 二进制规范序列化(BCS) 编码的有效载荷。
- Move对象包含其Move类型、对象是否可以使用
public_transfer
进行转移,以及其字段,再次编码为BCS。 - Move包含包中的字节码模块、一个表标识包的每个类型是由该包的哪个版本引入的(类型起源表),以及一个表将其所有传递依赖项映射到要使用的该包的特定版本(链接表)。
引用对象
有几种不同的方式可以简洁地引用一个对象,而无需指定其全部内容和元数据,每种方式都略有不同的用途:
- ID: 上面提到的对象的全局唯一ID。ID是对象随时间的稳定标识符,对于查询对象的当前状态或描述在两个地址之间传输的对象,都非常有用。
- 带版本的ID: 一个(ID,版本)对。带版本的ID描述了对象在对象历史的特定点的状态,非常适用于询问对象在过去某个时点的值或确定对象的某个视图现在有多新鲜。
- 对象引用: 一个(ID,版本,对象摘要)三元组。对象摘要是对象内容和元数据的哈希。对象引用提供了对象在对象历史的特定点的身份验证视图。交易要求通过对象引用指定对象输入,以确保交易的发送者和处理交易的验证器对对象的内容和元数据达成一致。
事务-对象DAG:关联对象和事务
事务以对象作为输入,读取/写入/变异这些输入,并产生变异或新创建的对象作为输出。每个对象都知道产生它的最后一个事务(的哈希)是什么。因此,表示对象和事务之间关系的一种自然方式是使用一个有向无环图(DAG),其中:
- 节点是事务。
- 有向边从事务
A
指向事务B
,如果A
的输出对象是B
的输入对象。它们由所讨论对象的引用标记(指定了由A
创建且由B
使用的对象的确切版本)。
此DAG的根是一个起源事务,它不接受任何输入并产生存在于系统初始状态的对象。可以通过识别尚未被任何提交事务消耗的可变事务输出,并发送一个新的事务,该事务将这些输出(以及可选的不可变事务输出)作为输入来扩展此DAG。
可以作为事务输入的对象集合称为活动对象,由Sui维护的全局状态包括所有这些对象的总和。对于特定的Sui地址A,A拥有的所有对象以及系统中的所有共享对象和不可变对象都属于活动对象。
当此DAG包含系统中的所有提交事务时,它形成了系统状态和历史的完整(且经过加密审计的)视图。此外,你可以使用上述方案构建一个子集的事务或对象的相关历史的DAG(例如,由单个地址拥有的对象)。
事务、对象和数据的限制
Sui对事务和事务中使用的数据有一些限制,例如最大大小和使用的对象数量。