From 21a4b5bd4afdf40c43c251b0ab9c7e6b3bbed6dd Mon Sep 17 00:00:00 2001 From: gabrielmer <101006718+gabrielmer@users.noreply.github.com> Date: Wed, 5 Jun 2024 15:32:35 +0200 Subject: [PATCH] unifying clusterId to be uint16 (#2777) --- apps/liteprotocoltester/tester_config.nim | 2 +- tests/test_waku_metadata.nim | 2 +- tests/testlib/wakunode.nim | 2 +- waku/common/envvar_serialization/reader.nim | 7 ++++- waku/common/envvar_serialization/utils.nim | 4 ++- waku/factory/external_config.nim | 31 ++------------------- waku/factory/internal_config.nim | 2 +- waku/factory/networks_config.nim | 6 ++-- waku/node/config.nim | 4 +-- waku/node/waku_node.nim | 2 +- waku/waku_core/topics/sharding.nim | 6 ++-- waku/waku_enr/sharding.nim | 2 +- 12 files changed, 25 insertions(+), 45 deletions(-) diff --git a/apps/liteprotocoltester/tester_config.nim b/apps/liteprotocoltester/tester_config.nim index 2c276d16a..8f9a8c050 100644 --- a/apps/liteprotocoltester/tester_config.nim +++ b/apps/liteprotocoltester/tester_config.nim @@ -91,7 +91,7 @@ type LiteProtocolTesterConf* = object # desc: "Shards index to subscribe to [0..MAX_SHARDS-1]. Argument may be repeated.", # defaultValue: @[], # name: "shard" - # .}: seq[ShardIdx] + # .}: seq[uint16] contentTopics* {. desc: "Default content topic to subscribe to. Argument may be repeated.", defaultValue: @[LiteContentTopic], diff --git a/tests/test_waku_metadata.nim b/tests/test_waku_metadata.nim index 3c0810581..ea8fd8167 100644 --- a/tests/test_waku_metadata.nim +++ b/tests/test_waku_metadata.nim @@ -24,7 +24,7 @@ import procSuite "Waku Metadata Protocol": asyncTest "request() returns the supported metadata of the peer": - let clusterId = 10.uint32 + let clusterId = 10.uint16 let node1 = newTestWakuNode( generateSecp256k1Key(), diff --git a/tests/testlib/wakunode.nim b/tests/testlib/wakunode.nim index 2eba4c13c..f73e0e0ec 100644 --- a/tests/testlib/wakunode.nim +++ b/tests/testlib/wakunode.nim @@ -35,7 +35,7 @@ proc defaultTestWakuNodeConf*(): WakuNodeConf = nat: "any", maxConnections: 50, maxMessageSize: "1024 KiB", - clusterId: 0.uint32, + clusterId: 0, pubsubTopics: @["/waku/2/rs/1/0"], relay: true, storeMessageDbUrl: "sqlite://store.sqlite3", diff --git a/waku/common/envvar_serialization/reader.nim b/waku/common/envvar_serialization/reader.nim index 83c9ba5bd..a4f94e9ed 100644 --- a/waku/common/envvar_serialization/reader.nim +++ b/waku/common/envvar_serialization/reader.nim @@ -72,7 +72,12 @@ proc readValue*[T](r: var EnvvarReader, value: var T) {.raises: [SerializationEr elif T is (seq or array): when uTypeIsPrimitives(T): let key = constructKey(r.prefix, r.key) - getValue(key, value) + try: + getValue(key, value) + except ValueError: + raise newException( + SerializationError, "Couldn't get value: " & getCurrentExceptionMsg() + ) else: let key = r.key[^1] for i in 0 ..< value.len: diff --git a/waku/common/envvar_serialization/utils.nim b/waku/common/envvar_serialization/utils.nim index 724da903c..c0a9762a0 100644 --- a/waku/common/envvar_serialization/utils.nim +++ b/waku/common/envvar_serialization/utils.nim @@ -42,7 +42,9 @@ proc getValue*(key: string, outVal: var string) {.raises: [ValueError].} = outVal.setLen(size) decodePaddedHex(hex, cast[ptr UncheckedArray[byte]](outVal[0].addr), size) -proc getValue*[T: SomePrimitives](key: string, outVal: var seq[T]) = +proc getValue*[T: SomePrimitives]( + key: string, outVal: var seq[T] +) {.raises: [ValueError].} = let hex = os.getEnv(key) let byteSize = (hex.len div 2) + (hex.len and 0x01) let size = (byteSize + sizeof(T) - 1) div sizeof(T) diff --git a/waku/factory/external_config.nim b/waku/factory/external_config.nim index abcc7a0f7..439f07bc9 100644 --- a/waku/factory/external_config.nim +++ b/waku/factory/external_config.nim @@ -30,8 +30,6 @@ type ProtectedTopic* = object topic*: string key*: secp256k1.SkPublicKey -type ShardIdx = distinct uint16 - type EthRpcUrl* = distinct string type StartUpCommand* = enum @@ -140,7 +138,7 @@ type WakuNodeConf* = object "Cluster id that the node is running in. Node in a different cluster id is disconnected.", defaultValue: 0, name: "cluster-id" - .}: uint32 + .}: uint16 agentString* {. defaultValue: "nwaku", @@ -307,7 +305,7 @@ type WakuNodeConf* = object desc: "Shards index to subscribe to [0..MAX_SHARDS-1]. Argument may be repeated.", defaultValue: @[], name: "shard" - .}: seq[ShardIdx] + .}: seq[uint16] contentTopics* {. desc: "Default content topic to subscribe to. Argument may be repeated.", @@ -663,15 +661,6 @@ proc defaultColocationLimit*(): int = proc completeCmdArg*(T: type Port, val: string): seq[string] = return @[] -proc completeCmdArg*(T: type ShardIdx, val: string): seq[ShardIdx] = - return @[] - -proc parseCmdArg*(T: type ShardIdx, p: string): T = - try: - ShardIdx(parseInt(p)) - except CatchableError: - raise newException(ValueError, "Invalid shard index") - proc completeCmdArg*(T: type EthRpcUrl, val: string): seq[string] = return @[] @@ -732,22 +721,6 @@ proc readValue*( except CatchableError: raise newException(SerializationError, getCurrentExceptionMsg()) -proc readValue*( - r: var TomlReader, value: var ShardIdx -) {.raises: [SerializationError].} = - try: - value = parseCmdArg(ShardIdx, r.readValue(string)) - except CatchableError: - raise newException(SerializationError, getCurrentExceptionMsg()) - -proc readValue*( - r: var EnvvarReader, value: var ShardIdx -) {.raises: [SerializationError].} = - try: - value = parseCmdArg(ShardIdx, r.readValue(string)) - except CatchableError: - raise newException(SerializationError, getCurrentExceptionMsg()) - proc readValue*( r: var TomlReader, value: var EthRpcUrl ) {.raises: [SerializationError].} = diff --git a/waku/factory/internal_config.nim b/waku/factory/internal_config.nim index ca3410daa..e9a708aaf 100644 --- a/waku/factory/internal_config.nim +++ b/waku/factory/internal_config.nim @@ -45,7 +45,7 @@ proc enrConfiguration*( shards = toSeq(conf.shards.mapIt(uint16(it))) enrBuilder.withWakuRelaySharding( - RelayShards(clusterId: uint16(conf.clusterId), shardIds: shards) + RelayShards(clusterId: conf.clusterId, shardIds: shards) ).isOkOr: return err("could not initialize ENR with shards") diff --git a/waku/factory/networks_config.nim b/waku/factory/networks_config.nim index 42c1624a8..9837cdaeb 100644 --- a/waku/factory/networks_config.nim +++ b/waku/factory/networks_config.nim @@ -5,7 +5,7 @@ else: type ClusterConf* = object maxMessageSize*: string - clusterId*: uint32 + clusterId*: uint16 rlnRelay*: bool rlnRelayEthContractAddress*: string rlnRelayDynamic*: bool @@ -21,7 +21,7 @@ type ClusterConf* = object # overrides existing cli configuration proc ClusterZeroConf*(T: type ClusterConf): ClusterConf = return ClusterConf( - clusterId: 0.uint32, + clusterId: 0, pubsubTopics: @["/waku/2/default-waku/proto"] # TODO: Add more config such as bootstrap, etc , @@ -33,7 +33,7 @@ proc ClusterZeroConf*(T: type ClusterConf): ClusterConf = proc TheWakuNetworkConf*(T: type ClusterConf): ClusterConf = return ClusterConf( maxMessageSize: "150KiB", - clusterId: 1.uint32, + clusterId: 1, rlnRelay: true, rlnRelayEthContractAddress: "0xF471d71E9b1455bBF4b85d475afb9BB0954A29c4", rlnRelayDynamic: true, diff --git a/waku/node/config.nim b/waku/node/config.nim index 5902f5b01..d3f2a3dfd 100644 --- a/waku/node/config.nim +++ b/waku/node/config.nim @@ -12,7 +12,7 @@ import ../waku_enr type NetConfig* = object hostAddress*: MultiAddress - clusterId*: uint32 + clusterId*: uint16 wsHostAddress*: Option[MultiAddress] hostExtAddress*: Option[MultiAddress] wsExtAddress*: Option[MultiAddress] @@ -78,7 +78,7 @@ proc init*( wssEnabled: bool = false, dns4DomainName = none(string), discv5UdpPort = none(Port), - clusterId: uint32 = 0, + clusterId: uint16 = 0, wakuFlags = none(CapabilitiesBitfield), ): NetConfigResult = ## Initialize and validate waku node network configuration diff --git a/waku/node/waku_node.nim b/waku/node/waku_node.nim index 7221e7d8b..2d699d34e 100644 --- a/waku/node/waku_node.nim +++ b/waku/node/waku_node.nim @@ -212,7 +212,7 @@ proc mountMetadata*(node: WakuNode, clusterId: uint32): Result[void, string] = ## Waku Sharding proc mountSharding*( - node: WakuNode, clusterId: uint32, shardCount: uint32 + node: WakuNode, clusterId: uint16, shardCount: uint32 ): Result[void, string] = info "mounting sharding", clusterId = clusterId, shardCount = shardCount node.wakuSharding = Sharding(clusterId: clusterId, shardCountGenZero: shardCount) diff --git a/waku/waku_core/topics/sharding.nim b/waku/waku_core/topics/sharding.nim index 62f317f66..5517af9ff 100644 --- a/waku/waku_core/topics/sharding.nim +++ b/waku/waku_core/topics/sharding.nim @@ -12,11 +12,11 @@ import nimcrypto, std/options, std/tables, stew/endians2, stew/results, stew/byt import ./content_topic, ./pubsub_topic type Sharding* = object - clusterId*: uint32 + clusterId*: uint16 # TODO: generations could be stored in a table here shardCountGenZero*: uint32 -proc new*(T: type Sharding, clusterId: uint32, shardCount: uint32): T = +proc new*(T: type Sharding, clusterId: uint16, shardCount: uint32): T = return Sharding(clusterId: clusterId, shardCountGenZero: shardCount) proc getGenZeroShard*(s: Sharding, topic: NsContentTopic, count: int): NsPubsubTopic = @@ -30,7 +30,7 @@ proc getGenZeroShard*(s: Sharding, topic: NsContentTopic, count: int): NsPubsubT # This is equilavent to modulo shard count but faster let shard = hashValue and uint64((count - 1)) - NsPubsubTopic.staticSharding(uint16(s.clusterId), uint16(shard)) + NsPubsubTopic.staticSharding(s.clusterId, uint16(shard)) proc getShard*(s: Sharding, topic: NsContentTopic): Result[NsPubsubTopic, string] = ## Compute the (pubsub topic) shard to use for this content topic. diff --git a/waku/waku_enr/sharding.nim b/waku/waku_enr/sharding.nim index dc73e6b1c..3f0774a4e 100644 --- a/waku/waku_enr/sharding.nim +++ b/waku/waku_enr/sharding.nim @@ -260,7 +260,7 @@ proc containsShard*(r: Record, topic: PubsubTopic | string): bool = containsShard(r, parseRes.value) -proc isClusterMismatched*(record: Record, clusterId: uint32): bool = +proc isClusterMismatched*(record: Record, clusterId: uint16): bool = ## Check the ENR sharding info for matching cluster id if (let typedRecord = record.toTyped(); typedRecord.isOk()): if (let relayShard = typedRecord.get().relaySharding(); relayShard.isSome()):