4646 assert_greater_than_or_equal ,
4747 assert_raises_rpc_error ,
4848)
49- from test_framework .wallet import MiniWallet
49+ from test_framework .wallet import MiniWallet , COIN
5050
5151
5252class MempoolPersistTest (BitcoinTestFramework ):
@@ -159,6 +159,16 @@ def run_test(self):
159159 assert self .nodes [0 ].getmempoolinfo ()["loaded" ]
160160 assert_equal (len (self .nodes [0 ].getrawmempool ()), 0 )
161161
162+ self .log .debug ("Import mempool at runtime to node0." )
163+ assert_equal ({}, self .nodes [0 ].importmempool (mempooldat0 ))
164+ assert_equal (len (self .nodes [0 ].getrawmempool ()), 7 )
165+ fees = self .nodes [0 ].getmempoolentry (txid = last_txid )["fees" ]
166+ assert_equal (fees ["base" ], fees ["modified" ])
167+ assert_equal ({}, self .nodes [0 ].importmempool (mempooldat0 , {"apply_fee_delta_priority" : True , "apply_unbroadcast_set" : True }))
168+ assert_equal (2 , self .nodes [0 ].getmempoolinfo ()["unbroadcastcount" ])
169+ fees = self .nodes [0 ].getmempoolentry (txid = last_txid )["fees" ]
170+ assert_equal (fees ["base" ] + Decimal ("0.00001000" ), fees ["modified" ])
171+
162172 self .log .debug ("Stop-start node0. Verify that it has the transactions in its mempool." )
163173 self .stop_nodes ()
164174 self .start_node (0 )
@@ -186,6 +196,7 @@ def run_test(self):
186196 assert_raises_rpc_error (- 1 , "Unable to dump mempool to disk" , self .nodes [1 ].savemempool )
187197 os .rmdir (mempooldotnew1 )
188198
199+ self .test_importmempool_union ()
189200 self .test_persist_unbroadcast ()
190201
191202 def test_persist_unbroadcast (self ):
@@ -210,6 +221,46 @@ def test_persist_unbroadcast(self):
210221 node0 .mockscheduler (16 * 60 ) # 15 min + 1 for buffer
211222 self .wait_until (lambda : len (conn .get_invs ()) == 1 )
212223
224+ def test_importmempool_union (self ):
225+ self .log .debug ("Submit different transactions to node0 and node1's mempools" )
226+ self .start_node (0 )
227+ self .start_node (2 )
228+ tx_node0 = self .mini_wallet .send_self_transfer (from_node = self .nodes [0 ])
229+ tx_node1 = self .mini_wallet .send_self_transfer (from_node = self .nodes [1 ])
230+ tx_node01 = self .mini_wallet .create_self_transfer ()
231+ tx_node01_secret = self .mini_wallet .create_self_transfer ()
232+ self .nodes [0 ].prioritisetransaction (tx_node01 ["txid" ], 0 , COIN )
233+ self .nodes [0 ].prioritisetransaction (tx_node01_secret ["txid" ], 0 , 2 * COIN )
234+ self .nodes [1 ].prioritisetransaction (tx_node01_secret ["txid" ], 0 , 3 * COIN )
235+ self .nodes [0 ].sendrawtransaction (tx_node01 ["hex" ])
236+ self .nodes [1 ].sendrawtransaction (tx_node01 ["hex" ])
237+ assert tx_node0 ["txid" ] in self .nodes [0 ].getrawmempool ()
238+ assert not tx_node0 ["txid" ] in self .nodes [1 ].getrawmempool ()
239+ assert not tx_node1 ["txid" ] in self .nodes [0 ].getrawmempool ()
240+ assert tx_node1 ["txid" ] in self .nodes [1 ].getrawmempool ()
241+ assert tx_node01 ["txid" ] in self .nodes [0 ].getrawmempool ()
242+ assert tx_node01 ["txid" ] in self .nodes [1 ].getrawmempool ()
243+ assert not tx_node01_secret ["txid" ] in self .nodes [0 ].getrawmempool ()
244+ assert not tx_node01_secret ["txid" ] in self .nodes [1 ].getrawmempool ()
245+
246+ self .log .debug ("Check that importmempool can add txns without replacing the entire mempool" )
247+ mempooldat0 = str (self .nodes [0 ].chain_path / "mempool.dat" )
248+ result0 = self .nodes [0 ].savemempool ()
249+ assert_equal (mempooldat0 , result0 ["filename" ])
250+ assert_equal ({}, self .nodes [1 ].importmempool (mempooldat0 , {"apply_fee_delta_priority" : True }))
251+ # All transactions should be in node1's mempool now.
252+ assert tx_node0 ["txid" ] in self .nodes [1 ].getrawmempool ()
253+ assert tx_node1 ["txid" ] in self .nodes [1 ].getrawmempool ()
254+ assert not tx_node1 ["txid" ] in self .nodes [0 ].getrawmempool ()
255+ # For transactions that already existed, priority should be changed
256+ entry_node01 = self .nodes [1 ].getmempoolentry (tx_node01 ["txid" ])
257+ assert_equal (entry_node01 ["fees" ]["base" ] + 1 , entry_node01 ["fees" ]["modified" ])
258+ # Deltas for not-yet-submitted transactions should be applied as well (prioritisation is stackable).
259+ self .nodes [1 ].sendrawtransaction (tx_node01_secret ["hex" ])
260+ entry_node01_secret = self .nodes [1 ].getmempoolentry (tx_node01_secret ["txid" ])
261+ assert_equal (entry_node01_secret ["fees" ]["base" ] + 5 , entry_node01_secret ["fees" ]["modified" ])
262+ self .stop_nodes ()
263+
213264
214265if __name__ == "__main__" :
215266 MempoolPersistTest ().main ()
0 commit comments