aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorSebastian Falbesoner <sebastian.falbesoner@gmail.com>2022-10-19 19:22:28 +0200
committerSebastian Falbesoner <sebastian.falbesoner@gmail.com>2022-10-20 01:33:17 +0200
commitfa54d3011ed0cbb7bcdc76548423ba41f0042832 (patch)
tree16ef104f03aab69b111851b62cd6b065f9b41107 /test
parent3bca6cd61a8cd677023f18c146f2a6534829b1c7 (diff)
downloadbitcoin-fa54d3011ed0cbb7bcdc76548423ba41f0042832.tar.xz
test: check for false-positives in rpc_scanblocks.py
Diffstat (limited to 'test')
-rwxr-xr-xtest/functional/rpc_scanblocks.py26
1 files changed, 26 insertions, 0 deletions
diff --git a/test/functional/rpc_scanblocks.py b/test/functional/rpc_scanblocks.py
index 39f091fd1a..68c84b17a2 100755
--- a/test/functional/rpc_scanblocks.py
+++ b/test/functional/rpc_scanblocks.py
@@ -3,6 +3,10 @@
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Test the scanblocks RPC call."""
+from test_framework.blockfilter import (
+ bip158_basic_element_hash,
+ bip158_relevant_scriptpubkeys,
+)
from test_framework.messages import COIN
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import (
@@ -71,6 +75,28 @@ class ScanblocksTest(BitcoinTestFramework):
assert(blockhash in node.scanblocks(
"start", [{"desc": f"pkh({parent_key}/*)", "range": [0, 100]}], height)['relevant_blocks'])
+ # check that false-positives are included in the result now; note that
+ # finding a false-positive at runtime would take too long, hence we simply
+ # use a pre-calculated one that collides with the regtest genesis block's
+ # coinbase output and verify that their BIP158 ranged hashes match
+ genesis_blockhash = node.getblockhash(0)
+ genesis_spks = bip158_relevant_scriptpubkeys(node, genesis_blockhash)
+ assert_equal(len(genesis_spks), 1)
+ genesis_coinbase_spk = list(genesis_spks)[0]
+ false_positive_spk = bytes.fromhex("001400000000000000000000000000000000000cadcb")
+
+ genesis_coinbase_hash = bip158_basic_element_hash(genesis_coinbase_spk, 1, genesis_blockhash)
+ false_positive_hash = bip158_basic_element_hash(false_positive_spk, 1, genesis_blockhash)
+ assert_equal(genesis_coinbase_hash, false_positive_hash)
+
+ assert(genesis_blockhash in node.scanblocks(
+ "start", [{"desc": f"raw({genesis_coinbase_spk.hex()})"}], 0, 0)['relevant_blocks'])
+ assert(genesis_blockhash in node.scanblocks(
+ "start", [{"desc": f"raw({false_positive_spk.hex()})"}], 0, 0)['relevant_blocks'])
+
+ # TODO: after an "accurate" mode for scanblocks is implemented (e.g. PR #26325)
+ # check here that it filters out the false-positive
+
# test node with disabled blockfilterindex
assert_raises_rpc_error(-1, "Index is not enabled for filtertype basic",
self.nodes[1].scanblocks, "start", [f"addr({addr_1})"])