35
35
bip112txs_vary_OP_CSV - 16 txs with nSequence = 10 evaluated against varying {relative_locktimes of 10} OP_CSV OP_DROP
36
36
bip112txs_vary_OP_CSV_9 - 16 txs with nSequence = 9 evaluated against varying {relative_locktimes of 10} OP_CSV OP_DROP
37
37
bip112tx_special - test negative argument to OP_CSV
38
+ bip112tx_emptystack - test empty stack (= no argument) OP_CSV
38
39
"""
39
40
from decimal import Decimal
40
41
from itertools import product
@@ -95,6 +96,13 @@ def create_bip112special(node, input, txversion, address):
95
96
signtx .vin [0 ].scriptSig = CScript ([- 1 , OP_CHECKSEQUENCEVERIFY , OP_DROP ] + list (CScript (signtx .vin [0 ].scriptSig )))
96
97
return signtx
97
98
99
+ def create_bip112emptystack (node , input , txversion , address ):
100
+ tx = create_transaction (node , input , address , amount = Decimal ("49.98" ))
101
+ tx .nVersion = txversion
102
+ signtx = sign_transaction (node , tx )
103
+ signtx .vin [0 ].scriptSig = CScript ([OP_CHECKSEQUENCEVERIFY ] + list (CScript (signtx .vin [0 ].scriptSig )))
104
+ return signtx
105
+
98
106
def send_generic_input_tx (node , coinbases , address ):
99
107
return node .sendrawtransaction (ToHex (sign_transaction (node , create_transaction (node , node .getblock (coinbases .pop ())['tx' ][0 ], address , amount = Decimal ("49.99" )))))
100
108
@@ -179,15 +187,15 @@ def run_test(self):
179
187
self .log .info ("Generate blocks in the past for coinbase outputs." )
180
188
long_past_time = int (time .time ()) - 600 * 1000 # enough to build up to 1000 blocks 10 minutes apart without worrying about getting into the future
181
189
self .nodes [0 ].setmocktime (long_past_time - 100 ) # enough so that the generated blocks will still all be before long_past_time
182
- self .coinbase_blocks = self .nodes [0 ].generate (1 + 16 + 2 * 32 + 1 ) # 82 blocks generated for inputs
190
+ self .coinbase_blocks = self .nodes [0 ].generate (1 + 16 + 2 * 32 + 2 ) # 83 blocks generated for inputs
183
191
self .nodes [0 ].setmocktime (0 ) # set time back to present so yielded blocks aren't in the future as we advance last_block_time
184
- self .tipheight = 82 # height of the next block to build
192
+ self .tipheight = 83 # height of the next block to build
185
193
self .last_block_time = long_past_time
186
194
self .tip = int (self .nodes [0 ].getbestblockhash (), 16 )
187
195
self .nodeaddress = self .nodes [0 ].getnewaddress ()
188
196
189
197
# Activation height is hardcoded
190
- test_blocks = self .generate_blocks (345 )
198
+ test_blocks = self .generate_blocks (344 )
191
199
self .send_blocks (test_blocks )
192
200
assert not softfork_active (self .nodes [0 ], 'csv' )
193
201
@@ -218,6 +226,8 @@ def run_test(self):
218
226
219
227
# 1 special input with -1 OP_CSV OP_DROP (actually will be prepended to spending scriptSig)
220
228
bip112specialinput = send_generic_input_tx (self .nodes [0 ], self .coinbase_blocks , self .nodeaddress )
229
+ # 1 special input with (empty stack) OP_CSV (actually will be prepended to spending scriptSig)
230
+ bip112emptystackinput = send_generic_input_tx (self .nodes [0 ],self .coinbase_blocks , self .nodeaddress )
221
231
222
232
# 1 normal input
223
233
bip113input = send_generic_input_tx (self .nodes [0 ], self .coinbase_blocks , self .nodeaddress )
@@ -228,7 +238,7 @@ def run_test(self):
228
238
self .tip = int (inputblockhash , 16 )
229
239
self .tipheight += 1
230
240
self .last_block_time += 600
231
- assert_equal (len (self .nodes [0 ].getblock (inputblockhash , True )["tx" ]), 82 + 1 )
241
+ assert_equal (len (self .nodes [0 ].getblock (inputblockhash , True )["tx" ]), 83 + 1 )
232
242
233
243
# 2 more version 4 blocks
234
244
test_blocks = self .generate_blocks (2 )
@@ -267,18 +277,22 @@ def run_test(self):
267
277
# -1 OP_CSV OP_DROP input
268
278
bip112tx_special_v1 = create_bip112special (self .nodes [0 ], bip112specialinput , 1 , self .nodeaddress )
269
279
bip112tx_special_v2 = create_bip112special (self .nodes [0 ], bip112specialinput , 2 , self .nodeaddress )
280
+ # (empty stack) OP_CSV input
281
+ bip112tx_emptystack_v1 = create_bip112emptystack (self .nodes [0 ], bip112emptystackinput , 1 , self .nodeaddress )
282
+ bip112tx_emptystack_v2 = create_bip112emptystack (self .nodes [0 ], bip112emptystackinput , 2 , self .nodeaddress )
270
283
271
284
self .log .info ("TESTING" )
272
285
273
286
self .log .info ("Pre-Soft Fork Tests. All txs should pass." )
274
287
self .log .info ("Test version 1 txs" )
275
288
276
289
success_txs = []
277
- # add BIP113 tx and -1 CSV tx
290
+ # BIP113 tx, -1 CSV tx and empty stack CSV tx should succeed
278
291
bip113tx_v1 .nLockTime = self .last_block_time - 600 * 5 # = MTP of prior block (not <) but < time put on current block
279
292
bip113signed1 = sign_transaction (self .nodes [0 ], bip113tx_v1 )
280
293
success_txs .append (bip113signed1 )
281
294
success_txs .append (bip112tx_special_v1 )
295
+ success_txs .append (bip112tx_emptystack_v1 )
282
296
# add BIP 68 txs
283
297
success_txs .extend (all_rlt_txs (bip68txs_v1 ))
284
298
# add BIP 112 with seq=10 txs
@@ -293,11 +307,12 @@ def run_test(self):
293
307
self .log .info ("Test version 2 txs" )
294
308
295
309
success_txs = []
296
- # add BIP113 tx and -1 CSV tx
310
+ # BIP113 tx, -1 CSV tx and empty stack CSV tx should succeed
297
311
bip113tx_v2 .nLockTime = self .last_block_time - 600 * 5 # = MTP of prior block (not <) but < time put on current block
298
312
bip113signed2 = sign_transaction (self .nodes [0 ], bip113tx_v2 )
299
313
success_txs .append (bip113signed2 )
300
314
success_txs .append (bip112tx_special_v2 )
315
+ success_txs .append (bip112tx_emptystack_v2 )
301
316
# add BIP 68 txs
302
317
success_txs .extend (all_rlt_txs (bip68txs_v2 ))
303
318
# add BIP 112 with seq=10 txs
@@ -385,8 +400,9 @@ def run_test(self):
385
400
self .log .info ("BIP 112 tests" )
386
401
self .log .info ("Test version 1 txs" )
387
402
388
- # -1 OP_CSV tx should fail
403
+ # -1 OP_CSV tx and (empty stack) OP_CSV tx should fail
389
404
self .send_blocks ([self .create_test_block ([bip112tx_special_v1 ])], success = False )
405
+ self .send_blocks ([self .create_test_block ([bip112tx_emptystack_v1 ])], success = False )
390
406
# If SEQUENCE_LOCKTIME_DISABLE_FLAG is set in argument to OP_CSV, version 1 txs should still pass
391
407
392
408
success_txs = [tx ['tx' ] for tx in bip112txs_vary_OP_CSV_v1 if tx ['sdf' ]]
@@ -404,8 +420,9 @@ def run_test(self):
404
420
405
421
self .log .info ("Test version 2 txs" )
406
422
407
- # -1 OP_CSV tx should fail
423
+ # -1 OP_CSV tx and (empty stack) OP_CSV tx should fail
408
424
self .send_blocks ([self .create_test_block ([bip112tx_special_v2 ])], success = False )
425
+ self .send_blocks ([self .create_test_block ([bip112tx_emptystack_v2 ])], success = False )
409
426
410
427
# If SEQUENCE_LOCKTIME_DISABLE_FLAG is set in argument to OP_CSV, version 2 txs should pass (all sequence locks are met)
411
428
success_txs = [tx ['tx' ] for tx in bip112txs_vary_OP_CSV_v2 if tx ['sdf' ]]
@@ -449,7 +466,5 @@ def run_test(self):
449
466
self .send_blocks ([self .create_test_block (time_txs )])
450
467
self .nodes [0 ].invalidateblock (self .nodes [0 ].getbestblockhash ())
451
468
452
- # TODO: Test empty stack fails
453
-
454
469
if __name__ == '__main__' :
455
470
BIP68_112_113Test ().main ()
0 commit comments