以太坊区块同步原理分析
以太坊区块同步,主要有三个模式 Full, Fast, Light。 其中Full是同步区块头和区块数据。以下分析主要分析核心思路,大致的算法过程。
一、部分源码分析
以太坊同步的过程主要是依赖下载器downloader进行同步,通过peer的一些标志来筛选节点。将任务放到优先级队列里面加快同步速度。其他的代码起到辅助作用。
queue.go :
优先级队列实现。处理请求,响应的优先级队列。包括同步区块头部和区块body。
peer.go:
记录peer的吞吐量,RTT,是否空闲等数据,同时对peer的注册和注销进行管理
downloader.go:
主要的下载任务实现逻辑。
二、FullSync 区块同步过程
区块头: 根据TD最大值筛选出节点,同步最长链的节点
同步区块头完成之后,进入fetchbody, 主要三步为:
根据当前计算的TTL 设置超时时间,
根据RTT计算该节点可以请求的节点的block的容量capacity
根据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可能被多次获取,适当降低有利于稳定传输