mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-17 18:30:45 +00:00
Merge pull request #893 from gzliudan/fix_nodeinfo
les: fix crasher in NodeInfo when running as server
This commit is contained in:
commit
a898812123
8 changed files with 188 additions and 153 deletions
|
|
@ -36,7 +36,6 @@ import (
|
||||||
"github.com/XinFinOrg/XDPoSChain/eth/ethconfig"
|
"github.com/XinFinOrg/XDPoSChain/eth/ethconfig"
|
||||||
"github.com/XinFinOrg/XDPoSChain/eth/filters"
|
"github.com/XinFinOrg/XDPoSChain/eth/filters"
|
||||||
"github.com/XinFinOrg/XDPoSChain/eth/gasprice"
|
"github.com/XinFinOrg/XDPoSChain/eth/gasprice"
|
||||||
"github.com/XinFinOrg/XDPoSChain/ethdb"
|
|
||||||
"github.com/XinFinOrg/XDPoSChain/event"
|
"github.com/XinFinOrg/XDPoSChain/event"
|
||||||
"github.com/XinFinOrg/XDPoSChain/internal/ethapi"
|
"github.com/XinFinOrg/XDPoSChain/internal/ethapi"
|
||||||
"github.com/XinFinOrg/XDPoSChain/light"
|
"github.com/XinFinOrg/XDPoSChain/light"
|
||||||
|
|
@ -49,26 +48,24 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type LightEthereum struct {
|
type LightEthereum struct {
|
||||||
config *ethconfig.Config
|
lesCommons
|
||||||
|
|
||||||
odr *LesOdr
|
odr *LesOdr
|
||||||
relay *LesTxRelay
|
relay *LesTxRelay
|
||||||
chainConfig *params.ChainConfig
|
chainConfig *params.ChainConfig
|
||||||
// Channel for shutting down the service
|
// Channel for shutting down the service
|
||||||
shutdownChan chan bool
|
shutdownChan chan bool
|
||||||
// Handlers
|
|
||||||
peers *peerSet
|
|
||||||
txPool *light.TxPool
|
|
||||||
blockchain *light.LightChain
|
|
||||||
protocolManager *ProtocolManager
|
|
||||||
serverPool *serverPool
|
|
||||||
reqDist *requestDistributor
|
|
||||||
retriever *retrieveManager
|
|
||||||
// DB interfaces
|
|
||||||
chainDb ethdb.Database // Block chain database
|
|
||||||
|
|
||||||
bloomRequests chan chan *bloombits.Retrieval // Channel receiving bloom data retrieval requests
|
// Handlers
|
||||||
bloomIndexer, chtIndexer, bloomTrieIndexer *core.ChainIndexer
|
peers *peerSet
|
||||||
|
txPool *light.TxPool
|
||||||
|
blockchain *light.LightChain
|
||||||
|
serverPool *serverPool
|
||||||
|
reqDist *requestDistributor
|
||||||
|
retriever *retrieveManager
|
||||||
|
|
||||||
|
bloomRequests chan chan *bloombits.Retrieval // Channel receiving bloom data retrieval requests
|
||||||
|
bloomIndexer *core.ChainIndexer
|
||||||
|
|
||||||
ApiBackend *LesApiBackend
|
ApiBackend *LesApiBackend
|
||||||
|
|
||||||
|
|
@ -108,30 +105,38 @@ func New(ctx *node.ServiceContext, config *ethconfig.Config) (*LightEthereum, er
|
||||||
quitSync := make(chan struct{})
|
quitSync := make(chan struct{})
|
||||||
|
|
||||||
leth := &LightEthereum{
|
leth := &LightEthereum{
|
||||||
config: config,
|
lesCommons: lesCommons{
|
||||||
chainConfig: chainConfig,
|
chainDb: chainDb,
|
||||||
chainDb: chainDb,
|
config: config,
|
||||||
eventMux: ctx.EventMux,
|
},
|
||||||
peers: peers,
|
chainConfig: chainConfig,
|
||||||
reqDist: newRequestDistributor(peers, quitSync),
|
eventMux: ctx.EventMux,
|
||||||
accountManager: ctx.AccountManager,
|
peers: peers,
|
||||||
engine: eth.CreateConsensusEngine(ctx, &config.Ethash, chainConfig, chainDb),
|
reqDist: newRequestDistributor(peers, quitSync),
|
||||||
shutdownChan: make(chan bool),
|
accountManager: ctx.AccountManager,
|
||||||
networkId: networkID,
|
engine: eth.CreateConsensusEngine(ctx, &config.Ethash, chainConfig, chainDb),
|
||||||
bloomRequests: make(chan chan *bloombits.Retrieval),
|
shutdownChan: make(chan bool),
|
||||||
bloomIndexer: eth.NewBloomIndexer(chainDb, light.BloomTrieFrequency),
|
networkId: networkID,
|
||||||
chtIndexer: light.NewChtIndexer(chainDb, true),
|
bloomRequests: make(chan chan *bloombits.Retrieval),
|
||||||
bloomTrieIndexer: light.NewBloomTrieIndexer(chainDb, true),
|
bloomIndexer: eth.NewBloomIndexer(chainDb, light.BloomTrieFrequency),
|
||||||
}
|
}
|
||||||
|
|
||||||
leth.relay = NewLesTxRelay(peers, leth.reqDist)
|
leth.relay = NewLesTxRelay(peers, leth.reqDist)
|
||||||
leth.serverPool = newServerPool(chainDb, quitSync, &leth.wg)
|
leth.serverPool = newServerPool(chainDb, quitSync, &leth.wg)
|
||||||
leth.retriever = newRetrieveManager(peers, leth.reqDist, leth.serverPool)
|
leth.retriever = newRetrieveManager(peers, leth.reqDist, leth.serverPool)
|
||||||
leth.odr = NewLesOdr(chainDb, leth.chtIndexer, leth.bloomTrieIndexer, leth.bloomIndexer, leth.retriever)
|
|
||||||
|
leth.odr = NewLesOdr(chainDb, leth.retriever)
|
||||||
|
leth.chtIndexer = light.NewChtIndexer(chainDb, true)
|
||||||
|
leth.bloomTrieIndexer = light.NewBloomTrieIndexer(chainDb, true)
|
||||||
|
leth.odr.SetIndexers(leth.chtIndexer, leth.bloomTrieIndexer, leth.bloomIndexer)
|
||||||
|
|
||||||
|
// Note: NewLightChain adds the trusted checkpoint so it needs an ODR with
|
||||||
|
// indexers already set but not started yet
|
||||||
if leth.blockchain, err = light.NewLightChain(leth.odr, leth.chainConfig, leth.engine); err != nil {
|
if leth.blockchain, err = light.NewLightChain(leth.odr, leth.chainConfig, leth.engine); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
leth.bloomIndexer.Start(leth.blockchain)
|
leth.bloomIndexer.Start(leth.blockchain)
|
||||||
|
|
||||||
// Rewind the chain in case of an incompatible config upgrade.
|
// Rewind the chain in case of an incompatible config upgrade.
|
||||||
if compat, ok := genesisErr.(*params.ConfigCompatError); ok {
|
if compat, ok := genesisErr.(*params.ConfigCompatError); ok {
|
||||||
log.Warn("Rewinding chain to upgrade configuration", "err", compat)
|
log.Warn("Rewinding chain to upgrade configuration", "err", compat)
|
||||||
|
|
@ -140,7 +145,7 @@ func New(ctx *node.ServiceContext, config *ethconfig.Config) (*LightEthereum, er
|
||||||
}
|
}
|
||||||
|
|
||||||
leth.txPool = light.NewTxPool(leth.chainConfig, leth.blockchain, leth.relay)
|
leth.txPool = light.NewTxPool(leth.chainConfig, leth.blockchain, leth.relay)
|
||||||
if leth.protocolManager, err = NewProtocolManager(leth.chainConfig, true, ClientProtocolVersions, networkID, leth.eventMux, leth.engine, leth.peers, leth.blockchain, nil, chainDb, leth.odr, leth.relay, quitSync, &leth.wg); err != nil {
|
if leth.protocolManager, err = NewProtocolManager(leth.chainConfig, true, networkID, leth.eventMux, leth.engine, leth.peers, leth.blockchain, nil, chainDb, leth.odr, leth.relay, quitSync, &leth.wg); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
leth.ApiBackend = &LesApiBackend{leth, nil}
|
leth.ApiBackend = &LesApiBackend{leth, nil}
|
||||||
|
|
@ -218,14 +223,14 @@ func (s *LightEthereum) ResetWithGenesisBlock(gb *types.Block) {
|
||||||
func (s *LightEthereum) BlockChain() *light.LightChain { return s.blockchain }
|
func (s *LightEthereum) BlockChain() *light.LightChain { return s.blockchain }
|
||||||
func (s *LightEthereum) TxPool() *light.TxPool { return s.txPool }
|
func (s *LightEthereum) TxPool() *light.TxPool { return s.txPool }
|
||||||
func (s *LightEthereum) Engine() consensus.Engine { return s.engine }
|
func (s *LightEthereum) Engine() consensus.Engine { return s.engine }
|
||||||
func (s *LightEthereum) LesVersion() int { return int(s.protocolManager.SubProtocols[0].Version) }
|
func (s *LightEthereum) LesVersion() int { return int(ClientProtocolVersions[0]) }
|
||||||
func (s *LightEthereum) Downloader() *downloader.Downloader { return s.protocolManager.downloader }
|
func (s *LightEthereum) Downloader() *downloader.Downloader { return s.protocolManager.downloader }
|
||||||
func (s *LightEthereum) EventMux() *event.TypeMux { return s.eventMux }
|
func (s *LightEthereum) EventMux() *event.TypeMux { return s.eventMux }
|
||||||
|
|
||||||
// Protocols implements node.Service, returning all the currently configured
|
// Protocols implements node.Service, returning all the currently configured
|
||||||
// network protocols to start.
|
// network protocols to start.
|
||||||
func (s *LightEthereum) Protocols() []p2p.Protocol {
|
func (s *LightEthereum) Protocols() []p2p.Protocol {
|
||||||
return s.protocolManager.SubProtocols
|
return s.makeProtocols(ClientProtocolVersions)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start implements node.Service, starting all internal goroutines needed by the
|
// Start implements node.Service, starting all internal goroutines needed by the
|
||||||
|
|
@ -245,12 +250,8 @@ func (s *LightEthereum) Start(srvr *p2p.Server) error {
|
||||||
// Ethereum protocol.
|
// Ethereum protocol.
|
||||||
func (s *LightEthereum) Stop() error {
|
func (s *LightEthereum) Stop() error {
|
||||||
s.odr.Stop()
|
s.odr.Stop()
|
||||||
if s.bloomIndexer != nil {
|
s.bloomIndexer.Close()
|
||||||
s.bloomIndexer.Close()
|
s.chtIndexer.Close()
|
||||||
}
|
|
||||||
if s.chtIndexer != nil {
|
|
||||||
s.chtIndexer.Close()
|
|
||||||
}
|
|
||||||
if s.bloomTrieIndexer != nil {
|
if s.bloomTrieIndexer != nil {
|
||||||
s.bloomTrieIndexer.Close()
|
s.bloomTrieIndexer.Close()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
86
les/commons.go
Normal file
86
les/commons.go
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
// Copyright 2018 The go-ethereum Authors
|
||||||
|
// This file is part of the go-ethereum library.
|
||||||
|
//
|
||||||
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public License
|
||||||
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
package les
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math/big"
|
||||||
|
|
||||||
|
"github.com/XinFinOrg/XDPoSChain/common"
|
||||||
|
"github.com/XinFinOrg/XDPoSChain/core"
|
||||||
|
"github.com/XinFinOrg/XDPoSChain/eth/ethconfig"
|
||||||
|
"github.com/XinFinOrg/XDPoSChain/ethdb"
|
||||||
|
"github.com/XinFinOrg/XDPoSChain/p2p"
|
||||||
|
"github.com/XinFinOrg/XDPoSChain/p2p/discover"
|
||||||
|
"github.com/XinFinOrg/XDPoSChain/params"
|
||||||
|
)
|
||||||
|
|
||||||
|
// lesCommons contains fields needed by both server and client.
|
||||||
|
type lesCommons struct {
|
||||||
|
config *ethconfig.Config
|
||||||
|
chainDb ethdb.Database
|
||||||
|
protocolManager *ProtocolManager
|
||||||
|
chtIndexer, bloomTrieIndexer *core.ChainIndexer
|
||||||
|
}
|
||||||
|
|
||||||
|
// NodeInfo represents a short summary of the Ethereum sub-protocol metadata
|
||||||
|
// known about the host peer.
|
||||||
|
type NodeInfo struct {
|
||||||
|
Network uint64 `json:"network"` // XDC network ID (50=xinfin, 51=apothem, 551=devnet)
|
||||||
|
Difficulty *big.Int `json:"difficulty"` // Total difficulty of the host's blockchain
|
||||||
|
Genesis common.Hash `json:"genesis"` // SHA3 hash of the host's genesis block
|
||||||
|
Config *params.ChainConfig `json:"config"` // Chain configuration for the fork rules
|
||||||
|
Head common.Hash `json:"head"` // SHA3 hash of the host's best owned block
|
||||||
|
}
|
||||||
|
|
||||||
|
// makeProtocols creates protocol descriptors for the given LES versions.
|
||||||
|
func (c *lesCommons) makeProtocols(versions []uint) []p2p.Protocol {
|
||||||
|
protos := make([]p2p.Protocol, len(versions))
|
||||||
|
for i, version := range versions {
|
||||||
|
version := version
|
||||||
|
protos[i] = p2p.Protocol{
|
||||||
|
Name: "les",
|
||||||
|
Version: version,
|
||||||
|
Length: ProtocolLengths[version],
|
||||||
|
NodeInfo: c.nodeInfo,
|
||||||
|
Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {
|
||||||
|
return c.protocolManager.runPeer(version, p, rw)
|
||||||
|
},
|
||||||
|
PeerInfo: func(id discover.NodeID) interface{} {
|
||||||
|
if p := c.protocolManager.peers.Peer(fmt.Sprintf("%x", id[:8])); p != nil {
|
||||||
|
return p.Info()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return protos
|
||||||
|
}
|
||||||
|
|
||||||
|
// nodeInfo retrieves some protocol metadata about the running host node.
|
||||||
|
func (c *lesCommons) nodeInfo() interface{} {
|
||||||
|
chain := c.protocolManager.blockchain
|
||||||
|
head := chain.CurrentHeader()
|
||||||
|
hash := head.Hash()
|
||||||
|
return &NodeInfo{
|
||||||
|
Network: c.config.NetworkId,
|
||||||
|
Difficulty: chain.GetTd(hash, head.Number.Uint64()),
|
||||||
|
Genesis: chain.Genesis().Hash(),
|
||||||
|
Config: chain.Config(),
|
||||||
|
Head: chain.CurrentHeader().Hash(),
|
||||||
|
}
|
||||||
|
}
|
||||||
108
les/handler.go
108
les/handler.go
|
|
@ -20,7 +20,6 @@ package les
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/big"
|
"math/big"
|
||||||
"net"
|
"net"
|
||||||
|
|
@ -40,7 +39,6 @@ import (
|
||||||
"github.com/XinFinOrg/XDPoSChain/light"
|
"github.com/XinFinOrg/XDPoSChain/light"
|
||||||
"github.com/XinFinOrg/XDPoSChain/log"
|
"github.com/XinFinOrg/XDPoSChain/log"
|
||||||
"github.com/XinFinOrg/XDPoSChain/p2p"
|
"github.com/XinFinOrg/XDPoSChain/p2p"
|
||||||
"github.com/XinFinOrg/XDPoSChain/p2p/discover"
|
|
||||||
"github.com/XinFinOrg/XDPoSChain/p2p/discv5"
|
"github.com/XinFinOrg/XDPoSChain/p2p/discv5"
|
||||||
"github.com/XinFinOrg/XDPoSChain/params"
|
"github.com/XinFinOrg/XDPoSChain/params"
|
||||||
"github.com/XinFinOrg/XDPoSChain/rlp"
|
"github.com/XinFinOrg/XDPoSChain/rlp"
|
||||||
|
|
@ -65,10 +63,6 @@ const (
|
||||||
disableClientRemovePeer = false
|
disableClientRemovePeer = false
|
||||||
)
|
)
|
||||||
|
|
||||||
// errIncompatibleConfig is returned if the requested protocols and configs are
|
|
||||||
// not compatible (low protocol version restrictions and high requirements).
|
|
||||||
var errIncompatibleConfig = errors.New("incompatible configuration")
|
|
||||||
|
|
||||||
func errResp(code errCode, format string, v ...interface{}) error {
|
func errResp(code errCode, format string, v ...interface{}) error {
|
||||||
return fmt.Errorf("%v - %v", code, fmt.Sprintf(format, v...))
|
return fmt.Errorf("%v - %v", code, fmt.Sprintf(format, v...))
|
||||||
}
|
}
|
||||||
|
|
@ -115,8 +109,6 @@ type ProtocolManager struct {
|
||||||
peers *peerSet
|
peers *peerSet
|
||||||
maxPeers int
|
maxPeers int
|
||||||
|
|
||||||
SubProtocols []p2p.Protocol
|
|
||||||
|
|
||||||
eventMux *event.TypeMux
|
eventMux *event.TypeMux
|
||||||
|
|
||||||
// channels for fetcher, syncer, txsyncLoop
|
// channels for fetcher, syncer, txsyncLoop
|
||||||
|
|
@ -131,7 +123,7 @@ type ProtocolManager struct {
|
||||||
|
|
||||||
// NewProtocolManager returns a new ethereum sub protocol manager. The Ethereum sub protocol manages peers capable
|
// NewProtocolManager returns a new ethereum sub protocol manager. The Ethereum sub protocol manages peers capable
|
||||||
// with the ethereum network.
|
// with the ethereum network.
|
||||||
func NewProtocolManager(chainConfig *params.ChainConfig, lightSync bool, protocolVersions []uint, networkId uint64, mux *event.TypeMux, engine consensus.Engine, peers *peerSet, blockchain BlockChain, txpool txPool, chainDb ethdb.Database, odr *LesOdr, txrelay *LesTxRelay, quitSync chan struct{}, wg *sync.WaitGroup) (*ProtocolManager, error) {
|
func NewProtocolManager(chainConfig *params.ChainConfig, lightSync bool, networkId uint64, mux *event.TypeMux, engine consensus.Engine, peers *peerSet, blockchain BlockChain, txpool txPool, chainDb ethdb.Database, odr *LesOdr, txrelay *LesTxRelay, quitSync chan struct{}, wg *sync.WaitGroup) (*ProtocolManager, error) {
|
||||||
// Create the protocol manager with the base fields
|
// Create the protocol manager with the base fields
|
||||||
manager := &ProtocolManager{
|
manager := &ProtocolManager{
|
||||||
lightSync: lightSync,
|
lightSync: lightSync,
|
||||||
|
|
@ -154,54 +146,6 @@ func NewProtocolManager(chainConfig *params.ChainConfig, lightSync bool, protoco
|
||||||
manager.reqDist = odr.retriever.dist
|
manager.reqDist = odr.retriever.dist
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initiate a sub-protocol for every implemented version we can handle
|
|
||||||
manager.SubProtocols = make([]p2p.Protocol, 0, len(protocolVersions))
|
|
||||||
for _, version := range protocolVersions {
|
|
||||||
// Compatible, initialize the sub-protocol
|
|
||||||
version := version // Closure for the run
|
|
||||||
manager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{
|
|
||||||
Name: "les",
|
|
||||||
Version: version,
|
|
||||||
Length: ProtocolLengths[version],
|
|
||||||
Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {
|
|
||||||
var entry *poolEntry
|
|
||||||
peer := manager.newPeer(int(version), networkId, p, rw)
|
|
||||||
if manager.serverPool != nil {
|
|
||||||
addr := p.RemoteAddr().(*net.TCPAddr)
|
|
||||||
entry = manager.serverPool.connect(peer, addr.IP, uint16(addr.Port))
|
|
||||||
}
|
|
||||||
peer.poolEntry = entry
|
|
||||||
select {
|
|
||||||
case manager.newPeerCh <- peer:
|
|
||||||
manager.wg.Add(1)
|
|
||||||
defer manager.wg.Done()
|
|
||||||
err := manager.handle(peer)
|
|
||||||
if entry != nil {
|
|
||||||
manager.serverPool.disconnect(entry)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
case <-manager.quitSync:
|
|
||||||
if entry != nil {
|
|
||||||
manager.serverPool.disconnect(entry)
|
|
||||||
}
|
|
||||||
return p2p.DiscQuitting
|
|
||||||
}
|
|
||||||
},
|
|
||||||
NodeInfo: func() interface{} {
|
|
||||||
return manager.NodeInfo()
|
|
||||||
},
|
|
||||||
PeerInfo: func(id discover.NodeID) interface{} {
|
|
||||||
if p := manager.peers.Peer(fmt.Sprintf("%x", id[:8])); p != nil {
|
|
||||||
return p.Info()
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
if len(manager.SubProtocols) == 0 {
|
|
||||||
return nil, errIncompatibleConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
removePeer := manager.removePeer
|
removePeer := manager.removePeer
|
||||||
if disableClientRemovePeer {
|
if disableClientRemovePeer {
|
||||||
removePeer = func(id string) {}
|
removePeer = func(id string) {}
|
||||||
|
|
@ -262,6 +206,32 @@ func (pm *ProtocolManager) Stop() {
|
||||||
log.Info("Light Ethereum protocol stopped")
|
log.Info("Light Ethereum protocol stopped")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// runPeer is the p2p protocol run function for the given version.
|
||||||
|
func (pm *ProtocolManager) runPeer(version uint, p *p2p.Peer, rw p2p.MsgReadWriter) error {
|
||||||
|
var entry *poolEntry
|
||||||
|
peer := pm.newPeer(int(version), pm.networkId, p, rw)
|
||||||
|
if pm.serverPool != nil {
|
||||||
|
addr := p.RemoteAddr().(*net.TCPAddr)
|
||||||
|
entry = pm.serverPool.connect(peer, addr.IP, uint16(addr.Port))
|
||||||
|
}
|
||||||
|
peer.poolEntry = entry
|
||||||
|
select {
|
||||||
|
case pm.newPeerCh <- peer:
|
||||||
|
pm.wg.Add(1)
|
||||||
|
defer pm.wg.Done()
|
||||||
|
err := pm.handle(peer)
|
||||||
|
if entry != nil {
|
||||||
|
pm.serverPool.disconnect(entry)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
case <-pm.quitSync:
|
||||||
|
if entry != nil {
|
||||||
|
pm.serverPool.disconnect(entry)
|
||||||
|
}
|
||||||
|
return p2p.DiscQuitting
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (pm *ProtocolManager) newPeer(pv int, nv uint64, p *p2p.Peer, rw p2p.MsgReadWriter) *peer {
|
func (pm *ProtocolManager) newPeer(pv int, nv uint64, p *p2p.Peer, rw p2p.MsgReadWriter) *peer {
|
||||||
return newPeer(pv, nv, p, newMeteredMsgWriter(rw))
|
return newPeer(pv, nv, p, newMeteredMsgWriter(rw))
|
||||||
}
|
}
|
||||||
|
|
@ -1181,30 +1151,6 @@ func (pm *ProtocolManager) txStatus(hashes []common.Hash) []txStatus {
|
||||||
return stats
|
return stats
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeInfo represents a short summary of the Ethereum sub-protocol metadata
|
|
||||||
// known about the host peer.
|
|
||||||
type NodeInfo struct {
|
|
||||||
Network uint64 `json:"network"` // XDC network ID (50=xinfin, 51=apothem, 551=devnet)
|
|
||||||
Difficulty *big.Int `json:"difficulty"` // Total difficulty of the host's blockchain
|
|
||||||
Genesis common.Hash `json:"genesis"` // SHA3 hash of the host's genesis block
|
|
||||||
Config *params.ChainConfig `json:"config"` // Chain configuration for the fork rules
|
|
||||||
Head common.Hash `json:"head"` // SHA3 hash of the host's best owned block
|
|
||||||
}
|
|
||||||
|
|
||||||
// NodeInfo retrieves some protocol metadata about the running host node.
|
|
||||||
func (pm *ProtocolManager) NodeInfo() *NodeInfo {
|
|
||||||
head := pm.blockchain.CurrentHeader()
|
|
||||||
hash := head.Hash()
|
|
||||||
|
|
||||||
return &NodeInfo{
|
|
||||||
Network: pm.networkId,
|
|
||||||
Difficulty: pm.blockchain.GetTd(hash, head.Number.Uint64()),
|
|
||||||
Genesis: pm.blockchain.Genesis().Hash(),
|
|
||||||
Config: pm.blockchain.Config(),
|
|
||||||
Head: hash,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// downloaderPeerNotify implements peerSetNotify
|
// downloaderPeerNotify implements peerSetNotify
|
||||||
type downloaderPeerNotify ProtocolManager
|
type downloaderPeerNotify ProtocolManager
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -172,18 +172,12 @@ func newTestProtocolManager(lightSync bool, blocks int, generator func(int, *cor
|
||||||
chain = blockchain
|
chain = blockchain
|
||||||
}
|
}
|
||||||
|
|
||||||
var protocolVersions []uint
|
pm, err := NewProtocolManager(gspec.Config, lightSync, NetworkId, evmux, engine, peers, chain, nil, db, odr, nil, make(chan struct{}), new(sync.WaitGroup))
|
||||||
if lightSync {
|
|
||||||
protocolVersions = ClientProtocolVersions
|
|
||||||
} else {
|
|
||||||
protocolVersions = ServerProtocolVersions
|
|
||||||
}
|
|
||||||
pm, err := NewProtocolManager(gspec.Config, lightSync, protocolVersions, NetworkId, evmux, engine, peers, chain, nil, db, odr, nil, make(chan struct{}), new(sync.WaitGroup))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if !lightSync {
|
if !lightSync {
|
||||||
srv := &LesServer{protocolManager: pm}
|
srv := &LesServer{lesCommons: lesCommons{protocolManager: pm}}
|
||||||
pm.server = srv
|
pm.server = srv
|
||||||
|
|
||||||
srv.defParams = &flowcontrol.ServerParams{
|
srv.defParams = &flowcontrol.ServerParams{
|
||||||
|
|
|
||||||
18
les/odr.go
18
les/odr.go
|
|
@ -33,14 +33,11 @@ type LesOdr struct {
|
||||||
stop chan struct{}
|
stop chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewLesOdr(db ethdb.Database, chtIndexer, bloomTrieIndexer, bloomIndexer *core.ChainIndexer, retriever *retrieveManager) *LesOdr {
|
func NewLesOdr(db ethdb.Database, retriever *retrieveManager) *LesOdr {
|
||||||
return &LesOdr{
|
return &LesOdr{
|
||||||
db: db,
|
db: db,
|
||||||
chtIndexer: chtIndexer,
|
retriever: retriever,
|
||||||
bloomTrieIndexer: bloomTrieIndexer,
|
stop: make(chan struct{}),
|
||||||
bloomIndexer: bloomIndexer,
|
|
||||||
retriever: retriever,
|
|
||||||
stop: make(chan struct{}),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -54,6 +51,13 @@ func (odr *LesOdr) Database() ethdb.Database {
|
||||||
return odr.db
|
return odr.db
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetIndexers adds the necessary chain indexers to the ODR backend
|
||||||
|
func (odr *LesOdr) SetIndexers(chtIndexer, bloomTrieIndexer, bloomIndexer *core.ChainIndexer) {
|
||||||
|
odr.chtIndexer = chtIndexer
|
||||||
|
odr.bloomTrieIndexer = bloomTrieIndexer
|
||||||
|
odr.bloomIndexer = bloomIndexer
|
||||||
|
}
|
||||||
|
|
||||||
// ChtIndexer returns the CHT chain indexer
|
// ChtIndexer returns the CHT chain indexer
|
||||||
func (odr *LesOdr) ChtIndexer() *core.ChainIndexer {
|
func (odr *LesOdr) ChtIndexer() *core.ChainIndexer {
|
||||||
return odr.chtIndexer
|
return odr.chtIndexer
|
||||||
|
|
|
||||||
|
|
@ -182,7 +182,8 @@ func testOdr(t *testing.T, protocol int, expFail uint64, fn odrTestFn) {
|
||||||
rm := newRetrieveManager(peers, dist, nil)
|
rm := newRetrieveManager(peers, dist, nil)
|
||||||
db := rawdb.NewMemoryDatabase()
|
db := rawdb.NewMemoryDatabase()
|
||||||
ldb := rawdb.NewMemoryDatabase()
|
ldb := rawdb.NewMemoryDatabase()
|
||||||
odr := NewLesOdr(ldb, light.NewChtIndexer(db, true), light.NewBloomTrieIndexer(db, true), eth.NewBloomIndexer(db, light.BloomTrieFrequency), rm)
|
odr := NewLesOdr(ldb, rm)
|
||||||
|
odr.SetIndexers(light.NewChtIndexer(db, true), light.NewBloomTrieIndexer(db, true), eth.NewBloomIndexer(db, light.BloomTrieFrequency))
|
||||||
pm := newTestProtocolManagerMust(t, false, 4, testChainGen, nil, nil, db)
|
pm := newTestProtocolManagerMust(t, false, 4, testChainGen, nil, nil, db)
|
||||||
lpm := newTestProtocolManagerMust(t, true, 0, nil, peers, odr, ldb)
|
lpm := newTestProtocolManagerMust(t, true, 0, nil, peers, odr, ldb)
|
||||||
_, err1, lpeer, err2 := newTestPeerPair("peer", protocol, pm, lpm)
|
_, err1, lpeer, err2 := newTestPeerPair("peer", protocol, pm, lpm)
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,8 @@ func testAccess(t *testing.T, protocol int, fn accessTestFn) {
|
||||||
rm := newRetrieveManager(peers, dist, nil)
|
rm := newRetrieveManager(peers, dist, nil)
|
||||||
db := rawdb.NewMemoryDatabase()
|
db := rawdb.NewMemoryDatabase()
|
||||||
ldb := rawdb.NewMemoryDatabase()
|
ldb := rawdb.NewMemoryDatabase()
|
||||||
odr := NewLesOdr(ldb, light.NewChtIndexer(db, true), light.NewBloomTrieIndexer(db, true), eth.NewBloomIndexer(db, light.BloomTrieFrequency), rm)
|
odr := NewLesOdr(ldb, rm)
|
||||||
|
odr.SetIndexers(light.NewChtIndexer(db, true), light.NewBloomTrieIndexer(db, true), eth.NewBloomIndexer(db, light.BloomTrieFrequency))
|
||||||
|
|
||||||
pm := newTestProtocolManagerMust(t, false, 4, testChainGen, nil, nil, db)
|
pm := newTestProtocolManagerMust(t, false, 4, testChainGen, nil, nil, db)
|
||||||
lpm := newTestProtocolManagerMust(t, true, 0, nil, peers, odr, ldb)
|
lpm := newTestProtocolManagerMust(t, true, 0, nil, peers, odr, ldb)
|
||||||
|
|
|
||||||
|
|
@ -39,21 +39,19 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type LesServer struct {
|
type LesServer struct {
|
||||||
config *ethconfig.Config
|
lesCommons
|
||||||
protocolManager *ProtocolManager
|
|
||||||
fcManager *flowcontrol.ClientManager // nil if our node is client only
|
|
||||||
fcCostStats *requestCostStats
|
|
||||||
defParams *flowcontrol.ServerParams
|
|
||||||
lesTopics []discv5.Topic
|
|
||||||
privateKey *ecdsa.PrivateKey
|
|
||||||
quitSync chan struct{}
|
|
||||||
|
|
||||||
chtIndexer, bloomTrieIndexer *core.ChainIndexer
|
fcManager *flowcontrol.ClientManager // nil if our node is client only
|
||||||
|
fcCostStats *requestCostStats
|
||||||
|
defParams *flowcontrol.ServerParams
|
||||||
|
lesTopics []discv5.Topic
|
||||||
|
privateKey *ecdsa.PrivateKey
|
||||||
|
quitSync chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewLesServer(eth *eth.Ethereum, config *ethconfig.Config) (*LesServer, error) {
|
func NewLesServer(eth *eth.Ethereum, config *ethconfig.Config) (*LesServer, error) {
|
||||||
quitSync := make(chan struct{})
|
quitSync := make(chan struct{})
|
||||||
pm, err := NewProtocolManager(eth.BlockChain().Config(), false, ServerProtocolVersions, eth.NetVersion(), eth.EventMux(), eth.Engine(), newPeerSet(), eth.BlockChain(), eth.TxPool(), eth.ChainDb(), nil, nil, quitSync, new(sync.WaitGroup))
|
pm, err := NewProtocolManager(eth.BlockChain().Config(), false, eth.NetVersion(), eth.EventMux(), eth.Engine(), newPeerSet(), eth.BlockChain(), eth.TxPool(), eth.ChainDb(), nil, nil, quitSync, new(sync.WaitGroup))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -64,13 +62,17 @@ func NewLesServer(eth *eth.Ethereum, config *ethconfig.Config) (*LesServer, erro
|
||||||
}
|
}
|
||||||
|
|
||||||
srv := &LesServer{
|
srv := &LesServer{
|
||||||
config: config,
|
lesCommons: lesCommons{
|
||||||
protocolManager: pm,
|
config: config,
|
||||||
quitSync: quitSync,
|
chainDb: eth.ChainDb(),
|
||||||
lesTopics: lesTopics,
|
chtIndexer: light.NewChtIndexer(eth.ChainDb(), false),
|
||||||
chtIndexer: light.NewChtIndexer(eth.ChainDb(), false),
|
bloomTrieIndexer: light.NewBloomTrieIndexer(eth.ChainDb(), false),
|
||||||
bloomTrieIndexer: light.NewBloomTrieIndexer(eth.ChainDb(), false),
|
protocolManager: pm,
|
||||||
|
},
|
||||||
|
quitSync: quitSync,
|
||||||
|
lesTopics: lesTopics,
|
||||||
}
|
}
|
||||||
|
|
||||||
logger := log.New()
|
logger := log.New()
|
||||||
|
|
||||||
chtV1SectionCount, _, _ := srv.chtIndexer.Sections() // indexer still uses LES/1 4k section size for backwards server compatibility
|
chtV1SectionCount, _, _ := srv.chtIndexer.Sections() // indexer still uses LES/1 4k section size for backwards server compatibility
|
||||||
|
|
@ -105,7 +107,7 @@ func NewLesServer(eth *eth.Ethereum, config *ethconfig.Config) (*LesServer, erro
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *LesServer) Protocols() []p2p.Protocol {
|
func (s *LesServer) Protocols() []p2p.Protocol {
|
||||||
return s.protocolManager.SubProtocols
|
return s.makeProtocols(ServerProtocolVersions)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start starts the LES server
|
// Start starts the LES server
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue