From a6b0dfcbfa25372967c2a4d8755b1f1eae28dfd0 Mon Sep 17 00:00:00 2001 From: stubbsta Date: Mon, 22 Jun 2026 10:25:35 +0200 Subject: [PATCH] extract generateRlnValidator into temp adapter dir --- logos_delivery/waku/node/waku_node/relay.nim | 1 + .../waku/waku_rln_relay/adapters/relay.nim | 82 +++++++++++++++++++ .../waku/waku_rln_relay/rln_relay.nim | 61 -------------- 3 files changed, 83 insertions(+), 61 deletions(-) create mode 100644 logos_delivery/waku/waku_rln_relay/adapters/relay.nim diff --git a/logos_delivery/waku/node/waku_node/relay.nim b/logos_delivery/waku/node/waku_node/relay.nim index 57904dc94..c1e79d44e 100644 --- a/logos_delivery/waku/node/waku_node/relay.nim +++ b/logos_delivery/waku/node/waku_node/relay.nim @@ -29,6 +29,7 @@ import waku_archive, waku_store_sync, waku_rln_relay, + waku_rln_relay/adapters/relay as waku_rln_relay_adapter, node/waku_node, node/subscription_manager, node/peer_manager, diff --git a/logos_delivery/waku/waku_rln_relay/adapters/relay.nim b/logos_delivery/waku/waku_rln_relay/adapters/relay.nim new file mode 100644 index 000000000..6ffbaf680 --- /dev/null +++ b/logos_delivery/waku/waku_rln_relay/adapters/relay.nim @@ -0,0 +1,82 @@ +{.push raises: [].} + +import + std/options, + chronicles, + chronos, + results, + stew/byteutils, + libp2p/protocols/pubsub/pubsub + +import + ../rln_relay, + ../protocol_types, + ../protocol_metrics, + ../conversion_utils + +import logos_delivery/waku/[waku_relay, waku_core] + +logScope: + topics = "waku rln_relay adapter" + +proc generateRlnValidator*( + wakuRlnRelay: WakuRLNRelay, spamHandler = none(SpamHandler) +): WakuValidatorHandler = + ## Bridges RLN's protocol-agnostic message validation into a relay + ## (gossipsub) validator. The core decision is made by + ## `validateMessageAndUpdateLog`; this adapter maps the result to + ## `pubsub.ValidationResult` so the validator can be installed on + ## WakuRelay's validator chain. + ## Validation logic follows https://rfc.vac.dev/spec/17/ + proc validator( + topic: string, message: WakuMessage + ): Future[pubsub.ValidationResult] {.async.} = + trace "rln-relay topic validator is called" + wakuRlnRelay.clearNullifierLog() + + let msgProof = RateLimitProof.init(message.proof).valueOr: + trace "generateRlnValidator reject", error = error + return pubsub.ValidationResult.Reject + + # validate the message and update log + let validationRes = await wakuRlnRelay.validateMessageAndUpdateLog(message) + + let + proof = byteutils.toHex(msgProof.proof) + epoch = fromEpoch(msgProof.epoch) + root = inHex(msgProof.merkleRoot) + shareX = inHex(msgProof.shareX) + shareY = inHex(msgProof.shareY) + nullifier = inHex(msgProof.nullifier) + payload = string.fromBytes(message.payload) + case validationRes + of Valid: + trace "message validity is verified, relaying", + proof = proof, + root = root, + shareX = shareX, + shareY = shareY, + nullifier = nullifier + waku_rln_valid_messages_total.inc(labelValues = [topic]) + return pubsub.ValidationResult.Accept + of Invalid: + trace "message validity could not be verified, discarding", + proof = proof, + root = root, + shareX = shareX, + shareY = shareY, + nullifier = nullifier + return pubsub.ValidationResult.Reject + of Spam: + trace "A spam message is found! yay! discarding:", + proof = proof, + root = root, + shareX = shareX, + shareY = shareY, + nullifier = nullifier + if spamHandler.isSome(): + let handler = spamHandler.get() + handler(message) + return pubsub.ValidationResult.Reject + + return validator diff --git a/logos_delivery/waku/waku_rln_relay/rln_relay.nim b/logos_delivery/waku/waku_rln_relay/rln_relay.nim index 7c325d3d5..59f62d03f 100644 --- a/logos_delivery/waku/waku_rln_relay/rln_relay.nim +++ b/logos_delivery/waku/waku_rln_relay/rln_relay.nim @@ -12,7 +12,6 @@ import web3/eth_api_types, eth/keys, libp2p/protocols/pubsub/rpc/messages, - libp2p/protocols/pubsub/pubsub, results, stew/[byteutils, arrayops], brokers/broker_context @@ -29,7 +28,6 @@ import import logos_delivery/waku/[ common/error_handling, - waku_relay, # for WakuRelayHandler waku_core, requests/rln_requests, waku_keystore, @@ -321,65 +319,6 @@ proc clearNullifierLog*(rlnPeer: WakuRlnRelay) = currentEpoch = currentEpoch, cleanedEpoch = fromEpoch(epochRemove) rlnPeer.nullifierLog.del(epochRemove) -proc generateRlnValidator*( - wakuRlnRelay: WakuRLNRelay, spamHandler = none(SpamHandler) -): WakuValidatorHandler = - ## this procedure is a thin wrapper for the pubsub addValidator method - ## it sets a validator for waku messages, acting in the registered pubsub topic - ## the message validation logic is according to https://rfc.vac.dev/spec/17/ - proc validator( - topic: string, message: WakuMessage - ): Future[pubsub.ValidationResult] {.async.} = - trace "rln-relay topic validator is called" - wakuRlnRelay.clearNullifierLog() - - let msgProof = RateLimitProof.init(message.proof).valueOr: - trace "generateRlnValidator reject", error = error - return pubsub.ValidationResult.Reject - - # validate the message and update log - let validationRes = await wakuRlnRelay.validateMessageAndUpdateLog(message) - - let - proof = byteutils.toHex(msgProof.proof) - epoch = fromEpoch(msgProof.epoch) - root = inHex(msgProof.merkleRoot) - shareX = inHex(msgProof.shareX) - shareY = inHex(msgProof.shareY) - nullifier = inHex(msgProof.nullifier) - payload = string.fromBytes(message.payload) - case validationRes - of Valid: - trace "message validity is verified, relaying", - proof = proof, - root = root, - shareX = shareX, - shareY = shareY, - nullifier = nullifier - waku_rln_valid_messages_total.inc(labelValues = [topic]) - return pubsub.ValidationResult.Accept - of Invalid: - trace "message validity could not be verified, discarding", - proof = proof, - root = root, - shareX = shareX, - shareY = shareY, - nullifier = nullifier - return pubsub.ValidationResult.Reject - of Spam: - trace "A spam message is found! yay! discarding:", - proof = proof, - root = root, - shareX = shareX, - shareY = shareY, - nullifier = nullifier - if spamHandler.isSome(): - let handler = spamHandler.get() - handler(message) - return pubsub.ValidationResult.Reject - - return validator - proc monitorEpochs(wakuRlnRelay: WakuRLNRelay) {.async.} = while true: try: