Skip to content

Commit 7a9e15c

Browse files
committed
Fix bugs in script type detection
1 parent dea28f2 commit 7a9e15c

File tree

2 files changed

+108
-14
lines changed

2 files changed

+108
-14
lines changed

blockchain_parser/script.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ def operations(self):
7070
"""
7171
if self._operations is None:
7272
# Some coinbase scripts are garbage, they could not be valid
73-
self._operations = list(self.script)
73+
try:
74+
self._operations = list(self.script)
75+
except CScriptInvalidError:
76+
self._operations = []
7477

7578
return self._operations
7679

@@ -80,7 +83,7 @@ def value(self):
8083
if self._value is None:
8184
parts = []
8285
try:
83-
for operation in self.operations:
86+
for operation in list(self.script):
8487
if isinstance(operation, bytes):
8588
parts.append(b2a_hex(operation).decode("ascii"))
8689
else:
@@ -138,4 +141,5 @@ def is_multisig(self):
138141
def is_unknown(self):
139142
return not self.is_pubkeyhash() and not self.is_pubkey() \
140143
and not self.is_p2sh() and not self.is_multisig() \
141-
and not self.is_return()
144+
and not self.is_return() and not self.is_p2wpkh() \
145+
and not self.is_p2wsh()

blockchain_parser/tests/test_script.py

Lines changed: 101 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,115 @@
1111

1212
import unittest
1313
from binascii import a2b_hex
14-
from blockchain_parser.script import Script, is_public_key
14+
from blockchain_parser.script import Script
1515

1616

1717
class TestScript(unittest.TestCase):
18-
def test_from_hex(self):
18+
def test_op_return_script(self):
1919
case1 = "6a"
2020
script = Script.from_hex(a2b_hex(case1))
2121
self.assertEqual("OP_RETURN", script.value)
22+
self.assertFalse(script.is_pubkey())
23+
self.assertFalse(script.is_multisig())
24+
self.assertFalse(script.is_p2sh())
25+
self.assertFalse(script.is_p2wpkh())
26+
self.assertFalse(script.is_p2wsh())
27+
self.assertFalse(script.is_pubkeyhash())
28+
self.assertFalse(script.is_unknown())
29+
self.assertTrue(script.is_return())
2230

23-
def test_invalid_script(self):
31+
def test_unknown_script(self):
2432
case = "40"
2533
script = Script.from_hex(a2b_hex(case))
2634
self.assertEqual("INVALID_SCRIPT", script.value)
35+
self.assertFalse(script.is_pubkey())
36+
self.assertFalse(script.is_multisig())
37+
self.assertFalse(script.is_p2sh())
38+
self.assertFalse(script.is_p2wpkh())
39+
self.assertFalse(script.is_p2wsh())
40+
self.assertFalse(script.is_pubkeyhash())
41+
self.assertTrue(script.is_unknown())
42+
self.assertFalse(script.is_return())
2743

28-
def test_is_public_key(self):
29-
case1 = "010000000000000017a91471c5c3727fac8dbace94bd38cf8ac16a034a7" \
30-
"94787"
31-
self.assertFalse(is_public_key(a2b_hex(case1)))
32-
self.assertFalse(is_public_key(None))
33-
case3 = "02c0993f639534d348e1dca30566491e6cb11c14afa13ec244c05396a98" \
34-
"39aeb17"
35-
self.assertTrue(is_public_key(a2b_hex(case3)))
44+
case = ""
45+
script = Script.from_hex(a2b_hex(case))
46+
self.assertEqual("", script.value)
47+
self.assertFalse(script.is_pubkey())
48+
self.assertFalse(script.is_multisig())
49+
self.assertFalse(script.is_p2sh())
50+
self.assertFalse(script.is_p2wpkh())
51+
self.assertFalse(script.is_p2wsh())
52+
self.assertFalse(script.is_pubkeyhash())
53+
self.assertTrue(script.is_unknown())
54+
self.assertFalse(script.is_return())
55+
56+
def test_multisig_script(self):
57+
case = "514104cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4410461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af52ae"
58+
script = Script.from_hex(a2b_hex(case))
59+
self.assertFalse(script.is_pubkey())
60+
self.assertTrue(script.is_multisig())
61+
self.assertFalse(script.is_p2sh())
62+
self.assertFalse(script.is_p2wpkh())
63+
self.assertFalse(script.is_p2wsh())
64+
self.assertFalse(script.is_pubkeyhash())
65+
self.assertFalse(script.is_unknown())
66+
self.assertFalse(script.is_return())
67+
68+
def test_p2sh_script(self):
69+
case = "a91428ad3e63dcae36e5010527578e2eef0e9eeaf3e487"
70+
script = Script.from_hex(a2b_hex(case))
71+
self.assertFalse(script.is_pubkey())
72+
self.assertFalse(script.is_multisig())
73+
self.assertTrue(script.is_p2sh())
74+
self.assertFalse(script.is_p2wpkh())
75+
self.assertFalse(script.is_p2wsh())
76+
self.assertFalse(script.is_pubkeyhash())
77+
self.assertFalse(script.is_unknown())
78+
self.assertFalse(script.is_return())
79+
80+
def test_p2wpkh_script(self):
81+
case = "0014c958269b5b6469b6e4b87de1062028ad3bb83cc2"
82+
script = Script.from_hex(a2b_hex(case))
83+
self.assertFalse(script.is_pubkey())
84+
self.assertFalse(script.is_multisig())
85+
self.assertFalse(script.is_p2sh())
86+
self.assertTrue(script.is_p2wpkh())
87+
self.assertFalse(script.is_p2wsh())
88+
self.assertFalse(script.is_pubkeyhash())
89+
self.assertFalse(script.is_unknown())
90+
self.assertFalse(script.is_return())
91+
92+
def test_p2wsh_script(self):
93+
case = "0020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d"
94+
script = Script.from_hex(a2b_hex(case))
95+
self.assertFalse(script.is_p2sh())
96+
self.assertFalse(script.is_multisig())
97+
self.assertFalse(script.is_p2sh())
98+
self.assertFalse(script.is_p2wpkh())
99+
self.assertTrue(script.is_p2wsh())
100+
self.assertFalse(script.is_pubkeyhash())
101+
self.assertFalse(script.is_unknown())
102+
self.assertFalse(script.is_return())
103+
104+
def test_pubkeyhash_script(self):
105+
case = "76a914e9629ef6f5b82564a9b2ecae6c288c56fb33710888ac"
106+
script = Script.from_hex(a2b_hex(case))
107+
self.assertFalse(script.is_pubkey())
108+
self.assertFalse(script.is_multisig())
109+
self.assertFalse(script.is_p2sh())
110+
self.assertFalse(script.is_p2wpkh())
111+
self.assertFalse(script.is_p2wsh())
112+
self.assertTrue(script.is_pubkeyhash())
113+
self.assertFalse(script.is_unknown())
114+
self.assertFalse(script.is_return())
115+
116+
def test_pubkey_script(self):
117+
script = Script.from_hex(a2b_hex("4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac"))
118+
self.assertTrue(script.is_pubkey())
119+
self.assertFalse(script.is_multisig())
120+
self.assertFalse(script.is_p2sh())
121+
self.assertFalse(script.is_p2wpkh())
122+
self.assertFalse(script.is_p2wsh())
123+
self.assertFalse(script.is_pubkeyhash())
124+
self.assertFalse(script.is_unknown())
125+
self.assertFalse(script.is_return())

0 commit comments

Comments
 (0)