Bitcoin ABC 0.26.3
P2P Digital Currency
Loading...
Searching...
No Matches
test_iguana.py
Go to the documentation of this file.
1# Copyright (c) 2024 The Bitcoin developers
2# Distributed under the MIT software license, see the accompanying
3# file COPYING or http://www.opensource.org/licenses/mit-license.php.
4"""Test the Iguana Script debugger."""
5
6import os
7import subprocess
8
9from test_framework.hash import hash160
10from test_framework.key import ECKey
11from test_framework.messages import COutPoint, CTransaction, CTxIn
12from test_framework.script import (
13 OP_2DUP,
14 OP_ADD,
15 OP_CHECKSIG,
16 OP_CHECKSIGVERIFY,
17 OP_DROP,
18 OP_DUP,
19 OP_EQUAL,
20 OP_HASH160,
21 OP_NOP,
22 OP_NOT,
23 OP_TOALTSTACK,
24 CScript,
25)
27 SIGHASH_ALL,
28 SIGHASH_FORKID,
29 SignatureHashForkId,
30)
31
32
33def iguana(*args, expected_stderr="", expected_returncode=None):
34 if expected_returncode is None:
35 expected_returncode = 255 if expected_stderr else 0
36
37 command = [os.environ["IGUANA_BIN"], *args]
38 if emulator := os.environ.get("EMULATOR", None):
39 command.insert(0, emulator)
40
41 child = subprocess.Popen(
42 command,
43 stdout=subprocess.PIPE,
44 stderr=subprocess.PIPE,
45 )
46 actual_stdout, actual_stderr = child.communicate()
47 assert actual_stderr.decode() == expected_stderr
48 assert child.returncode == expected_returncode
50
51
53 assert iguana("-version").startswith(
54 f"Iguana v{os.environ['CMAKE_PROJECT_VERSION']}"
55 )
56
57
59 assert iguana("-?").startswith("Usage: iguana")
60
61
63 iguana(
64 "-invalidarg",
65 expected_stderr="Error parsing command line arguments: Invalid parameter -invalidarg\n",
66 )
67
68
70 iguana(
71 "-format=doesntexist",
72 expected_stderr="Unsupported output format doesntexist\n",
73 )
74
75
77 tx = CTransaction()
78 iguana(
79 "-tx=" + tx.serialize().hex(),
80 "-inputindex=0",
81 "-scriptpubkey=",
82 "-value=0",
83 expected_stderr="Transaction doesn't have input index 0\n",
84 )
85
86
88 tx = CTransaction()
89 tx.vin = [CTxIn(COutPoint(), CScript([b"\x31", OP_DUP]))]
90
91 def run(fmt, expected_stderr):
92 return iguana(
93 "-tx=" + tx.serialize().hex(),
94 "-inputindex=0",
95 "-scriptpubkey=",
96 "-value=0",
97 f"-format={fmt}",
98 expected_stderr=expected_stderr,
99 expected_returncode=255,
100 )
101
102 assert (
103 run(
104 "human",
105 expected_stderr="scriptSig failed execution: Only push operators allowed in signatures\n",
106 )
107 == """\
108======= scriptSig =======
109 Stack (0 items): (empty stack)
110OP 0: 0x01 31
111 Stack (1 item):
112 0: 31
113OP 1: OP_DUP
114"""
115 )
116 assert (
117 run("csv", "")
118 == """\
119scriptName,index,opcode,stack 0,
120scriptSig,0,0x31,"31",
121scriptSig,1,OP_DUP,
122scriptSig failed execution: Only push operators allowed in signatures
123"""
124 )
125
126
128 tx = CTransaction()
129 tx.vin = [CTxIn(COutPoint(), CScript([b"\x31"]))]
130
131 def run(fmt):
132 return iguana(
133 "-tx=" + tx.serialize().hex(),
134 "-inputindex=0",
135 "-scriptpubkey=",
136 "-value=0",
137 f"-format={fmt}",
138 )
139
140 assert (
141 run("human")
142 == """\
143======= scriptSig =======
144 Stack (0 items): (empty stack)
145OP 0: 0x01 31
146======= scriptPubKey =======
147 Stack (1 item):
148 0: 31
149Script executed without errors
150"""
151 )
152 assert (
153 run("csv")
154 == """\
155scriptName,index,opcode,stack 0,
156scriptSig,0,0x31,"31",
157#sigChecks,0
158Script executed without errors
159"""
160 )
161
162
164 tx = CTransaction()
165 tx.vin = [CTxIn(COutPoint(), CScript(b"\x01"))]
166
167 def run(fmt, expected_stderr):
168 return iguana(
169 "-tx=" + tx.serialize().hex(),
170 "-inputindex=0",
171 "-scriptpubkey=",
172 "-value=0",
173 f"-format={fmt}",
174 expected_stderr=expected_stderr,
175 expected_returncode=255,
176 )
177
178 assert (
179 run(
180 "human",
181 expected_stderr="scriptSig failed execution: Invalidly encoded opcode\n",
182 )
183 == """\
184======= scriptSig =======
185 Stack (0 items): (empty stack)
186"""
187 )
188 assert (
189 run("csv", "")
190 == """\
191scriptName,index,opcode,
192scriptSig failed execution: Invalidly encoded opcode
193"""
194 )
195
196
198 tx = CTransaction()
199 tx.vin = [CTxIn(COutPoint(), CScript([b"\x31", b"\x32"]))]
200 script_pub_key = CScript([OP_ADD, b"\x63", OP_EQUAL])
201
202 def run(fmt):
203 return iguana(
204 "-tx=" + tx.serialize().hex(),
205 "-inputindex=0",
206 "-scriptpubkey=" + script_pub_key.hex(),
207 "-value=0",
208 f"-format={fmt}",
209 )
210
211 assert (
212 run("human")
213 == """\
214======= scriptSig =======
215 Stack (0 items): (empty stack)
216OP 0: 0x01 31
217 Stack (1 item):
218 0: 31
219OP 1: 0x01 32
220======= scriptPubKey =======
221 Stack (2 items):
222 0: 31
223 1: 32
224OP 0: OP_ADD
225 Stack (1 item):
226 0: 63
227OP 1: 0x01 63
228 Stack (2 items):
229 0: 63
230 1: 63
231OP 2: OP_EQUAL
232 Stack (1 item):
233 0: 01
234Script executed without errors
235"""
236 )
237 assert (
238 run("csv")
239 == """\
240scriptName,index,opcode,stack 0,stack 1,
241scriptSig,0,0x31,"31",
242scriptSig,1,0x32,"31","32",
243scriptPubKey,0,OP_ADD,"63",
244scriptPubKey,1,0x63,"63","63",
245scriptPubKey,2,OP_EQUAL,"01",
246#sigChecks,0
247Script executed without errors
248"""
249 )
250
251
253 tx = CTransaction()
254 tx.vin = [CTxIn(COutPoint(), CScript([b"\x31"]))]
255 script_pub_key = CScript([OP_EQUAL])
256 stdout = iguana(
257 "-tx=" + tx.serialize().hex(),
258 "-inputindex=0",
259 "-scriptpubkey=" + script_pub_key.hex(),
260 "-value=0",
261 expected_stderr="scriptPubKey failed execution: Operation not valid with the current stack size\n",
262 )
263 assert (
264 stdout
265 == """\
266======= scriptSig =======
267 Stack (0 items): (empty stack)
268OP 0: 0x01 31
269======= scriptPubKey =======
270 Stack (1 item):
271 0: 31
272OP 0: OP_EQUAL
273"""
274 )
275
276
278 tx = CTransaction()
279 tx.vin = [CTxIn(COutPoint(), CScript([b"\x31"]))]
280 script_pub_key = CScript([OP_DROP])
281 stdout = iguana(
282 "-tx=" + tx.serialize().hex(),
283 "-inputindex=0",
284 "-scriptpubkey=" + script_pub_key.hex(),
285 "-value=0",
286 expected_stderr="scriptPubKey failed execution: Script evaluated without error but finished with a false/empty top stack element\n",
287 )
288 assert (
289 stdout
290 == """\
291======= scriptSig =======
292 Stack (0 items): (empty stack)
293OP 0: 0x01 31
294======= scriptPubKey =======
295 Stack (1 item):
296 0: 31
297OP 0: OP_DROP
298"""
299 )
300
301
303 tx = CTransaction()
304 tx.vin = [CTxIn(COutPoint(), CScript([b"\x31"]))]
305 script_pub_key = CScript([OP_NOT])
306 stdout = iguana(
307 "-tx=" + tx.serialize().hex(),
308 "-inputindex=0",
309 "-scriptpubkey=" + script_pub_key.hex(),
310 "-value=0",
311 expected_stderr="scriptPubKey failed execution: Script evaluated without error but finished with a false/empty top stack element\n",
312 )
313 assert (
314 stdout
315 == """\
316======= scriptSig =======
317 Stack (0 items): (empty stack)
318OP 0: 0x01 31
319======= scriptPubKey =======
320 Stack (1 item):
321 0: 31
322OP 0: OP_NOT
323"""
324 )
325
326
328 tx = CTransaction()
329 script_pub_key = CScript([1])
330 tx.vin = [CTxIn(COutPoint(), CScript([0]))]
331 stdout = iguana(
332 "-tx=" + tx.serialize().hex(),
333 "-inputindex=0",
334 "-scriptpubkey=" + script_pub_key.hex(),
335 "-value=0",
336 expected_stderr="scriptPubKey failed execution: Stack size must be exactly one after execution\n",
337 )
338 assert (
339 stdout
340 == """\
341======= scriptSig =======
342 Stack (0 items): (empty stack)
343OP 0: OP_0
344======= scriptPubKey =======
345 Stack (1 item):
346 0: ""
347OP 0: OP_1
348 Stack (2 items):
349 0: ""
350 1: 01
351"""
352 )
353
354
356 redeem_script = CScript([OP_TOALTSTACK, b"\x63", OP_EQUAL])
357 tx = CTransaction()
358 tx.vin = [CTxIn(COutPoint(), CScript([b"\x63", b"alt!", bytes(redeem_script)]))]
359 script_hash = hash160(redeem_script)
360 script_pub_key = CScript([OP_HASH160, script_hash, OP_EQUAL])
361
362 def run(fmt):
363 return iguana(
364 "-tx=" + tx.serialize().hex(),
365 "-inputindex=0",
366 "-scriptpubkey=" + script_pub_key.hex(),
367 "-value=0",
368 f"-format={fmt}",
369 )
370
371 assert (
372 run("human")
373 == f"""\
374======= scriptSig =======
375 Stack (0 items): (empty stack)
376OP 0: 0x01 63
377 Stack (1 item):
378 0: 63
379OP 1: 0x04 {b"alt!".hex()}
380 Stack (2 items):
381 0: 63
382 1: {b"alt!".hex()}
383OP 2: 0x04 {redeem_script.hex()}
384======= scriptPubKey =======
385 Stack (3 items):
386 0: 63
387 1: {b"alt!".hex()}
388 2: {redeem_script.hex()}
389OP 0: OP_HASH160
390 Stack (3 items):
391 0: 63
392 1: {b"alt!".hex()}
393 2: {script_hash.hex()}
394OP 1: 0x14 {script_hash.hex()}
395 Stack (4 items):
396 0: 63
397 1: {b"alt!".hex()}
398 2: {script_hash.hex()}
399 3: {script_hash.hex()}
400OP 2: OP_EQUAL
401 Stack (3 items):
402 0: 63
403 1: {b"alt!".hex()}
404 2: 01
405======= redeemScript =======
406 Stack (2 items):
407 0: 63
408 1: {b"alt!".hex()}
409OP 0: OP_TOALTSTACK
410 Stack (1 item):
411 0: 63
412 Altstack (1 item):
413 0: {b"alt!".hex()}
414OP 1: 0x01 63
415 Stack (2 items):
416 0: 63
417 1: 63
418 Altstack (1 item):
419 0: {b"alt!".hex()}
420OP 2: OP_EQUAL
421 Stack (1 item):
422 0: 01
423 Altstack (1 item):
424 0: {b"alt!".hex()}
425Script executed without errors
426"""
427 )
428 assert (
429 run("csv")
430 == f"""\
431scriptName,index,opcode,stack 0,stack 1,stack 2,stack 3,altstack 0,
432scriptSig,0,0x63,"63",
433scriptSig,1,0x{b"alt!".hex()},"63","{b"alt!".hex()}",
434scriptSig,2,0x{redeem_script.hex()},"63","{b"alt!".hex()}","{redeem_script.hex()}",
435scriptPubKey,0,OP_HASH160,"63","{b"alt!".hex()}","{script_hash.hex()}",
436scriptPubKey,1,0x{script_hash.hex()},"63","{b"alt!".hex()}","{script_hash.hex()}","{script_hash.hex()}",
437scriptPubKey,2,OP_EQUAL,"63","{b"alt!".hex()}","01",
438redeemScript,0,OP_TOALTSTACK,"63",,,,"{b"alt!".hex()}",
439redeemScript,1,0x63,"63","63",,,"{b"alt!".hex()}",
440redeemScript,2,OP_EQUAL,"01",,,,"{b"alt!".hex()}",
441#sigChecks,0
442Script executed without errors
443"""
444 )
445
446
448 redeem_script = CScript([OP_CHECKSIG])
449 tx = CTransaction()
450 tx.vin = [CTxIn(COutPoint(), CScript([b"wrong", b"sig", bytes(redeem_script)]))]
451 script_pub_key = CScript([OP_HASH160, hash160(redeem_script), OP_EQUAL])
452 stdout = iguana(
453 "-tx=" + tx.serialize().hex(),
454 "-inputindex=0",
455 "-scriptpubkey=" + script_pub_key.hex(),
456 "-value=0",
457 expected_stderr="redeemScript failed execution: Non-canonical DER signature\n",
458 )
459 assert (
460 stdout
461 == """\
462======= scriptSig =======
463 Stack (0 items): (empty stack)
464OP 0: 0x05 77726f6e67
465 Stack (1 item):
466 0: 77726f6e67
467OP 1: 0x03 736967
468 Stack (2 items):
469 0: 77726f6e67
470 1: 736967
471OP 2: 0x01 ac
472======= scriptPubKey =======
473 Stack (3 items):
474 0: 77726f6e67
475 1: 736967
476 2: ac
477OP 0: OP_HASH160
478 Stack (3 items):
479 0: 77726f6e67
480 1: 736967
481 2: 17be79cf51aa88feebb0a25e9d6a153ead585e59
482OP 1: 0x14 17be79cf51aa88feebb0a25e9d6a153ead585e59
483 Stack (4 items):
484 0: 77726f6e67
485 1: 736967
486 2: 17be79cf51aa88feebb0a25e9d6a153ead585e59
487 3: 17be79cf51aa88feebb0a25e9d6a153ead585e59
488OP 2: OP_EQUAL
489 Stack (3 items):
490 0: 77726f6e67
491 1: 736967
492 2: 01
493======= redeemScript =======
494 Stack (2 items):
495 0: 77726f6e67
496 1: 736967
497OP 0: OP_CHECKSIG
498"""
499 )
500
501
503 redeem_script = CScript([OP_ADD])
504 tx = CTransaction()
505 tx.vin = [CTxIn(COutPoint(), CScript([b"111111", b"222222", bytes(redeem_script)]))]
506 script_hash = hash160(redeem_script)
507 script_pub_key = CScript([OP_HASH160, script_hash, OP_EQUAL])
508 stdout = iguana(
509 "-tx=" + tx.serialize().hex(),
510 "-inputindex=0",
511 "-scriptpubkey=" + script_pub_key.hex(),
512 "-value=0",
513 expected_stderr="redeemScript failed execution: Exception: script number overflow\n",
514 )
515 assert (
516 stdout
517 == f"""\
518======= scriptSig =======
519 Stack (0 items): (empty stack)
520OP 0: 0x06 313131313131
521 Stack (1 item):
522 0: 313131313131
523OP 1: 0x06 323232323232
524 Stack (2 items):
525 0: 313131313131
526 1: 323232323232
527OP 2: 0x01 93
528======= scriptPubKey =======
529 Stack (3 items):
530 0: 313131313131
531 1: 323232323232
532 2: 93
533OP 0: OP_HASH160
534 Stack (3 items):
535 0: 313131313131
536 1: 323232323232
537 2: {script_hash.hex()}
538OP 1: 0x14 {script_hash.hex()}
539 Stack (4 items):
540 0: 313131313131
541 1: 323232323232
542 2: {script_hash.hex()}
543 3: {script_hash.hex()}
544OP 2: OP_EQUAL
545 Stack (3 items):
546 0: 313131313131
547 1: 323232323232
548 2: 01
549======= redeemScript =======
550 Stack (2 items):
551 0: 313131313131
552 1: 323232323232
553OP 0: OP_ADD
554"""
555 )
556
557
559 redeem_script = CScript([OP_NOP])
560 tx = CTransaction()
561 tx.vin = [CTxIn(COutPoint(), CScript([bytes(redeem_script)]))]
562 script_pub_key = CScript([OP_HASH160, hash160(redeem_script), OP_EQUAL])
563 stdout = iguana(
564 "-tx=" + tx.serialize().hex(),
565 "-inputindex=0",
566 "-scriptpubkey=" + script_pub_key.hex(),
567 "-value=0",
568 expected_stderr="redeemScript failed execution: Script evaluated without error but finished with a false/empty top stack element\n",
569 )
570 assert (
571 stdout
572 == """\
573======= scriptSig =======
574 Stack (0 items): (empty stack)
575OP 0: 0x01 61
576======= scriptPubKey =======
577 Stack (1 item):
578 0: 61
579OP 0: OP_HASH160
580 Stack (1 item):
581 0: 994355199e516ff76c4fa4aab39337b9d84cf12b
582OP 1: 0x14 994355199e516ff76c4fa4aab39337b9d84cf12b
583 Stack (2 items):
584 0: 994355199e516ff76c4fa4aab39337b9d84cf12b
585 1: 994355199e516ff76c4fa4aab39337b9d84cf12b
586OP 2: OP_EQUAL
587 Stack (1 item):
588 0: 01
589======= redeemScript =======
590 Stack (0 items): (empty stack)
591OP 0: OP_NOP
592"""
593 )
594
595
597 redeem_script = CScript([0])
598 tx = CTransaction()
599 tx.vin = [CTxIn(COutPoint(), CScript([bytes(redeem_script)]))]
600 script_pub_key = CScript([OP_HASH160, hash160(redeem_script), OP_EQUAL])
601 stdout = iguana(
602 "-tx=" + tx.serialize().hex(),
603 "-inputindex=0",
604 "-scriptpubkey=" + script_pub_key.hex(),
605 "-value=0",
606 expected_stderr="redeemScript failed execution: Script evaluated without error but finished with a false/empty top stack element\n",
607 )
608 assert (
609 stdout
610 == """\
611======= scriptSig =======
612 Stack (0 items): (empty stack)
613OP 0: 0x01 00
614======= scriptPubKey =======
615 Stack (1 item):
616 0: 00
617OP 0: OP_HASH160
618 Stack (1 item):
619 0: 9f7fd096d37ed2c0e3f7f0cfc924beef4ffceb68
620OP 1: 0x14 9f7fd096d37ed2c0e3f7f0cfc924beef4ffceb68
621 Stack (2 items):
622 0: 9f7fd096d37ed2c0e3f7f0cfc924beef4ffceb68
623 1: 9f7fd096d37ed2c0e3f7f0cfc924beef4ffceb68
624OP 2: OP_EQUAL
625 Stack (1 item):
626 0: 01
627======= redeemScript =======
628 Stack (0 items): (empty stack)
629OP 0: OP_0
630"""
631 )
632
633
635 redeem_script = CScript([0, 1])
636 tx = CTransaction()
637 tx.vin = [CTxIn(COutPoint(), CScript([bytes(redeem_script)]))]
638 script_pub_key = CScript([OP_HASH160, hash160(redeem_script), OP_EQUAL])
639 stdout = iguana(
640 "-tx=" + tx.serialize().hex(),
641 "-inputindex=0",
642 "-scriptpubkey=" + script_pub_key.hex(),
643 "-value=0",
644 expected_stderr="redeemScript failed execution: Stack size must be exactly one after execution\n",
645 )
646 assert (
647 stdout
648 == """\
649======= scriptSig =======
650 Stack (0 items): (empty stack)
651OP 0: 0x02 0051
652======= scriptPubKey =======
653 Stack (1 item):
654 0: 0051
655OP 0: OP_HASH160
656 Stack (1 item):
657 0: 5cbe818a2be9df5479d201af59df9c0bdfaaf21e
658OP 1: 0x14 5cbe818a2be9df5479d201af59df9c0bdfaaf21e
659 Stack (2 items):
660 0: 5cbe818a2be9df5479d201af59df9c0bdfaaf21e
661 1: 5cbe818a2be9df5479d201af59df9c0bdfaaf21e
662OP 2: OP_EQUAL
663 Stack (1 item):
664 0: 01
665======= redeemScript =======
666 Stack (0 items): (empty stack)
667OP 0: OP_0
668 Stack (1 item):
669 0: ""
670OP 1: OP_1
671 Stack (2 items):
672 0: ""
673 1: 01
674"""
675 )
676
677
679 key = ECKey()
680 key.set(b"12345678" * 4, True)
681 redeem_script = CScript([OP_2DUP, OP_CHECKSIGVERIFY] * 3 + [OP_CHECKSIG])
682 script_hash = hash160(redeem_script)
683 script_pub_key = CScript([OP_HASH160, script_hash, OP_EQUAL])
684 tx = CTransaction()
685 tx.vin = [CTxIn(COutPoint())]
686 amount = 1999
687 sighash = SignatureHashForkId(
688 redeem_script, tx, 0, SIGHASH_ALL | SIGHASH_FORKID, amount
689 )
690 sig = key.sign_schnorr(sighash) + b"\x41"
691 pubkey = key.get_pubkey().get_bytes()
692 tx.vin[0].scriptSig = CScript([sig, pubkey, bytes(redeem_script)])
693 stdout = iguana(
694 "-tx=" + tx.serialize().hex(),
695 "-inputindex=0",
696 "-scriptpubkey=" + script_pub_key.hex(),
697 "-value=1999",
698 expected_stderr="redeemScript failed execution: Input SigChecks limit exceeded\n",
699 )
700 assert (
701 stdout
702 == f"""\
703======= scriptSig =======
704 Stack (0 items): (empty stack)
705OP 0: 0x41 {sig.hex()}
706 Stack (1 item):
707 0: {sig.hex()}
708OP 1: 0x21 {pubkey.hex()}
709 Stack (2 items):
710 0: {sig.hex()}
711 1: {pubkey.hex()}
712OP 2: 0x07 {redeem_script.hex()}
713======= scriptPubKey =======
714 Stack (3 items):
715 0: {sig.hex()}
716 1: {pubkey.hex()}
717 2: {redeem_script.hex()}
718OP 0: OP_HASH160
719 Stack (3 items):
720 0: {sig.hex()}
721 1: {pubkey.hex()}
722 2: {script_hash.hex()}
723OP 1: 0x14 {script_hash.hex()}
724 Stack (4 items):
725 0: {sig.hex()}
726 1: {pubkey.hex()}
727 2: {script_hash.hex()}
728 3: {script_hash.hex()}
729OP 2: OP_EQUAL
730 Stack (3 items):
731 0: {sig.hex()}
732 1: {pubkey.hex()}
733 2: 01
734======= redeemScript =======
735 Stack (2 items):
736 0: {sig.hex()}
737 1: {pubkey.hex()}
738OP 0: OP_2DUP
739 Stack (4 items):
740 0: {sig.hex()}
741 1: {pubkey.hex()}
742 2: {sig.hex()}
743 3: {pubkey.hex()}
744OP 1: OP_CHECKSIGVERIFY
745 Stack (2 items):
746 0: {sig.hex()}
747 1: {pubkey.hex()}
748OP 2: OP_2DUP
749 Stack (4 items):
750 0: {sig.hex()}
751 1: {pubkey.hex()}
752 2: {sig.hex()}
753 3: {pubkey.hex()}
754OP 3: OP_CHECKSIGVERIFY
755 Stack (2 items):
756 0: {sig.hex()}
757 1: {pubkey.hex()}
758OP 4: OP_2DUP
759 Stack (4 items):
760 0: {sig.hex()}
761 1: {pubkey.hex()}
762 2: {sig.hex()}
763 3: {pubkey.hex()}
764OP 5: OP_CHECKSIGVERIFY
765 Stack (2 items):
766 0: {sig.hex()}
767 1: {pubkey.hex()}
768OP 6: OP_CHECKSIG
769 Stack (1 item):
770 0: 01
771Number of sigChecks: 4
772"""
773 )
test_script_pub_key_empty_stack()
test_redeem_script_error()
test_script_pub_key_success()
test_redeem_script_exception()
test_script_pub_key_false_stack()
test_script_sig_success()
test_script_pub_key_cleanstack()
iguana(*args, expected_stderr="", expected_returncode=None)
test_redeem_script_success()
test_redeem_script_empty_stack()
test_redeem_script_cleanstack()
test_script_pub_key_failure()
test_invalid_inputindex()
test_redeem_script_input_sigchecks()
test_redeem_script_false()
test_invalid_format()
test_script_sig_invalid_opcode_encoding()
T GetRand(T nMax=std::numeric_limits< T >::max()) noexcept
Generate a uniform random integer of type T in the range [0..nMax) nMax defaults to std::numeric_limi...
Definition random.h:85