概要
Statesync 是将状态同步到接近当前最新块的目标区块的过程。同步节点(“客户端”)向其他最新的验证者(“服务器”)请求数据,以帮助其从当前视图进展到目标视图;服务器依赖 MonadDb 中的元数据高效响应请求。 由于当前最新块是一个移动目标,statesync 完成后,客户端会发起另一次 statesync 请求以更接近当前最新块,或者如果在追赶范围内则重放已排队的区块。方法
Statesync 是将存储在 MonadDb 中的状态同步到接近当前最新块的目标区块的过程。 当前最新块是一个移动目标,所以在 statesync 运行时,同步节点会存储目标区块之外的新区块,statesync 完成后,通过正常执行重放这些额外的区块以赶上当前最新块。目标区块可能在此过程中被更新多次。 Statesync 遵循客户端-服务器模型,statesync 请求者是客户端,服务 statesync 请求的验证者节点是服务器。Statesync 包含的数据
MonadDb 存储与区块执行相关的各种数据。然而,只有一部分是完全参与活跃集合所必需的,因此包含在 statesync 中:- 账户,包括余额、代码和存储
- 最后 256 个区块头(用于验证正确性)
版本控制和验证
为了效率,客户端按从最不最近更新到最近更新的顺序请求状态,在过程接近尾声时收敛到最新块。服务器提供相对于客户端最新区块的差异。
prefix- 默克尔帕特里夏树的前缀i- 起始区块号j- 结束区块号target- 目标区块号last_target- 上一个目标区块号,用于推断要发送的删除
j 相对于目标区块缓冲了某个偏移量 B,以避免重传 MPT 中最近使用的节点。当 i 和 target 区块足够接近时,如上面最后一轮所示,statesync 客户端将请求 j = target。
此时,如果 target 距离链最新块的差值小于 statesync_threshold(默认为 600 个区块),则 statesync 结束,状态根将被验证。target 和最新块之间的任何剩余区块将通过 blocksync 同步。如果 target 距离链最新块超过 statesync_threshold 个区块,将开始新一轮 statesync。
在区块执行期间,服务器将版本与节点内容一起存储。因此,在收到 statesync 请求时,服务器能够快速缩小相关子树的范围并提交读请求,这些请求是极易并行的。

