Skip to content

Commit

Permalink
use PushResponse in reputation manager
Browse files Browse the repository at this point in the history
  • Loading branch information
s-tikhomirov committed Feb 19, 2025
1 parent 96c881c commit 5c112aa
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 20 deletions.
28 changes: 14 additions & 14 deletions tests/incentivization/test_poc_reputation.nim
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,10 @@ import

import
waku/[node/peer_manager, waku_core],
waku/incentivization/[rpc, reputation_manager]
waku/incentivization/[rpc, reputation_manager],
waku/waku_lightpush/rpc

suite "Waku Incentivization PoC Reputation":
## Tests for a client-side reputation system as part of incentivization PoC.
## A client maintains a ReputationManager that tracks servers' reputation.
## A server's reputation depends on prior interactions with that server.
## TODO: think how to test reputation without integration with an actual protocol.

var manager {.threadvar.}: ReputationManager

setup:
Expand All @@ -30,12 +26,16 @@ suite "Waku Incentivization PoC Reputation":
manager.setReputation("peer1", true)
check manager.getReputation("peer1") == true

test "incentivization PoC: reputation: evaluate response":
let response = DummyResponse(peerId: "peer1", responseQuality: true)
check evaluateResponse(response) == true
test "incentivization PoC: reputation: evaluate DummyResponse":
let dummyResponse = DummyResponse(peerId: "peer1", responseQuality: true)
check evaluateResponse(dummyResponse) == true

test "incentivization PoC: reputation: evaluate PushResponse valid":
let validPR = PushResponse(isSuccess: true, info: some("Everything is OK"))
# We expect evaluateResponse to return true if isSuccess is true
check evaluateResponse(validPR) == true

test "incentivization PoC: reputation: update reputation with response":
let response = DummyResponse(peerId: "peer1", responseQuality: true)
let isGoodPeer = evaluateResponse(response)
manager.setReputation("peer1", isGoodPeer)
check manager.getReputation("peer1") == isGoodPeer
test "incentivization PoC: reputation: evaluate PushResponse invalid":
# For example, set isSuccess = false so we expect a returned false
let invalidPR = PushResponse(isSuccess: false, info: none(string))
check evaluateResponse(invalidPR) == false
16 changes: 10 additions & 6 deletions waku/incentivization/reputation_manager.nim
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import tables
import waku/waku_lightpush/rpc

type
PeerId = string
Expand All @@ -11,24 +12,27 @@ type
DummyResponse* = object
peerId*: PeerId
responseQuality*: ResponseQuality
# eligibility status omitted for brevity

proc init*(T: type ReputationManager): ReputationManager =
return ReputationManager(peerReputation: initTable[PeerId, ReputationIndicator]())

proc setReputation*(manager: var ReputationManager, peer: PeerId, reputationIndicator: ReputationIndicator) =
proc setReputation*(
manager: var ReputationManager,
peer: PeerId,
reputationIndicator: ReputationIndicator,
) =
manager.peerReputation[peer] = reputationIndicator

proc getReputation*(manager: ReputationManager, peer: PeerId): ReputationIndicator =
if peer in manager.peerReputation:
result = manager.peerReputation[peer]
else:
# Default reputation score if peer is not found
# We assume that peers are good unless they cheat
# Default to true if peer not found
result = true

proc evaluateResponse*(response: DummyResponse): ResponseQuality =
return response.responseQuality



# Evaluate a PushResponse by checking the isSuccess field.
proc evaluateResponse*(response: PushResponse): bool =
return response.isSuccess

0 comments on commit 5c112aa

Please sign in to comment.