2021-03-18 23:21:45 +00:00
|
|
|
package main
|
|
|
|
|
2021-03-22 16:45:13 +00:00
|
|
|
import (
|
2021-10-03 21:45:07 +00:00
|
|
|
"os"
|
|
|
|
|
2021-03-22 16:45:13 +00:00
|
|
|
logging "github.com/ipfs/go-log"
|
2021-04-13 18:54:06 +00:00
|
|
|
"github.com/status-im/go-waku/waku"
|
2022-01-18 18:17:06 +00:00
|
|
|
"github.com/status-im/go-waku/waku/v2/utils"
|
2022-02-21 15:23:52 +00:00
|
|
|
"github.com/urfave/cli/v2"
|
2021-03-22 16:45:13 +00:00
|
|
|
)
|
2021-03-18 23:21:45 +00:00
|
|
|
|
2021-10-03 21:45:07 +00:00
|
|
|
var options waku.Options
|
|
|
|
|
2021-03-18 23:21:45 +00:00
|
|
|
func main() {
|
2022-02-21 15:23:52 +00:00
|
|
|
app := &cli.App{
|
|
|
|
Flags: []cli.Flag{
|
|
|
|
&cli.IntFlag{
|
|
|
|
Name: "tcp-port",
|
|
|
|
Aliases: []string{"port", "p"},
|
|
|
|
Value: 60000,
|
|
|
|
Usage: "Libp2p TCP listening port (0 for random)",
|
|
|
|
Destination: &options.Port,
|
|
|
|
},
|
|
|
|
&cli.StringFlag{
|
2022-03-22 00:48:46 +00:00
|
|
|
Name: "address",
|
|
|
|
Aliases: []string{"host", "listen-address"},
|
2022-02-21 15:23:52 +00:00
|
|
|
Value: "0.0.0.0",
|
|
|
|
Usage: "Listening address",
|
|
|
|
Destination: &options.Address,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "websocket-support",
|
|
|
|
Aliases: []string{"ws"},
|
|
|
|
Usage: "Enable websockets support",
|
2022-03-22 13:12:58 +00:00
|
|
|
Destination: &options.Websocket.Enable,
|
2022-02-21 15:23:52 +00:00
|
|
|
},
|
|
|
|
&cli.IntFlag{
|
|
|
|
Name: "websocket-port",
|
|
|
|
Aliases: []string{"ws-port"},
|
|
|
|
Value: 60001,
|
|
|
|
Usage: "Libp2p TCP listening port for websocket connection (0 for random)",
|
2022-03-22 13:12:58 +00:00
|
|
|
Destination: &options.Websocket.Port,
|
2022-02-21 15:23:52 +00:00
|
|
|
},
|
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "websocket-address",
|
|
|
|
Aliases: []string{"ws-address"},
|
|
|
|
Value: "0.0.0.0",
|
|
|
|
Usage: "Listening address for websocket connections",
|
2022-03-22 13:12:58 +00:00
|
|
|
Destination: &options.Websocket.Address,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "websocket-secure-support",
|
|
|
|
Aliases: []string{"wss"},
|
|
|
|
Usage: "Enable secure websockets support",
|
|
|
|
Destination: &options.Websocket.Secure,
|
|
|
|
},
|
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "websocket-secure-key-path",
|
|
|
|
Aliases: []string{"wss-key"},
|
|
|
|
Value: "/path/to/key.txt",
|
|
|
|
Usage: "Secure websocket key path",
|
|
|
|
Destination: &options.Websocket.KeyPath,
|
|
|
|
},
|
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "websocket-secure-cert-path",
|
|
|
|
Aliases: []string{"wss-cert"},
|
|
|
|
Value: "/path/to/cert.txt",
|
|
|
|
Usage: "Secure websocket certificate path",
|
|
|
|
Destination: &options.Websocket.CertPath,
|
2022-02-21 15:23:52 +00:00
|
|
|
},
|
2022-03-22 00:48:46 +00:00
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "dns4-domain-name",
|
|
|
|
Value: "",
|
|
|
|
Usage: "The domain name resolving to the node's public IPv4 address",
|
|
|
|
Destination: &options.Dns4DomainName,
|
|
|
|
},
|
2022-02-21 15:23:52 +00:00
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "nodekey",
|
|
|
|
Usage: "P2P node private key as hex. Can also be set with GOWAKU-NODEKEY env variable (default random)",
|
|
|
|
Destination: &options.NodeKey,
|
|
|
|
},
|
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "key-file",
|
|
|
|
Value: "./nodekey",
|
|
|
|
Usage: "Path to a file containing the private key for the P2P node",
|
|
|
|
Destination: &options.KeyFile,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "generate-key",
|
|
|
|
Usage: "Generate private key file at path specified in --key-file",
|
|
|
|
Destination: &options.GenerateKey,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "overwrite",
|
|
|
|
Usage: "When generating a keyfile, overwrite the nodekey file if it already exists",
|
|
|
|
Destination: &options.Overwrite,
|
|
|
|
},
|
|
|
|
&cli.StringSliceFlag{
|
|
|
|
Name: "staticnode",
|
|
|
|
Usage: "Multiaddr of peer to directly connect with. Option may be repeated",
|
|
|
|
Destination: &options.StaticNodes,
|
|
|
|
},
|
|
|
|
&cli.IntFlag{
|
|
|
|
Name: "keep-alive",
|
|
|
|
Value: 20,
|
|
|
|
Usage: "Interval in seconds for pinging peers to keep the connection alive.",
|
|
|
|
Destination: &options.KeepAlive,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "use-db",
|
2022-06-19 21:47:39 +00:00
|
|
|
Aliases: []string{"sqlite-store"},
|
2022-02-21 15:23:52 +00:00
|
|
|
Usage: "Use SQLiteDB to persist information",
|
|
|
|
Destination: &options.UseDB,
|
|
|
|
},
|
2022-06-13 18:30:35 +00:00
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "persist-messages",
|
|
|
|
Usage: "Enable message persistence",
|
|
|
|
Destination: &options.Store.PersistMessages,
|
2022-06-19 21:47:39 +00:00
|
|
|
Value: false,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "persist-peers",
|
|
|
|
Usage: "Enable peer persistence",
|
|
|
|
Destination: &options.PersistPeers,
|
|
|
|
Value: false,
|
2022-06-13 18:30:35 +00:00
|
|
|
},
|
|
|
|
&cli.StringFlag{
|
2022-06-19 21:47:39 +00:00
|
|
|
Name: "nat", // This was added so js-waku test don't fail
|
|
|
|
Usage: "TODO: Not implemented yet. Specify method to use for determining public address: any, none ('any' will attempt upnp/pmp)",
|
|
|
|
Value: "any",
|
|
|
|
Destination: &options.NAT, // TODO: accept none,any,upnp,extaddr
|
2022-06-13 18:30:35 +00:00
|
|
|
},
|
2022-02-21 15:23:52 +00:00
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "db-path",
|
|
|
|
Aliases: []string{"dbpath"},
|
|
|
|
Value: "./store.db",
|
|
|
|
Usage: "Path to DB file",
|
|
|
|
Destination: &options.DBPath,
|
|
|
|
},
|
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "advertise-address",
|
|
|
|
Usage: "External address to advertise to other nodes (overrides --address and --ws-address flags)",
|
|
|
|
Destination: &options.AdvertiseAddress,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "show-addresses",
|
|
|
|
Usage: "Display listening addresses according to current configuration",
|
|
|
|
Destination: &options.ShowAddresses,
|
|
|
|
},
|
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "log-level",
|
|
|
|
Aliases: []string{"l"},
|
|
|
|
Value: "INFO",
|
|
|
|
Usage: "Define the logging level, supported strings are: DEBUG, INFO, WARN, ERROR, DPANIC, PANIC, FATAL, and their lower-case forms.",
|
|
|
|
Destination: &options.LogLevel,
|
|
|
|
},
|
2022-06-19 21:47:39 +00:00
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "version",
|
|
|
|
Value: false,
|
|
|
|
Usage: "prints the version",
|
|
|
|
Destination: &options.Version,
|
|
|
|
},
|
2022-06-01 20:03:26 +00:00
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "log-encoding",
|
|
|
|
Value: "console",
|
|
|
|
Usage: "Define the encoding used for the logs: console, json",
|
|
|
|
Destination: &options.LogEncoding,
|
|
|
|
},
|
2022-02-21 15:23:52 +00:00
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "relay",
|
|
|
|
Value: true,
|
|
|
|
Usage: "Enable relay protocol",
|
|
|
|
Destination: &options.Relay.Enable,
|
|
|
|
},
|
|
|
|
&cli.StringSliceFlag{
|
|
|
|
Name: "topics",
|
|
|
|
Usage: "List of topics to listen",
|
|
|
|
Destination: &options.Relay.Topics,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
2022-05-04 21:42:28 +00:00
|
|
|
Name: "relay-peer-exchange",
|
|
|
|
Aliases: []string{"peer-exchange"},
|
2022-06-19 21:47:39 +00:00
|
|
|
Value: false,
|
2022-02-21 15:23:52 +00:00
|
|
|
Usage: "Enable GossipSub Peer Exchange",
|
|
|
|
Destination: &options.Relay.PeerExchange,
|
|
|
|
},
|
|
|
|
&cli.IntFlag{
|
|
|
|
Name: "min-relay-peers-to-publish",
|
|
|
|
Value: 1,
|
|
|
|
Usage: "Minimum number of peers to publish to Relay",
|
|
|
|
Destination: &options.Relay.MinRelayPeersToPublish,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "store",
|
|
|
|
Usage: "Enable relay protocol",
|
|
|
|
Destination: &options.Store.Enable,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "resume",
|
|
|
|
Usage: "Fix the gaps in message history",
|
|
|
|
Destination: &options.Store.ShouldResume,
|
|
|
|
},
|
|
|
|
&cli.IntFlag{
|
2022-06-19 21:47:39 +00:00
|
|
|
Name: "store-seconds",
|
|
|
|
Value: (86400 * 30), // 30 days
|
|
|
|
Usage: "maximum number of seconds before a message is removed from the store",
|
|
|
|
Destination: &options.Store.RetentionMaxSeconds,
|
2022-02-21 15:23:52 +00:00
|
|
|
},
|
|
|
|
&cli.IntFlag{
|
|
|
|
Name: "store-capacity",
|
|
|
|
Value: 50000,
|
|
|
|
Usage: "maximum number of messages to store",
|
|
|
|
Destination: &options.Store.RetentionMaxMessages,
|
|
|
|
},
|
|
|
|
&cli.StringSliceFlag{
|
|
|
|
Name: "storenode",
|
|
|
|
Usage: "Multiaddr of a peer that supports store protocol. Option may be repeated",
|
|
|
|
Destination: &options.Store.Nodes,
|
|
|
|
},
|
2022-06-19 21:47:39 +00:00
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "swap",
|
|
|
|
Usage: "Enable swap protocol",
|
|
|
|
Value: false,
|
|
|
|
Destination: &options.Swap.Enable,
|
|
|
|
},
|
2022-02-21 15:23:52 +00:00
|
|
|
&cli.IntFlag{
|
|
|
|
Name: "swap-mode",
|
|
|
|
Value: 0,
|
|
|
|
Usage: "Swap mode: 0=soft, 1=mock, 2=hard",
|
|
|
|
Destination: &options.Swap.Mode,
|
|
|
|
},
|
|
|
|
&cli.IntFlag{
|
|
|
|
Name: "swap-payment-threshold",
|
|
|
|
Value: 100,
|
|
|
|
Usage: "Threshold for payment",
|
|
|
|
Destination: &options.Swap.PaymentThreshold,
|
|
|
|
},
|
|
|
|
&cli.IntFlag{
|
|
|
|
Name: "swap-disconnect-threshold",
|
|
|
|
Value: -100,
|
|
|
|
Usage: "Threshold for disconnecting",
|
|
|
|
Destination: &options.Swap.DisconnectThreshold,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "filter",
|
|
|
|
Usage: "Enable filter protocol",
|
|
|
|
Destination: &options.Filter.Enable,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "light-client",
|
|
|
|
Usage: "Don't accept filter subscribers",
|
|
|
|
Destination: &options.Filter.DisableFullNode,
|
|
|
|
},
|
|
|
|
&cli.StringSliceFlag{
|
|
|
|
Name: "filternode",
|
|
|
|
Usage: "Multiaddr of a peer that supports filter protocol. Option may be repeated",
|
|
|
|
Destination: &options.Filter.Nodes,
|
|
|
|
},
|
|
|
|
&cli.IntFlag{
|
|
|
|
Name: "filter-timeout",
|
|
|
|
Value: 14400,
|
|
|
|
Usage: "Timeout for filter node in seconds",
|
|
|
|
Destination: &options.Filter.Timeout,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "lightpush",
|
|
|
|
Usage: "Enable lightpush protocol",
|
|
|
|
Destination: &options.LightPush.Enable,
|
|
|
|
},
|
|
|
|
&cli.StringSliceFlag{
|
|
|
|
Name: "lightpushnode",
|
|
|
|
Usage: "Multiaddr of a peer that supports lightpush protocol. Option may be repeated",
|
|
|
|
Destination: &options.LightPush.Nodes,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "discv5-discovery",
|
|
|
|
Usage: "Enable discovering nodes via Node Discovery v5",
|
|
|
|
Destination: &options.DiscV5.Enable,
|
|
|
|
},
|
|
|
|
&cli.StringSliceFlag{
|
|
|
|
Name: "discv5-bootstrap-node",
|
|
|
|
Usage: "Text-encoded ENR for bootstrap node. Used when connecting to the network. Option may be repeated",
|
|
|
|
Destination: &options.DiscV5.Nodes,
|
|
|
|
},
|
|
|
|
&cli.IntFlag{
|
|
|
|
Name: "discv5-udp-port",
|
|
|
|
Value: 9000,
|
|
|
|
Usage: "Listening UDP port for Node Discovery v5.",
|
|
|
|
Destination: &options.DiscV5.Port,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "discv5-enr-auto-update",
|
|
|
|
Usage: "Discovery can automatically update its ENR with the IP address as seen by other nodes it communicates with.",
|
|
|
|
Destination: &options.DiscV5.AutoUpdate,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "rendezvous",
|
|
|
|
Usage: "Enable rendezvous protocol for peer discovery",
|
|
|
|
Destination: &options.Rendezvous.Enable,
|
|
|
|
},
|
|
|
|
&cli.StringSliceFlag{
|
|
|
|
Name: "rendezvous-node",
|
|
|
|
Usage: "Multiaddr of a waku2 rendezvous node. Option may be repeated",
|
|
|
|
Destination: &options.Rendezvous.Nodes,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "rendezvous-server",
|
|
|
|
Usage: "Node will act as rendezvous server",
|
|
|
|
Destination: &options.RendezvousServer.Enable,
|
|
|
|
},
|
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "rendezvous-db-path",
|
|
|
|
Value: "/tmp/rendezvous",
|
|
|
|
Usage: "Path where peer records database will be stored",
|
|
|
|
Destination: &options.RendezvousServer.DBPath,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "dns-discovery",
|
|
|
|
Usage: "Enable DNS discovery",
|
|
|
|
Destination: &options.DNSDiscovery.Enable,
|
|
|
|
},
|
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "dns-discovery-url",
|
|
|
|
Usage: "URL for DNS node list in format 'enrtree://<key>@<fqdn>'",
|
|
|
|
Destination: &options.DNSDiscovery.URL,
|
|
|
|
},
|
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "dns-discovery-name-server",
|
|
|
|
Aliases: []string{"dns-discovery-nameserver"},
|
|
|
|
Usage: "DNS nameserver IP to query (empty to use system's default)",
|
|
|
|
Destination: &options.DNSDiscovery.Nameserver,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "metrics-server",
|
|
|
|
Aliases: []string{"metrics"},
|
|
|
|
Usage: "Enable the metrics server",
|
|
|
|
Destination: &options.Metrics.Enable,
|
|
|
|
},
|
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "metrics-server-address",
|
|
|
|
Aliases: []string{"metrics-address"},
|
|
|
|
Value: "127.0.0.1",
|
|
|
|
Usage: "Listening address of the metrics server",
|
|
|
|
Destination: &options.Metrics.Address,
|
|
|
|
},
|
|
|
|
&cli.IntFlag{
|
|
|
|
Name: "metrics-server-port",
|
|
|
|
Aliases: []string{"metrics-port"},
|
|
|
|
Value: 8008,
|
|
|
|
Usage: "Listening HTTP port of the metrics server",
|
|
|
|
Destination: &options.Metrics.Port,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "rpc",
|
|
|
|
Usage: "Enable the rpc server",
|
|
|
|
Destination: &options.RPCServer.Enable,
|
|
|
|
},
|
|
|
|
&cli.IntFlag{
|
|
|
|
Name: "rpc-port",
|
2022-06-19 21:47:39 +00:00
|
|
|
Value: 8545,
|
2022-02-21 15:23:52 +00:00
|
|
|
Usage: "Listening port of the rpc server",
|
|
|
|
Destination: &options.RPCServer.Port,
|
|
|
|
},
|
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "rpc-address",
|
|
|
|
Value: "127.0.0.1",
|
|
|
|
Usage: "Listening address of the rpc server",
|
|
|
|
Destination: &options.RPCServer.Address,
|
|
|
|
},
|
2022-05-06 19:47:28 +00:00
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "rpc-admin",
|
|
|
|
Value: false,
|
|
|
|
Usage: "Enable access to JSON-RPC Admin API",
|
|
|
|
Destination: &options.RPCServer.Admin,
|
|
|
|
},
|
|
|
|
&cli.BoolFlag{
|
|
|
|
Name: "rpc-private",
|
|
|
|
Value: false,
|
|
|
|
Usage: "Enable access to JSON-RPC Private API",
|
|
|
|
Destination: &options.RPCServer.Private,
|
|
|
|
},
|
2022-02-21 15:23:52 +00:00
|
|
|
},
|
|
|
|
Action: func(c *cli.Context) error {
|
|
|
|
// for go-libp2p loggers
|
|
|
|
lvl, err := logging.LevelFromString(options.LogLevel)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
logging.SetAllLoggers(lvl)
|
2021-10-03 21:45:07 +00:00
|
|
|
|
2022-02-21 15:23:52 +00:00
|
|
|
// go-waku logger
|
|
|
|
err = utils.SetLogLevel(options.LogLevel)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2022-06-01 20:03:26 +00:00
|
|
|
// Set encoding for logs (console, json, ...)
|
|
|
|
// Note that libp2p reads the encoding from GOLOG_LOG_FMT env var.
|
|
|
|
utils.InitLogger(options.LogEncoding)
|
|
|
|
|
2022-02-21 15:23:52 +00:00
|
|
|
waku.Execute(options)
|
|
|
|
return nil
|
|
|
|
},
|
2021-03-22 16:45:13 +00:00
|
|
|
}
|
|
|
|
|
2022-02-21 15:23:52 +00:00
|
|
|
err := app.Run(os.Args)
|
2022-01-18 18:17:06 +00:00
|
|
|
if err != nil {
|
2022-02-21 15:23:52 +00:00
|
|
|
panic(err)
|
2022-01-18 18:17:06 +00:00
|
|
|
}
|
2021-03-18 23:21:45 +00:00
|
|
|
}
|