|
|
|
@ -87,12 +87,16 @@ type txPool interface { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type ProtocolManager struct { |
|
|
|
|
lightSync bool |
|
|
|
|
// Configs
|
|
|
|
|
chainConfig *params.ChainConfig |
|
|
|
|
iConfig *light.IndexerConfig |
|
|
|
|
|
|
|
|
|
client bool // The indicator whether the node is light client
|
|
|
|
|
maxPeers int // The maximum number peers allowed to connect.
|
|
|
|
|
networkId uint64 // The identity of network.
|
|
|
|
|
|
|
|
|
|
txpool txPool |
|
|
|
|
txrelay *LesTxRelay |
|
|
|
|
networkId uint64 |
|
|
|
|
chainConfig *params.ChainConfig |
|
|
|
|
iConfig *light.IndexerConfig |
|
|
|
|
blockchain BlockChain |
|
|
|
|
chainDb ethdb.Database |
|
|
|
|
odr *LesOdr |
|
|
|
@ -102,23 +106,21 @@ type ProtocolManager struct { |
|
|
|
|
reqDist *requestDistributor |
|
|
|
|
retriever *retrieveManager |
|
|
|
|
servingQueue *servingQueue |
|
|
|
|
|
|
|
|
|
downloader *downloader.Downloader |
|
|
|
|
fetcher *lightFetcher |
|
|
|
|
peers *peerSet |
|
|
|
|
maxPeers int |
|
|
|
|
|
|
|
|
|
eventMux *event.TypeMux |
|
|
|
|
downloader *downloader.Downloader |
|
|
|
|
fetcher *lightFetcher |
|
|
|
|
ulc *ulc |
|
|
|
|
peers *peerSet |
|
|
|
|
|
|
|
|
|
// channels for fetcher, syncer, txsyncLoop
|
|
|
|
|
newPeerCh chan *peer |
|
|
|
|
quitSync chan struct{} |
|
|
|
|
noMorePeers chan struct{} |
|
|
|
|
|
|
|
|
|
// wait group is used for graceful shutdowns during downloading
|
|
|
|
|
// and processing
|
|
|
|
|
wg *sync.WaitGroup |
|
|
|
|
ulc *ulc |
|
|
|
|
wg *sync.WaitGroup |
|
|
|
|
eventMux *event.TypeMux |
|
|
|
|
|
|
|
|
|
// Callbacks
|
|
|
|
|
synced func() bool |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// NewProtocolManager returns a new ethereum sub protocol manager. The Ethereum sub protocol manages peers capable
|
|
|
|
@ -126,7 +128,7 @@ type ProtocolManager struct { |
|
|
|
|
func NewProtocolManager( |
|
|
|
|
chainConfig *params.ChainConfig, |
|
|
|
|
indexerConfig *light.IndexerConfig, |
|
|
|
|
lightSync bool, |
|
|
|
|
client bool, |
|
|
|
|
networkId uint64, |
|
|
|
|
mux *event.TypeMux, |
|
|
|
|
engine consensus.Engine, |
|
|
|
@ -139,10 +141,10 @@ func NewProtocolManager( |
|
|
|
|
serverPool *serverPool, |
|
|
|
|
quitSync chan struct{}, |
|
|
|
|
wg *sync.WaitGroup, |
|
|
|
|
ulcConfig *eth.ULCConfig) (*ProtocolManager, error) { |
|
|
|
|
ulcConfig *eth.ULCConfig, synced func() bool) (*ProtocolManager, error) { |
|
|
|
|
// Create the protocol manager with the base fields
|
|
|
|
|
manager := &ProtocolManager{ |
|
|
|
|
lightSync: lightSync, |
|
|
|
|
client: client, |
|
|
|
|
eventMux: mux, |
|
|
|
|
blockchain: blockchain, |
|
|
|
|
chainConfig: chainConfig, |
|
|
|
@ -158,6 +160,7 @@ func NewProtocolManager( |
|
|
|
|
quitSync: quitSync, |
|
|
|
|
wg: wg, |
|
|
|
|
noMorePeers: make(chan struct{}), |
|
|
|
|
synced: synced, |
|
|
|
|
} |
|
|
|
|
if odr != nil { |
|
|
|
|
manager.retriever = odr.retriever |
|
|
|
@ -174,7 +177,7 @@ func NewProtocolManager( |
|
|
|
|
if disableClientRemovePeer { |
|
|
|
|
removePeer = func(id string) {} |
|
|
|
|
} |
|
|
|
|
if lightSync { |
|
|
|
|
if client { |
|
|
|
|
var checkpoint uint64 |
|
|
|
|
if cht, ok := params.TrustedCheckpoints[blockchain.Genesis().Hash()]; ok { |
|
|
|
|
checkpoint = (cht.SectionIndex+1)*params.CHTFrequency - 1 |
|
|
|
@ -193,7 +196,7 @@ func (pm *ProtocolManager) removePeer(id string) { |
|
|
|
|
|
|
|
|
|
func (pm *ProtocolManager) Start(maxPeers int) { |
|
|
|
|
pm.maxPeers = maxPeers |
|
|
|
|
if pm.lightSync { |
|
|
|
|
if pm.client { |
|
|
|
|
go pm.syncer() |
|
|
|
|
} else { |
|
|
|
|
go func() { |
|
|
|
@ -268,10 +271,13 @@ func (pm *ProtocolManager) newPeer(pv int, nv uint64, p *p2p.Peer, rw p2p.MsgRea |
|
|
|
|
func (pm *ProtocolManager) handle(p *peer) error { |
|
|
|
|
// Ignore maxPeers if this is a trusted peer
|
|
|
|
|
// In server mode we try to check into the client pool after handshake
|
|
|
|
|
if pm.lightSync && pm.peers.Len() >= pm.maxPeers && !p.Peer.Info().Network.Trusted { |
|
|
|
|
if pm.client && pm.peers.Len() >= pm.maxPeers && !p.Peer.Info().Network.Trusted { |
|
|
|
|
return p2p.DiscTooManyPeers |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Reject light clients if server is not synced.
|
|
|
|
|
if !pm.client && !pm.synced() { |
|
|
|
|
return p2p.DiscRequested |
|
|
|
|
} |
|
|
|
|
p.Log().Debug("Light Ethereum peer connected", "name", p.Name()) |
|
|
|
|
|
|
|
|
|
// Execute the LES handshake
|
|
|
|
@ -304,7 +310,7 @@ func (pm *ProtocolManager) handle(p *peer) error { |
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
// Register the peer in the downloader. If the downloader considers it banned, we disconnect
|
|
|
|
|
if pm.lightSync { |
|
|
|
|
if pm.client { |
|
|
|
|
p.lock.Lock() |
|
|
|
|
head := p.headInfo |
|
|
|
|
p.lock.Unlock() |
|
|
|
|