mirror of
https://gitlab.com/pulsechaincom/erigon-pulse.git
synced 2025-01-08 20:11:21 +00:00
7558730a54
The test was slow, because it was trying to find predefined nodeIDs (lookupTestnet) by generating random keys and trying to find their neighbours until it hits all nodes of the lookupTestnet. In addition each FindNode response was waited for 0.5 sec (respTimeout). This could take up to 30 sec and fail the test suite. A fake random key generator is now used during the test. It issues the expected keys, and the lookup converges quickly. The reply timeout is reduced for the test. Now it normally takes less than.1 sec.
95 lines
2.8 KiB
Go
95 lines
2.8 KiB
Go
// Copyright 2019 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 discover
|
|
|
|
import (
|
|
"context"
|
|
"crypto/ecdsa"
|
|
"github.com/ledgerwatch/erigon/crypto"
|
|
"net"
|
|
"time"
|
|
|
|
"github.com/ledgerwatch/erigon/common/mclock"
|
|
"github.com/ledgerwatch/erigon/p2p/enode"
|
|
"github.com/ledgerwatch/erigon/p2p/enr"
|
|
"github.com/ledgerwatch/erigon/p2p/netutil"
|
|
"github.com/ledgerwatch/log/v3"
|
|
)
|
|
|
|
// UDPConn is a network connection on which discovery can operate.
|
|
type UDPConn interface {
|
|
ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error)
|
|
WriteToUDP(b []byte, addr *net.UDPAddr) (n int, err error)
|
|
Close() error
|
|
LocalAddr() net.Addr
|
|
}
|
|
|
|
// Config holds settings for the discovery listener.
|
|
type Config struct {
|
|
// These settings are required and configure the UDP listener:
|
|
PrivateKey *ecdsa.PrivateKey
|
|
|
|
// These settings are optional:
|
|
NetRestrict *netutil.Netlist // network whitelist
|
|
Bootnodes []*enode.Node // list of bootstrap nodes
|
|
Unhandled chan<- ReadPacket // unhandled packets are sent on this channel
|
|
Log log.Logger // if set, log messages go here
|
|
ValidSchemes enr.IdentityScheme // allowed identity schemes
|
|
Clock mclock.Clock
|
|
ReplyTimeout time.Duration
|
|
|
|
PrivateKeyGenerator func() (*ecdsa.PrivateKey, error)
|
|
}
|
|
|
|
func (cfg Config) withDefaults() Config {
|
|
if cfg.Log == nil {
|
|
cfg.Log = log.Root()
|
|
}
|
|
if cfg.ValidSchemes == nil {
|
|
cfg.ValidSchemes = enode.ValidSchemes
|
|
}
|
|
if cfg.Clock == nil {
|
|
cfg.Clock = mclock.System{}
|
|
}
|
|
if cfg.ReplyTimeout == 0 {
|
|
cfg.ReplyTimeout = respTimeout
|
|
}
|
|
if cfg.PrivateKeyGenerator == nil {
|
|
cfg.PrivateKeyGenerator = crypto.GenerateKey
|
|
}
|
|
return cfg
|
|
}
|
|
|
|
// ListenUDP starts listening for discovery packets on the given UDP socket.
|
|
func ListenUDP(ctx context.Context, c UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv4, error) {
|
|
return ListenV4(ctx, c, ln, cfg)
|
|
}
|
|
|
|
// ReadPacket is a packet that couldn't be handled. Those packets are sent to the unhandled
|
|
// channel if configured.
|
|
type ReadPacket struct {
|
|
Data []byte
|
|
Addr *net.UDPAddr
|
|
}
|
|
|
|
func min(x, y int) int {
|
|
if x > y {
|
|
return y
|
|
}
|
|
return x
|
|
}
|