2021-06-16 20:19:45 +00:00
// Copyright 2019 The Waku Library Authors.
//
// The Waku 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 Waku library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty off
// 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 Waku library. If not, see <http://www.gnu.org/licenses/>.
//
// This software uses the go-ethereum library, which is licensed
// under the GNU Lesser General Public Library, version 3 or any later.
package wakuv2
import (
2024-02-27 09:24:34 +00:00
"errors"
2024-03-01 05:43:07 +00:00
"go.uber.org/zap"
2023-11-10 00:29:15 +00:00
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
2023-11-25 23:24:20 +00:00
2024-01-16 10:38:41 +00:00
"github.com/status-im/status-go/protocol/common/shard"
2023-12-20 12:49:12 +00:00
ethdisc "github.com/ethereum/go-ethereum/p2p/dnsdisc"
2023-11-25 23:24:20 +00:00
"github.com/status-im/status-go/wakuv2/common"
2021-06-16 20:19:45 +00:00
)
2024-03-01 05:43:07 +00:00
var (
ErrBadLightClientConfig = errors . New ( "either peer exchange server or discv5 must be disabled, and the peer exchange client must be enabled" )
ErrBadFullNodeConfig = errors . New ( "peer exchange server and discv5 must be enabled, and the peer exchange client must be disabled" )
)
2021-06-16 20:19:45 +00:00
// Config represents the configuration state of a waku node.
type Config struct {
2024-06-14 12:41:45 +00:00
MaxMessageSize uint32 ` toml:",omitempty" ` // Maximal message length allowed by the waku node
Host string ` toml:",omitempty" `
Port int ` 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
EnablePeerExchangeClient bool ` toml:",omitempty" `
KeepAliveInterval int ` toml:",omitempty" `
MinPeersForRelay int ` toml:",omitempty" ` // Indicates the minimum number of peers required for using Relay Protocol
MinPeersForFilter int ` toml:",omitempty" ` // Indicates the minimum number of peers required for using Filter Protocol
LightClient bool ` toml:",omitempty" ` // Indicates if the node is a light client
WakuNodes [ ] string ` toml:",omitempty" `
Rendezvous bool ` toml:",omitempty" `
DiscV5BootstrapNodes [ ] string ` toml:",omitempty" `
Nameserver string ` toml:",omitempty" ` // Optional nameserver to use for dns discovery
Resolver ethdisc . Resolver ` toml:",omitempty" ` // Optional resolver to use for dns discovery
EnableDiscV5 bool ` toml:",omitempty" ` // Indicates whether discv5 is enabled or not
DiscoveryLimit int ` toml:",omitempty" ` // Indicates the number of nodes to discover with peer exchange client
AutoUpdate bool ` toml:",omitempty" `
UDPPort int ` toml:",omitempty" `
EnableStore bool ` toml:",omitempty" `
StoreCapacity int ` toml:",omitempty" `
StoreSeconds int ` toml:",omitempty" `
TelemetryServerURL string ` toml:",omitempty" `
2024-06-28 10:24:04 +00:00
TelemetrySendPeriodMs int ` toml:",omitempty" ` // Number of milliseconds to wait between sending requests to telemetry service
2024-06-14 12:41:45 +00:00
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)
DefaultShardedPubsubTopics [ ] string ` 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
2024-02-27 09:24:34 +00:00
}
2024-03-01 05:43:07 +00:00
func ( c * Config ) Validate ( logger * zap . Logger ) error {
2024-02-27 09:24:34 +00:00
if c . LightClient && ( c . EnablePeerExchangeServer || c . EnableDiscV5 || ! c . EnablePeerExchangeClient ) {
2024-03-01 05:43:07 +00:00
logger . Warn ( "bad configuration for a light client" , zap . Error ( ErrBadLightClientConfig ) )
return nil
2024-02-27 09:24:34 +00:00
}
if ! c . LightClient && ( ! c . EnablePeerExchangeServer || ! c . EnableDiscV5 || c . EnablePeerExchangeClient ) {
2024-03-01 05:43:07 +00:00
logger . Warn ( "bad configuration for a full node" , zap . Error ( ErrBadFullNodeConfig ) )
return nil
2024-02-27 09:24:34 +00:00
}
return nil
2021-06-16 20:19:45 +00:00
}
var DefaultConfig = Config {
2024-01-16 10:38:41 +00:00
MaxMessageSize : common . DefaultMaxMessageSize ,
Host : "0.0.0.0" ,
Port : 0 ,
KeepAliveInterval : 10 , // second
DiscoveryLimit : 20 ,
MinPeersForRelay : 1 , // TODO: determine correct value with Vac team
MinPeersForFilter : 2 , // TODO: determine correct value with Vac team and via testing
AutoUpdate : false ,
2021-11-22 13:40:14 +00:00
}
func setDefaults ( cfg * Config ) * Config {
if cfg == nil {
cfg = new ( Config )
}
if cfg . MaxMessageSize == 0 {
cfg . MaxMessageSize = DefaultConfig . MaxMessageSize
}
if cfg . Host == "" {
cfg . Host = DefaultConfig . Host
}
if cfg . KeepAliveInterval == 0 {
cfg . KeepAliveInterval = DefaultConfig . KeepAliveInterval
}
if cfg . DiscoveryLimit == 0 {
cfg . DiscoveryLimit = DefaultConfig . DiscoveryLimit
}
if cfg . MinPeersForRelay == 0 {
cfg . MinPeersForRelay = DefaultConfig . MinPeersForRelay
}
2023-06-07 09:02:19 +00:00
if cfg . MinPeersForFilter == 0 {
cfg . MinPeersForFilter = DefaultConfig . MinPeersForFilter
}
2023-11-10 00:29:15 +00:00
if cfg . DefaultShardPubsubTopic == "" {
2024-01-16 10:38:41 +00:00
if cfg . UseShardAsDefaultTopic {
cfg . DefaultShardPubsubTopic = shard . DefaultShardPubsubTopic ( )
2024-06-14 12:41:45 +00:00
//For now populating with both used shards, but this can be populated from user subscribed communities etc once community sharding is implemented
cfg . DefaultShardedPubsubTopics = append ( cfg . DefaultShardedPubsubTopics , shard . DefaultShardPubsubTopic ( ) )
cfg . DefaultShardedPubsubTopics = append ( cfg . DefaultShardedPubsubTopics , shard . DefaultNonProtectedPubsubTopic ( ) )
2024-01-16 10:38:41 +00:00
} else {
cfg . DefaultShardPubsubTopic = relay . DefaultWakuTopic
}
2023-11-10 00:29:15 +00:00
}
2021-11-22 13:40:14 +00:00
return cfg
2021-06-16 20:19:45 +00:00
}