Skip to content

Commit 06444ad

Browse files
committed
chore!: separate internal and CLI configurations
Split `WakuNodeConfig` object for better separation of concerns and to introduce a tree-like structure to configuration.
1 parent 6ebb49a commit 06444ad

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+2437
-697
lines changed

apps/chat2/chat2.nim

+13-8
Original file line numberDiff line numberDiff line change
@@ -553,14 +553,19 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} =
553553
echo "rln-relay preparation is in progress..."
554554

555555
let rlnConf = WakuRlnConfig(
556-
rlnRelayDynamic: conf.rlnRelayDynamic,
557-
rlnRelayCredIndex: conf.rlnRelayCredIndex,
558-
rlnRelayEthContractAddress: conf.rlnRelayEthContractAddress,
559-
rlnRelayEthClientAddress: string(conf.rlnRelayethClientAddress),
560-
rlnRelayCredPath: conf.rlnRelayCredPath,
561-
rlnRelayCredPassword: conf.rlnRelayCredPassword,
562-
rlnRelayUserMessageLimit: conf.rlnRelayUserMessageLimit,
563-
rlnEpochSizeSec: conf.rlnEpochSizeSec,
556+
dynamic: conf.rlnRelayDynamic,
557+
credIndex: conf.rlnRelayCredIndex,
558+
chainId: conf.rlnRelayChainId,
559+
ethContractAddress: conf.rlnRelayEthContractAddress,
560+
ethClientAddress: string(conf.rlnRelayethClientAddress),
561+
creds: some(
562+
RlnRelayCreds(
563+
path: conf.rlnRelayCredPath, password: conf.rlnRelayCredPassword
564+
)
565+
),
566+
userMessageLimit: conf.rlnRelayUserMessageLimit,
567+
epochSizeSec: conf.rlnEpochSizeSec,
568+
treePath: conf.rlnRelayTreePath,
564569
)
565570

566571
waitFor node.mountRlnRelay(rlnConf, spamHandler = some(spamHandler))

apps/chat2/config_chat2.nim

+13
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,13 @@ type
213213
name: "rln-relay"
214214
.}: bool
215215

216+
rlnRelayChainId* {.
217+
desc:
218+
"Chain ID of the provided contract (optional, will fetch from RPC provider if not used)",
219+
defaultValue: 0,
220+
name: "rln-relay-chain-id"
221+
.}: uint
222+
216223
rlnRelayCredPath* {.
217224
desc: "The path for peristing rln-relay credential",
218225
defaultValue: "",
@@ -273,6 +280,12 @@ type
273280
name: "rln-relay-epoch-sec"
274281
.}: uint64
275282

283+
rlnRelayTreePath* {.
284+
desc: "Path to the RLN merkle tree sled db (https://github.com/spacejam/sled)",
285+
defaultValue: "",
286+
name: "rln-relay-tree-path"
287+
.}: string
288+
276289
# NOTE: Keys are different in nim-libp2p
277290
proc parseCmdArg*(T: type crypto.PrivateKey, p: string): T =
278291
try:

apps/liteprotocoltester/liteprotocoltester.nim

+1-1
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ when isMainModule:
126126
nodeHealthMonitor = WakuNodeHealthMonitor()
127127
nodeHealthMonitor.setOverallHealth(HealthStatus.INITIALIZING)
128128

129-
let restServer = rest_server_builder.startRestServerEsentials(
129+
let restServer = rest_server_builder.startRestServerEssentials(
130130
nodeHealthMonitor, wakuConf
131131
).valueOr:
132132
error "Starting esential REST server failed.", error = $error

apps/networkmonitor/networkmonitor.nim

+8-9
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ proc initAndStartApp(
462462

463463
nodeBuilder.withNodeKey(key)
464464
nodeBuilder.withRecord(record)
465-
nodeBUilder.withSwitchConfiguration(maxConnections = some(MaxConnectedPeers))
465+
nodeBuilder.withSwitchConfiguration(maxConnections = some(MaxConnectedPeers))
466466

467467
nodeBuilder.withPeerManagerConfig(
468468
maxConnections = MaxConnectedPeers,
@@ -630,14 +630,13 @@ when isMainModule:
630630

631631
if conf.rlnRelay and conf.rlnRelayEthContractAddress != "":
632632
let rlnConf = WakuRlnConfig(
633-
rlnRelayDynamic: conf.rlnRelayDynamic,
634-
rlnRelayCredIndex: some(uint(0)),
635-
rlnRelayEthContractAddress: conf.rlnRelayEthContractAddress,
636-
rlnRelayEthClientAddress: string(conf.rlnRelayethClientAddress),
637-
rlnRelayCredPath: "",
638-
rlnRelayCredPassword: "",
639-
rlnRelayTreePath: conf.rlnRelayTreePath,
640-
rlnEpochSizeSec: conf.rlnEpochSizeSec,
633+
dynamic: conf.rlnRelayDynamic,
634+
credIndex: some(uint(0)),
635+
ethContractAddress: conf.rlnRelayEthContractAddress,
636+
ethClientAddress: string(conf.rlnRelayethClientAddress),
637+
treePath: conf.rlnRelayTreePath,
638+
epochSizeSec: conf.rlnEpochSizeSec,
639+
creds: none(RlnRelayCreds),
641640
onFatalErrorAction: onFatalErrorAction,
642641
)
643642

apps/wakunode2/wakunode2.nim

+42-19
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,23 @@ when isMainModule:
3838

3939
const versionString = "version / git commit hash: " & waku.git_version
4040

41-
var conf = WakuNodeConf.load(version = versionString).valueOr:
41+
var wakuNodeConf = WakuNodeConf.load(version = versionString).valueOr:
4242
error "failure while loading the configuration", error = error
4343
quit(QuitFailure)
4444

45-
## Also called within Waku.new. The call to startRestServerEsentials needs the following line
46-
logging.setupLog(conf.logLevel, conf.logFormat)
45+
## Also called within Waku.new. The call to startRestServerEssentials needs the following line
46+
logging.setupLog(wakuNodeConf.logLevel, wakuNodeConf.logFormat)
4747

48-
case conf.cmd
48+
case wakuNodeConf.cmd
4949
of generateRlnKeystore:
50+
let conf = wakuNodeConf.toKeystoreGeneratorConf().valueOr:
51+
error "Configuration failed", error = error
52+
quit(QuitFailure)
5053
doRlnKeystoreGenerator(conf)
5154
of inspectRlnDb:
55+
let conf = wakuNodeConf.toInspectRlnDbConf().valueOr:
56+
error "Configuration failed", error = error
57+
quit(QuitFailure)
5258
doInspectRlnDb(conf)
5359
of noCommand:
5460
# NOTE: {.threadvar.} is used to make the global variable GC safe for the closure uses it
@@ -58,15 +64,20 @@ when isMainModule:
5864
nodeHealthMonitor = WakuNodeHealthMonitor()
5965
nodeHealthMonitor.setOverallHealth(HealthStatus.INITIALIZING)
6066

61-
var confCopy = conf
62-
63-
let restServer = rest_server_builder.startRestServerEsentials(
64-
nodeHealthMonitor, confCopy
65-
).valueOr:
66-
error "Starting esential REST server failed.", error = $error
67+
let conf = wakuNodeConf.toWakuConf().valueOr:
68+
error "Waku configuration failed", error = error
6769
quit(QuitFailure)
6870

69-
var waku = Waku.new(confCopy).valueOr:
71+
var restServer: WakuRestServerRef = nil
72+
73+
if conf.restServerConf.isSome:
74+
restServer = rest_server_builder.startRestServerEssentials(
75+
nodeHealthMonitor, conf.restServerConf.get(), conf.portsShift
76+
).valueOr:
77+
error "Starting essential REST server failed.", error = $error
78+
quit(QuitFailure)
79+
80+
var waku = Waku.new(conf).valueOr:
7081
error "Waku initialization failed", error = error
7182
quit(QuitFailure)
7283

@@ -78,15 +89,27 @@ when isMainModule:
7889
error "Starting waku failed", error = error
7990
quit(QuitFailure)
8091

81-
rest_server_builder.startRestServerProtocolSupport(
82-
restServer, waku.node, waku.wakuDiscv5, confCopy
83-
).isOkOr:
84-
error "Starting protocols support REST server failed.", error = $error
85-
quit(QuitFailure)
92+
if conf.restServerConf.isSome:
93+
rest_server_builder.startRestServerProtocolSupport(
94+
restServer,
95+
waku.node,
96+
waku.wakuDiscv5,
97+
conf.restServerConf.get(),
98+
conf.relay,
99+
conf.lightPush,
100+
conf.clusterId,
101+
conf.shards,
102+
conf.contentTopics,
103+
).isOkOr:
104+
error "Starting protocols support REST server failed.", error = $error
105+
quit(QuitFailure)
86106

87-
waku.metricsServer = waku_metrics.startMetricsServerAndLogging(confCopy).valueOr:
88-
error "Starting monitoring and external interfaces failed", error = error
89-
quit(QuitFailure)
107+
if conf.metricsServerConf.isSome:
108+
waku.metricsServer = waku_metrics.startMetricsServerAndLogging(
109+
conf.metricsServerConf.get(), conf.portsShift
110+
).valueOr:
111+
error "Starting monitoring and external interfaces failed", error = error
112+
quit(QuitFailure)
90113

91114
nodeHealthMonitor.setOverallHealth(HealthStatus.READY)
92115

examples/wakustealthcommitments/node_spec.nim

-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ proc setup*(): Waku =
3636
conf.clusterId = twnClusterConf.clusterId
3737
conf.rlnRelayEthContractAddress = twnClusterConf.rlnRelayEthContractAddress
3838
conf.rlnRelayDynamic = twnClusterConf.rlnRelayDynamic
39-
conf.rlnRelayBandwidthThreshold = twnClusterConf.rlnRelayBandwidthThreshold
4039
conf.discv5Discovery = twnClusterConf.discv5Discovery
4140
conf.discv5BootstrapNodes =
4241
conf.discv5BootstrapNodes & twnClusterConf.discv5BootstrapNodes

tests/all_tests_waku.nim

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,4 +107,4 @@ import
107107
import ./waku_rln_relay/test_all
108108

109109
# Node Factory
110-
import ./factory/test_config
110+
import ./factory/test_external_config

tests/factory/test_config.nim renamed to tests/factory/test_external_config.nim

+47-32
Original file line numberDiff line numberDiff line change
@@ -11,35 +11,47 @@ import
1111
confutils
1212
import
1313
../../waku/factory/external_config,
14-
../../waku/factory/internal_config,
1514
../../waku/factory/networks_config,
16-
../../waku/common/logging
15+
../../waku/factory/waku_conf,
16+
../../waku/common/logging,
17+
../../waku/common/utils/parse_size_units
1718

1819
suite "Waku config - apply preset":
1920
test "Default preset is TWN":
2021
## Setup
2122
let expectedConf = ClusterConf.TheWakuNetworkConf()
2223

2324
## Given
24-
let preConfig = WakuNodeConf(cmd: noCommand, preset: "twn")
25+
let preConfig = WakuNodeConf(
26+
cmd: noCommand,
27+
preset: "twn",
28+
relay: true,
29+
rlnRelayEthClientAddress: "http://someaddress".EthRpcUrl,
30+
rlnRelayTreePath: "/tmp/sometreepath",
31+
)
2532

2633
## When
27-
let res = applyPresetConfiguration(preConfig)
34+
let res = preConfig.toWakuConf()
2835
assert res.isOk(), $res.error
2936

3037
## Then
3138
let conf = res.get()
32-
assert conf.maxMessageSize == expectedConf.maxMessageSize
33-
assert conf.clusterId == expectedConf.clusterId
34-
assert conf.rlnRelay == expectedConf.rlnRelay
35-
assert conf.rlnRelayEthContractAddress == expectedConf.rlnRelayEthContractAddress
36-
assert conf.rlnRelayDynamic == expectedConf.rlnRelayDynamic
37-
assert conf.rlnRelayChainId == expectedConf.rlnRelayChainId
38-
assert conf.rlnRelayBandwidthThreshold == expectedConf.rlnRelayBandwidthThreshold
39-
assert conf.rlnEpochSizeSec == expectedConf.rlnEpochSizeSec
40-
assert conf.rlnRelayUserMessageLimit == expectedConf.rlnRelayUserMessageLimit
41-
assert conf.numShardsInNetwork == expectedConf.numShardsInNetwork
42-
assert conf.discv5BootstrapNodes == expectedConf.discv5BootstrapNodes
39+
check conf.maxMessageSizeBytes ==
40+
uint64(parseCorrectMsgSize(expectedConf.maxMessageSize))
41+
check conf.clusterId == expectedConf.clusterId
42+
check conf.rlnRelayConf.isSome() == expectedConf.rlnRelay
43+
if conf.rlnRelayConf.isSome():
44+
let rlnRelayConf = conf.rlnRelayConf.get()
45+
check rlnRelayConf.ethContractAddress == expectedConf.rlnRelayEthContractAddress
46+
check rlnRelayConf.dynamic == expectedConf.rlnRelayDynamic
47+
check rlnRelayConf.chainId == expectedConf.rlnRelayChainId
48+
check rlnRelayConf.epochSizeSec == expectedConf.rlnEpochSizeSec
49+
check rlnRelayConf.userMessageLimit == expectedConf.rlnRelayUserMessageLimit
50+
check conf.numShardsInNetwork == expectedConf.numShardsInNetwork
51+
check conf.discv5Conf.isSome() == expectedConf.discv5Discovery
52+
if expectedConf.discv5Discovery:
53+
let discv5Conf = conf.discv5Conf.get()
54+
check discv5Conf.bootstrapNodes == expectedConf.discv5BootstrapNodes
4355

4456
test "Subscribes to all valid shards in twn":
4557
## Setup
@@ -50,12 +62,12 @@ suite "Waku config - apply preset":
5062
let preConfig = WakuNodeConf(cmd: noCommand, preset: "twn", shards: shards)
5163

5264
## When
53-
let res = applyPresetConfiguration(preConfig)
65+
let res = preConfig.toWakuConf()
5466
assert res.isOk(), $res.error
5567

5668
## Then
5769
let conf = res.get()
58-
assert conf.shards.len == expectedConf.numShardsInNetwork.int
70+
check conf.shards.len == expectedConf.numShardsInNetwork.int
5971

6072
test "Subscribes to some valid shards in twn":
6173
## Setup
@@ -66,9 +78,8 @@ suite "Waku config - apply preset":
6678
let preConfig = WakuNodeConf(cmd: noCommand, preset: "twn", shards: shards)
6779

6880
## When
69-
let resConf = applyPresetConfiguration(preConfig)
70-
let res = validateShards(resConf.get())
71-
assert res.isOk(), $res.error
81+
let resConf = preConfig.toWakuConf()
82+
assert resConf.isOk(), $resConf.error
7283

7384
## Then
7485
let conf = resConf.get()
@@ -82,10 +93,9 @@ suite "Waku config - apply preset":
8293
## Given
8394
let shards: seq[uint16] = @[0, 4, 7, 10]
8495
let preConfig = WakuNodeConf(cmd: noCommand, preset: "twn", shards: shards)
85-
let postConfig = applyPresetConfiguration(preConfig)
8696

8797
## When
88-
let res = validateShards(postConfig.get())
98+
let res = preConfig.toWakuConf()
8999

90100
## Then
91101
assert res.isErr(), "Invalid shard was accepted"
@@ -103,11 +113,11 @@ suite "Waku config - node key":
103113
let config = WakuNodeConf.load(version = "", cmdLine = @["--nodekey=" & nodeKeyStr])
104114

105115
## When
106-
let res = getNodeKey(config)
116+
let res = config.toWakuConf()
107117
assert res.isOk(), $res.error
108118

109119
## Then
110-
let resKey = res.get()
120+
let resKey = res.get().nodeKey
111121
assert utils.toHex(resKey.getRawBytes().get()) ==
112122
utils.toHex(nodekey.getRawBytes().get())
113123

@@ -118,28 +128,31 @@ suite "Waku config - Shards":
118128
## Given
119129
let shards: seq[uint16] = @[0, 2, 4]
120130
let numShardsInNetwork = 5.uint32
121-
let config = WakuNodeConf(
131+
let wakuNodeConf = WakuNodeConf(
122132
cmd: noCommand, shards: shards, numShardsInNetwork: numShardsInNetwork
123133
)
124134

125135
## When
126-
let res = validateShards(config)
136+
let res = wakuNodeConf.toWakuConf()
137+
assert res.isOk(), $res.error
127138

128139
## Then
129-
assert res.isOk(), $res.error
140+
let wakuConf = res.get()
141+
let vRes = wakuConf.validate()
142+
assert vRes.isOk(), $vRes.error
130143

131144
test "Shards are not in range":
132145
## Setup
133146

134147
## Given
135148
let shards: seq[uint16] = @[0, 2, 5]
136149
let numShardsInNetwork = 5.uint32
137-
let config = WakuNodeConf(
150+
let wakuNodeConf = WakuNodeConf(
138151
cmd: noCommand, shards: shards, numShardsInNetwork: numShardsInNetwork
139152
)
140153

141154
## When
142-
let res = validateShards(config)
155+
let res = wakuNodeConf.toWakuConf()
143156

144157
## Then
145158
assert res.isErr(), "Invalid shard was accepted"
@@ -148,10 +161,12 @@ suite "Waku config - Shards":
148161
## Setup
149162

150163
## Given
151-
let config = WakuNodeConf.load(version = "", cmdLine = @["--shard=32"])
164+
let wakuNodeConf = WakuNodeConf.load(version = "", cmdLine = @["--shard=32"])
152165

153166
## When
154-
let res = validateShards(config)
167+
let res = wakuNodeConf.toWakuConf()
155168

156169
## Then
157-
assert res.isOk(), $res.error
170+
let wakuConf = res.get()
171+
let vRes = wakuConf.validate()
172+
assert vRes.isOk(), $vRes.error

0 commit comments

Comments
 (0)