Skip to content

Commit d8f8686

Browse files
committed
Add flags support to script_(in)valid.json tests
Most of the flags aren't actually checked in scripteval, so this still has basically all the script_invalid.json tests assocated with flags removed.
1 parent c79cadb commit d8f8686

3 files changed

Lines changed: 52 additions & 7 deletions

File tree

bitcoin/core/scripteval.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,27 @@
4040

4141
SCRIPT_VERIFY_P2SH = object()
4242
SCRIPT_VERIFY_STRICTENC = object()
43+
SCRIPT_VERIFY_DERSIG = object()
4344
SCRIPT_VERIFY_LOW_S = object()
45+
SCRIPT_VERIFY_NULLDUMMY = object()
46+
SCRIPT_VERIFY_SIGPUSHONLY = object()
47+
SCRIPT_VERIFY_MINIMALDATA = object()
48+
SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS = object()
49+
SCRIPT_VERIFY_CLEANSTACK = object()
50+
SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY = object()
51+
52+
SCRIPT_VERIFY_FLAGS_BY_NAME = {
53+
'P2SH': SCRIPT_VERIFY_P2SH,
54+
'STRICTENC': SCRIPT_VERIFY_STRICTENC,
55+
'DERSIG': SCRIPT_VERIFY_DERSIG,
56+
'LOW_S': SCRIPT_VERIFY_LOW_S,
57+
'NULLDUMMY': SCRIPT_VERIFY_NULLDUMMY,
58+
'SIGPUSHONLY': SCRIPT_VERIFY_SIGPUSHONLY,
59+
'MINIMALDATA': SCRIPT_VERIFY_MINIMALDATA,
60+
'DISCOURAGE_UPGRADABLE_NOPS': SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS,
61+
'CLEANSTACK': SCRIPT_VERIFY_CLEANSTACK,
62+
'CHECKLOCKTIMEVERIFY': SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY,
63+
}
4464

4565
class EvalScriptError(bitcoin.core.ValidationError):
4666
"""Base class for exceptions raised when a script fails during EvalScript()
@@ -781,7 +801,15 @@ def VerifySignature(txFrom, txTo, inIdx):
781801
'MAX_STACK_ITEMS',
782802
'SCRIPT_VERIFY_P2SH',
783803
'SCRIPT_VERIFY_STRICTENC',
804+
'SCRIPT_VERIFY_DERSIG',
784805
'SCRIPT_VERIFY_LOW_S',
806+
'SCRIPT_VERIFY_NULLDUMMY',
807+
'SCRIPT_VERIFY_SIGPUSHONLY',
808+
'SCRIPT_VERIFY_MINIMALDATA',
809+
'SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS',
810+
'SCRIPT_VERIFY_CLEANSTACK',
811+
'SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY',
812+
'SCRIPT_VERIFY_FLAGS_BY_NAME',
785813
'EvalScriptError',
786814
'MaxOpCountError',
787815
'MissingOpArgumentsError',

bitcoin/tests/data/script_valid.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,12 @@
726726
"P2SH",
727727
"P2SH(P2PK)"
728728
],
729+
[
730+
"0x47 0x304402204e2eb034be7b089534ac9e798cf6a2c79f38bcb34d1b179efd6f2de0841735db022071461beb056b5a7be1819da6a3e3ce3662831ecc298419ca101eb6887b5dd6a401 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac",
731+
"HASH160 0x14 0x2df519943d5acc0ef5222091f9dfe3543f489a82 EQUAL",
732+
"",
733+
"P2SH(P2PKH), bad sig but no VERIFY_P2SH"
734+
],
729735
[
730736
"0 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402200a358f750934b3feb822f1966bfcd8bbec9eeaa3a8ca941e11ee5960e181fa01022050bf6b5a8e7750f70354ae041cb68a7bade67ec6c3ab19eb359638974410626e01 0x47 0x304402200955d031fff71d8653221e85e36c3c85533d2312fc3045314b19650b7ae2f81002202a6bb8505e36201909d0921f01abff390ae6b7ff97bbf959f98aedeb0a56730901",
731737
"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",

bitcoin/tests/test_scripteval.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,23 @@ def load_test_vectors(name):
6868
scriptSig = parse_script(scriptSig)
6969
scriptPubKey = parse_script(scriptPubKey)
7070

71-
yield (scriptSig, scriptPubKey, comment, test_case)
71+
flag_set = set()
72+
for flag in flags.split(','):
73+
if flag == '' or flag == 'NONE':
74+
pass
7275

76+
else:
77+
try:
78+
flag = SCRIPT_VERIFY_FLAGS_BY_NAME[flag]
79+
except IndexError:
80+
raise Exception('Unknown script verify flag %r' % flag)
7381

74-
class Test_EvalScript(unittest.TestCase):
75-
flags = (SCRIPT_VERIFY_P2SH, SCRIPT_VERIFY_STRICTENC)
82+
flag_set.add(flag)
83+
84+
yield (scriptSig, scriptPubKey, flag_set, comment, test_case)
7685

86+
87+
class Test_EvalScript(unittest.TestCase):
7788
def create_test_txs(self, scriptSig, scriptPubKey):
7889
txCredit = CTransaction([CTxIn(COutPoint(), CScript([OP_0, OP_0]), nSequence=0xFFFFFFFF)],
7990
[CTxOut(0, scriptPubKey)],
@@ -84,20 +95,20 @@ def create_test_txs(self, scriptSig, scriptPubKey):
8495
return (txCredit, txSpend)
8596

8697
def test_script_valid(self):
87-
for scriptSig, scriptPubKey, comment, test_case in load_test_vectors('script_valid.json'):
98+
for scriptSig, scriptPubKey, flags, comment, test_case in load_test_vectors('script_valid.json'):
8899
(txCredit, txSpend) = self.create_test_txs(scriptSig, scriptPubKey)
89100

90101
try:
91-
VerifyScript(scriptSig, scriptPubKey, txSpend, 0, flags=self.flags)
102+
VerifyScript(scriptSig, scriptPubKey, txSpend, 0, flags)
92103
except ValidationError as err:
93104
self.fail('Script FAILED: %r %r %r with exception %r' % (scriptSig, scriptPubKey, comment, err))
94105

95106
def test_script_invalid(self):
96-
for scriptSig, scriptPubKey, comment, test_case in load_test_vectors('script_invalid.json'):
107+
for scriptSig, scriptPubKey, flags, comment, test_case in load_test_vectors('script_invalid.json'):
97108
(txCredit, txSpend) = self.create_test_txs(scriptSig, scriptPubKey)
98109

99110
try:
100-
VerifyScript(scriptSig, scriptPubKey, txSpend, 0, flags=self.flags)
111+
VerifyScript(scriptSig, scriptPubKey, txSpend, 0, flags)
101112
except ValidationError:
102113
continue
103114

0 commit comments

Comments
 (0)