github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/les/sync.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:39</date> 10 //</624450096259403776> 11 12 13 package les 14 15 import ( 16 "context" 17 "time" 18 19 "github.com/ethereum/go-ethereum/core/rawdb" 20 "github.com/ethereum/go-ethereum/eth/downloader" 21 "github.com/ethereum/go-ethereum/light" 22 ) 23 24 //同步器负责定期与网络同步,两者都是 25 //下载哈希和块以及处理公告处理程序。 26 func (pm *ProtocolManager) syncer() { 27 //启动并确保清除同步机制 28 //pm.fetcher.start()。 29 //延迟pm.fetcher.stop() 30 defer pm.downloader.Terminate() 31 32 //等待不同事件触发同步操作 33 //forceSync:=time.tick(forceSyncCycle) 34 for { 35 select { 36 case <-pm.newPeerCh: 37 /*//确保要从中选择对等点,然后同步 38 如果pm.peers.len()<mindesiredpeerCount_ 39 打破 40 } 41 转到pm.synchronize(pm.peers.bestpeer()) 42 **/ 43 44 /*ASE<-强制同步: 45 //即使没有足够的对等点,也强制同步 46 转到pm.synchronize(pm.peers.bestpeer()) 47 **/ 48 49 case <-pm.noMorePeers: 50 return 51 } 52 } 53 } 54 55 func (pm *ProtocolManager) needToSync(peerHead blockInfo) bool { 56 head := pm.blockchain.CurrentHeader() 57 currentTd := rawdb.ReadTd(pm.chainDb, head.Hash(), head.Number.Uint64()) 58 return currentTd != nil && peerHead.Td.Cmp(currentTd) > 0 59 } 60 61 //同步尝试同步我们的本地块链与远程对等。 62 func (pm *ProtocolManager) synchronise(peer *peer) { 63 //如果没有对等点,则短路 64 if peer == nil { 65 return 66 } 67 68 //确保同行的TD高于我们自己的TD。 69 if !pm.needToSync(peer.headBlockInfo()) { 70 return 71 } 72 73 ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) 74 defer cancel() 75 pm.blockchain.(*light.LightChain).SyncCht(ctx) 76 pm.downloader.Synchronise(peer.id, peer.Head(), peer.Td(), downloader.LightSync) 77 } 78