[SEC] gossipsub - a peer score is not retained up until expiry if abusive peer unsubscribes (#534)
* [SEC] gossipsub - a peer score is not retained up until expiry if abusive peer unsubscribes Fixes #402 * remove debug logging
This commit is contained in:
parent
c1d8317e3c
commit
d7469b2286
|
@ -614,7 +614,7 @@ suite "GossipSub":
|
||||||
nodesFut = nodes.mapIt(it.switch.start())
|
nodesFut = nodes.mapIt(it.switch.start())
|
||||||
|
|
||||||
await allFuturesThrowing(nodes.mapIt(it.start()))
|
await allFuturesThrowing(nodes.mapIt(it.start()))
|
||||||
await subscribeNodes(nodes)
|
await subscribeSparseNodes(nodes)
|
||||||
|
|
||||||
var seen: Table[string, int]
|
var seen: Table[string, int]
|
||||||
var seenFut = newFuture[void]()
|
var seenFut = newFuture[void]()
|
||||||
|
@ -769,3 +769,101 @@ suite "GossipSub":
|
||||||
)
|
)
|
||||||
|
|
||||||
await allFuturesThrowing(nodesFut.concat())
|
await allFuturesThrowing(nodesFut.concat())
|
||||||
|
|
||||||
|
asyncTest "GossipsSub peers disconnections mechanics":
|
||||||
|
var runs = 10
|
||||||
|
|
||||||
|
let
|
||||||
|
nodes = generateNodes(runs, gossip = true, triggerSelf = true)
|
||||||
|
nodesFut = nodes.mapIt(it.switch.start())
|
||||||
|
|
||||||
|
await allFuturesThrowing(nodes.mapIt(it.start()))
|
||||||
|
await subscribeNodes(nodes)
|
||||||
|
|
||||||
|
var seen: Table[string, int]
|
||||||
|
var seenFut = newFuture[void]()
|
||||||
|
for i in 0..<nodes.len:
|
||||||
|
let dialer = nodes[i]
|
||||||
|
var handler: TopicHandler
|
||||||
|
closureScope:
|
||||||
|
var peerName = $dialer.peerInfo.peerId
|
||||||
|
handler = proc(topic: string, data: seq[byte]) {.async, gcsafe, closure.} =
|
||||||
|
if peerName notin seen:
|
||||||
|
seen[peerName] = 0
|
||||||
|
seen[peerName].inc
|
||||||
|
check topic == "foobar"
|
||||||
|
if not seenFut.finished() and seen.len >= runs:
|
||||||
|
seenFut.complete()
|
||||||
|
|
||||||
|
dialer.subscribe("foobar", handler)
|
||||||
|
await waitSub(nodes[0], dialer, "foobar")
|
||||||
|
|
||||||
|
# ensure peer stats are stored properly and kept properly
|
||||||
|
check:
|
||||||
|
GossipSub(nodes[0]).peerStats.len == runs - 1 # minus self
|
||||||
|
|
||||||
|
tryPublish await wait(nodes[0].publish("foobar",
|
||||||
|
toBytes("from node " &
|
||||||
|
$nodes[0].peerInfo.peerId)),
|
||||||
|
1.minutes), 1, 5.seconds
|
||||||
|
|
||||||
|
await wait(seenFut, 5.minutes)
|
||||||
|
check: seen.len >= runs
|
||||||
|
for k, v in seen.pairs:
|
||||||
|
check: v >= 1
|
||||||
|
|
||||||
|
for node in nodes:
|
||||||
|
var gossip = GossipSub(node)
|
||||||
|
check:
|
||||||
|
"foobar" in gossip.gossipsub
|
||||||
|
gossip.fanout.len == 0
|
||||||
|
gossip.mesh["foobar"].len > 0
|
||||||
|
|
||||||
|
# Removing some subscriptions
|
||||||
|
|
||||||
|
for i in 0..<runs:
|
||||||
|
if i mod 3 != 0:
|
||||||
|
nodes[i].unsubscribeAll("foobar")
|
||||||
|
|
||||||
|
# Waiting 2 heartbeats
|
||||||
|
|
||||||
|
for _ in 0..1:
|
||||||
|
for i in 0..<runs:
|
||||||
|
if i mod 3 == 0:
|
||||||
|
let evnt = newAsyncEvent()
|
||||||
|
GossipSub(nodes[i]).heartbeatEvents &= evnt
|
||||||
|
await evnt.wait()
|
||||||
|
|
||||||
|
# ensure peer stats are stored properly and kept properly
|
||||||
|
check:
|
||||||
|
GossipSub(nodes[0]).peerStats.len == runs - 1 # minus self
|
||||||
|
|
||||||
|
# Adding again subscriptions
|
||||||
|
|
||||||
|
proc handler(topic: string, data: seq[byte]) {.async, gcsafe.} =
|
||||||
|
check topic == "foobar"
|
||||||
|
|
||||||
|
for i in 0..<runs:
|
||||||
|
if i mod 3 != 0:
|
||||||
|
nodes[i].subscribe("foobar", handler)
|
||||||
|
|
||||||
|
# Waiting 2 heartbeats
|
||||||
|
|
||||||
|
for _ in 0..1:
|
||||||
|
for i in 0..<runs:
|
||||||
|
if i mod 3 == 0:
|
||||||
|
let evnt = newAsyncEvent()
|
||||||
|
GossipSub(nodes[i]).heartbeatEvents &= evnt
|
||||||
|
await evnt.wait()
|
||||||
|
|
||||||
|
# ensure peer stats are stored properly and kept properly
|
||||||
|
check:
|
||||||
|
GossipSub(nodes[0]).peerStats.len == runs - 1 # minus self
|
||||||
|
|
||||||
|
await allFuturesThrowing(
|
||||||
|
nodes.mapIt(
|
||||||
|
allFutures(
|
||||||
|
it.stop(),
|
||||||
|
it.switch.stop())))
|
||||||
|
|
||||||
|
await allFuturesThrowing(nodesFut)
|
||||||
|
|
Loading…
Reference in New Issue