mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-25 14:16:44 +00:00
Merge branch 'develop' into manav/upstream_merge_v1.14.11
This commit is contained in:
commit
56065db427
4 changed files with 63 additions and 35 deletions
|
|
@ -73,15 +73,13 @@ type Config = ethconfig.Config
|
||||||
|
|
||||||
// Ethereum implements the Ethereum full node service.
|
// Ethereum implements the Ethereum full node service.
|
||||||
type Ethereum struct {
|
type Ethereum struct {
|
||||||
|
// core protocol objects
|
||||||
config *ethconfig.Config
|
config *ethconfig.Config
|
||||||
|
|
||||||
// Handlers
|
|
||||||
txPool *txpool.TxPool
|
txPool *txpool.TxPool
|
||||||
|
|
||||||
blockchain *core.BlockChain
|
blockchain *core.BlockChain
|
||||||
|
|
||||||
handler *handler
|
handler *handler
|
||||||
ethDialCandidates enode.Iterator
|
discmix *enode.FairMix
|
||||||
snapDialCandidates enode.Iterator
|
|
||||||
|
|
||||||
// DB interfaces
|
// DB interfaces
|
||||||
chainDb ethdb.Database // Block chain database
|
chainDb ethdb.Database // Block chain database
|
||||||
|
|
@ -168,6 +166,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) {
|
||||||
bloomRequests: make(chan chan *bloombits.Retrieval),
|
bloomRequests: make(chan chan *bloombits.Retrieval),
|
||||||
bloomIndexer: core.NewBloomIndexer(chainDb, params.BloomBitsBlocks, params.BloomConfirms),
|
bloomIndexer: core.NewBloomIndexer(chainDb, params.BloomBitsBlocks, params.BloomConfirms),
|
||||||
p2pServer: stack.Server(),
|
p2pServer: stack.Server(),
|
||||||
|
discmix: enode.NewFairMix(0),
|
||||||
shutdownTracker: shutdowncheck.NewShutdownTracker(chainDb),
|
shutdownTracker: shutdowncheck.NewShutdownTracker(chainDb),
|
||||||
closeCh: make(chan struct{}),
|
closeCh: make(chan struct{}),
|
||||||
}
|
}
|
||||||
|
|
@ -322,17 +321,6 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) {
|
||||||
// 1.14.8: NewOracle function definition was changed to accept (startPrice *big.Int) param.
|
// 1.14.8: NewOracle function definition was changed to accept (startPrice *big.Int) param.
|
||||||
eth.APIBackend.gpo = gasprice.NewOracle(eth.APIBackend, config.GPO, config.Miner.GasPrice)
|
eth.APIBackend.gpo = gasprice.NewOracle(eth.APIBackend, config.GPO, config.Miner.GasPrice)
|
||||||
|
|
||||||
// Setup DNS discovery iterators.
|
|
||||||
dnsclient := dnsdisc.NewClient(dnsdisc.Config{})
|
|
||||||
eth.ethDialCandidates, err = dnsclient.NewIterator(eth.config.EthDiscoveryURLs...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
eth.snapDialCandidates, err = dnsclient.NewIterator(eth.config.SnapDiscoveryURLs...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start the RPC service
|
// Start the RPC service
|
||||||
eth.netRPCService = ethapi.NewNetAPI(eth.p2pServer, config.NetworkId)
|
eth.netRPCService = ethapi.NewNetAPI(eth.p2pServer, config.NetworkId)
|
||||||
|
|
||||||
|
|
@ -600,9 +588,9 @@ func (s *Ethereum) SetAuthorized(authorized bool) {
|
||||||
// Protocols returns all the currently configured
|
// Protocols returns all the currently configured
|
||||||
// network protocols to start.
|
// network protocols to start.
|
||||||
func (s *Ethereum) Protocols() []p2p.Protocol {
|
func (s *Ethereum) Protocols() []p2p.Protocol {
|
||||||
protos := eth.MakeProtocols((*ethHandler)(s.handler), s.networkID, s.ethDialCandidates)
|
protos := eth.MakeProtocols((*ethHandler)(s.handler), s.networkID, s.discmix)
|
||||||
if s.config.SnapshotCache > 0 {
|
if s.config.SnapshotCache > 0 {
|
||||||
protos = append(protos, snap.MakeProtocols((*snapHandler)(s.handler), s.snapDialCandidates)...)
|
protos = append(protos, snap.MakeProtocols((*snapHandler)(s.handler))...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return protos
|
return protos
|
||||||
|
|
@ -611,7 +599,7 @@ func (s *Ethereum) Protocols() []p2p.Protocol {
|
||||||
// Start implements node.Lifecycle, starting all internal goroutines needed by the
|
// Start implements node.Lifecycle, starting all internal goroutines needed by the
|
||||||
// Ethereum protocol implementation.
|
// Ethereum protocol implementation.
|
||||||
func (s *Ethereum) Start() error {
|
func (s *Ethereum) Start() error {
|
||||||
eth.StartENRUpdater(s.blockchain, s.p2pServer.LocalNode())
|
s.setupDiscovery()
|
||||||
|
|
||||||
// Start the bloom bits servicing goroutines
|
// Start the bloom bits servicing goroutines
|
||||||
s.startBloomHandlers(params.BloomBitsBlocks)
|
s.startBloomHandlers(params.BloomBitsBlocks)
|
||||||
|
|
@ -798,6 +786,38 @@ func (s *Ethereum) handleNoAckMilestoneByID(ctx context.Context, ethHandler *eth
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Ethereum) setupDiscovery() error {
|
||||||
|
eth.StartENRUpdater(s.blockchain, s.p2pServer.LocalNode())
|
||||||
|
|
||||||
|
// Add eth nodes from DNS.
|
||||||
|
dnsclient := dnsdisc.NewClient(dnsdisc.Config{})
|
||||||
|
if len(s.config.EthDiscoveryURLs) > 0 {
|
||||||
|
iter, err := dnsclient.NewIterator(s.config.EthDiscoveryURLs...)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
s.discmix.AddSource(iter)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add snap nodes from DNS.
|
||||||
|
if len(s.config.SnapDiscoveryURLs) > 0 {
|
||||||
|
iter, err := dnsclient.NewIterator(s.config.SnapDiscoveryURLs...)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
s.discmix.AddSource(iter)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add DHT nodes from discv5.
|
||||||
|
if s.p2pServer.DiscoveryV5() != nil {
|
||||||
|
filter := eth.NewNodeFilter(s.blockchain)
|
||||||
|
iter := enode.Filter(s.p2pServer.DiscoveryV5().RandomNodes(), filter)
|
||||||
|
s.discmix.AddSource(iter)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Ethereum) getHandler() (*ethHandler, *bor.Bor, error) {
|
func (s *Ethereum) getHandler() (*ethHandler, *bor.Bor, error) {
|
||||||
ethHandler := (*ethHandler)(s.handler)
|
ethHandler := (*ethHandler)(s.handler)
|
||||||
|
|
||||||
|
|
@ -816,13 +836,14 @@ func (s *Ethereum) getHandler() (*ethHandler, *bor.Bor, error) {
|
||||||
// Stop implements node.Lifecycle, terminating all internal goroutines used by the
|
// Stop implements node.Lifecycle, terminating all internal goroutines used by the
|
||||||
// Ethereum protocol.
|
// Ethereum protocol.
|
||||||
func (s *Ethereum) Stop() error {
|
func (s *Ethereum) Stop() error {
|
||||||
|
// Stop all the peer-related stuff first.
|
||||||
|
s.discmix.Close()
|
||||||
|
|
||||||
// Close the engine before handler else it may cause a deadlock where
|
// Close the engine before handler else it may cause a deadlock where
|
||||||
// the heimdall is unresponsive and the syncing loop keeps waiting
|
// the heimdall is unresponsive and the syncing loop keeps waiting
|
||||||
// for a response and is unable to proceed to exit `Finalize` during
|
// for a response and is unable to proceed to exit `Finalize` during
|
||||||
// block processing.
|
// block processing.
|
||||||
s.engine.Close()
|
s.engine.Close()
|
||||||
s.ethDialCandidates.Close()
|
|
||||||
s.snapDialCandidates.Close()
|
|
||||||
s.handler.Stop()
|
s.handler.Stop()
|
||||||
|
|
||||||
// Then stop everything else.
|
// Then stop everything else.
|
||||||
|
|
|
||||||
|
|
@ -66,3 +66,17 @@ func currentENREntry(chain *core.BlockChain) *enrEntry {
|
||||||
ForkID: forkid.NewID(chain.Config(), chain.Genesis(), head.Number.Uint64(), head.Time),
|
ForkID: forkid.NewID(chain.Config(), chain.Genesis(), head.Number.Uint64(), head.Time),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewNodeFilter returns a filtering function that returns whether the provided
|
||||||
|
// enode advertises a forkid compatible with the current chain.
|
||||||
|
func NewNodeFilter(chain *core.BlockChain) func(*enode.Node) bool {
|
||||||
|
filter := forkid.NewFilter(chain)
|
||||||
|
return func(n *enode.Node) bool {
|
||||||
|
var entry enrEntry
|
||||||
|
if err := n.Load(entry); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
err := filter(entry.ForkID)
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,7 @@ type TxPool interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
// MakeProtocols constructs the P2P protocol definitions for `eth`.
|
// MakeProtocols constructs the P2P protocol definitions for `eth`.
|
||||||
func MakeProtocols(backend Backend, network uint64, dnsdisc enode.Iterator) []p2p.Protocol {
|
func MakeProtocols(backend Backend, network uint64, disc enode.Iterator) []p2p.Protocol {
|
||||||
protocols := make([]p2p.Protocol, 0, len(ProtocolVersions))
|
protocols := make([]p2p.Protocol, 0, len(ProtocolVersions))
|
||||||
for _, version := range ProtocolVersions {
|
for _, version := range ProtocolVersions {
|
||||||
// Blob transactions require eth/68 announcements, disable everything else
|
// Blob transactions require eth/68 announcements, disable everything else
|
||||||
|
|
@ -117,8 +117,8 @@ func MakeProtocols(backend Backend, network uint64, dnsdisc enode.Iterator) []p2
|
||||||
PeerInfo: func(id enode.ID) interface{} {
|
PeerInfo: func(id enode.ID) interface{} {
|
||||||
return backend.PeerInfo(id)
|
return backend.PeerInfo(id)
|
||||||
},
|
},
|
||||||
|
DialCandidates: disc,
|
||||||
Attributes: []enr.Entry{currentENREntry(backend.Chain())},
|
Attributes: []enr.Entry{currentENREntry(backend.Chain())},
|
||||||
DialCandidates: dnsdisc,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return protocols
|
return protocols
|
||||||
|
|
|
||||||
|
|
@ -82,13 +82,7 @@ type Backend interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
// MakeProtocols constructs the P2P protocol definitions for `snap`.
|
// MakeProtocols constructs the P2P protocol definitions for `snap`.
|
||||||
func MakeProtocols(backend Backend, dnsdisc enode.Iterator) []p2p.Protocol {
|
func MakeProtocols(backend Backend) []p2p.Protocol {
|
||||||
// Filter the discovery iterator for nodes advertising snap support.
|
|
||||||
dnsdisc = enode.Filter(dnsdisc, func(n *enode.Node) bool {
|
|
||||||
var snap enrEntry
|
|
||||||
return n.Load(&snap) == nil
|
|
||||||
})
|
|
||||||
|
|
||||||
protocols := make([]p2p.Protocol, len(ProtocolVersions))
|
protocols := make([]p2p.Protocol, len(ProtocolVersions))
|
||||||
|
|
||||||
for i, version := range ProtocolVersions {
|
for i, version := range ProtocolVersions {
|
||||||
|
|
@ -110,7 +104,6 @@ func MakeProtocols(backend Backend, dnsdisc enode.Iterator) []p2p.Protocol {
|
||||||
return backend.PeerInfo(id)
|
return backend.PeerInfo(id)
|
||||||
},
|
},
|
||||||
Attributes: []enr.Entry{&enrEntry{}},
|
Attributes: []enr.Entry{&enrEntry{}},
|
||||||
DialCandidates: dnsdisc,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue