p2p: support configuring NAT in TOML
This commit is contained in:
parent
6909dd9978
commit
50e0380533
|
@ -0,0 +1,144 @@
|
||||||
|
// Copyright 2025 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 p2p
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/ecdsa"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/common/mclock"
|
||||||
|
"github.com/ethereum/go-ethereum/log"
|
||||||
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
||||||
|
"github.com/ethereum/go-ethereum/p2p/nat"
|
||||||
|
"github.com/ethereum/go-ethereum/p2p/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:generate go run github.com/fjl/gencodec -type Config -field-override configMarshaling -formats toml -out config_toml.go
|
||||||
|
|
||||||
|
// Config holds Server options.
|
||||||
|
type Config struct {
|
||||||
|
// This field must be set to a valid secp256k1 private key.
|
||||||
|
PrivateKey *ecdsa.PrivateKey `toml:"-"`
|
||||||
|
|
||||||
|
// MaxPeers is the maximum number of peers that can be
|
||||||
|
// connected. It must be greater than zero.
|
||||||
|
MaxPeers int
|
||||||
|
|
||||||
|
// MaxPendingPeers is the maximum number of peers that can be pending in the
|
||||||
|
// handshake phase, counted separately for inbound and outbound connections.
|
||||||
|
// Zero defaults to preset values.
|
||||||
|
MaxPendingPeers int `toml:",omitempty"`
|
||||||
|
|
||||||
|
// DialRatio controls the ratio of inbound to dialed connections.
|
||||||
|
// Example: a DialRatio of 2 allows 1/2 of connections to be dialed.
|
||||||
|
// Setting DialRatio to zero defaults it to 3.
|
||||||
|
DialRatio int `toml:",omitempty"`
|
||||||
|
|
||||||
|
// NoDiscovery can be used to disable the peer discovery mechanism.
|
||||||
|
// Disabling is useful for protocol debugging (manual topology).
|
||||||
|
NoDiscovery bool
|
||||||
|
|
||||||
|
// DiscoveryV4 specifies whether V4 discovery should be started.
|
||||||
|
DiscoveryV4 bool `toml:",omitempty"`
|
||||||
|
|
||||||
|
// DiscoveryV5 specifies whether the new topic-discovery based V5 discovery
|
||||||
|
// protocol should be started or not.
|
||||||
|
DiscoveryV5 bool `toml:",omitempty"`
|
||||||
|
|
||||||
|
// Name sets the node name of this server.
|
||||||
|
Name string `toml:"-"`
|
||||||
|
|
||||||
|
// BootstrapNodes are used to establish connectivity
|
||||||
|
// with the rest of the network.
|
||||||
|
BootstrapNodes []*enode.Node
|
||||||
|
|
||||||
|
// BootstrapNodesV5 are used to establish connectivity
|
||||||
|
// with the rest of the network using the V5 discovery
|
||||||
|
// protocol.
|
||||||
|
BootstrapNodesV5 []*enode.Node `toml:",omitempty"`
|
||||||
|
|
||||||
|
// Static nodes are used as pre-configured connections which are always
|
||||||
|
// maintained and re-connected on disconnects.
|
||||||
|
StaticNodes []*enode.Node
|
||||||
|
|
||||||
|
// Trusted nodes are used as pre-configured connections which are always
|
||||||
|
// allowed to connect, even above the peer limit.
|
||||||
|
TrustedNodes []*enode.Node
|
||||||
|
|
||||||
|
// Connectivity can be restricted to certain IP networks.
|
||||||
|
// If this option is set to a non-nil value, only hosts which match one of the
|
||||||
|
// IP networks contained in the list are considered.
|
||||||
|
NetRestrict *netutil.Netlist `toml:",omitempty"`
|
||||||
|
|
||||||
|
// NodeDatabase is the path to the database containing the previously seen
|
||||||
|
// live nodes in the network.
|
||||||
|
NodeDatabase string `toml:",omitempty"`
|
||||||
|
|
||||||
|
// Protocols should contain the protocols supported
|
||||||
|
// by the server. Matching protocols are launched for
|
||||||
|
// each peer.
|
||||||
|
Protocols []Protocol `toml:"-" json:"-"`
|
||||||
|
|
||||||
|
// If ListenAddr is set to a non-nil address, the server
|
||||||
|
// will listen for incoming connections.
|
||||||
|
//
|
||||||
|
// If the port is zero, the operating system will pick a port. The
|
||||||
|
// ListenAddr field will be updated with the actual address when
|
||||||
|
// the server is started.
|
||||||
|
ListenAddr string
|
||||||
|
|
||||||
|
// If DiscAddr is set to a non-nil value, the server will use ListenAddr
|
||||||
|
// for TCP and DiscAddr for the UDP discovery protocol.
|
||||||
|
DiscAddr string
|
||||||
|
|
||||||
|
// If set to a non-nil value, the given NAT port mapper
|
||||||
|
// is used to make the listening port available to the
|
||||||
|
// Internet.
|
||||||
|
NAT nat.Interface `toml:",omitempty"`
|
||||||
|
|
||||||
|
// If Dialer is set to a non-nil value, the given Dialer
|
||||||
|
// is used to dial outbound peer connections.
|
||||||
|
Dialer NodeDialer `toml:"-"`
|
||||||
|
|
||||||
|
// If NoDial is true, the server will not dial any peers.
|
||||||
|
NoDial bool `toml:",omitempty"`
|
||||||
|
|
||||||
|
// If EnableMsgEvents is set then the server will emit PeerEvents
|
||||||
|
// whenever a message is sent to or received from a peer
|
||||||
|
EnableMsgEvents bool
|
||||||
|
|
||||||
|
// Logger is a custom logger to use with the p2p.Server.
|
||||||
|
Logger log.Logger `toml:"-"`
|
||||||
|
|
||||||
|
clock mclock.Clock
|
||||||
|
}
|
||||||
|
|
||||||
|
type configMarshaling struct {
|
||||||
|
NAT configNAT
|
||||||
|
}
|
||||||
|
|
||||||
|
type configNAT struct {
|
||||||
|
nat.Interface
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *configNAT) UnmarshalText(input []byte) error {
|
||||||
|
n, err := nat.Parse(string(input))
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("invalid NAT specification: %v", err)
|
||||||
|
}
|
||||||
|
w.Interface = n
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -0,0 +1,165 @@
|
||||||
|
// Code generated by github.com/fjl/gencodec. DO NOT EDIT.
|
||||||
|
|
||||||
|
package p2p
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/ecdsa"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/log"
|
||||||
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
||||||
|
"github.com/ethereum/go-ethereum/p2p/nat"
|
||||||
|
"github.com/ethereum/go-ethereum/p2p/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = (*configMarshaling)(nil)
|
||||||
|
|
||||||
|
// MarshalTOML marshals as TOML.
|
||||||
|
func (c Config) MarshalTOML() (interface{}, error) {
|
||||||
|
type Config struct {
|
||||||
|
PrivateKey *ecdsa.PrivateKey `toml:"-"`
|
||||||
|
MaxPeers int
|
||||||
|
MaxPendingPeers int `toml:",omitempty"`
|
||||||
|
DialRatio int `toml:",omitempty"`
|
||||||
|
NoDiscovery bool
|
||||||
|
DiscoveryV4 bool `toml:",omitempty"`
|
||||||
|
DiscoveryV5 bool `toml:",omitempty"`
|
||||||
|
Name string `toml:"-"`
|
||||||
|
BootstrapNodes []*enode.Node
|
||||||
|
BootstrapNodesV5 []*enode.Node `toml:",omitempty"`
|
||||||
|
StaticNodes []*enode.Node
|
||||||
|
TrustedNodes []*enode.Node
|
||||||
|
NetRestrict *netutil.Netlist `toml:",omitempty"`
|
||||||
|
NodeDatabase string `toml:",omitempty"`
|
||||||
|
Protocols []Protocol `toml:"-" json:"-"`
|
||||||
|
ListenAddr string
|
||||||
|
DiscAddr string
|
||||||
|
NAT nat.Interface `toml:",omitempty"`
|
||||||
|
Dialer NodeDialer `toml:"-"`
|
||||||
|
NoDial bool `toml:",omitempty"`
|
||||||
|
EnableMsgEvents bool
|
||||||
|
Logger log.Logger `toml:"-"`
|
||||||
|
}
|
||||||
|
var enc Config
|
||||||
|
enc.PrivateKey = c.PrivateKey
|
||||||
|
enc.MaxPeers = c.MaxPeers
|
||||||
|
enc.MaxPendingPeers = c.MaxPendingPeers
|
||||||
|
enc.DialRatio = c.DialRatio
|
||||||
|
enc.NoDiscovery = c.NoDiscovery
|
||||||
|
enc.DiscoveryV4 = c.DiscoveryV4
|
||||||
|
enc.DiscoveryV5 = c.DiscoveryV5
|
||||||
|
enc.Name = c.Name
|
||||||
|
enc.BootstrapNodes = c.BootstrapNodes
|
||||||
|
enc.BootstrapNodesV5 = c.BootstrapNodesV5
|
||||||
|
enc.StaticNodes = c.StaticNodes
|
||||||
|
enc.TrustedNodes = c.TrustedNodes
|
||||||
|
enc.NetRestrict = c.NetRestrict
|
||||||
|
enc.NodeDatabase = c.NodeDatabase
|
||||||
|
enc.Protocols = c.Protocols
|
||||||
|
enc.ListenAddr = c.ListenAddr
|
||||||
|
enc.DiscAddr = c.DiscAddr
|
||||||
|
enc.NAT = c.NAT
|
||||||
|
enc.Dialer = c.Dialer
|
||||||
|
enc.NoDial = c.NoDial
|
||||||
|
enc.EnableMsgEvents = c.EnableMsgEvents
|
||||||
|
enc.Logger = c.Logger
|
||||||
|
return &enc, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalTOML unmarshals from TOML.
|
||||||
|
func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error {
|
||||||
|
type Config struct {
|
||||||
|
PrivateKey *ecdsa.PrivateKey `toml:"-"`
|
||||||
|
MaxPeers *int
|
||||||
|
MaxPendingPeers *int `toml:",omitempty"`
|
||||||
|
DialRatio *int `toml:",omitempty"`
|
||||||
|
NoDiscovery *bool
|
||||||
|
DiscoveryV4 *bool `toml:",omitempty"`
|
||||||
|
DiscoveryV5 *bool `toml:",omitempty"`
|
||||||
|
Name *string `toml:"-"`
|
||||||
|
BootstrapNodes []*enode.Node
|
||||||
|
BootstrapNodesV5 []*enode.Node `toml:",omitempty"`
|
||||||
|
StaticNodes []*enode.Node
|
||||||
|
TrustedNodes []*enode.Node
|
||||||
|
NetRestrict *netutil.Netlist `toml:",omitempty"`
|
||||||
|
NodeDatabase *string `toml:",omitempty"`
|
||||||
|
Protocols []Protocol `toml:"-" json:"-"`
|
||||||
|
ListenAddr *string
|
||||||
|
DiscAddr *string
|
||||||
|
NAT *configNAT `toml:",omitempty"`
|
||||||
|
Dialer NodeDialer `toml:"-"`
|
||||||
|
NoDial *bool `toml:",omitempty"`
|
||||||
|
EnableMsgEvents *bool
|
||||||
|
Logger log.Logger `toml:"-"`
|
||||||
|
}
|
||||||
|
var dec Config
|
||||||
|
if err := unmarshal(&dec); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if dec.PrivateKey != nil {
|
||||||
|
c.PrivateKey = dec.PrivateKey
|
||||||
|
}
|
||||||
|
if dec.MaxPeers != nil {
|
||||||
|
c.MaxPeers = *dec.MaxPeers
|
||||||
|
}
|
||||||
|
if dec.MaxPendingPeers != nil {
|
||||||
|
c.MaxPendingPeers = *dec.MaxPendingPeers
|
||||||
|
}
|
||||||
|
if dec.DialRatio != nil {
|
||||||
|
c.DialRatio = *dec.DialRatio
|
||||||
|
}
|
||||||
|
if dec.NoDiscovery != nil {
|
||||||
|
c.NoDiscovery = *dec.NoDiscovery
|
||||||
|
}
|
||||||
|
if dec.DiscoveryV4 != nil {
|
||||||
|
c.DiscoveryV4 = *dec.DiscoveryV4
|
||||||
|
}
|
||||||
|
if dec.DiscoveryV5 != nil {
|
||||||
|
c.DiscoveryV5 = *dec.DiscoveryV5
|
||||||
|
}
|
||||||
|
if dec.Name != nil {
|
||||||
|
c.Name = *dec.Name
|
||||||
|
}
|
||||||
|
if dec.BootstrapNodes != nil {
|
||||||
|
c.BootstrapNodes = dec.BootstrapNodes
|
||||||
|
}
|
||||||
|
if dec.BootstrapNodesV5 != nil {
|
||||||
|
c.BootstrapNodesV5 = dec.BootstrapNodesV5
|
||||||
|
}
|
||||||
|
if dec.StaticNodes != nil {
|
||||||
|
c.StaticNodes = dec.StaticNodes
|
||||||
|
}
|
||||||
|
if dec.TrustedNodes != nil {
|
||||||
|
c.TrustedNodes = dec.TrustedNodes
|
||||||
|
}
|
||||||
|
if dec.NetRestrict != nil {
|
||||||
|
c.NetRestrict = dec.NetRestrict
|
||||||
|
}
|
||||||
|
if dec.NodeDatabase != nil {
|
||||||
|
c.NodeDatabase = *dec.NodeDatabase
|
||||||
|
}
|
||||||
|
if dec.Protocols != nil {
|
||||||
|
c.Protocols = dec.Protocols
|
||||||
|
}
|
||||||
|
if dec.ListenAddr != nil {
|
||||||
|
c.ListenAddr = *dec.ListenAddr
|
||||||
|
}
|
||||||
|
if dec.DiscAddr != nil {
|
||||||
|
c.DiscAddr = *dec.DiscAddr
|
||||||
|
}
|
||||||
|
if dec.NAT != nil {
|
||||||
|
c.NAT = dec.NAT
|
||||||
|
}
|
||||||
|
if dec.Dialer != nil {
|
||||||
|
c.Dialer = dec.Dialer
|
||||||
|
}
|
||||||
|
if dec.NoDial != nil {
|
||||||
|
c.NoDial = *dec.NoDial
|
||||||
|
}
|
||||||
|
if dec.EnableMsgEvents != nil {
|
||||||
|
c.EnableMsgEvents = *dec.EnableMsgEvents
|
||||||
|
}
|
||||||
|
if dec.Logger != nil {
|
||||||
|
c.Logger = dec.Logger
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -39,7 +39,6 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/p2p/discover"
|
"github.com/ethereum/go-ethereum/p2p/discover"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enode"
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enr"
|
"github.com/ethereum/go-ethereum/p2p/enr"
|
||||||
"github.com/ethereum/go-ethereum/p2p/nat"
|
|
||||||
"github.com/ethereum/go-ethereum/p2p/netutil"
|
"github.com/ethereum/go-ethereum/p2p/netutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -72,104 +71,6 @@ var (
|
||||||
errProtoHandshakeError = errors.New("rlpx proto error")
|
errProtoHandshakeError = errors.New("rlpx proto error")
|
||||||
)
|
)
|
||||||
|
|
||||||
// Config holds Server options.
|
|
||||||
type Config struct {
|
|
||||||
// This field must be set to a valid secp256k1 private key.
|
|
||||||
PrivateKey *ecdsa.PrivateKey `toml:"-"`
|
|
||||||
|
|
||||||
// MaxPeers is the maximum number of peers that can be
|
|
||||||
// connected. It must be greater than zero.
|
|
||||||
MaxPeers int
|
|
||||||
|
|
||||||
// MaxPendingPeers is the maximum number of peers that can be pending in the
|
|
||||||
// handshake phase, counted separately for inbound and outbound connections.
|
|
||||||
// Zero defaults to preset values.
|
|
||||||
MaxPendingPeers int `toml:",omitempty"`
|
|
||||||
|
|
||||||
// DialRatio controls the ratio of inbound to dialed connections.
|
|
||||||
// Example: a DialRatio of 2 allows 1/2 of connections to be dialed.
|
|
||||||
// Setting DialRatio to zero defaults it to 3.
|
|
||||||
DialRatio int `toml:",omitempty"`
|
|
||||||
|
|
||||||
// NoDiscovery can be used to disable the peer discovery mechanism.
|
|
||||||
// Disabling is useful for protocol debugging (manual topology).
|
|
||||||
NoDiscovery bool
|
|
||||||
|
|
||||||
// DiscoveryV4 specifies whether V4 discovery should be started.
|
|
||||||
DiscoveryV4 bool `toml:",omitempty"`
|
|
||||||
|
|
||||||
// DiscoveryV5 specifies whether the new topic-discovery based V5 discovery
|
|
||||||
// protocol should be started or not.
|
|
||||||
DiscoveryV5 bool `toml:",omitempty"`
|
|
||||||
|
|
||||||
// Name sets the node name of this server.
|
|
||||||
Name string `toml:"-"`
|
|
||||||
|
|
||||||
// BootstrapNodes are used to establish connectivity
|
|
||||||
// with the rest of the network.
|
|
||||||
BootstrapNodes []*enode.Node
|
|
||||||
|
|
||||||
// BootstrapNodesV5 are used to establish connectivity
|
|
||||||
// with the rest of the network using the V5 discovery
|
|
||||||
// protocol.
|
|
||||||
BootstrapNodesV5 []*enode.Node `toml:",omitempty"`
|
|
||||||
|
|
||||||
// Static nodes are used as pre-configured connections which are always
|
|
||||||
// maintained and re-connected on disconnects.
|
|
||||||
StaticNodes []*enode.Node
|
|
||||||
|
|
||||||
// Trusted nodes are used as pre-configured connections which are always
|
|
||||||
// allowed to connect, even above the peer limit.
|
|
||||||
TrustedNodes []*enode.Node
|
|
||||||
|
|
||||||
// Connectivity can be restricted to certain IP networks.
|
|
||||||
// If this option is set to a non-nil value, only hosts which match one of the
|
|
||||||
// IP networks contained in the list are considered.
|
|
||||||
NetRestrict *netutil.Netlist `toml:",omitempty"`
|
|
||||||
|
|
||||||
// NodeDatabase is the path to the database containing the previously seen
|
|
||||||
// live nodes in the network.
|
|
||||||
NodeDatabase string `toml:",omitempty"`
|
|
||||||
|
|
||||||
// Protocols should contain the protocols supported
|
|
||||||
// by the server. Matching protocols are launched for
|
|
||||||
// each peer.
|
|
||||||
Protocols []Protocol `toml:"-" json:"-"`
|
|
||||||
|
|
||||||
// If ListenAddr is set to a non-nil address, the server
|
|
||||||
// will listen for incoming connections.
|
|
||||||
//
|
|
||||||
// If the port is zero, the operating system will pick a port. The
|
|
||||||
// ListenAddr field will be updated with the actual address when
|
|
||||||
// the server is started.
|
|
||||||
ListenAddr string
|
|
||||||
|
|
||||||
// If DiscAddr is set to a non-nil value, the server will use ListenAddr
|
|
||||||
// for TCP and DiscAddr for the UDP discovery protocol.
|
|
||||||
DiscAddr string
|
|
||||||
|
|
||||||
// If set to a non-nil value, the given NAT port mapper
|
|
||||||
// is used to make the listening port available to the
|
|
||||||
// Internet.
|
|
||||||
NAT nat.Interface `toml:",omitempty"`
|
|
||||||
|
|
||||||
// If Dialer is set to a non-nil value, the given Dialer
|
|
||||||
// is used to dial outbound peer connections.
|
|
||||||
Dialer NodeDialer `toml:"-"`
|
|
||||||
|
|
||||||
// If NoDial is true, the server will not dial any peers.
|
|
||||||
NoDial bool `toml:",omitempty"`
|
|
||||||
|
|
||||||
// If EnableMsgEvents is set then the server will emit PeerEvents
|
|
||||||
// whenever a message is sent to or received from a peer
|
|
||||||
EnableMsgEvents bool
|
|
||||||
|
|
||||||
// Logger is a custom logger to use with the p2p.Server.
|
|
||||||
Logger log.Logger `toml:",omitempty"`
|
|
||||||
|
|
||||||
clock mclock.Clock
|
|
||||||
}
|
|
||||||
|
|
||||||
// Server manages all peer connections.
|
// Server manages all peer connections.
|
||||||
type Server struct {
|
type Server struct {
|
||||||
// Config fields may not be modified while the server is running.
|
// Config fields may not be modified while the server is running.
|
||||||
|
|
Loading…
Reference in New Issue