@ -57,15 +57,19 @@ type LesServer interface {
// Ethereum implements the Ethereum full node service.
type Ethereum struct {
config * Config
chainConfig * params . ChainConfig
// Channel for shutting down the service
shutdownChan chan bool // Channel for shutting down the ethereum
stopDbUpgrade func ( ) error // stop chain db sequential key upgrade
// Handlers
txPool * core . TxPool
blockchain * core . BlockChain
protocolManager * ProtocolManager
lesServer LesServer
// DB interfaces
chainDb ethdb . Database // Block chain database
@ -98,7 +102,6 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
if ! config . SyncMode . IsValid ( ) {
return nil , fmt . Errorf ( "invalid sync mode %d" , config . SyncMode )
}
chainDb , err := CreateDB ( ctx , config , "chaindata" )
if err != nil {
return nil , err
@ -111,6 +114,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
log . Info ( "Initialised chain configuration" , "config" , chainConfig )
eth := & Ethereum {
config : config ,
chainDb : chainDb ,
chainConfig : chainConfig ,
eventMux : ctx . EventMux ,
@ -153,21 +157,9 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
}
eth . txPool = core . NewTxPool ( config . TxPool , eth . chainConfig , eth . blockchain )
maxPeers := config . MaxPeers
if config . LightServ > 0 {
// if we are running a light server, limit the number of ETH peers so that we reserve some space for incoming LES connections
// temporary solution until the new peer connectivity API is finished
halfPeers := maxPeers / 2
maxPeers -= config . LightPeers
if maxPeers < halfPeers {
maxPeers = halfPeers
}
}
if eth . protocolManager , err = NewProtocolManager ( eth . chainConfig , config . SyncMode , config . NetworkId , maxPeers , eth . eventMux , eth . txPool , eth . engine , eth . blockchain , chainDb ) ; err != nil {
if eth . protocolManager , err = NewProtocolManager ( eth . chainConfig , config . SyncMode , config . NetworkId , eth . eventMux , eth . txPool , eth . engine , eth . blockchain , chainDb ) ; err != nil {
return nil , err
}
eth . miner = miner . New ( eth , eth . chainConfig , eth . EventMux ( ) , eth . engine )
eth . miner . SetExtra ( makeExtraData ( config . ExtraData ) )
@ -376,7 +368,15 @@ func (s *Ethereum) Protocols() []p2p.Protocol {
func ( s * Ethereum ) Start ( srvr * p2p . Server ) error {
s . netRPCService = ethapi . NewPublicNetAPI ( srvr , s . NetVersion ( ) )
s . protocolManager . Start ( )
// Figure out a max peers count based on the server limits
maxPeers := srvr . MaxPeers
if s . config . LightServ > 0 {
maxPeers -= s . config . LightPeers
if maxPeers < srvr . MaxPeers / 2 {
maxPeers = srvr . MaxPeers / 2
}
}
s . protocolManager . Start ( maxPeers )
if s . lesServer != nil {
s . lesServer . Start ( srvr )
}