分片
warning
页面正在开发中
分片是TON区块链中的一种机制,它允许处理大量交易。TON中分片的主要思想是,当账户A向账户B发送消息,同时账户C向账户D发送消息时,这两个操作都可以异步进行。
默认情况下,在基本链(workchain=0
)中只有一个分片,其分片号为 0x8000000000000000
(或二进制表示为 1000000000000000000000000000000000000000000000000000000000000000
)。主链(workchain=-1
)始终只有一个分片。
拆分
每个分片负责一些具有某些共同二进制前缀的账户子集。这个前缀出现在分片ID中,由一个64位整数表示,其结构为:<二进制前缀>100000...
。例如,ID为 1011100000...
的分片包含所有以前缀 1011
开头的账 户。
当某个分片中的交易数量增长时,它会分裂成两个分片。新分片获得以下ID:<父前缀>01000...
和 <父前缀>11000...
,分别负责以 <父前缀>0
和 <父前缀>1
开头的账户。分片中的区块序列号从父区块的最后一个序列号加1开始连续。拆分后,分片独立进行,可能会有不同的序列号。
主链区块在其头部包含分片信息。分片区块出现在主链头部后,可以认为是完成的(不能回滚)。
示例:
- 主链块
seqno=34607821
有2个分片:(0,4000000000000000,40485798)
和(0,c000000000000000,40485843)
(https://toncenter.com/api/v2/shards?seqno=34607821)。 - 分片
shard=4000000000000000
拆分成shard=2000000000000000
和shard=6000000000000000
,主链区块seqno=34607822
已经有3个分片:(0,2000000000000000,40485799)
和(0,6000000000000000,40485799)
。注意,两个新分片具有相同的序列号,但不同的分片ID (https://toncenter.com/api/v2/shards?seqno=34607822)。 - 新分片独立进行,经过100个主链区块(在主链块
seqno=34607921
中),一个分片有最后一个块(0,2000000000000000,40485901)
,另一个分片有(0,6000000000000000,40485897)
(https://toncenter.com/api/v2/shards?seqno=34607921)。
合并
当分片负载下降时,它们可以按如下方式合并回去:
- 如果两个分片有共同的父分片,因此,它们的分片ID分别为
<父前缀>010...
和<父前缀110...
,则可以合并。合并后的分片将具有分片ID<父前缀>10...
(例如10010...
+10110...
=1010...
)。合并分片的第一个区块将具有seqno=max(seqno1, seqno2) + 1
。
示例:
- 在主链区块
seqno=34626306
中,五个分片中的两个,最后区块为(0,a000000000000000,40492030)
和(0,e000000000000000,40492216)
,合并成一个区块为(0,c000000000000000,40492217)
的分片 (https://toncenter.com/api/v2/shards?seqno=34626306 和 https://toncenter.com/api/v2/shards?seqno=34626307)。