From 22821c9612134db87fd64ce951fcfbe50b1c2c44 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Wed, 3 Jan 2024 02:00:16 +0300 Subject: [PATCH 1/3] fix: ignore triggers from the past when voting --- src/governance/governance.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/governance/governance.cpp b/src/governance/governance.cpp index 6544d0fa82291..1807ef82651f4 100644 --- a/src/governance/governance.cpp +++ b/src/governance/governance.cpp @@ -734,6 +734,10 @@ void CGovernanceManager::VoteGovernanceTriggers(const std::optionalGetBlockHeight() <= nCachedBlockHeight) { + // ignore triggers from the past + continue; + } const uint256 trigger_hash = trigger->GetGovernanceObject(*this)->GetHash(); if (trigger_hash == votedFundingYesTriggerHash) { // Skip actual trigger From 5df26e672291f323029ca373dd9c202ef91c9d5b Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sat, 6 Jan 2024 00:33:26 +0300 Subject: [PATCH 2/3] fix: log "not voting outdated trigger" --- src/governance/governance.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/governance/governance.cpp b/src/governance/governance.cpp index 1807ef82651f4..7ddc736d649cb 100644 --- a/src/governance/governance.cpp +++ b/src/governance/governance.cpp @@ -734,11 +734,12 @@ void CGovernanceManager::VoteGovernanceTriggers(const std::optionalGetGovernanceObject(*this)->GetHash(); if (trigger->GetBlockHeight() <= nCachedBlockHeight) { // ignore triggers from the past + LogPrint(BCLog::GOBJECT, "CGovernanceManager::%s Not voting NO-FUNDING for outdated trigger:%s\n", __func__, trigger_hash.ToString()); continue; } - const uint256 trigger_hash = trigger->GetGovernanceObject(*this)->GetHash(); if (trigger_hash == votedFundingYesTriggerHash) { // Skip actual trigger LogPrint(BCLog::GOBJECT, "CGovernanceManager::%s Not voting NO-FUNDING for trigger:%s, we voted yes for it already\n", __func__, trigger_hash.ToString()); From 4d940a51b55313c0e8f660f4531871c0547c6f95 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sat, 6 Jan 2024 01:52:12 +0300 Subject: [PATCH 3/3] tests: make sure we cast no NO votes for outdated triggers --- test/functional/feature_governance.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/test/functional/feature_governance.py b/test/functional/feature_governance.py index 3b076aa960dc7..0169896694a60 100755 --- a/test/functional/feature_governance.py +++ b/test/functional/feature_governance.py @@ -303,13 +303,34 @@ def sync_gov(node): self.check_superblockbudget(True) self.check_superblock() + # Move a few block past the recent superblock height and make sure we have no new votes + for _ in range(5): + with self.nodes[1].assert_debug_log("", [f"Voting NO-FUNDING for trigger:{winning_trigger_hash} success"]): + self.nodes[0].generate(1) + self.bump_mocktime(1) + self.sync_blocks() + # Votes on both triggers should NOT change + assert_equal(self.nodes[0].gobject("list", "valid", "triggers")[winning_trigger_hash]['NoCount'], 1) + assert_equal(self.nodes[0].gobject("list", "valid", "triggers")[isolated_trigger_hash]['NoCount'], self.mn_count - 1) + + block_count = self.nodes[0].getblockcount() + n = sb_cycle - block_count % sb_cycle + + # Move remaining n blocks until the next Superblock + for i in range(n): + self.nodes[0].generate(1) + self.bump_mocktime(1) + self.sync_blocks() + assert_equal(self.nodes[0].getblockcount(), 260) + assert_equal(self.nodes[0].getblockchaininfo()["softforks"]["v20"]["bip9"]["status"], "active") + # Mine and check a couple more superblocks for i in range(2): for _ in range(20): self.nodes[0].generate(1) self.bump_mocktime(1) self.sync_blocks() - assert_equal(self.nodes[0].getblockcount(), 240 + (i + 1) * 20) + assert_equal(self.nodes[0].getblockcount(), 260 + (i + 1) * 20) assert_equal(self.nodes[0].getblockchaininfo()["softforks"]["v20"]["bip9"]["status"], "active") self.check_superblockbudget(True) self.check_superblock()