@ -40,10 +40,13 @@ import os
import time
from test_framework . test_framework import BitcoinTestFramework
from test_framework . mininode import P2PTxInvStore
from test_framework . util import (
assert_equal ,
assert_greater_than_or_equal ,
assert_raises_rpc_error ,
connect_nodes ,
disconnect_nodes ,
wait_until ,
)
@ -80,6 +83,11 @@ class MempoolPersistTest(BitcoinTestFramework):
assert_greater_than_or_equal ( tx_creation_time , tx_creation_time_lower )
assert_greater_than_or_equal ( tx_creation_time_higher , tx_creation_time )
# disconnect nodes & make a txn that remains in the unbroadcast set.
disconnect_nodes ( self . nodes [ 0 ] , 2 )
self . nodes [ 0 ] . sendtoaddress ( self . nodes [ 2 ] . getnewaddress ( ) , Decimal ( " 12 " ) )
connect_nodes ( self . nodes [ 0 ] , 2 )
self . log . debug ( " Stop-start the nodes. Verify that node0 has the transactions in its mempool and node1 does not. Verify that node2 calculates its balance correctly after loading wallet transactions. " )
self . stop_nodes ( )
# Give this node a head-start, so we can be "extra-sure" that it didn't load anything later
@ -89,7 +97,7 @@ class MempoolPersistTest(BitcoinTestFramework):
self . start_node ( 2 )
wait_until ( lambda : self . nodes [ 0 ] . getmempoolinfo ( ) [ " loaded " ] , timeout = 1 )
wait_until ( lambda : self . nodes [ 2 ] . getmempoolinfo ( ) [ " loaded " ] , timeout = 1 )
assert_equal ( len ( self . nodes [ 0 ] . getrawmempool ( ) ) , 5 )
assert_equal ( len ( self . nodes [ 0 ] . getrawmempool ( ) ) , 6 )
assert_equal ( len ( self . nodes [ 2 ] . getrawmempool ( ) ) , 5 )
# The others have loaded their mempool. If node_1 loaded anything, we'd probably notice by now:
assert_equal ( len ( self . nodes [ 1 ] . getrawmempool ( ) ) , 0 )
@ -105,9 +113,10 @@ class MempoolPersistTest(BitcoinTestFramework):
self . nodes [ 2 ] . syncwithvalidationinterfacequeue ( ) # Flush mempool to wallet
assert_equal ( node2_balance , self . nodes [ 2 ] . getbalance ( ) )
# start node0 with wallet disabled so wallet transactions don't get resubmitted
self . log . debug ( " Stop-start node0 with -persistmempool=0. Verify that it doesn ' t load its mempool.dat file. " )
self . stop_nodes ( )
self . start_node ( 0 , extra_args = [ " -persistmempool=0 " ])
self . start_node ( 0 , extra_args = [ " -persistmempool=0 " , " -disablewallet " ])
wait_until ( lambda : self . nodes [ 0 ] . getmempoolinfo ( ) [ " loaded " ] )
assert_equal ( len ( self . nodes [ 0 ] . getrawmempool ( ) ) , 0 )
@ -115,7 +124,7 @@ class MempoolPersistTest(BitcoinTestFramework):
self . stop_nodes ( )
self . start_node ( 0 )
wait_until ( lambda : self . nodes [ 0 ] . getmempoolinfo ( ) [ " loaded " ] )
assert_equal ( len ( self . nodes [ 0 ] . getrawmempool ( ) ) , 5 )
assert_equal ( len ( self . nodes [ 0 ] . getrawmempool ( ) ) , 6 )
mempooldat0 = os . path . join ( self . nodes [ 0 ] . datadir , self . chain , ' mempool.dat ' )
mempooldat1 = os . path . join ( self . nodes [ 1 ] . datadir , self . chain , ' mempool.dat ' )
@ -124,12 +133,12 @@ class MempoolPersistTest(BitcoinTestFramework):
self . nodes [ 0 ] . savemempool ( )
assert os . path . isfile ( mempooldat0 )
self . log . debug ( " Stop nodes, make node1 use mempool.dat from node0. Verify it has 5 transactions" )
self . log . debug ( " Stop nodes, make node1 use mempool.dat from node0. Verify it has 6 transactions" )
os . rename ( mempooldat0 , mempooldat1 )
self . stop_nodes ( )
self . start_node ( 1 , extra_args = [ ] )
wait_until ( lambda : self . nodes [ 1 ] . getmempoolinfo ( ) [ " loaded " ] )
assert_equal ( len ( self . nodes [ 1 ] . getrawmempool ( ) ) , 5 )
assert_equal ( len ( self . nodes [ 1 ] . getrawmempool ( ) ) , 6 )
self . log . debug ( " Prevent bitcoind from writing mempool.dat to disk. Verify that `savemempool` fails " )
# to test the exception we are creating a tmp folder called mempool.dat.new
@ -139,6 +148,27 @@ class MempoolPersistTest(BitcoinTestFramework):
assert_raises_rpc_error ( - 1 , " Unable to dump mempool to disk " , self . nodes [ 1 ] . savemempool )
os . rmdir ( mempooldotnew1 )
self . test_persist_unbroadcast ( )
def test_persist_unbroadcast ( self ) :
node0 = self . nodes [ 0 ]
self . start_node ( 0 )
# clear out mempool
node0 . generate ( 1 )
# disconnect nodes to make a txn that remains in the unbroadcast set.
disconnect_nodes ( node0 , 1 )
node0 . sendtoaddress ( self . nodes [ 1 ] . getnewaddress ( ) , Decimal ( " 12 " ) )
# shutdown, then startup with wallet disabled
self . stop_nodes ( )
self . start_node ( 0 , extra_args = [ " -disablewallet " ] )
# check that txn gets broadcast due to unbroadcast logic
conn = node0 . add_p2p_connection ( P2PTxInvStore ( ) )
node0 . mockscheduler ( 16 * 60 ) # 15 min + 1 for buffer
wait_until ( lambda : len ( conn . get_invs ( ) ) == 1 )
if __name__ == ' __main__ ' :
MempoolPersistTest ( ) . main ( )