@@ -91,6 +91,7 @@ def create_tx_below_mempoolminfee(self, wallet):
91
91
def test_basic_child_then_parent (self ):
92
92
node = self .nodes [0 ]
93
93
self .log .info ("Check that opportunistic 1p1c logic works when child is received before parent" )
94
+ node .setmocktime (int (time .time ()))
94
95
95
96
low_fee_parent = self .create_tx_below_mempoolminfee (self .wallet )
96
97
high_fee_child = self .wallet .create_self_transfer (utxo_to_spend = low_fee_parent ["new_utxo" ], fee_rate = 20 * FEERATE_1SAT_VB )
@@ -100,11 +101,13 @@ def test_basic_child_then_parent(self):
100
101
# 1. Child is received first (perhaps the low feerate parent didn't meet feefilter or the requests were sent to different nodes). It is missing an input.
101
102
high_child_wtxid_int = high_fee_child ["tx" ].wtxid_int
102
103
peer_sender .send_and_ping (msg_inv ([CInv (t = MSG_WTX , h = high_child_wtxid_int )]))
104
+ node .bumpmocktime (NONPREF_PEER_TX_DELAY )
103
105
peer_sender .wait_for_getdata ([high_child_wtxid_int ])
104
106
peer_sender .send_and_ping (msg_tx (high_fee_child ["tx" ]))
105
107
106
108
# 2. Node requests the missing parent by txid.
107
109
parent_txid_int = int (low_fee_parent ["txid" ], 16 )
110
+ node .bumpmocktime (NONPREF_PEER_TX_DELAY + TXID_RELAY_DELAY )
108
111
peer_sender .wait_for_getdata ([parent_txid_int ])
109
112
110
113
# 3. Sender relays the parent. Parent+Child are evaluated as a package and accepted.
@@ -120,6 +123,7 @@ def test_basic_child_then_parent(self):
120
123
@cleanup
121
124
def test_basic_parent_then_child (self , wallet ):
122
125
node = self .nodes [0 ]
126
+ node .setmocktime (int (time .time ()))
123
127
low_fee_parent = self .create_tx_below_mempoolminfee (wallet )
124
128
high_fee_child = wallet .create_self_transfer (utxo_to_spend = low_fee_parent ["new_utxo" ], fee_rate = 20 * FEERATE_1SAT_VB )
125
129
@@ -146,6 +150,7 @@ def test_basic_parent_then_child(self, wallet):
146
150
# 3. Node requests the missing parent by txid.
147
151
# It should do so even if it has previously rejected that parent for being too low feerate.
148
152
parent_txid_int = int (low_fee_parent ["txid" ], 16 )
153
+ node .bumpmocktime (TXID_RELAY_DELAY )
149
154
peer_sender .wait_for_getdata ([parent_txid_int ])
150
155
151
156
# 4. Sender re-relays the parent. Parent+Child are evaluated as a package and accepted.
@@ -159,6 +164,7 @@ def test_basic_parent_then_child(self, wallet):
159
164
@cleanup
160
165
def test_low_and_high_child (self , wallet ):
161
166
node = self .nodes [0 ]
167
+ node .setmocktime (int (time .time ()))
162
168
low_fee_parent = self .create_tx_below_mempoolminfee (wallet )
163
169
# This feerate is above mempoolminfee, but not enough to also bump the low feerate parent.
164
170
feerate_just_above = node .getmempoolinfo ()["mempoolminfee" ]
@@ -189,6 +195,7 @@ def test_low_and_high_child(self, wallet):
189
195
190
196
# 3. Node requests the orphan's missing parent.
191
197
parent_txid_int = int (low_fee_parent ["txid" ], 16 )
198
+ node .bumpmocktime (TXID_RELAY_DELAY )
192
199
peer_sender .wait_for_getdata ([parent_txid_int ])
193
200
194
201
# 4. The low parent + low child are submitted as a package. They are not accepted due to low package feerate.
@@ -216,6 +223,7 @@ def test_low_and_high_child(self, wallet):
216
223
# 6. Node requests the orphan's parent, even though it has already been rejected, both by
217
224
# itself and with a child. This is necessary, otherwise high_fee_child can be censored.
218
225
parent_txid_int = int (low_fee_parent ["txid" ], 16 )
226
+ node .bumpmocktime (TXID_RELAY_DELAY )
219
227
peer_sender .wait_for_getdata ([parent_txid_int ])
220
228
221
229
# 7. The low feerate parent + high feerate child are submitted as a package.
@@ -231,6 +239,7 @@ def test_low_and_high_child(self, wallet):
231
239
def test_orphan_consensus_failure (self ):
232
240
self .log .info ("Check opportunistic 1p1c logic requires parent and child to be from the same peer" )
233
241
node = self .nodes [0 ]
242
+ node .setmocktime (int (time .time ()))
234
243
low_fee_parent = self .create_tx_below_mempoolminfee (self .wallet )
235
244
coin = low_fee_parent ["new_utxo" ]
236
245
address = node .get_deterministic_priv_key ().address
@@ -246,11 +255,13 @@ def test_orphan_consensus_failure(self):
246
255
# 1. Child is received first. It is missing an input.
247
256
child_wtxid_int = tx_orphan_bad_wit .wtxid_int
248
257
bad_orphan_sender .send_and_ping (msg_inv ([CInv (t = MSG_WTX , h = child_wtxid_int )]))
258
+ node .bumpmocktime (NONPREF_PEER_TX_DELAY )
249
259
bad_orphan_sender .wait_for_getdata ([child_wtxid_int ])
250
260
bad_orphan_sender .send_and_ping (msg_tx (tx_orphan_bad_wit ))
251
261
252
262
# 2. Node requests the missing parent by txid.
253
263
parent_txid_int = int (low_fee_parent ["txid" ], 16 )
264
+ node .bumpmocktime (NONPREF_PEER_TX_DELAY + TXID_RELAY_DELAY )
254
265
bad_orphan_sender .wait_for_getdata ([parent_txid_int ])
255
266
256
267
# 3. A different peer relays the parent. Package is not evaluated because the transactions
@@ -273,6 +284,8 @@ def test_orphan_consensus_failure(self):
273
284
def test_parent_consensus_failure (self ):
274
285
self .log .info ("Check opportunistic 1p1c logic with consensus-invalid parent causes disconnect of the correct peer" )
275
286
node = self .nodes [0 ]
287
+ node .setmocktime (int (time .time ()))
288
+
276
289
low_fee_parent = self .create_tx_below_mempoolminfee (self .wallet )
277
290
high_fee_child = self .wallet .create_self_transfer (utxo_to_spend = low_fee_parent ["new_utxo" ], fee_rate = 999 * FEERATE_1SAT_VB )
278
291
@@ -287,11 +300,13 @@ def test_parent_consensus_failure(self):
287
300
# 1. Child is received first. It is missing an input.
288
301
child_wtxid_int = high_fee_child ["tx" ].wtxid_int
289
302
package_sender .send_and_ping (msg_inv ([CInv (t = MSG_WTX , h = child_wtxid_int )]))
303
+ node .bumpmocktime (NONPREF_PEER_TX_DELAY )
290
304
package_sender .wait_for_getdata ([child_wtxid_int ])
291
305
package_sender .send_and_ping (msg_tx (high_fee_child ["tx" ]))
292
306
293
307
# 2. Node requests the missing parent by txid.
294
308
parent_txid_int = tx_parent_bad_wit .txid_int
309
+ node .bumpmocktime (NONPREF_PEER_TX_DELAY + TXID_RELAY_DELAY )
295
310
package_sender .wait_for_getdata ([parent_txid_int ])
296
311
297
312
# 3. A different node relays the parent. The parent is first evaluated by itself and
@@ -309,6 +324,7 @@ def test_parent_consensus_failure(self):
309
324
# It can send the "real" parent transaction, and the package is accepted.
310
325
parent_wtxid_int = low_fee_parent ["tx" ].wtxid_int
311
326
package_sender .send_and_ping (msg_inv ([CInv (t = MSG_WTX , h = parent_wtxid_int )]))
327
+ node .bumpmocktime (NONPREF_PEER_TX_DELAY )
312
328
package_sender .wait_for_getdata ([parent_wtxid_int ])
313
329
package_sender .send_and_ping (msg_tx (low_fee_parent ["tx" ]))
314
330
@@ -355,6 +371,7 @@ def test_multiple_parents(self):
355
371
def test_other_parent_in_mempool (self ):
356
372
self .log .info ("Check opportunistic 1p1c fails if child already has another parent in mempool" )
357
373
node = self .nodes [0 ]
374
+ node .setmocktime (int (time .time ()))
358
375
359
376
# This parent needs CPFP
360
377
parent_low = self .create_tx_below_mempoolminfee (self .wallet )
@@ -376,6 +393,7 @@ def test_other_parent_in_mempool(self):
376
393
377
394
# 3. Node requests parent_low. However, 1p1c fails because package-not-child-with-unconfirmed-parents
378
395
parent_low_txid_int = int (parent_low ["txid" ], 16 )
396
+ node .bumpmocktime (NONPREF_PEER_TX_DELAY + TXID_RELAY_DELAY )
379
397
peer_sender .wait_for_getdata ([parent_low_txid_int ])
380
398
peer_sender .send_and_ping (msg_tx (parent_low ["tx" ]))
381
399
0 commit comments