#ethereum

以太坊区块同步原理分析

以太坊区块同步,主要有三个模式 Full, Fast, Light。 其中Full是同步区块头和区块数据。以下分析主要分析核心思路,大致的算法过程。

一、部分源码分析

以太坊同步的过程主要是依赖下载器downloader进行同步,通过peer的一些标志来筛选节点。将任务放到优先级队列里面加快同步速度。其他的代码起到辅助作用。

queue.go :

优先级队列实现。处理请求,响应的优先级队列。包括同步区块头部和区块body。

peer.go:

记录peer的吞吐量,RTT,是否空闲等数据,同时对peer的注册和注销进行管理

downloader.go:

主要的下载任务实现逻辑。

二、FullSync 区块同步过程

区块头: 根据TD最大值筛选出节点,同步最长链的节点

同步区块头完成之后,进入fetchbody, 主要三步为:

  1. 根据当前计算的TTL 设置超时时间,

  2. 根据RTT计算该节点可以请求的节点的block的容量capacity

  3. 根据peerSet返回当前空闲的peer, 并且按照吞吐量排序

三、fetchBodies过程分析

fetchbodies是同步块的主要函数,通过找到一部分可以使用的节点,向这些节点派送同步区块的任务,并发进行。同时检查是否有存在超时。

qosTuner 服务

定时更新RTT。根据impact系数,所有节点的RTT中位数,计算新一轮的RTT。同时更新d.rttConfidence, 以当前的RTT时间作为下一轮开始的delay。

requestTTL计算过程

参数 计算
d.rttEstimate 根据qosTuner 服务,定时更新
d.rttConfidence 新peer加入,更新conf
ttlScaling 3 (定值)
ttlLimit 1分钟(定值)

requestRTT计算过程

0.9 *d.rttEstimate

原因是该RTT可能被多次获取,适当降低有利于稳定传输

四、FullSync时序图

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×