46
46
assert_greater_than_or_equal ,
47
47
assert_raises_rpc_error ,
48
48
)
49
- from test_framework .wallet import MiniWallet
49
+ from test_framework .wallet import MiniWallet , COIN
50
50
51
51
52
52
class MempoolPersistTest (BitcoinTestFramework ):
@@ -159,6 +159,16 @@ def run_test(self):
159
159
assert self .nodes [0 ].getmempoolinfo ()["loaded" ]
160
160
assert_equal (len (self .nodes [0 ].getrawmempool ()), 0 )
161
161
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
+
162
172
self .log .debug ("Stop-start node0. Verify that it has the transactions in its mempool." )
163
173
self .stop_nodes ()
164
174
self .start_node (0 )
@@ -186,6 +196,7 @@ def run_test(self):
186
196
assert_raises_rpc_error (- 1 , "Unable to dump mempool to disk" , self .nodes [1 ].savemempool )
187
197
os .rmdir (mempooldotnew1 )
188
198
199
+ self .test_importmempool_union ()
189
200
self .test_persist_unbroadcast ()
190
201
191
202
def test_persist_unbroadcast (self ):
@@ -210,6 +221,46 @@ def test_persist_unbroadcast(self):
210
221
node0 .mockscheduler (16 * 60 ) # 15 min + 1 for buffer
211
222
self .wait_until (lambda : len (conn .get_invs ()) == 1 )
212
223
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
+
213
264
214
265
if __name__ == "__main__" :
215
266
MempoolPersistTest ().main ()
0 commit comments