chore: WakuV2 use config instead of settings
This commit is contained in:
parent
92685e5a7b
commit
3de945feaf
|
@ -110,7 +110,6 @@ func SetFleet(fleet string, nodeConfig *params.NodeConfig) error {
|
||||||
DiscoveryLimit: 20,
|
DiscoveryLimit: 20,
|
||||||
Host: "0.0.0.0",
|
Host: "0.0.0.0",
|
||||||
AutoUpdate: true,
|
AutoUpdate: true,
|
||||||
PeerExchange: true,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
clusterConfig, err := params.LoadClusterConfigFromFleet(fleet)
|
clusterConfig, err := params.LoadClusterConfigFromFleet(fleet)
|
||||||
|
|
|
@ -220,7 +220,6 @@ func randomNodeConfig() *params.NodeConfig {
|
||||||
MaxMessageSize: uint32(randomInt(math.MaxInt64)),
|
MaxMessageSize: uint32(randomInt(math.MaxInt64)),
|
||||||
EnableConfirmations: randomBool(),
|
EnableConfirmations: randomBool(),
|
||||||
CustomNodes: randomCustomNodes(),
|
CustomNodes: randomCustomNodes(),
|
||||||
PeerExchange: randomBool(),
|
|
||||||
EnableDiscV5: randomBool(),
|
EnableDiscV5: randomBool(),
|
||||||
UDPPort: randomInt(math.MaxInt64),
|
UDPPort: randomInt(math.MaxInt64),
|
||||||
AutoUpdate: randomBool(),
|
AutoUpdate: randomBool(),
|
||||||
|
|
|
@ -311,27 +311,36 @@ func (b *StatusNode) wakuService(wakuCfg *params.WakuConfig, clusterCfg *params.
|
||||||
func (b *StatusNode) wakuV2Service(nodeConfig *params.NodeConfig, telemetryServerURL string) (*wakuv2.Waku, error) {
|
func (b *StatusNode) wakuV2Service(nodeConfig *params.NodeConfig, telemetryServerURL string) (*wakuv2.Waku, error) {
|
||||||
if b.wakuV2Srvc == nil {
|
if b.wakuV2Srvc == nil {
|
||||||
cfg := &wakuv2.Config{
|
cfg := &wakuv2.Config{
|
||||||
MaxMessageSize: wakucommon.DefaultMaxMessageSize,
|
MaxMessageSize: wakucommon.DefaultMaxMessageSize,
|
||||||
Host: nodeConfig.WakuV2Config.Host,
|
Host: nodeConfig.WakuV2Config.Host,
|
||||||
Port: nodeConfig.WakuV2Config.Port,
|
Port: nodeConfig.WakuV2Config.Port,
|
||||||
LightClient: nodeConfig.WakuV2Config.LightClient,
|
LightClient: nodeConfig.WakuV2Config.LightClient,
|
||||||
KeepAliveInterval: nodeConfig.WakuV2Config.KeepAliveInterval,
|
KeepAliveInterval: nodeConfig.WakuV2Config.KeepAliveInterval,
|
||||||
Rendezvous: nodeConfig.Rendezvous,
|
Rendezvous: nodeConfig.Rendezvous,
|
||||||
WakuNodes: nodeConfig.ClusterConfig.WakuNodes,
|
WakuNodes: nodeConfig.ClusterConfig.WakuNodes,
|
||||||
PeerExchange: nodeConfig.WakuV2Config.PeerExchange,
|
EnablePeerExchangeServer: nodeConfig.WakuV2Config.PeerExchange,
|
||||||
EnableStore: nodeConfig.WakuV2Config.EnableStore,
|
EnableStore: nodeConfig.WakuV2Config.EnableStore,
|
||||||
StoreCapacity: nodeConfig.WakuV2Config.StoreCapacity,
|
StoreCapacity: nodeConfig.WakuV2Config.StoreCapacity,
|
||||||
StoreSeconds: nodeConfig.WakuV2Config.StoreSeconds,
|
StoreSeconds: nodeConfig.WakuV2Config.StoreSeconds,
|
||||||
DiscoveryLimit: nodeConfig.WakuV2Config.DiscoveryLimit,
|
DiscoveryLimit: nodeConfig.WakuV2Config.DiscoveryLimit,
|
||||||
DiscV5BootstrapNodes: nodeConfig.ClusterConfig.DiscV5BootstrapNodes,
|
DiscV5BootstrapNodes: nodeConfig.ClusterConfig.DiscV5BootstrapNodes,
|
||||||
Nameserver: nodeConfig.WakuV2Config.Nameserver,
|
Nameserver: nodeConfig.WakuV2Config.Nameserver,
|
||||||
EnableDiscV5: nodeConfig.WakuV2Config.EnableDiscV5,
|
EnableDiscV5: nodeConfig.WakuV2Config.EnableDiscV5,
|
||||||
UDPPort: nodeConfig.WakuV2Config.UDPPort,
|
UDPPort: nodeConfig.WakuV2Config.UDPPort,
|
||||||
AutoUpdate: nodeConfig.WakuV2Config.AutoUpdate,
|
AutoUpdate: nodeConfig.WakuV2Config.AutoUpdate,
|
||||||
DefaultShardPubsubTopic: shard.DefaultShardPubsubTopic(),
|
DefaultShardPubsubTopic: shard.DefaultShardPubsubTopic(),
|
||||||
UseShardAsDefaultTopic: nodeConfig.WakuV2Config.UseShardAsDefaultTopic,
|
UseShardAsDefaultTopic: nodeConfig.WakuV2Config.UseShardAsDefaultTopic,
|
||||||
TelemetryServerURL: telemetryServerURL,
|
TelemetryServerURL: telemetryServerURL,
|
||||||
ClusterID: nodeConfig.ClusterConfig.ClusterID,
|
ClusterID: nodeConfig.ClusterConfig.ClusterID,
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply peer exchange settings
|
||||||
|
if cfg.LightClient {
|
||||||
|
cfg.EnablePeerExchangeServer = false
|
||||||
|
cfg.EnablePeerExchangeClient = true
|
||||||
|
} else {
|
||||||
|
cfg.EnablePeerExchangeServer = true
|
||||||
|
cfg.EnablePeerExchangeClient = false
|
||||||
}
|
}
|
||||||
|
|
||||||
if nodeConfig.WakuV2Config.MaxMessageSize > 0 {
|
if nodeConfig.WakuV2Config.MaxMessageSize > 0 {
|
||||||
|
|
|
@ -189,6 +189,7 @@ type WakuV2Config struct {
|
||||||
CustomNodes map[string]string
|
CustomNodes map[string]string
|
||||||
|
|
||||||
// PeerExchange determines whether WakuV2 Peer Exchange is enabled or not
|
// PeerExchange determines whether WakuV2 Peer Exchange is enabled or not
|
||||||
|
// Deprecated: will be calculated based on LightClient
|
||||||
PeerExchange bool
|
PeerExchange bool
|
||||||
|
|
||||||
// Nameserver determines which nameserver will be used for dns discovery
|
// Nameserver determines which nameserver will be used for dns discovery
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
package wakuv2
|
package wakuv2
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
|
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
|
||||||
|
|
||||||
"github.com/status-im/status-go/protocol/common/shard"
|
"github.com/status-im/status-go/protocol/common/shard"
|
||||||
|
@ -30,30 +32,43 @@ import (
|
||||||
|
|
||||||
// Config represents the configuration state of a waku node.
|
// Config represents the configuration state of a waku node.
|
||||||
type Config struct {
|
type Config struct {
|
||||||
MaxMessageSize uint32 `toml:",omitempty"`
|
MaxMessageSize uint32 `toml:",omitempty"` // Maximal message length allowed by the waku node
|
||||||
Host string `toml:",omitempty"`
|
Host string `toml:",omitempty"`
|
||||||
Port int `toml:",omitempty"`
|
Port int `toml:",omitempty"`
|
||||||
PeerExchange bool `toml:",omitempty"`
|
EnablePeerExchangeServer bool `toml:",omitempty"` // PeerExchange server makes sense only when discv5 is running locally as it will have a cache of peers that it can respond to in case a PeerExchange request comes from the PeerExchangeClient
|
||||||
KeepAliveInterval int `toml:",omitempty"`
|
EnablePeerExchangeClient bool `toml:",omitempty"`
|
||||||
MinPeersForRelay int `toml:",omitempty"`
|
KeepAliveInterval int `toml:",omitempty"`
|
||||||
MinPeersForFilter int `toml:",omitempty"`
|
MinPeersForRelay int `toml:",omitempty"` // Indicates the minimum number of peers required for using Relay Protocol
|
||||||
LightClient bool `toml:",omitempty"`
|
MinPeersForFilter int `toml:",omitempty"` // Indicates the minimum number of peers required for using Filter Protocol
|
||||||
WakuNodes []string `toml:",omitempty"`
|
LightClient bool `toml:",omitempty"` // Indicates if the node is a light client
|
||||||
Rendezvous bool `toml:",omitempty"`
|
WakuNodes []string `toml:",omitempty"`
|
||||||
DiscV5BootstrapNodes []string `toml:",omitempty"`
|
Rendezvous bool `toml:",omitempty"`
|
||||||
Nameserver string `toml:",omitempty"`
|
DiscV5BootstrapNodes []string `toml:",omitempty"`
|
||||||
Resolver ethdisc.Resolver `toml:",omitempty"`
|
Nameserver string `toml:",omitempty"` // Optional nameserver to use for dns discovery
|
||||||
EnableDiscV5 bool `toml:",omitempty"`
|
Resolver ethdisc.Resolver `toml:",omitempty"` // Optional resolver to use for dns discovery
|
||||||
DiscoveryLimit int `toml:",omitempty"`
|
EnableDiscV5 bool `toml:",omitempty"` // Indicates whether discv5 is enabled or not
|
||||||
AutoUpdate bool `toml:",omitempty"`
|
DiscoveryLimit int `toml:",omitempty"` // Indicates the number of nodes to discover with peer exchange client
|
||||||
UDPPort int `toml:",omitempty"`
|
AutoUpdate bool `toml:",omitempty"`
|
||||||
EnableStore bool `toml:",omitempty"`
|
UDPPort int `toml:",omitempty"`
|
||||||
StoreCapacity int `toml:",omitempty"`
|
EnableStore bool `toml:",omitempty"`
|
||||||
StoreSeconds int `toml:",omitempty"`
|
StoreCapacity int `toml:",omitempty"`
|
||||||
TelemetryServerURL string `toml:",omitempty"`
|
StoreSeconds int `toml:",omitempty"`
|
||||||
DefaultShardPubsubTopic string `toml:",omitempty"`
|
TelemetryServerURL string `toml:",omitempty"`
|
||||||
UseShardAsDefaultTopic bool `toml:",omitempty"`
|
DefaultShardPubsubTopic string `toml:",omitempty"` // Pubsub topic to be used by default for messages that do not have a topic assigned (depending whether sharding is used or not)
|
||||||
ClusterID uint16 `toml:",omitempty"`
|
UseShardAsDefaultTopic bool `toml:",omitempty"`
|
||||||
|
ClusterID uint16 `toml:",omitempty"`
|
||||||
|
EnableConfirmations bool `toml:",omitempty"` // Enable sending message confirmations
|
||||||
|
SkipPublishToTopic bool `toml:",omitempty"` // Used in testing
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Config) Validate() error {
|
||||||
|
if c.LightClient && (c.EnablePeerExchangeServer || c.EnableDiscV5 || !c.EnablePeerExchangeClient) {
|
||||||
|
return errors.New("bad configuration for a light client: either peer exchange server or discv5 must be disabled, and the peer exchange client must be enabled")
|
||||||
|
}
|
||||||
|
if !c.LightClient && (!c.EnablePeerExchangeServer || !c.EnableDiscV5 || c.EnablePeerExchangeClient) {
|
||||||
|
return errors.New("bad configuration for a full node: peer exchange server and discv5 must be enabled, and the peer exchange client must be disabled")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var DefaultConfig = Config{
|
var DefaultConfig = Config{
|
||||||
|
|
133
wakuv2/waku.go
133
wakuv2/waku.go
|
@ -62,8 +62,6 @@ import (
|
||||||
"github.com/waku-org/go-waku/waku/v2/protocol/peer_exchange"
|
"github.com/waku-org/go-waku/waku/v2/protocol/peer_exchange"
|
||||||
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
|
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
|
||||||
|
|
||||||
ethdisc "github.com/ethereum/go-ethereum/p2p/dnsdisc"
|
|
||||||
|
|
||||||
"github.com/status-im/status-go/connection"
|
"github.com/status-im/status-go/connection"
|
||||||
"github.com/status-im/status-go/eth-node/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
"github.com/status-im/status-go/timesource"
|
"github.com/status-im/status-go/timesource"
|
||||||
|
@ -81,22 +79,6 @@ const requestTimeout = 30 * time.Second
|
||||||
const bootnodesQueryBackoffMs = 200
|
const bootnodesQueryBackoffMs = 200
|
||||||
const bootnodesMaxRetries = 7
|
const bootnodesMaxRetries = 7
|
||||||
|
|
||||||
type settings struct {
|
|
||||||
LightClient bool // Indicates if the node is a light client
|
|
||||||
MinPeersForRelay int // Indicates the minimum number of peers required for using Relay Protocol
|
|
||||||
MinPeersForFilter int // Indicates the minimum number of peers required for using Filter Protocol
|
|
||||||
MaxMsgSize uint32 // Maximal message length allowed by the waku node
|
|
||||||
EnableConfirmations bool // Enable sending message confirmations
|
|
||||||
PeerExchange bool // Enable peer exchange
|
|
||||||
DiscoveryLimit int // Indicates the number of nodes to discover
|
|
||||||
Nameserver string // Optional nameserver to use for dns discovery
|
|
||||||
Resolver ethdisc.Resolver // Optional resolver to use for dns discovery
|
|
||||||
EnableDiscV5 bool // Indicates whether discv5 is enabled or not
|
|
||||||
DefaultPubsubTopic string // Pubsub topic to be used by default for messages that do not have a topic assigned (depending whether sharding is used or not)
|
|
||||||
Options []node.WakuNodeOption
|
|
||||||
SkipPublishToTopic bool // used in testing
|
|
||||||
}
|
|
||||||
|
|
||||||
type ITelemetryClient interface {
|
type ITelemetryClient interface {
|
||||||
PushReceivedEnvelope(*protocol.Envelope)
|
PushReceivedEnvelope(*protocol.Envelope)
|
||||||
}
|
}
|
||||||
|
@ -133,9 +115,8 @@ type Waku struct {
|
||||||
cancel context.CancelFunc
|
cancel context.CancelFunc
|
||||||
wg sync.WaitGroup
|
wg sync.WaitGroup
|
||||||
|
|
||||||
cfg *Config
|
cfg *Config
|
||||||
settings settings // Holds configuration settings that can be dynamically changed
|
options []node.WakuNodeOption
|
||||||
settingsMu sync.RWMutex // Mutex to sync the settings access
|
|
||||||
|
|
||||||
envelopeFeed event.Feed
|
envelopeFeed event.Feed
|
||||||
|
|
||||||
|
@ -189,6 +170,9 @@ func New(nodeKey string, fleet string, cfg *Config, logger *zap.Logger, appDB *s
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg = setDefaults(cfg)
|
cfg = setDefaults(cfg)
|
||||||
|
if err = cfg.Validate(); err != nil {
|
||||||
|
logger.Warn("bad wakuv2 configuration", zap.Error(err))
|
||||||
|
}
|
||||||
|
|
||||||
logger.Info("starting wakuv2 with config", zap.Any("config", cfg))
|
logger.Info("starting wakuv2 with config", zap.Any("config", cfg))
|
||||||
|
|
||||||
|
@ -218,33 +202,8 @@ func New(nodeKey string, fleet string, cfg *Config, logger *zap.Logger, appDB *s
|
||||||
onHistoricMessagesRequestFailed: onHistoricMessagesRequestFailed,
|
onHistoricMessagesRequestFailed: onHistoricMessagesRequestFailed,
|
||||||
onPeerStats: onPeerStats,
|
onPeerStats: onPeerStats,
|
||||||
}
|
}
|
||||||
enablePeerExchangeServer := false
|
|
||||||
enablePeerExchangeClient := false //TODO: Not sure how to set this as config that can be used in peerExchangeLoop
|
|
||||||
enableDiscv5 := false
|
|
||||||
if cfg.LightClient {
|
|
||||||
enablePeerExchangeServer = false
|
|
||||||
enablePeerExchangeClient = true
|
|
||||||
enableDiscv5 = false
|
|
||||||
} else {
|
|
||||||
enablePeerExchangeServer = true
|
|
||||||
enablePeerExchangeClient = false
|
|
||||||
enableDiscv5 = true
|
|
||||||
}
|
|
||||||
|
|
||||||
waku.settings = settings{
|
waku.filters = common.NewFilters(waku.cfg.DefaultShardPubsubTopic, waku.logger)
|
||||||
MaxMsgSize: cfg.MaxMessageSize,
|
|
||||||
LightClient: cfg.LightClient,
|
|
||||||
MinPeersForRelay: cfg.MinPeersForRelay,
|
|
||||||
MinPeersForFilter: cfg.MinPeersForFilter,
|
|
||||||
PeerExchange: enablePeerExchangeServer,
|
|
||||||
DiscoveryLimit: cfg.DiscoveryLimit,
|
|
||||||
Nameserver: cfg.Nameserver,
|
|
||||||
Resolver: cfg.Resolver,
|
|
||||||
EnableDiscV5: enableDiscv5,
|
|
||||||
}
|
|
||||||
|
|
||||||
waku.settings.DefaultPubsubTopic = cfg.DefaultShardPubsubTopic
|
|
||||||
waku.filters = common.NewFilters(waku.settings.DefaultPubsubTopic, waku.logger)
|
|
||||||
waku.bandwidthCounter = metrics.NewBandwidthCounter()
|
waku.bandwidthCounter = metrics.NewBandwidthCounter()
|
||||||
|
|
||||||
var privateKey *ecdsa.PrivateKey
|
var privateKey *ecdsa.PrivateKey
|
||||||
|
@ -285,13 +244,12 @@ func New(nodeKey string, fleet string, cfg *Config, logger *zap.Logger, appDB *s
|
||||||
node.WithMaxMsgSize(1024 * 1024),
|
node.WithMaxMsgSize(1024 * 1024),
|
||||||
}
|
}
|
||||||
|
|
||||||
if enableDiscv5 {
|
if cfg.EnableDiscV5 {
|
||||||
bootnodes, err := waku.getDiscV5BootstrapNodes(waku.ctx, cfg.DiscV5BootstrapNodes)
|
bootnodes, err := waku.getDiscV5BootstrapNodes(waku.ctx, cfg.DiscV5BootstrapNodes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("failed to get bootstrap nodes", zap.Error(err))
|
logger.Error("failed to get bootstrap nodes", zap.Error(err))
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
opts = append(opts, node.WithDiscoveryV5(uint(cfg.UDPPort), bootnodes, cfg.AutoUpdate))
|
opts = append(opts, node.WithDiscoveryV5(uint(cfg.UDPPort), bootnodes, cfg.AutoUpdate))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -299,14 +257,14 @@ func New(nodeKey string, fleet string, cfg *Config, logger *zap.Logger, appDB *s
|
||||||
opts = append(opts, node.WithWakuFilterLightNode())
|
opts = append(opts, node.WithWakuFilterLightNode())
|
||||||
} else {
|
} else {
|
||||||
relayOpts := []pubsub.Option{
|
relayOpts := []pubsub.Option{
|
||||||
pubsub.WithMaxMessageSize(int(waku.settings.MaxMsgSize)),
|
pubsub.WithMaxMessageSize(int(waku.cfg.MaxMessageSize)),
|
||||||
}
|
}
|
||||||
|
|
||||||
if waku.logger.Level() == zap.DebugLevel {
|
if waku.logger.Level() == zap.DebugLevel {
|
||||||
relayOpts = append(relayOpts, pubsub.WithEventTracer(waku))
|
relayOpts = append(relayOpts, pubsub.WithEventTracer(waku))
|
||||||
}
|
}
|
||||||
|
|
||||||
opts = append(opts, node.WithWakuRelayAndMinPeers(waku.settings.MinPeersForRelay, relayOpts...))
|
opts = append(opts, node.WithWakuRelayAndMinPeers(waku.cfg.MinPeersForRelay, relayOpts...))
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg.EnableStore {
|
if cfg.EnableStore {
|
||||||
|
@ -333,7 +291,7 @@ func New(nodeKey string, fleet string, cfg *Config, logger *zap.Logger, appDB *s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
waku.settings.Options = opts
|
waku.options = opts
|
||||||
waku.logger.Info("setup the go-waku node successfully")
|
waku.logger.Info("setup the go-waku node successfully")
|
||||||
|
|
||||||
return waku, nil
|
return waku, nil
|
||||||
|
@ -401,10 +359,8 @@ func (w *Waku) dnsDiscover(ctx context.Context, enrtreeAddress string, apply fnA
|
||||||
|
|
||||||
discNodes, ok := w.dnsAddressCache[enrtreeAddress]
|
discNodes, ok := w.dnsAddressCache[enrtreeAddress]
|
||||||
if !ok {
|
if !ok {
|
||||||
w.settingsMu.RLock()
|
nameserver := w.cfg.Nameserver
|
||||||
nameserver := w.settings.Nameserver
|
resolver := w.cfg.Resolver
|
||||||
resolver := w.settings.Resolver
|
|
||||||
w.settingsMu.RUnlock()
|
|
||||||
|
|
||||||
var opts []dnsdisc.DNSDiscoveryOption
|
var opts []dnsdisc.DNSDiscoveryOption
|
||||||
if nameserver != "" {
|
if nameserver != "" {
|
||||||
|
@ -434,19 +390,19 @@ func (w *Waku) dnsDiscover(ctx context.Context, enrtreeAddress string, apply fnA
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *Waku) addWakuV2Peers(ctx context.Context, cfg *Config) error {
|
func (w *Waku) discoverAndConnectPeers() error {
|
||||||
fnApply := func(d dnsdisc.DiscoveredNode, wg *sync.WaitGroup) {
|
fnApply := func(d dnsdisc.DiscoveredNode, wg *sync.WaitGroup) {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
if len(d.PeerInfo.Addrs) != 0 {
|
if len(d.PeerInfo.Addrs) != 0 {
|
||||||
go w.identifyAndConnect(ctx, w.settings.LightClient, d.PeerInfo)
|
go w.identifyAndConnect(w.ctx, w.cfg.LightClient, d.PeerInfo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, addrString := range cfg.WakuNodes {
|
for _, addrString := range w.cfg.WakuNodes {
|
||||||
addrString := addrString
|
addrString := addrString
|
||||||
if strings.HasPrefix(addrString, "enrtree://") {
|
if strings.HasPrefix(addrString, "enrtree://") {
|
||||||
// Use DNS Discovery
|
// Use DNS Discovery
|
||||||
go w.dnsDiscover(ctx, addrString, fnApply)
|
go w.dnsDiscover(w.ctx, addrString, fnApply)
|
||||||
} else {
|
} else {
|
||||||
// It is a normal multiaddress
|
// It is a normal multiaddress
|
||||||
addr, err := multiaddr.NewMultiaddr(addrString)
|
addr, err := multiaddr.NewMultiaddr(addrString)
|
||||||
|
@ -461,7 +417,7 @@ func (w *Waku) addWakuV2Peers(ctx context.Context, cfg *Config) error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
go w.identifyAndConnect(ctx, cfg.LightClient, *peerInfo)
|
go w.identifyAndConnect(w.ctx, w.cfg.LightClient, *peerInfo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -550,7 +506,7 @@ func (w *Waku) GetStats() types.StatsSummary {
|
||||||
|
|
||||||
func (w *Waku) runPeerExchangeLoop() {
|
func (w *Waku) runPeerExchangeLoop() {
|
||||||
defer w.wg.Done()
|
defer w.wg.Done()
|
||||||
if !enablePeerExchangeClient {
|
if !w.cfg.EnablePeerExchangeClient {
|
||||||
// Currently peer exchange client is only used for light nodes
|
// Currently peer exchange client is only used for light nodes
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -578,7 +534,7 @@ func (w *Waku) runPeerExchangeLoop() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
peersToDiscover := w.settings.DiscoveryLimit - peersWithRelay
|
peersToDiscover := w.cfg.DiscoveryLimit - peersWithRelay
|
||||||
if peersToDiscover <= 0 {
|
if peersToDiscover <= 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -606,7 +562,7 @@ func (w *Waku) runPeerExchangeLoop() {
|
||||||
|
|
||||||
func (w *Waku) getPubsubTopic(topic string) string {
|
func (w *Waku) getPubsubTopic(topic string) string {
|
||||||
if topic == "" || !w.cfg.UseShardAsDefaultTopic {
|
if topic == "" || !w.cfg.UseShardAsDefaultTopic {
|
||||||
topic = w.settings.DefaultPubsubTopic
|
topic = w.cfg.DefaultShardPubsubTopic
|
||||||
}
|
}
|
||||||
return topic
|
return topic
|
||||||
}
|
}
|
||||||
|
@ -624,7 +580,7 @@ func (w *Waku) unsubscribeFromPubsubTopicWithWakuRelay(topic string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *Waku) subscribeToPubsubTopicWithWakuRelay(topic string, pubkey *ecdsa.PublicKey) error {
|
func (w *Waku) subscribeToPubsubTopicWithWakuRelay(topic string, pubkey *ecdsa.PublicKey) error {
|
||||||
if w.settings.LightClient {
|
if w.cfg.LightClient {
|
||||||
return errors.New("only available for full nodes")
|
return errors.New("only available for full nodes")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -673,16 +629,7 @@ func (w *Waku) subscribeToPubsubTopicWithWakuRelay(topic string, pubkey *ecdsa.P
|
||||||
|
|
||||||
// MaxMessageSize returns the maximum accepted message size.
|
// MaxMessageSize returns the maximum accepted message size.
|
||||||
func (w *Waku) MaxMessageSize() uint32 {
|
func (w *Waku) MaxMessageSize() uint32 {
|
||||||
w.settingsMu.RLock()
|
return w.cfg.MaxMessageSize
|
||||||
defer w.settingsMu.RUnlock()
|
|
||||||
return w.settings.MaxMsgSize
|
|
||||||
}
|
|
||||||
|
|
||||||
// ConfirmationsEnabled returns true if message confirmations are enabled.
|
|
||||||
func (w *Waku) ConfirmationsEnabled() bool {
|
|
||||||
w.settingsMu.RLock()
|
|
||||||
defer w.settingsMu.RUnlock()
|
|
||||||
return w.settings.EnableConfirmations
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CurrentTime returns current time.
|
// CurrentTime returns current time.
|
||||||
|
@ -962,7 +909,7 @@ func (w *Waku) Subscribe(f *common.Filter) (string, error) {
|
||||||
return id, err
|
return id, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if w.settings.LightClient {
|
if w.cfg.LightClient {
|
||||||
w.filterManager.eventChan <- FilterEvent{eventType: FilterEventAdded, filterID: id}
|
w.filterManager.eventChan <- FilterEvent{eventType: FilterEventAdded, filterID: id}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -976,7 +923,7 @@ func (w *Waku) Unsubscribe(ctx context.Context, id string) error {
|
||||||
return fmt.Errorf("failed to unsubscribe: invalid ID '%s'", id)
|
return fmt.Errorf("failed to unsubscribe: invalid ID '%s'", id)
|
||||||
}
|
}
|
||||||
|
|
||||||
if w.settings.LightClient {
|
if w.cfg.LightClient {
|
||||||
w.filterManager.eventChan <- FilterEvent{eventType: FilterEventRemoved, filterID: id}
|
w.filterManager.eventChan <- FilterEvent{eventType: FilterEventRemoved, filterID: id}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1010,7 +957,7 @@ func (w *Waku) UnsubscribeMany(ids []string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *Waku) SkipPublishToTopic(value bool) {
|
func (w *Waku) SkipPublishToTopic(value bool) {
|
||||||
w.settings.SkipPublishToTopic = value
|
w.cfg.SkipPublishToTopic = value
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *Waku) broadcast() {
|
func (w *Waku) broadcast() {
|
||||||
|
@ -1019,12 +966,12 @@ func (w *Waku) broadcast() {
|
||||||
case envelope := <-w.sendQueue:
|
case envelope := <-w.sendQueue:
|
||||||
logger := w.logger.With(zap.String("envelopeHash", hexutil.Encode(envelope.Hash())), zap.String("pubsubTopic", envelope.PubsubTopic()), zap.String("contentTopic", envelope.Message().ContentTopic), zap.Int64("timestamp", envelope.Message().GetTimestamp()))
|
logger := w.logger.With(zap.String("envelopeHash", hexutil.Encode(envelope.Hash())), zap.String("pubsubTopic", envelope.PubsubTopic()), zap.String("contentTopic", envelope.Message().ContentTopic), zap.Int64("timestamp", envelope.Message().GetTimestamp()))
|
||||||
var fn publishFn
|
var fn publishFn
|
||||||
if w.settings.SkipPublishToTopic {
|
if w.cfg.SkipPublishToTopic {
|
||||||
// For now only used in testing to simulate going offline
|
// For now only used in testing to simulate going offline
|
||||||
fn = func(env *protocol.Envelope, logger *zap.Logger) error {
|
fn = func(env *protocol.Envelope, logger *zap.Logger) error {
|
||||||
return errors.New("test send failure")
|
return errors.New("test send failure")
|
||||||
}
|
}
|
||||||
} else if w.settings.LightClient {
|
} else if w.cfg.LightClient {
|
||||||
fn = func(env *protocol.Envelope, logger *zap.Logger) error {
|
fn = func(env *protocol.Envelope, logger *zap.Logger) error {
|
||||||
logger.Info("publishing message via lightpush")
|
logger.Info("publishing message via lightpush")
|
||||||
_, err := w.node.Lightpush().Publish(w.ctx, env.Message(), lightpush.WithPubSubTopic(env.PubsubTopic()))
|
_, err := w.node.Lightpush().Publish(w.ctx, env.Message(), lightpush.WithPubSubTopic(env.PubsubTopic()))
|
||||||
|
@ -1181,7 +1128,7 @@ func (w *Waku) Start() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
if w.node, err = node.New(w.settings.Options...); err != nil {
|
if w.node, err = node.New(w.options...); err != nil {
|
||||||
return fmt.Errorf("failed to create a go-waku node: %v", err)
|
return fmt.Errorf("failed to create a go-waku node: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1201,18 +1148,18 @@ func (w *Waku) Start() error {
|
||||||
|
|
||||||
w.identifyService = idService
|
w.identifyService = idService
|
||||||
|
|
||||||
if err = w.addWakuV2Peers(w.ctx, w.cfg); err != nil {
|
if err = w.discoverAndConnectPeers(); err != nil {
|
||||||
return fmt.Errorf("failed to add wakuv2 peers: %v", err)
|
return fmt.Errorf("failed to add wakuv2 peers: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if w.settings.EnableDiscV5 {
|
if w.cfg.EnableDiscV5 {
|
||||||
err := w.node.DiscV5().Start(w.ctx)
|
err := w.node.DiscV5().Start(w.ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if w.settings.PeerExchange {
|
if w.cfg.EnablePeerExchangeServer {
|
||||||
err := w.node.PeerExchange().Start(w.ctx)
|
err := w.node.PeerExchange().Start(w.ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -1245,7 +1192,7 @@ func (w *Waku) Start() error {
|
||||||
w.onPeerStats(latestConnStatus)
|
w.onPeerStats(latestConnStatus)
|
||||||
}
|
}
|
||||||
|
|
||||||
if w.settings.EnableDiscV5 {
|
if w.cfg.EnableDiscV5 {
|
||||||
// Restarting DiscV5
|
// Restarting DiscV5
|
||||||
if !latestConnStatus.IsOnline && isConnected {
|
if !latestConnStatus.IsOnline && isConnected {
|
||||||
w.logger.Info("Restarting DiscV5: offline and is connected")
|
w.logger.Info("Restarting DiscV5: offline and is connected")
|
||||||
|
@ -1269,12 +1216,12 @@ func (w *Waku) Start() error {
|
||||||
go w.telemetryBandwidthStats(w.cfg.TelemetryServerURL)
|
go w.telemetryBandwidthStats(w.cfg.TelemetryServerURL)
|
||||||
go w.runPeerExchangeLoop()
|
go w.runPeerExchangeLoop()
|
||||||
|
|
||||||
if w.settings.LightClient {
|
if w.cfg.LightClient {
|
||||||
// Create FilterManager that will main peer connectivity
|
// Create FilterManager that will main peer connectivity
|
||||||
// for installed filters
|
// for installed filters
|
||||||
w.filterManager = newFilterManager(w.ctx, w.logger,
|
w.filterManager = newFilterManager(w.ctx, w.logger,
|
||||||
func(id string) *common.Filter { return w.GetFilter(id) },
|
func(id string) *common.Filter { return w.GetFilter(id) },
|
||||||
w.settings,
|
w.cfg,
|
||||||
func(env *protocol.Envelope) error { return w.OnNewEnvelopes(env, common.RelayedMessageType, false) },
|
func(env *protocol.Envelope) error { return w.OnNewEnvelopes(env, common.RelayedMessageType, false) },
|
||||||
w.node)
|
w.node)
|
||||||
|
|
||||||
|
@ -1302,7 +1249,7 @@ func (w *Waku) Start() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *Waku) setupRelaySubscriptions() error {
|
func (w *Waku) setupRelaySubscriptions() error {
|
||||||
if w.settings.LightClient {
|
if w.cfg.LightClient {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1321,7 +1268,7 @@ func (w *Waku) setupRelaySubscriptions() error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err := w.subscribeToPubsubTopicWithWakuRelay(w.settings.DefaultPubsubTopic, nil)
|
err := w.subscribeToPubsubTopicWithWakuRelay(w.cfg.DefaultShardPubsubTopic, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1553,7 +1500,7 @@ func (w *Waku) ListenAddresses() []string {
|
||||||
func (w *Waku) SubscribeToPubsubTopic(topic string, pubkey *ecdsa.PublicKey) error {
|
func (w *Waku) SubscribeToPubsubTopic(topic string, pubkey *ecdsa.PublicKey) error {
|
||||||
topic = w.getPubsubTopic(topic)
|
topic = w.getPubsubTopic(topic)
|
||||||
|
|
||||||
if !w.settings.LightClient {
|
if !w.cfg.LightClient {
|
||||||
err := w.subscribeToPubsubTopicWithWakuRelay(topic, pubkey)
|
err := w.subscribeToPubsubTopicWithWakuRelay(topic, pubkey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -1565,7 +1512,7 @@ func (w *Waku) SubscribeToPubsubTopic(topic string, pubkey *ecdsa.PublicKey) err
|
||||||
func (w *Waku) UnsubscribeFromPubsubTopic(topic string) error {
|
func (w *Waku) UnsubscribeFromPubsubTopic(topic string) error {
|
||||||
topic = w.getPubsubTopic(topic)
|
topic = w.getPubsubTopic(topic)
|
||||||
|
|
||||||
if !w.settings.LightClient {
|
if !w.cfg.LightClient {
|
||||||
err := w.unsubscribeFromPubsubTopicWithWakuRelay(topic)
|
err := w.unsubscribeFromPubsubTopicWithWakuRelay(topic)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -1635,7 +1582,7 @@ func (w *Waku) ConnectionChanged(state connection.State) {
|
||||||
// It backs off exponentially until maxRetries, at which point it restarts from 0
|
// It backs off exponentially until maxRetries, at which point it restarts from 0
|
||||||
// It also restarts if there's a connection change signalled from the client
|
// It also restarts if there's a connection change signalled from the client
|
||||||
func (w *Waku) seedBootnodesForDiscV5() {
|
func (w *Waku) seedBootnodesForDiscV5() {
|
||||||
if !w.settings.EnableDiscV5 || w.node.DiscV5() == nil {
|
if !w.cfg.EnableDiscV5 || w.node.DiscV5() == nil {
|
||||||
w.wg.Done()
|
w.wg.Done()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -1865,7 +1812,7 @@ func FormatPeerStats(wakuNode *node.WakuNode, peers node.PeerStats) map[string]t
|
||||||
for _, addr := range peerInfo.Addrs {
|
for _, addr := range peerInfo.Addrs {
|
||||||
wakuV2Peer.Addresses = append(wakuV2Peer.Addresses, addr.Encapsulate(hostInfo).String())
|
wakuV2Peer.Addresses = append(wakuV2Peer.Addresses, addr.Encapsulate(hostInfo).String())
|
||||||
}
|
}
|
||||||
p[k.Pretty()] = wakuV2Peer
|
p[k.String()] = wakuV2Peer
|
||||||
}
|
}
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,8 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"go.uber.org/zap"
|
||||||
|
|
||||||
"github.com/cenkalti/backoff/v3"
|
"github.com/cenkalti/backoff/v3"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
|
@ -220,11 +222,14 @@ func makeTestTree(domain string, nodes []*enode.Node, links []string) (*ethdnsdi
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPeerExchange(t *testing.T) {
|
func TestPeerExchange(t *testing.T) {
|
||||||
|
logger, err := zap.NewDevelopment()
|
||||||
|
require.NoError(t, err)
|
||||||
// start node which serve as PeerExchange server
|
// start node which serve as PeerExchange server
|
||||||
config := &Config{}
|
config := &Config{}
|
||||||
config.EnableDiscV5 = true
|
config.EnableDiscV5 = true
|
||||||
config.PeerExchange = true
|
config.EnablePeerExchangeServer = true
|
||||||
pxServerNode, err := New("", "", config, nil, nil, nil, nil, nil)
|
config.EnablePeerExchangeClient = false
|
||||||
|
pxServerNode, err := New("", "", config, logger.Named("pxServerNode"), nil, nil, nil, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, pxServerNode.Start())
|
require.NoError(t, pxServerNode.Start())
|
||||||
|
|
||||||
|
@ -233,10 +238,12 @@ func TestPeerExchange(t *testing.T) {
|
||||||
// start node that will be discovered by PeerExchange
|
// start node that will be discovered by PeerExchange
|
||||||
config = &Config{}
|
config = &Config{}
|
||||||
config.EnableDiscV5 = true
|
config.EnableDiscV5 = true
|
||||||
|
config.EnablePeerExchangeServer = false
|
||||||
|
config.EnablePeerExchangeClient = false
|
||||||
config.DiscV5BootstrapNodes = []string{pxServerNode.node.ENR().String()}
|
config.DiscV5BootstrapNodes = []string{pxServerNode.node.ENR().String()}
|
||||||
node, err := New("", "", config, nil, nil, nil, nil, nil)
|
discV5Node, err := New("", "", config, logger.Named("discV5Node"), nil, nil, nil, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, node.Start())
|
require.NoError(t, discV5Node.Start())
|
||||||
|
|
||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
|
|
||||||
|
@ -246,12 +253,13 @@ func TestPeerExchange(t *testing.T) {
|
||||||
resolver := mapResolver(tree.ToTXT("n"))
|
resolver := mapResolver(tree.ToTXT("n"))
|
||||||
|
|
||||||
config = &Config{}
|
config = &Config{}
|
||||||
config.PeerExchange = true
|
config.EnablePeerExchangeServer = false
|
||||||
|
config.EnablePeerExchangeClient = true
|
||||||
config.LightClient = true
|
config.LightClient = true
|
||||||
config.Resolver = resolver
|
config.Resolver = resolver
|
||||||
|
|
||||||
config.WakuNodes = []string{url}
|
config.WakuNodes = []string{url}
|
||||||
lightNode, err := New("", "", config, nil, nil, nil, nil, nil)
|
lightNode, err := New("", "", config, logger.Named("lightNode"), nil, nil, nil, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, lightNode.Start())
|
require.NoError(t, lightNode.Start())
|
||||||
|
|
||||||
|
@ -269,7 +277,7 @@ func TestPeerExchange(t *testing.T) {
|
||||||
|
|
||||||
require.NoError(t, lightNode.Stop())
|
require.NoError(t, lightNode.Stop())
|
||||||
require.NoError(t, pxServerNode.Stop())
|
require.NoError(t, pxServerNode.Stop())
|
||||||
require.NoError(t, node.Stop())
|
require.NoError(t, discV5Node.Stop())
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestWakuV2Filter(t *testing.T) {
|
func TestWakuV2Filter(t *testing.T) {
|
||||||
|
|
Loading…
Reference in New Issue