mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-22 15:04:44 +01:00
test: use MiniWallet for p2p_filter.py
This test can now be run even with the Bitcoin Core wallet disabled.
This commit is contained in:
parent
6fc2cd3f09
commit
cfdb6baa22
1 changed files with 20 additions and 14 deletions
|
@ -8,6 +8,7 @@ Test BIP 37
|
||||||
|
|
||||||
from test_framework.messages import (
|
from test_framework.messages import (
|
||||||
CInv,
|
CInv,
|
||||||
|
COIN,
|
||||||
MAX_BLOOM_FILTER_SIZE,
|
MAX_BLOOM_FILTER_SIZE,
|
||||||
MAX_BLOOM_HASH_FUNCS,
|
MAX_BLOOM_HASH_FUNCS,
|
||||||
MSG_BLOCK,
|
MSG_BLOCK,
|
||||||
|
@ -28,11 +29,15 @@ from test_framework.p2p import (
|
||||||
)
|
)
|
||||||
from test_framework.script import MAX_SCRIPT_ELEMENT_SIZE
|
from test_framework.script import MAX_SCRIPT_ELEMENT_SIZE
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
|
from test_framework.wallet import (
|
||||||
|
MiniWallet,
|
||||||
|
random_p2wpkh,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class P2PBloomFilter(P2PInterface):
|
class P2PBloomFilter(P2PInterface):
|
||||||
# This is a P2SH watch-only wallet
|
# This is a P2SH watch-only wallet
|
||||||
watch_script_pubkey = 'a914ffffffffffffffffffffffffffffffffffffffff87'
|
watch_script_pubkey = bytes.fromhex('a914ffffffffffffffffffffffffffffffffffffffff87')
|
||||||
# The initial filter (n=10, fp=0.000001) with just the above scriptPubKey added
|
# The initial filter (n=10, fp=0.000001) with just the above scriptPubKey added
|
||||||
watch_filter_init = msg_filterload(
|
watch_filter_init = msg_filterload(
|
||||||
data=
|
data=
|
||||||
|
@ -93,8 +98,9 @@ class FilterTest(BitcoinTestFramework):
|
||||||
'-whitelist=noban@127.0.0.1', # immediate tx relay
|
'-whitelist=noban@127.0.0.1', # immediate tx relay
|
||||||
]]
|
]]
|
||||||
|
|
||||||
def skip_test_if_missing_module(self):
|
def generatetoscriptpubkey(self, scriptpubkey):
|
||||||
self.skip_if_no_wallet()
|
"""Helper to generate a single block to the given scriptPubKey."""
|
||||||
|
return self.generatetodescriptor(self.nodes[0], 1, f'raw({scriptpubkey.hex()})')[0]
|
||||||
|
|
||||||
def test_size_limits(self, filter_peer):
|
def test_size_limits(self, filter_peer):
|
||||||
self.log.info('Check that too large filter is rejected')
|
self.log.info('Check that too large filter is rejected')
|
||||||
|
@ -130,8 +136,7 @@ class FilterTest(BitcoinTestFramework):
|
||||||
filter_peer = P2PBloomFilter()
|
filter_peer = P2PBloomFilter()
|
||||||
|
|
||||||
self.log.debug("Create a tx relevant to the peer before connecting")
|
self.log.debug("Create a tx relevant to the peer before connecting")
|
||||||
filter_address = self.nodes[0].decodescript(filter_peer.watch_script_pubkey)['address']
|
txid, _ = self.wallet.send_to(from_node=self.nodes[0], scriptPubKey=filter_peer.watch_script_pubkey, amount=9 * COIN)
|
||||||
txid = self.nodes[0].sendtoaddress(filter_address, 90)
|
|
||||||
|
|
||||||
self.log.debug("Send a mempool msg after connecting and check that the tx is received")
|
self.log.debug("Send a mempool msg after connecting and check that the tx is received")
|
||||||
self.nodes[0].add_p2p_connection(filter_peer)
|
self.nodes[0].add_p2p_connection(filter_peer)
|
||||||
|
@ -142,8 +147,7 @@ class FilterTest(BitcoinTestFramework):
|
||||||
def test_frelay_false(self, filter_peer):
|
def test_frelay_false(self, filter_peer):
|
||||||
self.log.info("Check that a node with fRelay set to false does not receive invs until the filter is set")
|
self.log.info("Check that a node with fRelay set to false does not receive invs until the filter is set")
|
||||||
filter_peer.tx_received = False
|
filter_peer.tx_received = False
|
||||||
filter_address = self.nodes[0].decodescript(filter_peer.watch_script_pubkey)['address']
|
self.wallet.send_to(from_node=self.nodes[0], scriptPubKey=filter_peer.watch_script_pubkey, amount=9 * COIN)
|
||||||
self.nodes[0].sendtoaddress(filter_address, 90)
|
|
||||||
# Sync to make sure the reason filter_peer doesn't receive the tx is not p2p delays
|
# Sync to make sure the reason filter_peer doesn't receive the tx is not p2p delays
|
||||||
filter_peer.sync_with_ping()
|
filter_peer.sync_with_ping()
|
||||||
assert not filter_peer.tx_received
|
assert not filter_peer.tx_received
|
||||||
|
@ -156,45 +160,44 @@ class FilterTest(BitcoinTestFramework):
|
||||||
filter_peer.send_and_ping(filter_peer.watch_filter_init)
|
filter_peer.send_and_ping(filter_peer.watch_filter_init)
|
||||||
# If fRelay is not already True, sending filterload sets it to True
|
# If fRelay is not already True, sending filterload sets it to True
|
||||||
assert self.nodes[0].getpeerinfo()[0]['relaytxes']
|
assert self.nodes[0].getpeerinfo()[0]['relaytxes']
|
||||||
filter_address = self.nodes[0].decodescript(filter_peer.watch_script_pubkey)['address']
|
|
||||||
|
|
||||||
self.log.info('Check that we receive merkleblock and tx if the filter matches a tx in a block')
|
self.log.info('Check that we receive merkleblock and tx if the filter matches a tx in a block')
|
||||||
block_hash = self.generatetoaddress(self.nodes[0], 1, filter_address)[0]
|
block_hash = self.generatetoscriptpubkey(filter_peer.watch_script_pubkey)
|
||||||
txid = self.nodes[0].getblock(block_hash)['tx'][0]
|
txid = self.nodes[0].getblock(block_hash)['tx'][0]
|
||||||
filter_peer.wait_for_merkleblock(block_hash)
|
filter_peer.wait_for_merkleblock(block_hash)
|
||||||
filter_peer.wait_for_tx(txid)
|
filter_peer.wait_for_tx(txid)
|
||||||
|
|
||||||
self.log.info('Check that we only receive a merkleblock if the filter does not match a tx in a block')
|
self.log.info('Check that we only receive a merkleblock if the filter does not match a tx in a block')
|
||||||
filter_peer.tx_received = False
|
filter_peer.tx_received = False
|
||||||
block_hash = self.generatetoaddress(self.nodes[0], 1, self.nodes[0].getnewaddress())[0]
|
block_hash = self.generatetoscriptpubkey(random_p2wpkh())
|
||||||
filter_peer.wait_for_merkleblock(block_hash)
|
filter_peer.wait_for_merkleblock(block_hash)
|
||||||
assert not filter_peer.tx_received
|
assert not filter_peer.tx_received
|
||||||
|
|
||||||
self.log.info('Check that we not receive a tx if the filter does not match a mempool tx')
|
self.log.info('Check that we not receive a tx if the filter does not match a mempool tx')
|
||||||
filter_peer.merkleblock_received = False
|
filter_peer.merkleblock_received = False
|
||||||
filter_peer.tx_received = False
|
filter_peer.tx_received = False
|
||||||
self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 90)
|
self.wallet.send_to(from_node=self.nodes[0], scriptPubKey=random_p2wpkh(), amount=7 * COIN)
|
||||||
filter_peer.sync_send_with_ping()
|
filter_peer.sync_send_with_ping()
|
||||||
assert not filter_peer.merkleblock_received
|
assert not filter_peer.merkleblock_received
|
||||||
assert not filter_peer.tx_received
|
assert not filter_peer.tx_received
|
||||||
|
|
||||||
self.log.info('Check that we receive a tx if the filter matches a mempool tx')
|
self.log.info('Check that we receive a tx if the filter matches a mempool tx')
|
||||||
filter_peer.merkleblock_received = False
|
filter_peer.merkleblock_received = False
|
||||||
txid = self.nodes[0].sendtoaddress(filter_address, 90)
|
txid, _ = self.wallet.send_to(from_node=self.nodes[0], scriptPubKey=filter_peer.watch_script_pubkey, amount=9 * COIN)
|
||||||
filter_peer.wait_for_tx(txid)
|
filter_peer.wait_for_tx(txid)
|
||||||
assert not filter_peer.merkleblock_received
|
assert not filter_peer.merkleblock_received
|
||||||
|
|
||||||
self.log.info('Check that after deleting filter all txs get relayed again')
|
self.log.info('Check that after deleting filter all txs get relayed again')
|
||||||
filter_peer.send_and_ping(msg_filterclear())
|
filter_peer.send_and_ping(msg_filterclear())
|
||||||
for _ in range(5):
|
for _ in range(5):
|
||||||
txid = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 7)
|
txid, _ = self.wallet.send_to(from_node=self.nodes[0], scriptPubKey=random_p2wpkh(), amount=7 * COIN)
|
||||||
filter_peer.wait_for_tx(txid)
|
filter_peer.wait_for_tx(txid)
|
||||||
|
|
||||||
self.log.info('Check that request for filtered blocks is ignored if no filter is set')
|
self.log.info('Check that request for filtered blocks is ignored if no filter is set')
|
||||||
filter_peer.merkleblock_received = False
|
filter_peer.merkleblock_received = False
|
||||||
filter_peer.tx_received = False
|
filter_peer.tx_received = False
|
||||||
with self.nodes[0].assert_debug_log(expected_msgs=['received getdata']):
|
with self.nodes[0].assert_debug_log(expected_msgs=['received getdata']):
|
||||||
block_hash = self.generatetoaddress(self.nodes[0], 1, self.nodes[0].getnewaddress())[0]
|
block_hash = self.generatetoscriptpubkey(random_p2wpkh())
|
||||||
filter_peer.wait_for_inv([CInv(MSG_BLOCK, int(block_hash, 16))])
|
filter_peer.wait_for_inv([CInv(MSG_BLOCK, int(block_hash, 16))])
|
||||||
filter_peer.sync_with_ping()
|
filter_peer.sync_with_ping()
|
||||||
assert not filter_peer.merkleblock_received
|
assert not filter_peer.merkleblock_received
|
||||||
|
@ -210,6 +213,9 @@ class FilterTest(BitcoinTestFramework):
|
||||||
self.nodes[0].disconnect_p2ps()
|
self.nodes[0].disconnect_p2ps()
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
|
self.wallet = MiniWallet(self.nodes[0])
|
||||||
|
self.wallet.rescan_utxos()
|
||||||
|
|
||||||
filter_peer = self.nodes[0].add_p2p_connection(P2PBloomFilter())
|
filter_peer = self.nodes[0].add_p2p_connection(P2PBloomFilter())
|
||||||
self.log.info('Test filter size limits')
|
self.log.info('Test filter size limits')
|
||||||
self.test_size_limits(filter_peer)
|
self.test_size_limits(filter_peer)
|
||||||
|
|
Loading…
Add table
Reference in a new issue