上一节分析到Fetcher用于同步网络节点的新区块和新的交易数据,如果新区块和本地最新的区块相隔距离较远,说明本地区块数据太旧,Fetcher就不会同步这些区块。这时候就要借助Downloader来同步完整的区块数据。
一,启动Downloader
handler 初始化的时候会进行Downloader的初始化:
- eth/handler.go:196 newHandler()
- // Construct the downloader (long sync) 构建下载器(长同步)
- h.downloader = downloader.New(h.checkpointNumber, config.Database, h.eventMux, h.chain, nil, h.removePeer, success)
- // New creates a new downloader to fetch hashes and blocks from remote peers. 创建一个新的下载器以从远程对等端获取哈希和块。
- func New(checkpoint uint64, stateDb ethdb.Database, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn, success func()) *Downloader {
- if lightchain == nil {
- lightchain = chain
- }
- dl := &Downloader{
- stateDB: stateDb,
- mux: mux,
- checkpoint: checkpoint,
- queue: newQueu