无限分片范式
理解TON区块链中的拆分合并
TON(Telegram Open Network)区块链引入了一些创新概念来提高区块链的可扩展性和效率。其中一个概念是拆分合并功能,这是其区块链架构的一个组成部分。本短文探讨了TON区块链中拆分合并的关键方面,重点讨论其在无限分片范式(ISP,Infinity Sharding Paradigm)中的作用。
无限分片范式(ISP)及其应用
ISP是TON区块链设计的基础,将每个账户视为其独立的“账户链”的一部分。这些账户链然后被聚合到分片链块中以提高效率。一个分片链的状态包括其所有账户链的状态。因此,一个分片链区块本质上是一系列分配给它的虚拟账户区块的集合。
- ShardState:近似表示为 Hashmap(n, AccountState),其中n是account_id的位长度。
- ShardBlock:近似表示为 Hashmap(n, AccountBlock)。
每个分片链,或更准确地说,每个分片链区块,由workchain_id
和账户id的二进制前缀s
的组合来标识。
分片示例
- 对每个区块的区块大小(Block size estimation) 、gas消耗量(Gasconsumption)和区块的起始点和终点点点之间的差异( lt delta)去计算它们的变化量
- 使用这些值,可将区块视为超载或欠载。
- 每个分片都会保存欠载和过载历史。如果最近有足够多的区块被欠载或超载, 就会设置
want_merge
或want_split
标志。 - 验证器使用这些标志合并或拆分分片。
1. 对当前区块状态评估
总之,TON区块链中的拆分合并是一个复杂但高效的机制,增强了区块链网络的可扩展性和交互性。它体现了TON解决常见区块链挑战的方法,强调效率和全局一致性。
- Block size estimation - 不是实际的块大小,而是在整理过程中计算出的估计值。
- Gas consumption - 所有交易中消耗的 gas 总量(不包括 ticktock 和造币/回收特殊交易)。
- Lt delta -- 区块起始和结束时长之差。
分片链的拆分和非拆分部分
一个分片链块和状态分为两部分:
- 拆分部分:符合ISP形式,包含特定于账户的数据。
- 非拆分部分:涉及区块与其他区块和外部世界的交互相关的数据。
- Lt delta:
1000/5000/10000
. 此外,还有一个中等限制,等于(soft + hard) / 2
。
我们将三个参数 (大小(size) 、gas和 lt delta) 分类为类别:
0
- 未达到欠载限制。1
- 超过欠载限制。2
- 超过软限制。3
- 超过介质限制。4
- 超过硬限制。
区块分类最终的标准以最大值为主,在 (“size”、“gas”、“lt delta” ) 中取最大值 。 例如,如果尺寸分类为2,气体分类为3, lt delta的分类是。据此可以判断出最后的区块分类是3。
- 当块的分类是0 (underload) 时,该块倾向于与其他合并。
- 当块的分类为 2 轻微 (soft) 限制已经达到时,整理器停止处理内部消息。该块倾向于分裂。
- 当块的分类为 3 达到中等 (medium) 限制时,整理器停止处理外部消息。
3. 过载或欠载的判定
在对数据块进行分类后,整理器会检查过载和欠载情况。 出站报文队列的大小和调度队列的处理状态也在考虑之列。
- 如果区块类别大于等于“2” (soft) 并且消息队列大小没有超过“SPLIT_MAX_QUEUE_SIZE = 100000”,则该块过载。
- 如果达到了调度队列中已处理消息总数的限制,并且消息队列大小没有超过
SPLIT_MAX_QUEUE_SIZE = 100000
,则该区块判定为过载。 - 如果区块类别为“0” (欠载) 且消息队列大小没有超过“MERGE_MAX_QUEUE_SIZE = 2047”,则该块欠载。
- 如果消息队列尺寸大于等于
FORCE_SPLIT_QUEUE_SIZE = 4096
且没有超过SPLIT_MAX_QUEUE_SIZE = 100000
,则该区块将被当作超载。
4. 决定区块的拆分还是合并
每个区块都保存着过载和 欠载的历史记录——这是一个64位的掩码,记录了最近64个区块的过载/欠载状态 ,它被用来决定是否要进行分割或合并。
分片链状态中的OutMsgQueue是一个关键的非拆分部分。它保存OutMsgDescr中的未处理消息,直到它们被处理或发送到目的地。
当欠载或过载的历史记录具有非负权重时,会设置 want_merge
或 want_split
标志。
5. 区块分割合并的最后决定
验证者 (Validators ) 使用 want_split
和 want_merge
标志以及工作链配置参数
workchain configuration parameters.来决定是否要分割或合并分片(shards)。
- 区块布局
- 白皮书
- 深度为
min_split
的分片不能合并,深度为max_split
的分片不能分割。 - 如果区块有
want_split
标志,分片将会分割。 - 如果区块及其兄弟区块都设置了
want_merge
标志,则这些分片将会合并。
分片将在做出决定后的 split_merge_delay = 100
秒内进行分割和合并。