From ba1870d114a9bf2d04692cc7bad2814a9234db66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?rich=CE=9Brd?= Date: Tue, 7 Jan 2025 09:29:39 -0400 Subject: [PATCH] feat(libwaku): add protected topic (#3211) --- library/libwaku.h | 7 +++++ library/libwaku.nim | 27 +++++++++++++++++ .../requests/protocols/relay_request.nim | 29 ++++++++++++++++--- 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/library/libwaku.h b/library/libwaku.h index c02f6da43..bd9b6bfed 100644 --- a/library/libwaku.h +++ b/library/libwaku.h @@ -84,6 +84,13 @@ int waku_relay_subscribe(void* ctx, WakuCallBack callback, void* userData); +int waku_relay_add_protected_shard(void* ctx, + int clusterId, + int shardId, + char* publicKey, + WakuCallBack callback, + void* userData); + int waku_relay_unsubscribe(void* ctx, const char* pubSubTopic, WakuCallBack callback, diff --git a/library/libwaku.nim b/library/libwaku.nim index 745937291..1488cebc1 100644 --- a/library/libwaku.nim +++ b/library/libwaku.nim @@ -386,6 +386,33 @@ proc waku_relay_subscribe( userData, ) +proc waku_relay_add_protected_shard( + ctx: ptr WakuContext, + clusterId: cint, + shardId: cint, + publicKey: cstring, + callback: WakuCallBack, + userData: pointer, +): cint {.dynlib, exportc, cdecl.} = + initializeLibrary() + checkLibwakuParams(ctx, callback, userData) + let pubk = publicKey.alloc() + defer: + deallocShared(pubk) + + handleRequest( + ctx, + RequestType.RELAY, + RelayRequest.createShared( + RelayMsgType.ADD_PROTECTED_SHARD, + clusterId = clusterId, + shardId = shardId, + publicKey = $pubk, + ), + callback, + userData, + ) + proc waku_relay_unsubscribe( ctx: ptr WakuContext, pubSubTopic: cstring, diff --git a/library/waku_thread/inter_thread_communication/requests/protocols/relay_request.nim b/library/waku_thread/inter_thread_communication/requests/protocols/relay_request.nim index 8672aae6d..126dc65d2 100644 --- a/library/waku_thread/inter_thread_communication/requests/protocols/relay_request.nim +++ b/library/waku_thread/inter_thread_communication/requests/protocols/relay_request.nim @@ -2,7 +2,7 @@ import std/net import chronicles, chronos, stew/byteutils, results import ../../../../../waku/waku_core/message/message, - ../../../../../waku/factory/waku, + ../../../../../waku/factory/[external_config, validator_signed, waku], ../../../../../waku/waku_core/message, ../../../../../waku/waku_core/time, # Timestamp ../../../../../waku/waku_core/topics/pubsub_topic, @@ -17,6 +17,7 @@ type RelayMsgType* = enum ## to return the list of all connected peers to an specific pubsub topic LIST_MESH_PEERS ## to return the list of only the peers that conform the mesh for a particular pubsub topic + ADD_PROTECTED_SHARD ## Protects a shard with a public key type ThreadSafeWakuMessage* = object payload: SharedSeq[byte] @@ -33,17 +34,26 @@ type RelayRequest* = object pubsubTopic: cstring relayEventCallback: WakuRelayHandler # not used in 'PUBLISH' requests message: ThreadSafeWakuMessage # only used in 'PUBLISH' requests + clusterId: cint # only used in 'ADD_PROTECTED_SHARD' requests + shardId: cint # only used in 'ADD_PROTECTED_SHARD' requests + publicKey: cstring # only used in 'ADD_PROTECTED_SHARD' requests proc createShared*( T: type RelayRequest, op: RelayMsgType, - pubsubTopic: PubsubTopic, + pubsubTopic: PubsubTopic = "", relayEventCallback: WakuRelayHandler = nil, m = WakuMessage(), + clusterId: cint = 0, + shardId: cint = 0, + publicKey: string = "", ): ptr type T = var ret = createShared(T) ret[].operation = op ret[].pubsubTopic = pubsubTopic.alloc() + ret[].clusterId = clusterId + ret[].shardId = shardId + ret[].publicKey = publicKey.alloc() ret[].relayEventCallback = relayEventCallback ret[].message = ThreadSafeWakuMessage( payload: allocSharedSeq(m.payload), @@ -64,7 +74,8 @@ proc destroyShared(self: ptr RelayRequest) = deallocSharedSeq(self[].message.meta) when defined(rln): deallocSharedSeq(self[].message.proof) - + deallocShared(self[].pubsubTopic) + deallocShared(self[].publicKey) deallocShared(self) proc toWakuMessage(m: ThreadSafeWakuMessage): WakuMessage = @@ -120,5 +131,15 @@ proc process*( error "LIST_MESH_PEERS failed", error = error return err($error) return ok($numPeersInMesh) - + of ADD_PROTECTED_SHARD: + try: + let relayShard = + RelayShard(clusterId: uint16(self.clusterId), shardId: uint16(self.shardId)) + let protectedShard = + ProtectedShard.parseCmdArg($relayShard & ":" & $self.publicKey) + waku.node.wakuRelay.addSignedShardsValidator( + @[protectedShard], uint16(self.clusterId) + ) + except ValueError: + return err("ADD_PROTECTED_SHARD exception: " & getCurrentExceptionMsg()) return ok("")