From e1518cf9ffc6c9ce2230aa5a44c52784bbd9f913 Mon Sep 17 00:00:00 2001 From: gabrielmer <101006718+gabrielmer@users.noreply.github.com> Date: Tue, 9 Jul 2024 18:36:12 +0300 Subject: [PATCH] chore: deprecating named sharding (#2723) --- apps/chat2/config_chat2.nim | 2 +- apps/chat2bridge/config_chat2bridge.nim | 2 +- apps/liteprotocoltester/README.md | 4 +- apps/liteprotocoltester/run_service_node.sh | 2 +- apps/liteprotocoltester/run_tester_node.sh | 2 +- apps/liteprotocoltester/tester_config.nim | 2 +- docs/operators/how-to/run.md | 4 +- docs/tutorial/onchain-rln-relay-chat2.md | 2 +- docs/tutorial/rln-chat-cross-client.md | 2 +- examples/cbindings/waku_example.c | 2 +- examples/filter_subscriber.nim | 2 +- examples/lightpush_publisher.nim | 2 +- examples/publisher.nim | 2 +- examples/subscriber.nim | 2 +- tests/node/peer_manager/test_peer_manager.nim | 2 +- tests/test_wakunode.nim | 2 +- tests/testlib/wakunode.nim | 2 +- tests/waku_core/test_message_digest.nim | 41 +++++------ tests/waku_core/test_namespaced_topics.nim | 20 +---- tests/waku_core/topics/test_pubsub_topic.nim | 24 ------ tests/waku_relay/test_protocol.nim | 25 ++++--- tests/wakunode_rest/test_rest_relay.nim | 2 +- waku/factory/external_config.nim | 13 +++- waku/factory/internal_config.nim | 29 +++++--- waku/factory/networks_config.nim | 11 --- waku/factory/waku.nim | 6 -- waku/node/peer_manager/peer_manager.nim | 5 -- waku/node/waku_node.nim | 2 +- waku/waku_core/topics/pubsub_topic.nim | 73 ++++--------------- waku/waku_enr/sharding.nim | 22 ++---- waku/waku_metadata/protocol.nim | 3 - 31 files changed, 108 insertions(+), 206 deletions(-) diff --git a/apps/chat2/config_chat2.nim b/apps/chat2/config_chat2.nim index 8426396ab..417d298a3 100644 --- a/apps/chat2/config_chat2.nim +++ b/apps/chat2/config_chat2.nim @@ -85,7 +85,7 @@ type topics* {. desc: "Default topics to subscribe to (space separated list).", - defaultValue: "/waku/2/default-waku/proto", + defaultValue: "/waku/2/rs/0/0", name: "topics" .}: string diff --git a/apps/chat2bridge/config_chat2bridge.nim b/apps/chat2bridge/config_chat2bridge.nim index 81137b2b1..c858fdb3b 100644 --- a/apps/chat2bridge/config_chat2bridge.nim +++ b/apps/chat2bridge/config_chat2bridge.nim @@ -69,7 +69,7 @@ type Chat2MatterbridgeConf* = object topics* {. desc: "Default topics to subscribe to (space separated list)", - defaultValue: "/waku/2/default-waku/proto", + defaultValue: "/waku/2/rs/0/0", name: "topics" .}: string diff --git a/apps/liteprotocoltester/README.md b/apps/liteprotocoltester/README.md index 09b80103d..dbcc9fa5d 100644 --- a/apps/liteprotocoltester/README.md +++ b/apps/liteprotocoltester/README.md @@ -56,7 +56,7 @@ docker compose logs -f receivernode | ---: | :--- | :--- | | NUM_MESSAGES | Number of message to publish | 120 | | DELAY_MESSAGES | Frequency of messages in milliseconds | 1000 | -| PUBSUB | Used pubsub_topic for testing | /waku/2/default-waku/proto | +| PUBSUB | Used pubsub_topic for testing | /waku/2/rs/0/0 | | CONTENT_TOPIC | content_topic for testing | /tester/1/light-pubsub-example/proto | ### Lite Protocol Tester application cli options @@ -67,7 +67,7 @@ docker compose logs -f receivernode | --service-node| Address of the service node to use for lightpush and/or filter service | - | | --num-messages | Number of message to publish | 120 | | --delay-messages | Frequency of messages in milliseconds | 1000 | -| --pubsub-topic | Used pubsub_topic for testing | /waku/2/default-waku/proto | +| --pubsub-topic | Used pubsub_topic for testing | /waku/2/rs/0/0 | | --content_topic | content_topic for testing | /tester/1/light-pubsub-example/proto | | --cluster-id | Cluster id for the test | 0 | | --config-file | TOML configuration file to fine tune the light waku node
Note that some configurations (full node services) are not taken into account | - | diff --git a/apps/liteprotocoltester/run_service_node.sh b/apps/liteprotocoltester/run_service_node.sh index 5cce31a95..ba50782c2 100644 --- a/apps/liteprotocoltester/run_service_node.sh +++ b/apps/liteprotocoltester/run_service_node.sh @@ -25,5 +25,5 @@ exec /usr/bin/wakunode\ --metrics-server-address=0.0.0.0\ --nodekey=e3f5e64568b3a612dee609f6e7c0203c501dab6131662922bdcbcabd474281d5\ --nat=extip:${IP}\ - --pubsub-topic=/waku/2/default-waku/proto\ + --pubsub-topic=/waku/2/rs/0/0\ --cluster-id=0 diff --git a/apps/liteprotocoltester/run_tester_node.sh b/apps/liteprotocoltester/run_tester_node.sh index a96c0561e..6c633f5dd 100644 --- a/apps/liteprotocoltester/run_tester_node.sh +++ b/apps/liteprotocoltester/run_tester_node.sh @@ -63,7 +63,7 @@ echo "Using service node: ${SERIVCE_NODE_ADDR}" exec /usr/bin/liteprotocoltester\ --log-level=DEBUG\ --service-node="${SERIVCE_NODE_ADDR}"\ - --pubsub-topic=/waku/2/default-waku/proto\ + --pubsub-topic=/waku/2/rs/0/0\ --cluster-id=0\ --num-messages=${NUM_MESSAGES}\ --delay-messages=${DELAY_MESSAGES}\ diff --git a/apps/liteprotocoltester/tester_config.nim b/apps/liteprotocoltester/tester_config.nim index 468831357..8055a2295 100644 --- a/apps/liteprotocoltester/tester_config.nim +++ b/apps/liteprotocoltester/tester_config.nim @@ -26,7 +26,7 @@ import export confTomlDefs, confTomlNet, confEnvvarDefs, confEnvvarNet const - LitePubsubTopic* = PubsubTopic("/waku/2/default-waku/proto") + LitePubsubTopic* = PubsubTopic("/waku/2/rs/0/0") LiteContentTopic* = ContentTopic("/tester/1/light-pubsub-example/proto") type TesterFunctionality* = enum diff --git a/docs/operators/how-to/run.md b/docs/operators/how-to/run.md index 8381134e2..b85efe1bb 100644 --- a/docs/operators/how-to/run.md +++ b/docs/operators/how-to/run.md @@ -18,7 +18,7 @@ By default a nwaku node will: See [this tutorial](./configure-key.md) if you want to generate and configure a persistent private key. - listen for incoming libp2p connections on the default TCP port (`60000`) - enable `relay` protocol -- subscribe to the default pubsub topic, namely `/waku/2/default-waku/proto` +- subscribe to the default pubsub topic, namely `/waku/2/rs/0/0` - enable `store` protocol, but only as a client. This implies that the nwaku node will not persist any historical messages itself, but can query `store` service peers who do so. @@ -107,7 +107,7 @@ enr=enr:-IO4QDxToTg86pPCK2KvMeVCXC2ADVZWrxXSvNZeaoa0JhShbM5qed69RQz1s1mWEEqJ3aok ## Typical configuration (relay node) The typical configuration for a nwaku node is to run the `relay` protocol, -subscribed to the default pubsub topic `/waku/2/default-waku/proto`, +subscribed to the default pubsub topic `/waku/2/rs/0/0`, and connecting to one or more existing peers. We assume below that running nodes also participate in Discovery v5 to continually discover and connect to random peers for a more robust mesh. diff --git a/docs/tutorial/onchain-rln-relay-chat2.md b/docs/tutorial/onchain-rln-relay-chat2.md index d39580d2b..6748fc516 100644 --- a/docs/tutorial/onchain-rln-relay-chat2.md +++ b/docs/tutorial/onchain-rln-relay-chat2.md @@ -19,7 +19,7 @@ At a high level, when a chat2 client is run with Waku-RLN-Relay mounted in on-ch Under the hood, the chat2 client constantly listens to the membership contract and keeps itself updated with the latest state of the group. In the following test setting, the chat2 clients are to be connected to the Waku test fleets as their first hop. -The test fleets will act as routers and are also set to run Waku-RLN-Relay over the same pubsub topic and content topic as chat2 clients i.e., the default pubsub topic of `/waku/2/default-waku/proto` and the content topic of `/toy-chat/3/mingde/proto`. +The test fleets will act as routers and are also set to run Waku-RLN-Relay over the same pubsub topic and content topic as chat2 clients i.e., the default pubsub topic of `/waku/2/rs/0/0` and the content topic of `/toy-chat/3/mingde/proto`. Spam messages published on the said combination of topics will be caught by the test fleet nodes and will not be routed. Note that spam protection does not rely on the presence of the test fleets. In fact, all the chat2 clients are also capable of catching and dropping spam messages if they receive any. diff --git a/docs/tutorial/rln-chat-cross-client.md b/docs/tutorial/rln-chat-cross-client.md index 16aacea42..837bf8977 100644 --- a/docs/tutorial/rln-chat-cross-client.md +++ b/docs/tutorial/rln-chat-cross-client.md @@ -14,7 +14,7 @@ As for the setup, please follow the tutorials below: - [JS-chat](https://examples.waku.org/rln-js/) Once you set up your chat client, it will be connected to the Waku v2 test fleets as its first hop. -Messages generated by the chat client are set to be published on a specific combination of pubsub and content topic i.e., the default pubsub topic of `/waku/2/default-waku/proto` and the content topic of `/toy-chat/3/mingde/proto`. +Messages generated by the chat client are set to be published on a specific combination of pubsub and content topic i.e., the default pubsub topic of `/waku/2/rs/0/0` and the content topic of `/toy-chat/3/mingde/proto`. The test fleets also run Waku-RLN-Relay over the same pubsub topic and content topic. Test fleets act as routers and enforce the message rate limit. As such, any spam messages published by a chat client on the said combination of topics will be caught by the Waku v2 test fleet nodes and will not be routed. diff --git a/examples/cbindings/waku_example.c b/examples/cbindings/waku_example.c index 9090c9a3e..d1987973f 100644 --- a/examples/cbindings/waku_example.c +++ b/examples/cbindings/waku_example.c @@ -317,7 +317,7 @@ int main(int argc, char** argv) { userData) ); WAKU_CALL( waku_relay_subscribe(ctx, - "/waku/2/default-waku/proto", + "/waku/2/rs/0/0", event_handler, userData) ); diff --git a/examples/filter_subscriber.nim b/examples/filter_subscriber.nim index 028222810..a18bf92db 100644 --- a/examples/filter_subscriber.nim +++ b/examples/filter_subscriber.nim @@ -8,7 +8,7 @@ const FilterPeer = "/ip4/34.16.1.67/tcp/30303/p2p/16Uiu2HAmDCp8XJ9z1ev18zuv8NHekAsjNyezAvmMfFEJkiharitG" # node-01.gc-us-central1-a.waku.test.statusim.net on waku.test - FilterPubsubTopic = PubsubTopic("/waku/2/default-waku/proto") + FilterPubsubTopic = PubsubTopic("/waku/2/rs/0/0") FilterContentTopic = ContentTopic("/examples/1/light-pubsub-example/proto") proc unsubscribe( diff --git a/examples/lightpush_publisher.nim b/examples/lightpush_publisher.nim index 0a4e349e7..4cc2f195d 100644 --- a/examples/lightpush_publisher.nim +++ b/examples/lightpush_publisher.nim @@ -8,7 +8,7 @@ const LightpushPeer = "/ip4/178.128.141.171/tcp/30303/p2p/16Uiu2HAkykgaECHswi3YKJ5dMLbq2kPVCo89fcyTd38UcQD6ej5W" # node-01.do-ams3.waku.test.statusim.net on waku.test - LightpushPubsubTopic = PubsubTopic("/waku/2/default-waku/proto") + LightpushPubsubTopic = PubsubTopic("/waku/2/rs/0/0") LightpushContentTopic = ContentTopic("/examples/1/light-pubsub-example/proto") proc publishMessages( diff --git a/examples/publisher.nim b/examples/publisher.nim index de0f83a3f..e26a476ed 100644 --- a/examples/publisher.nim +++ b/examples/publisher.nim @@ -107,7 +107,7 @@ proc setupAndPublish(rng: ref HmacDrbgContext) {.async.} = # Make sure it matches the publisher. Use default value # see spec: https://rfc.vac.dev/spec/23/ - let pubSubTopic = PubsubTopic("/waku/2/default-waku/proto") + let pubSubTopic = PubsubTopic("/waku/2/rs/0/0") # any content topic can be chosen let contentTopic = ContentTopic("/examples/1/pubsub-example/proto") diff --git a/examples/subscriber.nim b/examples/subscriber.nim index c569afcb7..477f90982 100644 --- a/examples/subscriber.nim +++ b/examples/subscriber.nim @@ -105,7 +105,7 @@ proc setupAndSubscribe(rng: ref HmacDrbgContext) {.async.} = # Make sure it matches the publisher. Use default value # see spec: https://rfc.vac.dev/spec/23/ - let pubSubTopic = PubsubTopic("/waku/2/default-waku/proto") + let pubSubTopic = PubsubTopic("/waku/2/rs/0/0") # any content topic can be chosen. make sure it matches the publisher let contentTopic = ContentTopic("/examples/1/pubsub-example/proto") diff --git a/tests/node/peer_manager/test_peer_manager.nim b/tests/node/peer_manager/test_peer_manager.nim index f74a6c584..3d0cb08c2 100644 --- a/tests/node/peer_manager/test_peer_manager.nim +++ b/tests/node/peer_manager/test_peer_manager.nim @@ -59,7 +59,7 @@ suite "Peer Manager": # When making an operation that triggers onPeerMetadata discard await client.filterSubscribe( - some("/waku/2/default-waku/proto"), "waku/lightpush/1", serverRemotePeerInfo + some("/waku/2/rs/0/0"), "waku/lightpush/1", serverRemotePeerInfo ) await sleepAsync(FUTURE_TIMEOUT) diff --git a/tests/test_wakunode.nim b/tests/test_wakunode.nim index 1105cfd64..4640d49f9 100644 --- a/tests/test_wakunode.nim +++ b/tests/test_wakunode.nim @@ -28,7 +28,7 @@ suite "WakuNode": node1 = newTestWakuNode(nodeKey1, parseIpAddress("0.0.0.0"), Port(61000)) nodeKey2 = generateSecp256k1Key() node2 = newTestWakuNode(nodeKey2, parseIpAddress("0.0.0.0"), Port(61002)) - pubSubTopic = "/waku/2/default-waku/proto" + pubSubTopic = "/waku/2/rs/0/0" contentTopic = ContentTopic("/waku/2/default-content/proto") payload = "hello world".toBytes() message = WakuMessage(payload: payload, contentTopic: contentTopic) diff --git a/tests/testlib/wakunode.nim b/tests/testlib/wakunode.nim index be563a35d..bec8ffe04 100644 --- a/tests/testlib/wakunode.nim +++ b/tests/testlib/wakunode.nim @@ -38,7 +38,7 @@ proc defaultTestWakuNodeConf*(): WakuNodeConf = maxConnections: 50, maxMessageSize: "1024 KiB", clusterId: 0, - pubsubTopics: @["/waku/2/rs/1/0"], + pubsubTopics: @["/waku/2/rs/0/0"], relay: true, storeMessageDbUrl: "sqlite://store.sqlite3", ) diff --git a/tests/waku_core/test_message_digest.nim b/tests/waku_core/test_message_digest.nim index 16efaa4da..1d1f71225 100644 --- a/tests/waku_core/test_message_digest.nim +++ b/tests/waku_core/test_message_digest.nim @@ -7,16 +7,16 @@ suite "Waku Message - Deterministic hashing": test "digest computation - empty meta field": ## Test vector: ## - ## pubsub_topic = 0x2f77616b752f322f64656661756c742d77616b752f70726f746f + ## pubsub_topic = 2f77616b752f322f72732f302f30 ## waku_message.payload = 0x010203045445535405060708 ## waku_message.content_topic = 0x2f77616b752f322f64656661756c742d636f6e74656e742f70726f746f ## waku_message.meta = ## waku_message.ts = 0x175789bfa23f8400 ## - ## message_hash = 0xa2554498b31f5bcdfcbf7fa58ad1c2d45f0254f3f8110a85588ec3cf10720fd8 + ## message_hash = 0xcccab07fed94181c83937c8ca8340c9108492b7ede354a6d95421ad34141fd37 ## Given - let pubsubTopic = DefaultPubsubTopic # /waku/2/default-waku/proto + let pubsubTopic = DefaultPubsubTopic # /waku/2/rs/0/0 let message = fakeWakuMessage( contentTopic = DefaultContentTopic, # /waku/2/default-content/proto payload = "\x01\x02\x03\x04TEST\x05\x06\x07\x08".toBytes(), @@ -29,29 +29,28 @@ suite "Waku Message - Deterministic hashing": ## Then check: - byteutils.toHex(pubsubTopic.toBytes()) == - "2f77616b752f322f64656661756c742d77616b752f70726f746f" + byteutils.toHex(pubsubTopic.toBytes()) == "2f77616b752f322f72732f302f30" byteutils.toHex(message.contentTopic.toBytes()) == "2f77616b752f322f64656661756c742d636f6e74656e742f70726f746f" byteutils.toHex(message.payload) == "010203045445535405060708" byteutils.toHex(message.meta) == "" byteutils.toHex(toBytesBE(uint64(message.timestamp))) == "175789bfa23f8400" messageHash.toHex() == - "a2554498b31f5bcdfcbf7fa58ad1c2d45f0254f3f8110a85588ec3cf10720fd8" + "cccab07fed94181c83937c8ca8340c9108492b7ede354a6d95421ad34141fd37" test "digest computation - meta field (12 bytes)": ## Test vector: ## - ## pubsub_topic = 0x2f77616b752f322f64656661756c742d77616b752f70726f746f + ## pubsub_topic = 0x2f77616b752f322f72732f302f30 ## waku_message.payload = 0x010203045445535405060708 ## waku_message.content_topic = 0x2f77616b752f322f64656661756c742d636f6e74656e742f70726f746f ## waku_message.meta = 0x73757065722d736563726574 ## waku_message.ts = 0x175789bfa23f8400 ## - ## message_hash = 0x64cce733fed134e83da02b02c6f689814872b1a0ac97ea56b76095c3c72bfe05 + ## message_hash = 0xb9b4852f9d8c489846e8bfc6c5ca6a1a8d460a40d28832a966e029eb39619199 ## Given - let pubsubTopic = DefaultPubsubTopic # /waku/2/default-waku/proto + let pubsubTopic = DefaultPubsubTopic # /waku/2/rs/0/0 let message = fakeWakuMessage( contentTopic = DefaultContentTopic, # /waku/2/default-content/proto payload = "\x01\x02\x03\x04TEST\x05\x06\x07\x08".toBytes(), @@ -64,29 +63,28 @@ suite "Waku Message - Deterministic hashing": ## Then check: - byteutils.toHex(pubsubTopic.toBytes()) == - "2f77616b752f322f64656661756c742d77616b752f70726f746f" + byteutils.toHex(pubsubTopic.toBytes()) == "2f77616b752f322f72732f302f30" byteutils.toHex(message.contentTopic.toBytes()) == "2f77616b752f322f64656661756c742d636f6e74656e742f70726f746f" byteutils.toHex(message.payload) == "010203045445535405060708" byteutils.toHex(message.meta) == "73757065722d736563726574" byteutils.toHex(toBytesBE(uint64(message.timestamp))) == "175789bfa23f8400" messageHash.toHex() == - "64cce733fed134e83da02b02c6f689814872b1a0ac97ea56b76095c3c72bfe05" + "b9b4852f9d8c489846e8bfc6c5ca6a1a8d460a40d28832a966e029eb39619199" test "digest computation - meta field (64 bytes)": ## Test vector: ## - ## pubsub_topic = 0x2f77616b752f322f64656661756c742d77616b752f70726f746f + ## pubsub_topic = 0x2f77616b752f322f72732f302f30 ## waku_message.payload = 0x010203045445535405060708 ## waku_message.content_topic = 0x2f77616b752f322f64656661756c742d636f6e74656e742f70726f746f ## waku_message.meta = 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f ## waku_message.ts = 0x175789bfa23f8400 ## - ## message_hash = 0x7158b6498753313368b9af8f6e0a0a05104f68f972981da42a43bc53fb0c1b27" + ## message_hash = 0x653460d04f66c5b11814d235152f4f246e6f03ef80a305a825913636fbafd0ba ## Given - let pubsubTopic = DefaultPubsubTopic # /waku/2/default-waku/proto + let pubsubTopic = DefaultPubsubTopic # /waku/2/rs/0/0 let message = fakeWakuMessage( contentTopic = DefaultContentTopic, # /waku/2/default-content/proto payload = "\x01\x02\x03\x04TEST\x05\x06\x07\x08".toBytes(), @@ -99,8 +97,7 @@ suite "Waku Message - Deterministic hashing": ## Then check: - byteutils.toHex(pubsubTopic.toBytes()) == - "2f77616b752f322f64656661756c742d77616b752f70726f746f" + byteutils.toHex(pubsubTopic.toBytes()) == "2f77616b752f322f72732f302f30" byteutils.toHex(message.contentTopic.toBytes()) == "2f77616b752f322f64656661756c742d636f6e74656e742f70726f746f" byteutils.toHex(message.payload) == "010203045445535405060708" @@ -108,21 +105,21 @@ suite "Waku Message - Deterministic hashing": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f" byteutils.toHex(toBytesBE(uint64(message.timestamp))) == "175789bfa23f8400" messageHash.toHex() == - "7158b6498753313368b9af8f6e0a0a05104f68f972981da42a43bc53fb0c1b27" + "653460d04f66c5b11814d235152f4f246e6f03ef80a305a825913636fbafd0ba" test "digest computation - zero length payload": ## Test vector: ## - ## pubsub_topic = 0x2f77616b752f322f64656661756c742d77616b752f70726f746f + ## pubsub_topic = 0x2f77616b752f322f72732f302f30 ## waku_message.payload = [] ## waku_message.content_topic = 0x2f77616b752f322f64656661756c742d636f6e74656e742f70726f746f ## waku_message.meta = 0x73757065722d736563726574 ## waku_message.ts = 0x175789bfa23f8400 ## - ## message_hash = 0x483ea950cb63f9b9d6926b262bb36194d3f40a0463ce8446228350bd44e96de4 + ## message_hash = 0x0f6448cc23b2db6c696aa6ab4b693eff4cf3549ff346fe1dbeb281697396a09f ## Given - let pubsubTopic = DefaultPubsubTopic # /waku/2/default-waku/proto + let pubsubTopic = DefaultPubsubTopic # /waku/2/rs/0/0 let message = fakeWakuMessage( contentTopic = DefaultContentTopic, # /waku/2/default-content/proto payload = newSeq[byte](), @@ -136,7 +133,7 @@ suite "Waku Message - Deterministic hashing": ## Then check: messageHash.toHex() == - "483ea950cb63f9b9d6926b262bb36194d3f40a0463ce8446228350bd44e96de4" + "0f6448cc23b2db6c696aa6ab4b693eff4cf3549ff346fe1dbeb281697396a09f" test "waku message - check meta size is enforced": # create message with meta size > 64 bytes (invalid) diff --git a/tests/waku_core/test_namespaced_topics.nim b/tests/waku_core/test_namespaced_topics.nim index 9d739a841..1cab7677a 100644 --- a/tests/waku_core/test_namespaced_topics.nim +++ b/tests/waku_core/test_namespaced_topics.nim @@ -134,17 +134,6 @@ suite "Waku Message - Content topics namespacing": err.cause == "generation should be a numeric value" suite "Waku Message - Pub-sub topics namespacing": - test "Stringify named sharding pub-sub topic": - ## Given - var ns = NsPubsubTopic.named("waku-dev") - - ## When - let topic = $ns - - ## Then - check: - topic == "/waku/2/waku-dev" - test "Stringify static sharding pub-sub topic": ## Given var ns = NsPubsubTopic.staticSharding(clusterId = 0, shardId = 2) @@ -156,7 +145,7 @@ suite "Waku Message - Pub-sub topics namespacing": check: topic == "/waku/2/rs/0/2" - test "Parse named pub-sub topic string - Valid string": + test "Parse invalid pub-sub topic string": ## Given let topic = "/waku/2/waku-dev" @@ -164,11 +153,10 @@ suite "Waku Message - Pub-sub topics namespacing": let nsRes = NsPubsubTopic.parse(topic) ## Then - check nsRes.isOk() - - let ns = nsRes.get() + check nsRes.isErr() + let err = nsRes.tryError() check: - ns.name == "waku-dev" + err.kind == ParsingErrorKind.InvalidFormat test "Parse static sharding pub-sub topic string - Valid string": ## Given diff --git a/tests/waku_core/topics/test_pubsub_topic.nim b/tests/waku_core/topics/test_pubsub_topic.nim index aef8d1a0d..ba6bf65dc 100644 --- a/tests/waku_core/topics/test_pubsub_topic.nim +++ b/tests/waku_core/topics/test_pubsub_topic.nim @@ -18,27 +18,3 @@ suite "Static Sharding Functionality": topic.clusterId == 0 topic.shardId == 1 topic == "/waku/2/rs/0/1" - -suite "Automatic Sharding Mechanics": - test "Shard Selection Algorithm": - let - topic1 = NsPubsubTopic.parseNamedSharding("/waku/2/xxx").get() - topic2 = NsPubsubTopic.parseNamedSharding("/waku/2/123").get() - topic3 = NsPubsubTopic.parseNamedSharding("/waku/2/xxx123").get() - - check: - # topic1.shardId == 1 - # topic1.clusterId == 0 - topic1 == NsPubsubTopic.staticSharding(0, 1) - # topic2.shardId == 1 - # topic2.clusterId == 0 - topic2 == NsPubsubTopic.staticSharding(0, 1) - # topic3.shardId == 1 - # topic3.clusterId == 0 - topic3 == NsPubsubTopic.staticSharding(0, 1) - - test "Shard Selection Algorithm without topicName": - let topicResult = NsPubsubTopic.parseNamedSharding("/waku/2/") - - check: - topicResult.isErr() diff --git a/tests/waku_relay/test_protocol.nim b/tests/waku_relay/test_protocol.nim index 741f9fe9c..871cfb28d 100644 --- a/tests/waku_relay/test_protocol.nim +++ b/tests/waku_relay/test_protocol.nim @@ -1,7 +1,7 @@ {.used.} import - std/[options, sequtils, strutils], + std/[options, sequtils, strutils, strformat], stew/shims/net as stewNet, testutils/unittests, chronicles, @@ -430,8 +430,8 @@ suite "Waku Relay": asyncTest "How multiple interconnected nodes work": # Given two other pubsub topics let - pubsubTopicB = "pubsub-topic-b" - pubsubTopicC = "pubsub-topic-c" + pubsubTopicB = "/waku/2/rs/0/1" + pubsubTopicC = "/waku/2/rs/0/2" # Given two other nodes connected to the first one let @@ -767,13 +767,17 @@ suite "Waku Relay": asyncTest "Single Node with Multiple Pubsub Topics": # Given other pubsub topic - let pubsubTopicB = "pubsub-topic-b" + let pubsubTopicB = "/waku/2/rs/0/1" # Given a node subscribed to multiple pubsub topics let topicHandler = node.subscribe(pubsubTopic, simpleFutureHandler) topicHandlerB = node.subscribe(pubsubTopicB, simpleFutureHandler) - check node.subscribedTopics == @[pubsubTopic, pubsubTopicB] + + assert pubsubTopic in node.subscribedTopics, + fmt"Node is not subscribed to {pubsubTopic}" + assert pubsubTopicB in node.subscribedTopics, + fmt"Node is not subscribed to {pubsubTopicB}" # When unsubscribing from one of the pubsub topics node.unsubscribe(pubsubTopic, topicHandler) @@ -811,14 +815,17 @@ suite "Waku Relay": asyncTest "Single Node with Multiple Pubsub Topics": # Given other pubsub topic - let pubsubTopicB = "pubsub-topic-b" + let pubsubTopicB = "/waku/2/rs/0/1" # Given a node subscribed to multiple pubsub topics discard node.subscribe(pubsubTopic, simpleFutureHandler) discard node.subscribe(pubsubTopic, simpleFutureHandler) discard node.subscribe(pubsubTopicB, simpleFutureHandler) - check node.subscribedTopics == @[pubsubTopic, pubsubTopicB] + assert pubsubTopic in node.subscribedTopics, + fmt"Node is not subscribed to {pubsubTopic}" + assert pubsubTopicB in node.subscribedTopics, + fmt"Node is not subscribed to {pubsubTopicB}" # When unsubscribing all handlers from pubsubTopic node.unsubscribeAll(pubsubTopic) @@ -1042,11 +1049,11 @@ suite "Waku Relay": ) # 100KiB msg4 = fakeWakuMessage( contentTopic = contentTopic, - payload = getByteSequence(DefaultMaxWakuMessageSize - sizeEmptyMsg - 38), + payload = getByteSequence(DefaultMaxWakuMessageSize - sizeEmptyMsg - 26), ) # Max Size (Inclusive Limit) msg5 = fakeWakuMessage( contentTopic = contentTopic, - payload = getByteSequence(DefaultMaxWakuMessageSize - sizeEmptyMsg - 37), + payload = getByteSequence(DefaultMaxWakuMessageSize - sizeEmptyMsg - 25), ) # Max Size (Exclusive Limit) msg6 = fakeWakuMessage( contentTopic = contentTopic, diff --git a/tests/wakunode_rest/test_rest_relay.nim b/tests/wakunode_rest/test_rest_relay.nim index f3462a278..c8a372984 100644 --- a/tests/wakunode_rest/test_rest_relay.nim +++ b/tests/wakunode_rest/test_rest_relay.nim @@ -152,7 +152,7 @@ suite "Waku v2 Rest API - Relay": restPort = restServer.httpServer.address.port # update with bound port for client use - let pubSubTopic = "/waku/2/default-waku/proto" + let pubSubTopic = "/waku/2/rs/0/0" var messages = @[ diff --git a/waku/factory/external_config.nim b/waku/factory/external_config.nim index 60ce252ad..8ce67bce4 100644 --- a/waku/factory/external_config.nim +++ b/waku/factory/external_config.nim @@ -305,12 +305,23 @@ type WakuNodeConf* = object pubsubTopics* {. desc: "Default pubsub topic to subscribe to. Argument may be repeated.", + defaultValue: @[], name: "pubsub-topic" .}: seq[string] shards* {. desc: "Shards index to subscribe to [0..MAX_SHARDS-1]. Argument may be repeated.", - defaultValue: @[], + defaultValue: + @[ + uint16(0), + uint16(1), + uint16(2), + uint16(3), + uint16(4), + uint16(5), + uint16(6), + uint16(7), + ], name: "shard" .}: seq[uint16] diff --git a/waku/factory/internal_config.nim b/waku/factory/internal_config.nim index 6f26cbbde..c28498231 100644 --- a/waku/factory/internal_config.nim +++ b/waku/factory/internal_config.nim @@ -30,19 +30,24 @@ proc enrConfiguration*( var shards = newSeq[uint16]() - # no shards configured - if conf.shards.len == 0: - let shardsOpt = topicsToRelayShards(conf.pubsubTopics).valueOr: - error "failed to parse pubsub topic, please format according to static shard specification", - error = $error - return err("failed to parse pubsub topic: " & $error) - if shardsOpt.isSome(): - shards = shardsOpt.get().shardIds - else: - info "no pubsub topics specified or pubsubtopic is of type Named sharding " - # some shards configured - else: + let shardsOpt = topicsToRelayShards(conf.pubsubTopics).valueOr: + error "failed to parse pubsub topic, please format according to static shard specification", + error = $error + return err("failed to parse pubsub topic: " & $error) + + if shardsOpt.isSome(): + let relayShards = shardsOpt.get() + + if relayShards.clusterid != conf.clusterId: + error "pubsub topic corresponds to different shard than configured", + nodeCluster = conf.clusterId, pubsubCluster = relayShards.clusterid + return err("pubsub topic corresponds to different shard than configured") + + shards = relayShards.shardIds + elif conf.shards.len > 0: shards = toSeq(conf.shards.mapIt(uint16(it))) + else: + info "no pubsub topics specified" enrBuilder.withWakuRelaySharding( RelayShards(clusterId: conf.clusterId, shardIds: shards) diff --git a/waku/factory/networks_config.nim b/waku/factory/networks_config.nim index 01db3cdbe..6d7da343e 100644 --- a/waku/factory/networks_config.nim +++ b/waku/factory/networks_config.nim @@ -14,17 +14,6 @@ type ClusterConf* = object discv5Discovery*: bool discv5BootstrapNodes*: seq[string] -# cluster-id=0 -# Cluster configuration for the default pubsub topic. Note that it -# overrides existing cli configuration -proc ClusterZeroConf*(T: type ClusterConf): ClusterConf = - return ClusterConf( - clusterId: 0, - pubsubTopics: - @["/waku/2/default-waku/proto"] # TODO: Add more config such as bootstrap, etc - , - ) - # cluster-id=1 (aka The Waku Network) # Cluster configuration corresponding to The Waku Network. Note that it # overrides existing cli configuration diff --git a/waku/factory/waku.nim b/waku/factory/waku.nim index 4296854a4..c6c651cc1 100644 --- a/waku/factory/waku.nim +++ b/waku/factory/waku.nim @@ -93,12 +93,6 @@ proc init*(T: type Waku, conf: WakuNodeConf): Result[Waku, string] = case confCopy.clusterId - # cluster-id=0 - of 0: - let clusterZeroConf = ClusterConf.ClusterZeroConf() - confCopy.pubsubTopics = clusterZeroConf.pubsubTopics - # TODO: Write some template to "merge" the configs - # cluster-id=1 (aka The Waku Network) of 1: let twnClusterConf = ClusterConf.TheWakuNetworkConf() diff --git a/waku/node/peer_manager/peer_manager.nim b/waku/node/peer_manager/peer_manager.nim index 5af14c5ec..774259de9 100644 --- a/waku/node/peer_manager/peer_manager.nim +++ b/waku/node/peer_manager/peer_manager.nim @@ -356,11 +356,6 @@ proc onConnEvent(pm: PeerManager, peerId: PeerID, event: ConnEvent) {.async.} = discard proc onPeerMetadata(pm: PeerManager, peerId: PeerId) {.async.} = - # To prevent metadata protocol from breaking prev nodes, by now we only - # disconnect if the clusterid is specified. - if pm.wakuMetadata.clusterId == 0: - return - let res = catch: await pm.switch.dial(peerId, WakuMetadataCodec) diff --git a/waku/node/waku_node.nim b/waku/node/waku_node.nim index 480babd2d..4f91fde63 100644 --- a/waku/node/waku_node.nim +++ b/waku/node/waku_node.nim @@ -420,7 +420,7 @@ proc mountRelay*( node.switch.mount(node.wakuRelay, protocolMatcher(WakuRelayCodec)) - info "relay mounted successfully" + info "relay mounted successfully", pubsubTopics = pubsubTopics # Subscribe to topics for pubsubTopic in pubsubTopics: diff --git a/waku/waku_core/topics/pubsub_topic.nim b/waku/waku_core/topics/pubsub_topic.nim index ef45cd6f7..6306df081 100644 --- a/waku/waku_core/topics/pubsub_topic.nim +++ b/waku/waku_core/topics/pubsub_topic.nim @@ -13,40 +13,23 @@ export parsing type PubsubTopic* = string -const DefaultPubsubTopic* = PubsubTopic("/waku/2/default-waku/proto") +const DefaultPubsubTopic* = PubsubTopic("/waku/2/rs/0/0") ## Namespaced pub-sub topic -type NsPubsubTopicKind* {.pure.} = enum - StaticSharding - NamedSharding - type NsPubsubTopic* = object - case kind*: NsPubsubTopicKind - of NsPubsubTopicKind.StaticSharding: - clusterId*: uint16 - shardId*: uint16 - of NsPubsubTopicKind.NamedSharding: - name*: string + clusterId*: uint16 + shardId*: uint16 proc staticSharding*(T: type NsPubsubTopic, clusterId, shardId: uint16): T = - NsPubsubTopic( - kind: NsPubsubTopicKind.StaticSharding, clusterId: clusterId, shardId: shardId - ) - -proc named*(T: type NsPubsubTopic, name: string): T = - NsPubsubTopic(kind: NsPubsubTopicKind.NamedSharding, name: name) + return NsPubsubTopic(clusterId: clusterId, shardId: shardId) # Serialization proc `$`*(topic: NsPubsubTopic): string = ## Returns a string representation of a namespaced topic - ## in the format `/waku/2/ - case topic.kind - of NsPubsubTopicKind.NamedSharding: - "/waku/2/" & topic.name - of NsPubsubTopicKind.StaticSharding: - "/waku/2/rs/" & $topic.clusterId & "/" & $topic.shardId + ## in the format `/waku/2/rs// + return "/waku/2/rs/" & $topic.clusterId & "/" & $topic.shardId # Deserialization @@ -55,7 +38,7 @@ const StaticShardingPubsubTopicPrefix = Waku2PubsubTopicPrefix & "/rs" proc parseStaticSharding*( - T: type NsPubsubTopic, topic: PubsubTopic | string + T: type NsPubsubTopic, topic: PubsubTopic ): ParsingResult[NsPubsubTopic] = if not topic.startsWith(StaticShardingPubsubTopicPrefix): return err( @@ -86,27 +69,10 @@ proc parseStaticSharding*( ok(NsPubsubTopic.staticSharding(clusterId, shardId)) -proc parseNamedSharding*( - T: type NsPubsubTopic, topic: PubsubTopic | string -): ParsingResult[NsPubsubTopic] = - if not topic.startsWith(Waku2PubsubTopicPrefix): - return err(ParsingError.invalidFormat("must start with " & Waku2PubsubTopicPrefix)) - - let raw = topic[8 ..< topic.len] - if raw.len == 0: - return err(ParsingError.missingPart("topic-name")) - - ok(NsPubsubTopic.named(name = raw)) - -proc parse*( - T: type NsPubsubTopic, topic: PubsubTopic | string -): ParsingResult[NsPubsubTopic] = +proc parse*(T: type NsPubsubTopic, topic: PubsubTopic): ParsingResult[NsPubsubTopic] = ## Splits a namespaced topic string into its constituent parts. ## The topic string has to be in the format `////` - if topic.startsWith(StaticShardingPubsubTopicPrefix): - NsPubsubTopic.parseStaticSharding(topic) - else: - NsPubsubTopic.parseNamedSharding(topic) + NsPubsubTopic.parseStaticSharding(topic) # Pubsub topic compatibility @@ -114,21 +80,10 @@ converter toPubsubTopic*(topic: NsPubsubTopic): PubsubTopic = $topic proc `==`*[T: NsPubsubTopic](x, y: T): bool = - case y.kind - of NsPubsubTopicKind.StaticSharding: - if x.kind != NsPubsubTopicKind.StaticSharding: - return false + if x.clusterId != y.clusterId: + return false - if x.clusterId != y.clusterId: - return false + if x.shardId != y.shardId: + return false - if x.shardId != y.shardId: - return false - of NsPubsubTopicKind.NamedSharding: - if x.kind != NsPubsubTopicKind.NamedSharding: - return false - - if x.name != y.name: - return false - - true + return true diff --git a/waku/waku_enr/sharding.nim b/waku/waku_enr/sharding.nim index 742688a07..8c7fdb363 100644 --- a/waku/waku_enr/sharding.nim +++ b/waku/waku_enr/sharding.nim @@ -67,12 +67,6 @@ func topicsToRelayShards*(topics: seq[string]): Result[Option[RelayShards], stri if res.isErr(): return err("failed to parse topic: " & $res.error) - if parsedTopicsRes.allIt(it.get().kind == NsPubsubTopicKind.NamedSharding): - return ok(none(RelayShards)) - - if parsedTopicsRes.anyIt(it.get().kind == NsPubsubTopicKind.NamedSharding): - return err("use named (/waku/2/*) OR static (/waku/2/rs/*/*) shards not both.") - if parsedTopicsRes.anyIt(it.get().clusterId != parsedTopicsRes[0].get().clusterId): return err("use shards with the same cluster Id.") @@ -84,15 +78,12 @@ func topicsToRelayShards*(topics: seq[string]): Result[Option[RelayShards], stri return ok(some(relayShard)) func contains*(rs: RelayShards, clusterId, shardId: uint16): bool = - rs.clusterId == clusterId and rs.shardIds.contains(shardId) + return rs.clusterId == clusterId and rs.shardIds.contains(shardId) func contains*(rs: RelayShards, topic: NsPubsubTopic): bool = - if topic.kind != NsPubsubTopicKind.StaticSharding: - return false + return rs.contains(topic.clusterId, topic.shardId) - rs.contains(topic.clusterId, topic.shardId) - -func contains*(rs: RelayShards, topic: PubsubTopic | string): bool = +func contains*(rs: RelayShards, topic: PubsubTopic): bool = let parseRes = NsPubsubTopic.parse(topic) if parseRes.isErr(): return false @@ -245,12 +236,9 @@ proc containsShard*(r: Record, clusterId, shardId: uint16): bool = rs.contains(clusterId, shardId) proc containsShard*(r: Record, topic: NsPubsubTopic): bool = - if topic.kind != NsPubsubTopicKind.StaticSharding: - return false + return containsShard(r, topic.clusterId, topic.shardId) - containsShard(r, topic.clusterId, topic.shardId) - -proc containsShard*(r: Record, topic: PubsubTopic | string): bool = +proc containsShard*(r: Record, topic: PubsubTopic): bool = let parseRes = NsPubsubTopic.parse(topic) if parseRes.isErr(): debug "invalid static sharding topic", topic = topic, error = parseRes.error diff --git a/waku/waku_metadata/protocol.nim b/waku/waku_metadata/protocol.nim index 2a0ba67d4..3eb898d54 100644 --- a/waku/waku_metadata/protocol.nim +++ b/waku/waku_metadata/protocol.nim @@ -130,9 +130,6 @@ proc subscriptionsListener(wm: WakuMetadata) {.async.} = let parsedTopic = NsPubsubTopic.parse(event.topic).valueOr: continue - if parsedTopic.kind != NsPubsubTopicKind.StaticSharding: - continue - if parsedTopic.clusterId != wm.clusterId: continue