Skip to content

Commit 25eaf28

Browse files
committed
go/p2p: Remove global config
1 parent 0178f6f commit 25eaf28

10 files changed

Lines changed: 266 additions & 253 deletions

File tree

go/oasis-node/cmd/debug/byzantine/beacon_vrf.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import (
1717
"github.com/oasisprotocol/oasis-core/go/config"
1818
consensus "github.com/oasisprotocol/oasis-core/go/consensus/api"
1919
"github.com/oasisprotocol/oasis-core/go/consensus/api/transaction"
20-
"github.com/oasisprotocol/oasis-core/go/oasis-node/cmd/common/metrics"
2120
scheduler "github.com/oasisprotocol/oasis-core/go/scheduler/api"
2221
)
2322

@@ -85,8 +84,7 @@ func doVRFBeaconScenario(*cobra.Command, []string) {
8584
round := uint64(3)
8685
// For every command where applicable you will have to parse yaml config??
8786
cfg := &config.GlobalConfig
88-
metricsEnabled := metrics.Enabled(cfg.Metrics.Mode)
89-
b, err := initializeAndRegisterByzantineNode(runtimeID, node.RoleValidator, scheduler.RoleInvalid, false, true, round, metricsEnabled)
87+
b, err := initializeAndRegisterByzantineNode(cfg, runtimeID, node.RoleValidator, scheduler.RoleInvalid, false, true, round)
9088
if err != nil {
9189
panic(fmt.Sprintf("error initializing node: %+v", err))
9290
}

go/oasis-node/cmd/debug/byzantine/byzantine.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"github.com/oasisprotocol/oasis-core/go/config"
2020
"github.com/oasisprotocol/oasis-core/go/oasis-node/cmd/common/flags"
2121
"github.com/oasisprotocol/oasis-core/go/oasis-node/cmd/common/grpc"
22-
"github.com/oasisprotocol/oasis-core/go/oasis-node/cmd/common/metrics"
2322
"github.com/oasisprotocol/oasis-core/go/roothash/api/block"
2423
"github.com/oasisprotocol/oasis-core/go/roothash/api/commitment"
2524
"github.com/oasisprotocol/oasis-core/go/runtime/transaction"
@@ -151,15 +150,14 @@ func doExecutorScenario(*cobra.Command, []string) { //nolint: gocyclo
151150
isTxScheduler := viper.GetBool(CfgPrimarySchedulerExpected)
152151
// For every command where applicable you will have to parse yaml config??
153152
cfg := &config.GlobalConfig
154-
metricsEnabled := metrics.Enabled(cfg.Metrics.Mode)
155153
b, err := initializeAndRegisterByzantineNode(
154+
cfg,
156155
runtimeID,
157156
node.RoleComputeWorker,
158157
scheduler.RoleWorker,
159158
isTxScheduler,
160159
false,
161160
round,
162-
metricsEnabled,
163161
)
164162
if err != nil {
165163
panic(fmt.Sprintf("error initializing node: %+v", err))

go/oasis-node/cmd/debug/byzantine/node.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@ import (
1313
"github.com/oasisprotocol/oasis-core/go/common/identity"
1414
"github.com/oasisprotocol/oasis-core/go/common/logging"
1515
"github.com/oasisprotocol/oasis-core/go/common/node"
16+
"github.com/oasisprotocol/oasis-core/go/config"
1617
consensus "github.com/oasisprotocol/oasis-core/go/consensus/api"
1718
genesis "github.com/oasisprotocol/oasis-core/go/genesis/file"
1819
cmdCommon "github.com/oasisprotocol/oasis-core/go/oasis-node/cmd/common"
1920
cmdFlags "github.com/oasisprotocol/oasis-core/go/oasis-node/cmd/common/flags"
21+
"github.com/oasisprotocol/oasis-core/go/oasis-node/cmd/common/metrics"
2022
"github.com/oasisprotocol/oasis-core/go/roothash/api/block"
2123
"github.com/oasisprotocol/oasis-core/go/roothash/api/commitment"
2224
scheduler "github.com/oasisprotocol/oasis-core/go/scheduler/api"
@@ -96,13 +98,13 @@ func (b *byzantine) receiveAndScheduleTransactions(ctx context.Context, cbc *com
9698
}
9799

98100
func initializeAndRegisterByzantineNode(
101+
cfg *config.Config,
99102
runtimeID common.Namespace,
100103
nodeRoles node.RolesMask,
101104
expectedExecutorRole scheduler.Role,
102105
shouldBePrimaryScheduler bool,
103106
noCommittees bool,
104107
round uint64,
105-
metricsEnabled bool,
106108
) (*byzantine, error) {
107109
var err error
108110
b := &byzantine{
@@ -140,13 +142,14 @@ func initializeAndRegisterByzantineNode(
140142

141143
// Setup CometBFT.
142144
b.cometbft = newHonestCometBFT(genesis, genesisDoc)
145+
metricsEnabled := metrics.Enabled(cfg.Metrics.Mode)
143146
if err = b.cometbft.start(b.identity, cmdCommon.DataDir(), metricsEnabled); err != nil {
144147
return nil, fmt.Errorf("node cometbft start failed: %w", err)
145148
}
146149

147150
// Setup P2P.
148151
b.p2p = newP2PHandle()
149-
if err = b.p2p.start(b.cometbft, b.identity, b.chainContext, b.runtimeID); err != nil {
152+
if err = b.p2p.start(cfg, b.cometbft, b.identity, b.chainContext, b.runtimeID); err != nil {
150153
return nil, fmt.Errorf("P2P start failed: %w", err)
151154
}
152155

go/oasis-node/cmd/debug/byzantine/p2p.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/oasisprotocol/oasis-core/go/common/cbor"
99
"github.com/oasisprotocol/oasis-core/go/common/crypto/signature"
1010
"github.com/oasisprotocol/oasis-core/go/common/identity"
11+
"github.com/oasisprotocol/oasis-core/go/config"
1112
"github.com/oasisprotocol/oasis-core/go/p2p"
1213
p2pAPI "github.com/oasisprotocol/oasis-core/go/p2p/api"
1314
"github.com/oasisprotocol/oasis-core/go/p2p/protocol"
@@ -91,13 +92,17 @@ func (h *committeeMsgHandler) HandleMessage(_ context.Context, peerID signature.
9192
return <-responseCh
9293
}
9394

94-
func (ph *p2pHandle) start(ht *honestCometBFT, id *identity.Identity, chainContext string, runtimeID common.Namespace) error {
95+
func (ph *p2pHandle) start(yamlCfg *config.Config, ht *honestCometBFT, id *identity.Identity, chainContext string, runtimeID common.Namespace) error {
9596
if ph.service != nil {
9697
return fmt.Errorf("P2P service already started")
9798
}
9899

100+
var cfg p2p.Config
101+
if err := cfg.Load(&yamlCfg.P2P); err != nil {
102+
return fmt.Errorf("failed to parse p2p config %w", err)
103+
}
99104
var err error
100-
ph.service, err = p2p.New(id, chainContext, nil)
105+
ph.service, err = p2p.New(&cfg, id, chainContext, nil)
101106
if err != nil {
102107
return fmt.Errorf("P2P service New: %w", err)
103108
}

go/oasis-node/cmd/node/node.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,11 @@ func NewNode(cfg *config.Config) (node *Node, err error) { // nolint: gocyclo
494494
if isArchive {
495495
node.P2P = p2p.NewNop()
496496
} else {
497-
node.P2P, err = p2p.New(node.Identity, node.chainContext, node.commonStore)
497+
var p2pCfg p2p.Config
498+
if err := p2pCfg.Load(&cfg.P2P); err != nil {
499+
return nil, fmt.Errorf("failed to parse p2p config %w", err)
500+
}
501+
node.P2P, err = p2p.New(&p2pCfg, node.Identity, node.chainContext, node.commonStore)
498502
if err != nil {
499503
return nil, err
500504
}

go/oasis-node/cmd/node/seed.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func (n *SeedNode) Cleanup() {
5656
}
5757

5858
// NewSeedNode initializes the seed node.
59-
func NewSeedNode(_ *config.Config) (node *SeedNode, err error) {
59+
func NewSeedNode(cfg *config.Config) (node *SeedNode, err error) {
6060
logger := cmdCommon.Logger()
6161

6262
node = &SeedNode{
@@ -152,7 +152,7 @@ func NewSeedNode(_ *config.Config) (node *SeedNode, err error) {
152152

153153
// Initialize and start the libp2p seed.
154154
var seedCfg p2p.SeedConfig
155-
if err = seedCfg.Load(); err != nil {
155+
if err = seedCfg.Load(&cfg.P2P); err != nil {
156156
return nil, fmt.Errorf("failed to load libp2p seed config: %w", err)
157157
}
158158
seedCfg.Signer = node.identity.P2PSigner

go/p2p/config.go

Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
package p2p
2+
3+
import (
4+
"fmt"
5+
"net"
6+
"time"
7+
8+
"github.com/libp2p/go-libp2p/core"
9+
"github.com/libp2p/go-libp2p/core/peer"
10+
"github.com/multiformats/go-multiaddr"
11+
manet "github.com/multiformats/go-multiaddr/net"
12+
13+
"github.com/oasisprotocol/oasis-core/go/common/crypto/signature"
14+
"github.com/oasisprotocol/oasis-core/go/common/node"
15+
"github.com/oasisprotocol/oasis-core/go/common/persistent"
16+
"github.com/oasisprotocol/oasis-core/go/common/version"
17+
"github.com/oasisprotocol/oasis-core/go/p2p/api"
18+
"github.com/oasisprotocol/oasis-core/go/p2p/config"
19+
"github.com/oasisprotocol/oasis-core/go/worker/common/configparser"
20+
)
21+
22+
// Config describes a set of P2P settings for a peer.
23+
type Config struct {
24+
Addresses []multiaddr.Multiaddr
25+
26+
HostConfig
27+
GossipSubConfig
28+
BootstrapDiscoveryConfig
29+
}
30+
31+
// HostConfig describes a set of settings for a host.
32+
type HostConfig struct {
33+
Signer signature.Signer
34+
35+
UserAgent string
36+
ListenAddr multiaddr.Multiaddr
37+
Port uint16
38+
39+
ConnManagerConfig
40+
ConnGaterConfig
41+
}
42+
43+
// ConnManagerConfig describes a set of settings for a connection manager.
44+
type ConnManagerConfig struct {
45+
MinPeers int
46+
MaxPeers int
47+
GracePeriod time.Duration
48+
PersistentPeers []peer.ID
49+
}
50+
51+
// ConnGaterConfig describes a set of settings for a connection gater.
52+
type ConnGaterConfig struct {
53+
BlockedPeers []net.IP
54+
}
55+
56+
// GossipSubConfig describes a set of settings for a gossip pubsub.
57+
type GossipSubConfig struct {
58+
// XXX: Main config has int64, but here just int -- investigate.
59+
PeerOutboundQueueSize int
60+
ValidateQueueSize int
61+
ValidateThrottle int
62+
63+
PersistentPeers []peer.AddrInfo
64+
}
65+
66+
// Load loads a default P2P configuration.
67+
func (cfg *Config) Load(yamlCfg *config.Config) error {
68+
rawAddresses, err := configparser.ParseAddressList(yamlCfg.Registration.Addresses)
69+
if err != nil {
70+
return fmt.Errorf("failed to parse address list: %w", err)
71+
}
72+
var addresses []multiaddr.Multiaddr
73+
for _, addr := range rawAddresses {
74+
var mAddr multiaddr.Multiaddr
75+
mAddr, err = manet.FromNetAddr(addr.ToTCPAddr())
76+
if err != nil {
77+
return fmt.Errorf("failed to convert address to multiaddress: %w", err)
78+
}
79+
addresses = append(addresses, mAddr)
80+
}
81+
82+
var hostCfg HostConfig
83+
if err := hostCfg.Load(yamlCfg); err != nil {
84+
return fmt.Errorf("failed to load host config: %w", err)
85+
}
86+
87+
var gossipSubCfg GossipSubConfig
88+
if err := gossipSubCfg.Load(yamlCfg); err != nil {
89+
return fmt.Errorf("failed to load gossipsub config: %w", err)
90+
}
91+
92+
var bootstrapCfg BootstrapDiscoveryConfig
93+
if err := bootstrapCfg.Load(yamlCfg); err != nil {
94+
return fmt.Errorf("failed to load bootstrap config: %w", err)
95+
}
96+
97+
cfg.Addresses = addresses
98+
cfg.HostConfig = hostCfg
99+
cfg.GossipSubConfig = gossipSubCfg
100+
cfg.BootstrapDiscoveryConfig = bootstrapCfg
101+
102+
return nil
103+
}
104+
105+
// Load loads host configuration.
106+
func (cfg *HostConfig) Load(yamlCfg *config.Config) error {
107+
userAgent := fmt.Sprintf("oasis-core/%s", version.SoftwareVersion)
108+
109+
port := yamlCfg.Port
110+
111+
// Listen for connections on all interfaces.
112+
listenAddr, err := multiaddr.NewMultiaddr(
113+
fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", port),
114+
)
115+
if err != nil {
116+
return fmt.Errorf("failed to create multiaddress: %w", err)
117+
}
118+
119+
var cmCfg ConnManagerConfig
120+
if err = cmCfg.Load(&yamlCfg.ConnectionManager); err != nil {
121+
return fmt.Errorf("failed to load connection manager config: %w", err)
122+
}
123+
124+
var cgCfg ConnGaterConfig
125+
if err = cgCfg.Load(yamlCfg.ConnectionGater.BlockedPeerIPs); err != nil {
126+
return fmt.Errorf("failed to load connection gater config: %w", err)
127+
}
128+
129+
cfg.UserAgent = userAgent
130+
cfg.Port = port
131+
cfg.ListenAddr = listenAddr
132+
cfg.ConnManagerConfig = cmCfg
133+
cfg.ConnGaterConfig = cgCfg
134+
135+
return nil
136+
}
137+
138+
// Load loads connection manager configuration.
139+
func (cfg *ConnManagerConfig) Load(yamlCfg *config.ConnectionManagerConfig) error {
140+
persistentPeersMap := make(map[core.PeerID]struct{})
141+
for _, pp := range yamlCfg.PersistentPeers {
142+
var addr node.ConsensusAddress
143+
if err := addr.UnmarshalText([]byte(pp)); err != nil {
144+
return fmt.Errorf("malformed address (expected pubkey@IP:port): %w", err)
145+
}
146+
147+
pid, err := api.PublicKeyToPeerID(addr.ID)
148+
if err != nil {
149+
return fmt.Errorf("invalid public key (%s): %w", addr.ID, err)
150+
}
151+
152+
persistentPeersMap[pid] = struct{}{}
153+
}
154+
155+
persistentPeers := make([]peer.ID, 0)
156+
for pid := range persistentPeersMap {
157+
persistentPeers = append(persistentPeers, pid)
158+
}
159+
160+
cfg.MinPeers = yamlCfg.MaxNumPeers
161+
cfg.MaxPeers = cfg.MinPeers + peersHighWatermarkDelta
162+
cfg.GracePeriod = yamlCfg.PeerGracePeriod
163+
cfg.PersistentPeers = persistentPeers
164+
165+
return nil
166+
}
167+
168+
// Load loads connection gater configuration.
169+
func (cfg *ConnGaterConfig) Load(blocked []string) error {
170+
blockedPeers := make([]net.IP, 0)
171+
for _, blockedIP := range blocked {
172+
parsedIP := net.ParseIP(blockedIP)
173+
if parsedIP == nil {
174+
return fmt.Errorf("malformed blocked IP: %s", blockedIP)
175+
}
176+
blockedPeers = append(blockedPeers, parsedIP)
177+
}
178+
179+
cfg.BlockedPeers = blockedPeers
180+
181+
return nil
182+
}
183+
184+
// Load loads gossipsub configuration.
185+
func (cfg *GossipSubConfig) Load(yamlCfg *config.Config) error {
186+
persistentPeers, err := api.AddrInfosFromConsensusAddrs(yamlCfg.ConnectionManager.PersistentPeers)
187+
if err != nil {
188+
return fmt.Errorf("failed to convert persistent peers' addresses: %w", err)
189+
}
190+
191+
cfg.PeerOutboundQueueSize = yamlCfg.Gossipsub.PeerOutboundQueueSize
192+
cfg.ValidateQueueSize = yamlCfg.Gossipsub.ValidateQueueSize
193+
cfg.ValidateThrottle = yamlCfg.Gossipsub.ValidateThrottle
194+
cfg.PersistentPeers = persistentPeers
195+
196+
return nil
197+
}
198+
199+
// BootstrapDiscoveryConfig describes a set of settings for a discovery.
200+
type BootstrapDiscoveryConfig struct {
201+
Enable bool
202+
Seeds []peer.AddrInfo
203+
RetentionPeriod time.Duration
204+
}
205+
206+
// Load loads bootstrap discovery configuration.
207+
func (cfg *BootstrapDiscoveryConfig) Load(yamlCfg *config.Config) error {
208+
seeds, err := api.AddrInfosFromConsensusAddrs(yamlCfg.Seeds)
209+
if err != nil {
210+
return fmt.Errorf("failed to convert seeds' addresses: %w", err)
211+
}
212+
213+
cfg.Seeds = seeds
214+
cfg.Enable = yamlCfg.Discovery.Bootstrap.Enable
215+
cfg.RetentionPeriod = yamlCfg.Discovery.Bootstrap.RetentionPeriod
216+
217+
return nil
218+
}
219+
220+
// SeedConfig describes a set of settings for a seed.
221+
type SeedConfig struct {
222+
CommonStore *persistent.CommonStore
223+
224+
HostConfig
225+
BootstrapDiscoveryConfig
226+
}
227+
228+
// Load loads seed configuration.
229+
func (cfg *SeedConfig) Load(yamlCfg *config.Config) error {
230+
var hostCfg HostConfig
231+
if err := hostCfg.Load(yamlCfg); err != nil {
232+
return fmt.Errorf("failed to load host config: %w", err)
233+
}
234+
235+
var bootstrapCfg BootstrapDiscoveryConfig
236+
if err := bootstrapCfg.Load(yamlCfg); err != nil {
237+
return fmt.Errorf("failed to load bootstrap config: %w", err)
238+
}
239+
240+
cfg.HostConfig = hostCfg
241+
cfg.BootstrapDiscoveryConfig = bootstrapCfg
242+
243+
return nil
244+
}

0 commit comments

Comments
 (0)