From 2a13ddffd4dc71c58c36c05a790cee70828997d2 Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Tue, 29 Oct 2024 13:05:38 +0100 Subject: [PATCH] refuse a proposal that was already received --- mysticeti/validator.nim | 2 ++ tests/mysticeti/validator/testMultiple.nim | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/mysticeti/validator.nim b/mysticeti/validator.nim index a27d115..e39ba41 100644 --- a/mysticeti/validator.nim +++ b/mysticeti/validator.nim @@ -114,6 +114,8 @@ func check*(validator: Validator, signed: SignedBlock): auto = missing.add(parent) if missing.len > 0: return BlockCheck.incomplete(missing) + if validator.rounds.latest.find(signed.blck.id).isSome: + return BlockCheck.invalid("block already received") BlockCheck.correct(signed) func receive*(validator: Validator, correct: CorrectBlock) = diff --git a/tests/mysticeti/validator/testMultiple.nim b/tests/mysticeti/validator/testMultiple.nim index c8b3d22..7795877 100644 --- a/tests/mysticeti/validator/testMultiple.nim +++ b/tests/mysticeti/validator/testMultiple.nim @@ -176,6 +176,12 @@ suite "Multiple Validators": check checked.verdict == BlockVerdict.invalid check checked.reason == "block has a round number that is too high" + test "refuses a proposal that was already received": + let proposals = exchangeProposals() + let checked = validators[1].check(proposals[0]) + check checked.verdict == BlockVerdict.invalid + check checked.reason == "block already received" + test "skips blocks that are ignored by >2f validators": # first round: other validators do not receive proposal from first validator let proposals = exchangeProposals {