1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
package p2p
import (
"errors"
"fmt"
"net"
"time"
"github.com/ethereum-optimism/optimism/op-node/p2p/gating"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/p2p/discover"
"github.com/ethereum/go-ethereum/p2p/enode"
ds "github.com/ipfs/go-datastore"
"github.com/libp2p/go-libp2p"
pubsub "github.com/libp2p/go-libp2p-pubsub"
"github.com/libp2p/go-libp2p/core"
"github.com/libp2p/go-libp2p/core/connmgr"
"github.com/libp2p/go-libp2p/core/crypto"
"github.com/libp2p/go-libp2p/core/host"
"github.com/libp2p/go-libp2p/core/metrics"
cmgr "github.com/libp2p/go-libp2p/p2p/net/connmgr"
"github.com/ethereum-optimism/optimism/op-node/rollup"
)
var DefaultBootnodes = []*enode.Node{
enode.MustParse("enode://869d07b5932f17e8490990f75a3f94195e9504ddb6b85f7189e5a9c0a8fff8b00aecf6f3ac450ecba6cdabdb5858788a94bde2b613e0f2d82e9b395355f76d1a@34.65.67.101:0?discport=30305"),
enode.MustParse("enode://2d4e7e9d48f4dd4efe9342706dd1b0024681bd4c3300d021f86fc75eab7865d4e0cbec6fbc883f011cfd6a57423e7e2f6e104baad2b744c3cafaec6bc7dc92c1@34.65.43.171:0?discport=30305"),
enode.MustParse("enode://9d7a3efefe442351217e73b3a593bcb8efffb55b4807699972145324eab5e6b382152f8d24f6301baebbfb5ecd4127bd3faab2842c04cd432bdf50ba092f6645@34.65.109.126:0?discport=30305"),
}
type HostMetrics interface {
gating.UnbanMetrics
gating.ConnectionGaterMetrics
}
// SetupP2P provides a host and discovery service for usage in the rollup node.
type SetupP2P interface {
Check() error
Disabled() bool
// Host creates a libp2p host service. Returns nil, nil if p2p is disabled.
Host(log log.Logger, reporter metrics.Reporter, metrics HostMetrics) (host.Host, error)
// Discovery creates a disc-v5 service. Returns nil, nil, nil if discovery is disabled.
Discovery(log log.Logger, rollupCfg *rollup.Config, tcpPort uint16) (*enode.LocalNode, *discover.UDPv5, error)
TargetPeers() uint
BanPeers() bool
BanThreshold() float64
BanDuration() time.Duration
GossipSetupConfigurables
ReqRespSyncEnabled() bool
}
// ScoringParams defines the various types of peer scoring parameters.
type ScoringParams struct {
PeerScoring pubsub.PeerScoreParams
ApplicationScoring ApplicationScoreParams
}
// Config sets up a p2p host and discv5 service from configuration.
// This implements SetupP2P.
type Config struct {
Priv *crypto.Secp256k1PrivateKey
DisableP2P bool
NoDiscovery bool
ScoringParams *ScoringParams
// Whether to ban peers based on their [PeerScoring] score. Should be negative.
BanningEnabled bool
// Minimum score before peers are disconnected and banned
BanningThreshold float64
BanningDuration time.Duration
ListenIP net.IP
ListenTCPPort uint16
// Port to bind discv5 to
ListenUDPPort uint16
AdvertiseIP net.IP
AdvertiseTCPPort uint16
AdvertiseUDPPort uint16
Bootnodes []*enode.Node
DiscoveryDB *enode.DB
StaticPeers []core.Multiaddr
HostMux []libp2p.Option
HostSecurity []libp2p.Option
NoTransportSecurity bool
PeersLo uint
PeersHi uint
PeersGrace time.Duration
MeshD int // topic stable mesh target count
MeshDLo int // topic stable mesh low watermark
MeshDHi int // topic stable mesh high watermark
MeshDLazy int // gossip target
// FloodPublish publishes messages from ourselves to peers outside of the gossip topic mesh but supporting the same topic.
FloodPublish bool
// If true a NAT manager will host a NAT port mapping that is updated with PMP and UPNP by libp2p/go-nat
NAT bool
UserAgent string
TimeoutNegotiation time.Duration
TimeoutAccept time.Duration
TimeoutDial time.Duration
// Underlying store that hosts connection-gater and peerstore data.
Store ds.Batching
EnableReqRespSync bool
}
func DefaultConnManager(conf *Config) (connmgr.ConnManager, error) {
return cmgr.NewConnManager(
int(conf.PeersLo),
int(conf.PeersHi),
cmgr.WithGracePeriod(conf.PeersGrace),
cmgr.WithSilencePeriod(time.Minute),
cmgr.WithEmergencyTrim(true))
}
func (conf *Config) TargetPeers() uint {
return conf.PeersLo
}
func (conf *Config) Disabled() bool {
return conf.DisableP2P
}
func (conf *Config) PeerScoringParams() *ScoringParams {
if conf.ScoringParams == nil {
return nil
}
return conf.ScoringParams
}
func (conf *Config) BanPeers() bool {
return conf.BanningEnabled
}
func (conf *Config) BanThreshold() float64 {
return conf.BanningThreshold
}
func (conf *Config) BanDuration() time.Duration {
return conf.BanningDuration
}
func (conf *Config) ReqRespSyncEnabled() bool {
return conf.EnableReqRespSync
}
const maxMeshParam = 1000
func (conf *Config) Check() error {
if conf.DisableP2P {
return nil
}
if conf.Store == nil {
return errors.New("p2p requires a persistent or in-memory peerstore, but found none")
}
if !conf.NoDiscovery {
if conf.DiscoveryDB == nil {
return errors.New("discovery requires a persistent or in-memory discv5 db, but found none")
}
}
if conf.PeersLo == 0 || conf.PeersHi == 0 || conf.PeersLo > conf.PeersHi {
return fmt.Errorf("peers lo/hi tides are invalid: %d, %d", conf.PeersLo, conf.PeersHi)
}
if conf.MeshD <= 0 || conf.MeshD > maxMeshParam {
return fmt.Errorf("mesh D param must not be 0 or exceed %d, but got %d", maxMeshParam, conf.MeshD)
}
if conf.MeshDLo <= 0 || conf.MeshDLo > maxMeshParam {
return fmt.Errorf("mesh Dlo param must not be 0 or exceed %d, but got %d", maxMeshParam, conf.MeshDLo)
}
if conf.MeshDHi <= 0 || conf.MeshDHi > maxMeshParam {
return fmt.Errorf("mesh Dhi param must not be 0 or exceed %d, but got %d", maxMeshParam, conf.MeshDHi)
}
if conf.MeshDLazy <= 0 || conf.MeshDLazy > maxMeshParam {
return fmt.Errorf("mesh Dlazy param must not be 0 or exceed %d, but got %d", maxMeshParam, conf.MeshDLazy)
}
return nil
}