From c35cd6cbd4e853da2e9f9e1c1efca3be90c6f03d Mon Sep 17 00:00:00 2001 From: Hanno Cornelius <68783915+jm-clius@users.noreply.github.com> Date: Wed, 21 Jul 2021 14:22:40 +0200 Subject: [PATCH] Fix topic conversion in bridge (#679) --- CHANGELOG.md | 1 + tests/v2/test_waku_bridge.nim | 18 ++++++++++-------- waku/common/wakubridge.nim | 4 +++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89587b4f4..ecfc76c3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ This release contains the following: #### API ### Fixes +- Conversion between topics for the Waku v1 <-> v2 bridge now follows the [RFC recommendation](https://rfc.vac.dev/spec/23/) ## 2021-06-03 v0.4 diff --git a/tests/v2/test_waku_bridge.nim b/tests/v2/test_waku_bridge.nim index 0defda360..922b3ef6c 100644 --- a/tests/v2/test_waku_bridge.nim +++ b/tests/v2/test_waku_bridge.nim @@ -50,7 +50,7 @@ procSuite "WakuBridge": v2NodeKey = crypto.PrivateKey.random(Secp256k1, rng[])[] v2Node = WakuNode.new(v2NodeKey, ValidIpAddress.init("0.0.0.0"), Port(60002)) - contentTopic = ContentTopic("/waku/1/1a2b3c4d/rlp") + contentTopic = ContentTopic("/waku/1/0x1a2b3c4d/rlp") topic = [byte 0x1a, byte 0x2b, byte 0x3c, byte 0x4d] payloadV1 = "hello from V1".toBytes() payloadV2 = "hello from V2".toBytes() @@ -74,13 +74,15 @@ procSuite "WakuBridge": # Expected cases check: - toV1Topic(ContentTopic("/waku/1/00000000/rlp")) == [byte 0x00, byte 0x00, byte 0x00, byte 0x00] - toV2ContentTopic([byte 0x00, byte 0x00, byte 0x00, byte 0x00]) == ContentTopic("/waku/1/00000000/rlp") - toV1Topic(ContentTopic("/waku/1/ffffffff/rlp")) == [byte 0xff, byte 0xff, byte 0xff, byte 0xff] - toV2ContentTopic([byte 0xff, byte 0xff, byte 0xff, byte 0xff]) == ContentTopic("/waku/1/ffffffff/rlp") + toV1Topic(ContentTopic("/waku/1/0x00000000/rlp")) == [byte 0x00, byte 0x00, byte 0x00, byte 0x00] + toV2ContentTopic([byte 0x00, byte 0x00, byte 0x00, byte 0x00]) == ContentTopic("/waku/1/0x00000000/rlp") + toV1Topic(ContentTopic("/waku/1/0xffffffff/rlp")) == [byte 0xff, byte 0xff, byte 0xff, byte 0xff] + toV2ContentTopic([byte 0xff, byte 0xff, byte 0xff, byte 0xff]) == ContentTopic("/waku/1/0xffffffff/rlp") + toV1Topic(ContentTopic("/waku/1/0x1a2b3c4d/rlp")) == [byte 0x1a, byte 0x2b, byte 0x3c, byte 0x4d] + toV2ContentTopic([byte 0x1a, byte 0x2b, byte 0x3c, byte 0x4d]) == ContentTopic("/waku/1/0x1a2b3c4d/rlp") + # Topic conversion should still work where '0x' prefix is omitted from toV1Topic(ContentTopic("/waku/1/1a2b3c4d/rlp")) == [byte 0x1a, byte 0x2b, byte 0x3c, byte 0x4d] - toV2ContentTopic([byte 0x1a, byte 0x2b, byte 0x3c, byte 0x4d]) == ContentTopic("/waku/1/1a2b3c4d/rlp") - + # Invalid cases expect LPError: @@ -89,7 +91,7 @@ procSuite "WakuBridge": expect ValueError: # Content topic name too short - discard toV1Topic(ContentTopic("/waku/1/112233/rlp")) + discard toV1Topic(ContentTopic("/waku/1/0x112233/rlp")) expect ValueError: # Content topic name not hex diff --git a/waku/common/wakubridge.nim b/waku/common/wakubridge.nim index 48819e960..8d899233d 100644 --- a/waku/common/wakubridge.nim +++ b/waku/common/wakubridge.nim @@ -66,12 +66,14 @@ proc containsOrAdd(sequence: var seq[hashes.Hash], hash: hashes.Hash): bool = proc toV2ContentTopic*(v1Topic: waku_protocol.Topic): ContentTopic = ## Convert a 4-byte array v1 topic to a namespaced content topic ## with format `/waku/1//proto` + ## + ## should be prefixed with `0x` var namespacedTopic = NamespacedTopic() namespacedTopic.application = "waku" namespacedTopic.version = "1" - namespacedTopic.topicName = v1Topic.toHex() + namespacedTopic.topicName = "0x" & v1Topic.toHex() namespacedTopic.encoding = "rlp" return ContentTopic($namespacedTopic)