diff --git a/apps/wakunode2/external_config.nim b/apps/wakunode2/external_config.nim index f18c4b159e..384cb1922e 100644 --- a/apps/wakunode2/external_config.nim +++ b/apps/wakunode2/external_config.nim @@ -30,18 +30,16 @@ type ProtectedTopic* = object topic*: string key*: secp256k1.SkPublicKey +type StartUpCommand* = enum + noCommand # default, runs waku + generateRlnKeystore # generates a new RLN keystore + type WakuNodeConf* = object configFile* {. desc: "Loads configuration from a TOML file (cmd-line parameters take precedence)" name: "config-file" }: Option[InputFile] - ## Application-level configuration - protectedTopics* {. - desc: "Topics and its public key to be used for message validation, topic:pubkey. Argument may be repeated." - defaultValue: newSeq[ProtectedTopic](0) - name: "protected-topic" .}: seq[ProtectedTopic] - ## Log configuration logLevel* {. desc: "Sets the log level for process. Supported levels: TRACE, DEBUG, INFO, NOTICE, WARN, ERROR or FATAL", @@ -53,409 +51,432 @@ type defaultValue: logging.LogFormat.TEXT, name: "log-format" .}: logging.LogFormat - ## General node config - clusterId* {. - desc: "Cluster id that the node is running in. Node in a different cluster id is disconnected." - defaultValue: 0 - name: "cluster-id" }: uint32 - - agentString* {. - defaultValue: "nwaku", - desc: "Node agent string which is used as identifier in network" - name: "agent-string" .}: string - - nodekey* {. - desc: "P2P node private key as 64 char hex string.", - name: "nodekey" }: Option[PrivateKey] - - listenAddress* {. - defaultValue: defaultListenAddress() - desc: "Listening address for LibP2P (and Discovery v5, if enabled) traffic." - name: "listen-address"}: ValidIpAddress - - tcpPort* {. - desc: "TCP listening port." - defaultValue: 60000 - name: "tcp-port" }: Port - - portsShift* {. - desc: "Add a shift to all port numbers." - defaultValue: 0 - name: "ports-shift" }: uint16 - - nat* {. - desc: "Specify method to use for determining public address. " & - "Must be one of: any, none, upnp, pmp, extip:." - defaultValue: "any" }: string - - extMultiAddrs* {. - desc: "External multiaddresses to advertise to the network. Argument may be repeated." - name: "ext-multiaddr" }: seq[string] - - extMultiAddrsOnly* {. - desc: "Only announce external multiaddresses", - defaultValue: false, - name: "ext-multiaddr-only" }: bool - - maxConnections* {. - desc: "Maximum allowed number of libp2p connections." - defaultValue: 50 - name: "max-connections" }: uint16 - - maxRelayPeers* {. - desc: "Maximum allowed number of relay peers." - name: "max-relay-peers" }: Option[int] - - peerStoreCapacity* {. - desc: "Maximum stored peers in the peerstore." - name: "peer-store-capacity" }: Option[int] - - peerPersistence* {. - desc: "Enable peer persistence.", - defaultValue: false, - name: "peer-persistence" }: bool - - ## DNS addrs config - - dnsAddrs* {. - desc: "Enable resolution of `dnsaddr`, `dns4` or `dns6` multiaddrs" - defaultValue: true - name: "dns-addrs" }: bool - - dnsAddrsNameServers* {. - desc: "DNS name server IPs to query for DNS multiaddrs resolution. Argument may be repeated." - defaultValue: @[ValidIpAddress.init("1.1.1.1"), ValidIpAddress.init("1.0.0.1")] - name: "dns-addrs-name-server" }: seq[ValidIpAddress] - - dns4DomainName* {. - desc: "The domain name resolving to the node's public IPv4 address", - defaultValue: "" - name: "dns4-domain-name" }: string - - ## Relay config - - relay* {. - desc: "Enable relay protocol: true|false", - defaultValue: true - name: "relay" }: bool - - relayPeerExchange* {. - desc: "Enable gossipsub peer exchange in relay protocol: true|false", - defaultValue: false - name: "relay-peer-exchange" }: bool - - rlnRelay* {. - desc: "Enable spam protection through rln-relay: true|false", - defaultValue: false - name: "rln-relay" }: bool - rlnRelayCredPath* {. desc: "The path for peristing rln-relay credential", - defaultValue: "" + defaultValue: "", name: "rln-relay-cred-path" }: string - rlnRelayCredIndex* {. - desc: "the index of the onchain commitment to use", - name: "rln-relay-membership-index" }: Option[uint] - - rlnRelayDynamic* {. - desc: "Enable waku-rln-relay with on-chain dynamic group management: true|false", - defaultValue: false - name: "rln-relay-dynamic" }: bool - - rlnRelayIdKey* {. - desc: "Rln relay identity secret key as a Hex string", - defaultValue: "" - name: "rln-relay-id-key" }: string - - rlnRelayIdCommitmentKey* {. - desc: "Rln relay identity commitment key as a Hex string", - defaultValue: "" - name: "rln-relay-id-commitment-key" }: string - rlnRelayEthClientAddress* {. desc: "WebSocket address of an Ethereum testnet client e.g., ws://localhost:8540/", - defaultValue: "ws://localhost:8540/" + defaultValue: "ws://localhost:8540/", name: "rln-relay-eth-client-address" }: string rlnRelayEthContractAddress* {. desc: "Address of membership contract on an Ethereum testnet", - defaultValue: "" + defaultValue: "", name: "rln-relay-eth-contract-address" }: string rlnRelayCredPassword* {. desc: "Password for encrypting RLN credentials", - defaultValue: "" + defaultValue: "", name: "rln-relay-cred-password" }: string - rlnRelayTreePath* {. - desc: "Path to the RLN merkle tree sled db (https://github.com/spacejam/sled)", - defaultValue: "" - name: "rln-relay-tree-path" }: string - - rlnRelayBandwidthThreshold* {. - desc: "Message rate in bytes/sec after which verification of proofs should happen", - defaultValue: 0 # to maintain backwards compatibility - name: "rln-relay-bandwidth-threshold" }: int - - staticnodes* {. - desc: "Peer multiaddr to directly connect with. Argument may be repeated." - name: "staticnode" }: seq[string] - - keepAlive* {. - desc: "Enable keep-alive for idle connections: true|false", - defaultValue: false - name: "keep-alive" }: bool - - topics* {. - desc: "Default topic to subscribe to. Argument may be repeated. Deprecated! Please use pubsub-topic and/or content-topic instead." - defaultValue: @["/waku/2/default-waku/proto"] - name: "topic" .}: seq[string] - - pubsubTopics* {. - desc: "Default pubsub topic to subscribe to. Argument may be repeated." - name: "pubsub-topic" .}: seq[string] - - contentTopics* {. - desc: "Default content topic to subscribe to. Argument may be repeated." - name: "content-topic" .}: seq[string] - - ## Store and message store config - - store* {. - desc: "Enable/disable waku store protocol", - defaultValue: false, - name: "store" }: bool - - storenode* {. - desc: "Peer multiaddress to query for storage", + rlnRelayEthPrivateKey* {. + desc: "Private key for broadcasting transactions", defaultValue: "", - name: "storenode" }: string - - storeMessageRetentionPolicy* {. - desc: "Message store retention policy. Time retention policy: 'time:'. Capacity retention policy: 'capacity:'. Size retention policy: 'size:'. Set to 'none' to disable.", - defaultValue: "time:" & $2.days.seconds, - name: "store-message-retention-policy" }: string - - storeMessageDbUrl* {. - desc: "The database connection URL for peristent storage.", - defaultValue: "sqlite://store.sqlite3", - name: "store-message-db-url" }: string - - storeMessageDbVacuum* {. - desc: "Enable database vacuuming at start. Only supported by SQLite database engine.", - defaultValue: false, - name: "store-message-db-vacuum" }: bool - - storeMessageDbMigration* {. - desc: "Enable database migration at start.", - defaultValue: true, - name: "store-message-db-migration" }: bool - - ## Filter config - - filter* {. - desc: "Enable filter protocol: true|false", - defaultValue: false - name: "filter" }: bool - - filternode* {. - desc: "Peer multiaddr to request content filtering of messages.", - defaultValue: "" - name: "filternode" }: string - - filterTimeout* {. - desc: "Timeout for filter node in seconds.", - defaultValue: 14400 # 4 hours - name: "filter-timeout" }: int64 - - ## Lightpush config - - lightpush* {. - desc: "Enable lightpush protocol: true|false", - defaultValue: false - name: "lightpush" }: bool - - lightpushnode* {. - desc: "Peer multiaddr to request lightpush of published messages.", - defaultValue: "" - name: "lightpushnode" }: string - - ## JSON-RPC config - - rpc* {. - desc: "Enable Waku JSON-RPC server: true|false", - defaultValue: true - name: "rpc" }: bool - - rpcAddress* {. - desc: "Listening address of the JSON-RPC server.", - defaultValue: ValidIpAddress.init("127.0.0.1") - name: "rpc-address" }: ValidIpAddress - - rpcPort* {. - desc: "Listening port of the JSON-RPC server.", - defaultValue: 8545 - name: "rpc-port" }: uint16 - - rpcAdmin* {. - desc: "Enable access to JSON-RPC Admin API: true|false", - defaultValue: false - name: "rpc-admin" }: bool - - rpcPrivate* {. - desc: "Enable access to JSON-RPC Private API: true|false", - defaultValue: false - name: "rpc-private" }: bool - - ## REST HTTP config - - rest* {. - desc: "Enable Waku REST HTTP server: true|false", - defaultValue: false - name: "rest" }: bool - - restAddress* {. - desc: "Listening address of the REST HTTP server.", - defaultValue: ValidIpAddress.init("127.0.0.1") - name: "rest-address" }: ValidIpAddress - - restPort* {. - desc: "Listening port of the REST HTTP server.", - defaultValue: 8645 - name: "rest-port" }: uint16 - - restRelayCacheCapacity* {. - desc: "Capacity of the Relay REST API message cache.", - defaultValue: 30 - name: "rest-relay-cache-capacity" }: uint32 - - restAdmin* {. - desc: "Enable access to REST HTTP Admin API: true|false", - defaultValue: false - name: "rest-admin" }: bool - - restPrivate* {. - desc: "Enable access to REST HTTP Private API: true|false", - defaultValue: false - name: "rest-private" }: bool - - ## Metrics config - - metricsServer* {. - desc: "Enable the metrics server: true|false" - defaultValue: false - name: "metrics-server" }: bool - - metricsServerAddress* {. - desc: "Listening address of the metrics server." - defaultValue: ValidIpAddress.init("127.0.0.1") - name: "metrics-server-address" }: ValidIpAddress - - metricsServerPort* {. - desc: "Listening HTTP port of the metrics server." - defaultValue: 8008 - name: "metrics-server-port" }: uint16 - - metricsLogging* {. - desc: "Enable metrics logging: true|false" - defaultValue: true - name: "metrics-logging" }: bool - - ## DNS discovery config - - dnsDiscovery* {. - desc: "Enable discovering nodes via DNS" - defaultValue: false - name: "dns-discovery" }: bool - - dnsDiscoveryUrl* {. - desc: "URL for DNS node list in format 'enrtree://@'", - defaultValue: "" - name: "dns-discovery-url" }: string - - dnsDiscoveryNameServers* {. - desc: "DNS name server IPs to query. Argument may be repeated." - defaultValue: @[ValidIpAddress.init("1.1.1.1"), ValidIpAddress.init("1.0.0.1")] - name: "dns-discovery-name-server" }: seq[ValidIpAddress] - - ## Discovery v5 config - - discv5Discovery* {. - desc: "Enable discovering nodes via Node Discovery v5" - defaultValue: false - name: "discv5-discovery" }: bool - - discv5UdpPort* {. - desc: "Listening UDP port for Node Discovery v5." - defaultValue: 9000 - name: "discv5-udp-port" }: Port - - discv5BootstrapNodes* {. - desc: "Text-encoded ENR for bootstrap node. Used when connecting to the network. Argument may be repeated." - name: "discv5-bootstrap-node" }: seq[string] - - discv5EnrAutoUpdate* {. - desc: "Discovery can automatically update its ENR with the IP address " & - "and UDP port as seen by other nodes it communicates with. " & - "This option allows to enable/disable this functionality" - defaultValue: false - name: "discv5-enr-auto-update" .}: bool - - discv5TableIpLimit* {. - hidden - desc: "Maximum amount of nodes with the same IP in discv5 routing tables" - defaultValue: 10 - name: "discv5-table-ip-limit" .}: uint - - discv5BucketIpLimit* {. - hidden - desc: "Maximum amount of nodes with the same IP in discv5 routing table buckets" - defaultValue: 2 - name: "discv5-bucket-ip-limit" .}: uint - - discv5BitsPerHop* {. - hidden - desc: "Kademlia's b variable, increase for less hops per lookup" - defaultValue: 1 - name: "discv5-bits-per-hop" .}: int - - ## waku peer exchange config - peerExchange* {. - desc: "Enable waku peer exchange protocol (responder side): true|false", - defaultValue: false - name: "peer-exchange" }: bool - - peerExchangeNode* {. - desc: "Peer multiaddr to send peer exchange requests to. (enables peer exchange protocol requester side)", - defaultValue: "" - name: "peer-exchange-node" }: string - - ## websocket config - websocketSupport* {. - desc: "Enable websocket: true|false", - defaultValue: false - name: "websocket-support"}: bool - - websocketPort* {. - desc: "WebSocket listening port." - defaultValue: 8000 - name: "websocket-port" }: Port - - websocketSecureSupport* {. - desc: "Enable secure websocket: true|false", - defaultValue: false - name: "websocket-secure-support"}: bool - - websocketSecureKeyPath* {. - desc: "Secure websocket key path: '/path/to/key.txt' ", - defaultValue: "" - name: "websocket-secure-key-path"}: string - - websocketSecureCertPath* {. - desc: "Secure websocket Certificate path: '/path/to/cert.txt' ", - defaultValue: "" - name: "websocket-secure-cert-path"}: string + name: "rln-relay-eth-private-key" }: string + + case cmd* {. + command + defaultValue: noCommand }: StartUpCommand + + of generateRlnKeystore: + execute* {. + desc: "Runs the registration function on-chain. By default, a dry-run will occur", + defaultValue: false, + name: "execute" .}: bool + + + of noCommand: + ## Application-level configuration + protectedTopics* {. + desc: "Topics and its public key to be used for message validation, topic:pubkey. Argument may be repeated." + defaultValue: newSeq[ProtectedTopic](0) + name: "protected-topic" .}: seq[ProtectedTopic] + + ## General node config + clusterId* {. + desc: "Cluster id that the node is running in. Node in a different cluster id is disconnected." + defaultValue: 0 + name: "cluster-id" }: uint32 + + agentString* {. + defaultValue: "nwaku", + desc: "Node agent string which is used as identifier in network" + name: "agent-string" .}: string + + nodekey* {. + desc: "P2P node private key as 64 char hex string.", + name: "nodekey" }: Option[PrivateKey] + + listenAddress* {. + defaultValue: defaultListenAddress() + desc: "Listening address for LibP2P (and Discovery v5, if enabled) traffic." + name: "listen-address"}: ValidIpAddress + + tcpPort* {. + desc: "TCP listening port." + defaultValue: 60000 + name: "tcp-port" }: Port + + portsShift* {. + desc: "Add a shift to all port numbers." + defaultValue: 0 + name: "ports-shift" }: uint16 + + nat* {. + desc: "Specify method to use for determining public address. " & + "Must be one of: any, none, upnp, pmp, extip:." + defaultValue: "any" }: string + + extMultiAddrs* {. + desc: "External multiaddresses to advertise to the network. Argument may be repeated." + name: "ext-multiaddr" }: seq[string] + + extMultiAddrsOnly* {. + desc: "Only announce external multiaddresses", + defaultValue: false, + name: "ext-multiaddr-only" }: bool + + maxConnections* {. + desc: "Maximum allowed number of libp2p connections." + defaultValue: 50 + name: "max-connections" }: uint16 + + maxRelayPeers* {. + desc: "Maximum allowed number of relay peers." + name: "max-relay-peers" }: Option[int] + + peerStoreCapacity* {. + desc: "Maximum stored peers in the peerstore." + name: "peer-store-capacity" }: Option[int] + + peerPersistence* {. + desc: "Enable peer persistence.", + defaultValue: false, + name: "peer-persistence" }: bool + + ## DNS addrs config + + dnsAddrs* {. + desc: "Enable resolution of `dnsaddr`, `dns4` or `dns6` multiaddrs" + defaultValue: true + name: "dns-addrs" }: bool + + dnsAddrsNameServers* {. + desc: "DNS name server IPs to query for DNS multiaddrs resolution. Argument may be repeated." + defaultValue: @[ValidIpAddress.init("1.1.1.1"), ValidIpAddress.init("1.0.0.1")] + name: "dns-addrs-name-server" }: seq[ValidIpAddress] + + dns4DomainName* {. + desc: "The domain name resolving to the node's public IPv4 address", + defaultValue: "" + name: "dns4-domain-name" }: string + + ## Relay config + + relay* {. + desc: "Enable relay protocol: true|false", + defaultValue: true + name: "relay" }: bool + + relayPeerExchange* {. + desc: "Enable gossipsub peer exchange in relay protocol: true|false", + defaultValue: false + name: "relay-peer-exchange" }: bool + + rlnRelay* {. + desc: "Enable spam protection through rln-relay: true|false", + defaultValue: false + name: "rln-relay" }: bool + + rlnRelayCredIndex* {. + desc: "the index of the onchain commitment to use", + name: "rln-relay-membership-index" }: Option[uint] + + rlnRelayDynamic* {. + desc: "Enable waku-rln-relay with on-chain dynamic group management: true|false", + defaultValue: false + name: "rln-relay-dynamic" }: bool + + rlnRelayIdKey* {. + desc: "Rln relay identity secret key as a Hex string", + defaultValue: "" + name: "rln-relay-id-key" }: string + + rlnRelayIdCommitmentKey* {. + desc: "Rln relay identity commitment key as a Hex string", + defaultValue: "" + name: "rln-relay-id-commitment-key" }: string + + rlnRelayTreePath* {. + desc: "Path to the RLN merkle tree sled db (https://github.com/spacejam/sled)", + defaultValue: "" + name: "rln-relay-tree-path" }: string + + rlnRelayBandwidthThreshold* {. + desc: "Message rate in bytes/sec after which verification of proofs should happen", + defaultValue: 0 # to maintain backwards compatibility + name: "rln-relay-bandwidth-threshold" }: int + + staticnodes* {. + desc: "Peer multiaddr to directly connect with. Argument may be repeated." + name: "staticnode" }: seq[string] + + keepAlive* {. + desc: "Enable keep-alive for idle connections: true|false", + defaultValue: false + name: "keep-alive" }: bool + + topics* {. + desc: "Default topic to subscribe to. Argument may be repeated. Deprecated! Please use pubsub-topic and/or content-topic instead." + defaultValue: @["/waku/2/default-waku/proto"] + name: "topic" .}: seq[string] + + pubsubTopics* {. + desc: "Default pubsub topic to subscribe to. Argument may be repeated." + name: "pubsub-topic" .}: seq[string] + + contentTopics* {. + desc: "Default content topic to subscribe to. Argument may be repeated." + name: "content-topic" .}: seq[string] + + ## Store and message store config + + store* {. + desc: "Enable/disable waku store protocol", + defaultValue: false, + name: "store" }: bool + + storenode* {. + desc: "Peer multiaddress to query for storage", + defaultValue: "", + name: "storenode" }: string + + storeMessageRetentionPolicy* {. + desc: "Message store retention policy. Time retention policy: 'time:'. Capacity retention policy: 'capacity:'. Size retention policy: 'size:'. Set to 'none' to disable.", + defaultValue: "time:" & $2.days.seconds, + name: "store-message-retention-policy" }: string + + storeMessageDbUrl* {. + desc: "The database connection URL for peristent storage.", + defaultValue: "sqlite://store.sqlite3", + name: "store-message-db-url" }: string + + storeMessageDbVacuum* {. + desc: "Enable database vacuuming at start. Only supported by SQLite database engine.", + defaultValue: false, + name: "store-message-db-vacuum" }: bool + + storeMessageDbMigration* {. + desc: "Enable database migration at start.", + defaultValue: true, + name: "store-message-db-migration" }: bool + + ## Filter config + + filter* {. + desc: "Enable filter protocol: true|false", + defaultValue: false + name: "filter" }: bool + + filternode* {. + desc: "Peer multiaddr to request content filtering of messages.", + defaultValue: "" + name: "filternode" }: string + + filterTimeout* {. + desc: "Timeout for filter node in seconds.", + defaultValue: 14400 # 4 hours + name: "filter-timeout" }: int64 + + ## Lightpush config + + lightpush* {. + desc: "Enable lightpush protocol: true|false", + defaultValue: false + name: "lightpush" }: bool + + lightpushnode* {. + desc: "Peer multiaddr to request lightpush of published messages.", + defaultValue: "" + name: "lightpushnode" }: string + + ## JSON-RPC config + + rpc* {. + desc: "Enable Waku JSON-RPC server: true|false", + defaultValue: true + name: "rpc" }: bool + + rpcAddress* {. + desc: "Listening address of the JSON-RPC server.", + defaultValue: ValidIpAddress.init("127.0.0.1") + name: "rpc-address" }: ValidIpAddress + + rpcPort* {. + desc: "Listening port of the JSON-RPC server.", + defaultValue: 8545 + name: "rpc-port" }: uint16 + + rpcAdmin* {. + desc: "Enable access to JSON-RPC Admin API: true|false", + defaultValue: false + name: "rpc-admin" }: bool + + rpcPrivate* {. + desc: "Enable access to JSON-RPC Private API: true|false", + defaultValue: false + name: "rpc-private" }: bool + + ## REST HTTP config + + rest* {. + desc: "Enable Waku REST HTTP server: true|false", + defaultValue: false + name: "rest" }: bool + + restAddress* {. + desc: "Listening address of the REST HTTP server.", + defaultValue: ValidIpAddress.init("127.0.0.1") + name: "rest-address" }: ValidIpAddress + + restPort* {. + desc: "Listening port of the REST HTTP server.", + defaultValue: 8645 + name: "rest-port" }: uint16 + + restRelayCacheCapacity* {. + desc: "Capacity of the Relay REST API message cache.", + defaultValue: 30 + name: "rest-relay-cache-capacity" }: uint32 + + restAdmin* {. + desc: "Enable access to REST HTTP Admin API: true|false", + defaultValue: false + name: "rest-admin" }: bool + + restPrivate* {. + desc: "Enable access to REST HTTP Private API: true|false", + defaultValue: false + name: "rest-private" }: bool + + ## Metrics config + + metricsServer* {. + desc: "Enable the metrics server: true|false" + defaultValue: false + name: "metrics-server" }: bool + + metricsServerAddress* {. + desc: "Listening address of the metrics server." + defaultValue: ValidIpAddress.init("127.0.0.1") + name: "metrics-server-address" }: ValidIpAddress + + metricsServerPort* {. + desc: "Listening HTTP port of the metrics server." + defaultValue: 8008 + name: "metrics-server-port" }: uint16 + + metricsLogging* {. + desc: "Enable metrics logging: true|false" + defaultValue: true + name: "metrics-logging" }: bool + + ## DNS discovery config + + dnsDiscovery* {. + desc: "Enable discovering nodes via DNS" + defaultValue: false + name: "dns-discovery" }: bool + + dnsDiscoveryUrl* {. + desc: "URL for DNS node list in format 'enrtree://@'", + defaultValue: "" + name: "dns-discovery-url" }: string + + dnsDiscoveryNameServers* {. + desc: "DNS name server IPs to query. Argument may be repeated." + defaultValue: @[ValidIpAddress.init("1.1.1.1"), ValidIpAddress.init("1.0.0.1")] + name: "dns-discovery-name-server" }: seq[ValidIpAddress] + + ## Discovery v5 config + + discv5Discovery* {. + desc: "Enable discovering nodes via Node Discovery v5" + defaultValue: false + name: "discv5-discovery" }: bool + + discv5UdpPort* {. + desc: "Listening UDP port for Node Discovery v5." + defaultValue: 9000 + name: "discv5-udp-port" }: Port + + discv5BootstrapNodes* {. + desc: "Text-encoded ENR for bootstrap node. Used when connecting to the network. Argument may be repeated." + name: "discv5-bootstrap-node" }: seq[string] + + discv5EnrAutoUpdate* {. + desc: "Discovery can automatically update its ENR with the IP address " & + "and UDP port as seen by other nodes it communicates with. " & + "This option allows to enable/disable this functionality" + defaultValue: false + name: "discv5-enr-auto-update" .}: bool + + discv5TableIpLimit* {. + hidden + desc: "Maximum amount of nodes with the same IP in discv5 routing tables" + defaultValue: 10 + name: "discv5-table-ip-limit" .}: uint + + discv5BucketIpLimit* {. + hidden + desc: "Maximum amount of nodes with the same IP in discv5 routing table buckets" + defaultValue: 2 + name: "discv5-bucket-ip-limit" .}: uint + + discv5BitsPerHop* {. + hidden + desc: "Kademlia's b variable, increase for less hops per lookup" + defaultValue: 1 + name: "discv5-bits-per-hop" .}: int + + ## waku peer exchange config + peerExchange* {. + desc: "Enable waku peer exchange protocol (responder side): true|false", + defaultValue: false + name: "peer-exchange" }: bool + + peerExchangeNode* {. + desc: "Peer multiaddr to send peer exchange requests to. (enables peer exchange protocol requester side)", + defaultValue: "" + name: "peer-exchange-node" }: string + + ## websocket config + websocketSupport* {. + desc: "Enable websocket: true|false", + defaultValue: false + name: "websocket-support"}: bool + + websocketPort* {. + desc: "WebSocket listening port." + defaultValue: 8000 + name: "websocket-port" }: Port + + websocketSecureSupport* {. + desc: "Enable secure websocket: true|false", + defaultValue: false + name: "websocket-secure-support"}: bool + + websocketSecureKeyPath* {. + desc: "Secure websocket key path: '/path/to/key.txt' ", + defaultValue: "" + name: "websocket-secure-key-path"}: string + + websocketSecureCertPath* {. + desc: "Secure websocket Certificate path: '/path/to/cert.txt' ", + defaultValue: "" + name: "websocket-secure-cert-path"}: string ## Parsing diff --git a/apps/wakunode2/wakunode2.nim b/apps/wakunode2/wakunode2.nim index 30a281f332..6cd97aa68f 100644 --- a/apps/wakunode2/wakunode2.nim +++ b/apps/wakunode2/wakunode2.nim @@ -13,6 +13,7 @@ import system/ansi_c, libp2p/crypto/crypto import + ../../tools/rln_keystore_generator/rln_keystore_generator, ../../waku/common/logging, ./external_config, ./app @@ -49,96 +50,99 @@ when isMainModule: logging.setupLogLevel(conf.logLevel) logging.setupLogFormat(conf.logFormat, color) + case conf.cmd: + of generateRlnKeystore: + doRlnKeystoreGenerator(conf) + of noCommand: + var wakunode2 = App.init(rng, conf) - var wakunode2 = App.init(rng, conf) + ############## + # Node setup # + ############## - ############## - # Node setup # - ############## + debug "1/7 Setting up storage" - debug "1/7 Setting up storage" - - ## Peer persistence - let res1 = wakunode2.setupPeerPersistence() - if res1.isErr(): - error "1/7 Setting up storage failed", error=res1.error - quit(QuitFailure) + ## Peer persistence + let res1 = wakunode2.setupPeerPersistence() + if res1.isErr(): + error "1/7 Setting up storage failed", error=res1.error + quit(QuitFailure) - debug "2/7 Retrieve dynamic bootstrap nodes" + debug "2/7 Retrieve dynamic bootstrap nodes" - let res3 = wakunode2.setupDyamicBootstrapNodes() - if res3.isErr(): - error "2/7 Retrieving dynamic bootstrap nodes failed", error=res3.error - quit(QuitFailure) + let res3 = wakunode2.setupDyamicBootstrapNodes() + if res3.isErr(): + error "2/7 Retrieving dynamic bootstrap nodes failed", error=res3.error + quit(QuitFailure) - debug "3/7 Initializing node" + debug "3/7 Initializing node" - let res4 = wakunode2.setupWakuApp() - if res4.isErr(): - error "3/7 Initializing node failed", error=res4.error - quit(QuitFailure) + let res4 = wakunode2.setupWakuApp() + if res4.isErr(): + error "3/7 Initializing node failed", error=res4.error + quit(QuitFailure) - debug "4/7 Mounting protocols" + debug "4/7 Mounting protocols" - let res5 = waitFor wakunode2.setupAndMountProtocols() - if res5.isErr(): - error "4/7 Mounting protocols failed", error=res5.error - quit(QuitFailure) + let res5 = waitFor wakunode2.setupAndMountProtocols() + if res5.isErr(): + error "4/7 Mounting protocols failed", error=res5.error + quit(QuitFailure) - debug "5/7 Starting node and mounted protocols" + debug "5/7 Starting node and mounted protocols" - let res6 = waitFor wakunode2.startApp() - if res6.isErr(): - error "5/7 Starting node and protocols failed", error=res6.error - quit(QuitFailure) + let res6 = waitFor wakunode2.startApp() + if res6.isErr(): + error "5/7 Starting node and protocols failed", error=res6.error + quit(QuitFailure) - debug "6/7 Starting monitoring and external interfaces" + debug "6/7 Starting monitoring and external interfaces" - let res7 = wakunode2.setupMonitoringAndExternalInterfaces() - if res7.isErr(): - error "6/7 Starting monitoring and external interfaces failed", error=res7.error - quit(QuitFailure) + let res7 = wakunode2.setupMonitoringAndExternalInterfaces() + if res7.isErr(): + error "6/7 Starting monitoring and external interfaces failed", error=res7.error + quit(QuitFailure) - debug "7/7 Setting up shutdown hooks" - ## Setup shutdown hooks for this process. - ## Stop node gracefully on shutdown. + debug "7/7 Setting up shutdown hooks" + ## Setup shutdown hooks for this process. + ## Stop node gracefully on shutdown. - proc asyncStopper(node: App) {.async.} = - await node.stop() - quit(QuitSuccess) + proc asyncStopper(node: App) {.async.} = + await node.stop() + quit(QuitSuccess) - # Handle Ctrl-C SIGINT - proc handleCtrlC() {.noconv.} = - when defined(windows): - # workaround for https://github.com/nim-lang/Nim/issues/4057 - setupForeignThreadGc() - notice "Shutting down after receiving SIGINT" - asyncSpawn asyncStopper(wakunode2) + # Handle Ctrl-C SIGINT + proc handleCtrlC() {.noconv.} = + when defined(windows): + # workaround for https://github.com/nim-lang/Nim/issues/4057 + setupForeignThreadGc() + notice "Shutting down after receiving SIGINT" + asyncSpawn asyncStopper(wakunode2) - setControlCHook(handleCtrlC) + setControlCHook(handleCtrlC) - # Handle SIGTERM - when defined(posix): - proc handleSigterm(signal: cint) {.noconv.} = - notice "Shutting down after receiving SIGTERM" - asyncSpawn asyncStopper(wakunode2) + # Handle SIGTERM + when defined(posix): + proc handleSigterm(signal: cint) {.noconv.} = + notice "Shutting down after receiving SIGTERM" + asyncSpawn asyncStopper(wakunode2) - c_signal(ansi_c.SIGTERM, handleSigterm) + c_signal(ansi_c.SIGTERM, handleSigterm) - # Handle SIGSEGV - when defined(posix): - proc handleSigsegv(signal: cint) {.noconv.} = - # Require --debugger:native - fatal "Shutting down after receiving SIGSEGV", stacktrace=getBacktrace() + # Handle SIGSEGV + when defined(posix): + proc handleSigsegv(signal: cint) {.noconv.} = + # Require --debugger:native + fatal "Shutting down after receiving SIGSEGV", stacktrace=getBacktrace() - # Not available in -d:release mode - writeStackTrace() + # Not available in -d:release mode + writeStackTrace() - waitFor wakunode2.stop() - quit(QuitFailure) + waitFor wakunode2.stop() + quit(QuitFailure) - c_signal(ansi_c.SIGSEGV, handleSigsegv) + c_signal(ansi_c.SIGSEGV, handleSigsegv) - info "Node setup complete" + info "Node setup complete" - runForever() + runForever() \ No newline at end of file diff --git a/tests/testlib/wakunode.nim b/tests/testlib/wakunode.nim index 4e3b3cf7e4..1ba6a0f819 100644 --- a/tests/testlib/wakunode.nim +++ b/tests/testlib/wakunode.nim @@ -22,6 +22,7 @@ import proc defaultTestWakuNodeConf*(): WakuNodeConf = WakuNodeConf( + cmd: noCommand, tcpPort: Port(60000), websocketPort: Port(8000), listenAddress: ValidIpAddress.init("0.0.0.0"), diff --git a/tools/rln_keystore_generator/external_config.nim b/tools/rln_keystore_generator/external_config.nim deleted file mode 100644 index 6c05f3bfe1..0000000000 --- a/tools/rln_keystore_generator/external_config.nim +++ /dev/null @@ -1,79 +0,0 @@ -when (NimMajor, NimMinor) < (1, 4): - {.push raises: [Defect].} -else: - {.push raises: [].} - -import - stew/results, - chronos, - confutils, - confutils/defs, - confutils/toml/defs as confTomlDefs, - confutils/toml/std/net as confTomlNet, - libp2p/crypto/crypto, - libp2p/crypto/secp, - libp2p/multiaddress, - secp256k1 -import - ../../waku/common/confutils/envvar/defs as confEnvvarDefs, - ../../waku/common/confutils/envvar/std/net as confEnvvarNet - -export - confTomlDefs, - confTomlNet, - confEnvvarDefs, - confEnvvarNet - -type - RlnKeystoreGeneratorConf* = object - configFile* {. - desc: "Loads configuration from a TOML file (cmd-line parameters take precedence)", - name: "config-file" }: Option[InputFile] - - execute* {. - desc: "Runs the registration function on-chain. By default, a dry-run will occur", - defaultValue: false, - name: "execute" .}: bool - - ## General node config - rlnRelayCredPath* {. - desc: "The path for peristing rln-relay credential", - defaultValue: "", - name: "rln-relay-cred-path" }: string - - rlnRelayEthClientAddress* {. - desc: "WebSocket address of an Ethereum testnet client e.g., ws://localhost:8540/", - defaultValue: "ws://localhost:8540/", - name: "rln-relay-eth-client-address" }: string - - rlnRelayEthContractAddress* {. - desc: "Address of membership contract on an Ethereum testnet", - defaultValue: "", - name: "rln-relay-eth-contract-address" }: string - - rlnRelayCredPassword* {. - desc: "Password for encrypting RLN credentials", - defaultValue: "", - name: "rln-relay-cred-password" }: string - - rlnRelayEthPrivateKey* {. - desc: "Private key for broadcasting transactions", - defaultValue: "", - name: "rln-relay-eth-private-key" }: string - -proc loadConfig*(T: type RlnKeystoreGeneratorConf): Result[T, string] = - try: - let conf = RlnKeystoreGeneratorConf.load() - if conf.rlnRelayCredPath == "": - return err("--rln-relay-cred-path must be set") - if conf.rlnRelayEthContractAddress == "": - return err("--rln-relay-eth-contract-address must be set") - if conf.rlnRelayCredPassword == "": - return err("--rln-relay-cred-password must be set") - if conf.rlnRelayEthPrivateKey == "": - return err("--rln-relay-eth-private-key must be set") - ok(conf) - except CatchableError: - err(getCurrentExceptionMsg()) - except Exception: - err(getCurrentExceptionMsg()) diff --git a/tools/rln_keystore_generator/nim.cfg b/tools/rln_keystore_generator/nim.cfg deleted file mode 100644 index f3bae15902..0000000000 --- a/tools/rln_keystore_generator/nim.cfg +++ /dev/null @@ -1,3 +0,0 @@ --d:chronicles_line_numbers --d:chronicles_runtime_filtering=on -#-d:"chronicles_enabled_topics=GossipSub:TRACE,WakuRelay:TRACE" diff --git a/tools/rln_keystore_generator/rln_keystore_generator.nim b/tools/rln_keystore_generator/rln_keystore_generator.nim index d6aa901320..ff413d8b29 100644 --- a/tools/rln_keystore_generator/rln_keystore_generator.nim +++ b/tools/rln_keystore_generator/rln_keystore_generator.nim @@ -13,21 +13,13 @@ import ../../waku/waku_rln_relay/rln, ../../waku/waku_rln_relay/conversion_utils, ../../waku/waku_rln_relay/group_manager/on_chain, - ./external_config + ../../apps/wakunode2/external_config logScope: topics = "rln_keystore_generator" -when isMainModule: - {.pop.} +proc doRlnKeystoreGenerator*(conf: WakuNodeConf) = # 1. load configuration - let confRes = RlnKeystoreGeneratorConf.loadConfig() - if confRes.isErr(): - error "failure while loading the configuration", error=confRes.error - quit(1) - - let conf = confRes.get() - trace "configuration", conf = $conf # 2. initialize rlnInstance @@ -102,5 +94,9 @@ when isMainModule: info "credentials persisted", path = conf.rlnRelayCredPath - waitFor groupManager.stop() + try: + waitFor groupManager.stop() + except CatchableError: + error "failure while stopping OnchainGroupManager", error=getCurrentExceptionMsg() + quit(0) # 0 because we already registered on-chain quit(0)