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