forked from bitcoin/bitcoin
-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge bitcoin#19198: test: Check that peers with forcerelay permissio…
…n are not asked to feefilter fac63eb doc: Remove -whitelistforcerelay from comment (MarcoFalke) faabd15 test: Check that peers with forcerelay permission do not get a feefilter message (MarcoFalke) fad676b test: Add connect_nodes method (MarcoFalke) fac6ef4 test: Add test for no net permission (MarcoFalke) ffff3fe test: Replace self.nodes[0].p2p with conn (MarcoFalke) faccdc8 test: remove redundant generate (MarcoFalke) fab83b9 test: pep-8 p2p_feefilter.py (MarcoFalke) Pull request description: ACKs for top commit: jonatack: re-ACK fac63eb move-only change of two class member functions in test_framework.py and rebases since my review @ faccf0a per `git range-diff 4b5c919 faccf0a fac63eb`. Verified p2p_feefilter and p2p_permissions functional tests are running 🟢 locally. Tree-SHA512: 30a1c83baee15a4236d127d199c4f264852045372918d5aa5c09ef3d48041762ce3920ff86ef2466d4b2c792ddf56943d12b16c6dce34c6c5aea2a4af2eb4d49
- Loading branch information
Showing
4 changed files
with
63 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,11 +10,13 @@ | |
from test_framework.messages import MSG_TX, msg_feefilter | ||
from test_framework.mininode import mininode_lock, P2PInterface | ||
from test_framework.test_framework import BitcoinTestFramework | ||
from test_framework.util import assert_equal | ||
|
||
|
||
def hashToHex(hash): | ||
return format(hash, '064x') | ||
|
||
|
||
# Wait up to 60 secs to see if the testnode has received all the expected invs | ||
def allInvsMatch(invsExpected, testnode): | ||
for x in range(60): | ||
|
@@ -24,6 +26,18 @@ def allInvsMatch(invsExpected, testnode): | |
time.sleep(1) | ||
return False | ||
|
||
|
||
class FeefilterConn(P2PInterface): | ||
feefilter_received = False | ||
|
||
def on_feefilter(self, message): | ||
self.feefilter_received = True | ||
|
||
def assert_feefilter_received(self, recv: bool): | ||
with mininode_lock: | ||
assert_equal(self.feefilter_received, recv) | ||
|
||
|
||
class TestP2PConn(P2PInterface): | ||
def __init__(self): | ||
super().__init__() | ||
|
@@ -38,6 +52,7 @@ def clear_invs(self): | |
with mininode_lock: | ||
self.txinvs = [] | ||
|
||
|
||
class FeeFilterTest(BitcoinTestFramework): | ||
def set_test_params(self): | ||
self.num_nodes = 2 | ||
|
@@ -46,41 +61,54 @@ def set_test_params(self): | |
# mempool and wallet feerate calculation based on GetFee | ||
# rounding down 3 places, leading to stranded transactions. | ||
# See issue #16499 | ||
self.extra_args = [["-minrelaytxfee=0.00000100", "-mintxfee=0.00000100"]]*self.num_nodes | ||
self.extra_args = [["-minrelaytxfee=0.00000100", "-mintxfee=0.00000100"]] * self.num_nodes | ||
|
||
def skip_test_if_missing_module(self): | ||
self.skip_if_no_wallet() | ||
|
||
def run_test(self): | ||
self.test_feefilter_forcerelay() | ||
self.test_feefilter() | ||
|
||
def test_feefilter_forcerelay(self): | ||
self.log.info('Check that peers without forcerelay permission (default) get a feefilter message') | ||
self.nodes[0].add_p2p_connection(FeefilterConn()).assert_feefilter_received(True) | ||
|
||
self.log.info('Check that peers with forcerelay permission do not get a feefilter message') | ||
self.restart_node(0, extra_args=['[email protected]']) | ||
self.nodes[0].add_p2p_connection(FeefilterConn()).assert_feefilter_received(False) | ||
|
||
# Restart to disconnect peers and load default extra_args | ||
self.restart_node(0) | ||
self.connect_nodes(1, 0) | ||
|
||
def test_feefilter(self): | ||
node1 = self.nodes[1] | ||
node0 = self.nodes[0] | ||
# Get out of IBD | ||
node1.generate(1) | ||
self.sync_blocks() | ||
|
||
self.nodes[0].add_p2p_connection(TestP2PConn()) | ||
conn = self.nodes[0].add_p2p_connection(TestP2PConn()) | ||
|
||
# Test that invs are received by test connection for all txs at | ||
# feerate of .2 sat/byte | ||
node1.settxfee(Decimal("0.00000200")) | ||
txids = [node1.sendtoaddress(node1.getnewaddress(), 1) for x in range(3)] | ||
assert allInvsMatch(txids, self.nodes[0].p2p) | ||
self.nodes[0].p2p.clear_invs() | ||
assert allInvsMatch(txids, conn) | ||
conn.clear_invs() | ||
|
||
# Set a filter of .15 sat/byte on test connection | ||
self.nodes[0].p2p.send_and_ping(msg_feefilter(150)) | ||
conn.send_and_ping(msg_feefilter(150)) | ||
|
||
# Test that txs are still being received by test connection (paying .15 sat/byte) | ||
node1.settxfee(Decimal("0.00000150")) | ||
txids = [node1.sendtoaddress(node1.getnewaddress(), 1) for x in range(3)] | ||
assert allInvsMatch(txids, self.nodes[0].p2p) | ||
self.nodes[0].p2p.clear_invs() | ||
assert allInvsMatch(txids, conn) | ||
conn.clear_invs() | ||
|
||
# Change tx fee rate to .1 sat/byte and test they are no longer received | ||
# by the test connection | ||
node1.settxfee(Decimal("0.00000100")) | ||
[node1.sendtoaddress(node1.getnewaddress(), 1) for x in range(3)] | ||
self.sync_mempools() # must be sure node 0 has received all txs | ||
self.sync_mempools() # must be sure node 0 has received all txs | ||
|
||
# Send one transaction from node0 that should be received, so that we | ||
# we can sync the test on receipt (if node1's txs were relayed, they'd | ||
|
@@ -91,14 +119,15 @@ def run_test(self): | |
# as well. | ||
node0.settxfee(Decimal("0.00020000")) | ||
txids = [node0.sendtoaddress(node0.getnewaddress(), 1)] | ||
assert allInvsMatch(txids, self.nodes[0].p2p) | ||
self.nodes[0].p2p.clear_invs() | ||
assert allInvsMatch(txids, conn) | ||
conn.clear_invs() | ||
|
||
# Remove fee filter and check that txs are received again | ||
self.nodes[0].p2p.send_and_ping(msg_feefilter(0)) | ||
conn.send_and_ping(msg_feefilter(0)) | ||
txids = [node1.sendtoaddress(node1.getnewaddress(), 1) for x in range(3)] | ||
assert allInvsMatch(txids, self.nodes[0].p2p) | ||
self.nodes[0].p2p.clear_invs() | ||
assert allInvsMatch(txids, conn) | ||
conn.clear_invs() | ||
|
||
|
||
if __name__ == '__main__': | ||
FeeFilterTest().main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -42,6 +42,12 @@ def run_test(self): | |
["relay", "noban", "mempool"], | ||
True) | ||
|
||
self.checkpermission( | ||
# no permission (even with forcerelay) | ||
["[email protected]", "-whitelistforcerelay=1"], | ||
[], | ||
False) | ||
|
||
self.checkpermission( | ||
# relay permission removed (no specific permissions) | ||
["-whitelist=127.0.0.1", "-whitelistrelay=0"], | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters