qa: test we don't warn for ignored unknown version bits deployments
What changed, and why it matters
This commit only adds a new test case to Bitcoin Core's existing test suite. It checks that the software does not produce spurious warnings for version bits that belong to deployments that have been explicitly disabled/ignored. There is no change to production code, no bug fix, and no security vulnerability in the commit itself.
No action required. Review as normal QA/test-only change.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The diff modifies test/functional/feature_versionbits_warning.py to introduce an additional ignored version bit (bit 5) and verifies that, even after that deployment reaches ACTIVE state, no ‘Unknown new rules activated’ warning is emitted. The existing test for an actually unknown bit (bit 3) remains. This is purely a regression/behavioral test addition; no consensus, networking, or wallet code is touched.
Changed components
test/functional/feature_versionbits_warning.pyInspect captured patch +20 / −2
diff --git a/test/functional/feature_versionbits_warning.py b/test/functional/feature_versionbits_warning.py
index 1f858dc7..8bb457e2 100755
--- a/test/functional/feature_versionbits_warning.py
+++ b/test/functional/feature_versionbits_warning.py
@@ -18,8 +18,13 @@ from test_framework.test_framework import BitcoinTestFramework
VB_PERIOD = 144 # versionbits period length for regtest
VB_THRESHOLD = 108 # versionbits activation threshold for regtest
VB_TOP_BITS = 0x20000000
-VB_UNKNOWN_BIT = 3 # Choose a bit unassigned to any deployment
+
+# Choose a bit unassigned to any deployment, or start the
+# node with the deployment matching this bit disabled.
+VB_UNKNOWN_BIT = 3
VB_UNKNOWN_VERSION = VB_TOP_BITS | (1 << VB_UNKNOWN_BIT)
+VB_IGNORED_BIT = 5
+VB_IGNORED_VERSION = VB_TOP_BITS | (1 << VB_IGNORED_BIT)
WARN_UNKNOWN_RULES_ACTIVE = f"Unknown new rules activated (versionbit {VB_UNKNOWN_BIT})"
VB_PATTERN = re.compile("Unknown new rules activated.*versionbit")
@@ -76,11 +81,24 @@ class VersionBitsWarningTest(BitcoinTestFramework):
assert not VB_PATTERN.match(",".join(node.getmininginfo()["warnings"]))
assert not VB_PATTERN.match(",".join(node.getnetworkinfo()["warnings"]))
+ self.log.info("Check that there is no warning if previous VB_BLOCKS have VB_PERIOD blocks with ignored versionbits version.")
# Build one period of blocks with VB_THRESHOLD blocks signaling some unknown bit
- self.send_blocks_with_version(peer, VB_THRESHOLD, VB_UNKNOWN_VERSION)
+ self.send_blocks_with_version(peer, VB_THRESHOLD, VB_IGNORED_VERSION)
self.generatetoaddress(node, VB_PERIOD - VB_THRESHOLD, node_deterministic_address)
+ # Move the ignored deployment state to ACTIVE and make sure we're out of IBD.
+ self.generatetoaddress(node, VB_PERIOD, node_deterministic_address)
+ self.wait_until(lambda: not node.getblockchaininfo()['initialblockdownload'])
+
+ # Check that we're not getting any versionbit-related warnings in get*info()
+ assert not VB_PATTERN.match(", ".join(node.getmininginfo()["warnings"]))
+ assert not VB_PATTERN.match(", ".join(node.getnetworkinfo()["warnings"]))
+
self.log.info("Check that there is a warning if previous VB_BLOCKS have >=VB_THRESHOLD blocks with unknown versionbits version.")
+ # Build one period of blocks with VB_THRESHOLD blocks signaling some unknown bit
+ self.send_blocks_with_version(peer, VB_THRESHOLD, VB_UNKNOWN_VERSION)
+ self.generatetoaddress(node, VB_PERIOD - VB_THRESHOLD, node_deterministic_address)
+
# Mine a period worth of expected blocks so the generic block-version warning
# is cleared. This will move the versionbit state to ACTIVE.
self.generatetoaddress(node, VB_PERIOD, node_deterministic_address)
Why this scored 12/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.