OP_RETURN recognize fix

OP_RETURN_NON_STANDARD type
This commit is contained in:
4tochka 2019-03-13 21:21:53 +04:00
parent c3639b7cd8
commit f4e5ec138e
4 changed files with 42 additions and 7 deletions

View File

@ -75,7 +75,8 @@ SCRIPT_TYPES = {"P2PKH": 0,
"MULTISIG": 4,
"P2WPKH": 5,
"P2WSH": 6,
"NON_STANDART": 7
"NON_STANDARD": 7,
"NULL_DATA_NON_STANDARD": 8
}

View File

@ -59,9 +59,16 @@ def parse_script(script, segwit=True):
return {"nType": 2, "type": "PUBKEY", "reqSigs": 1, "addressHash": hash160(script[1:-1])}
if l == 35 and script[-1] == 172:
return {"nType": 2, "type": "PUBKEY", "reqSigs": 1, "addressHash": hash160(script[1:-1])}
if script[0] == 106 and l > 1 and l <= 82:
if script[1] == l - 2:
return {"nType": 3, "type": "NULL_DATA", "reqSigs": 0, "data": script[2:]}
if script[0] == OPCODE["OP_RETURN"]:
if l == 1:
return {"nType": 3, "type": "NULL_DATA", "reqSigs": 0, "data": b""}
elif script[1] < OPCODE["OP_PUSHDATA1"]:
if script[1] == l - 2:
return {"nType": 3, "type": "NULL_DATA", "reqSigs": 0, "data": script[2:]}
elif script[1] == OPCODE["OP_PUSHDATA1"]:
if script[2] == l - 3 and script[2] <= 80:
return {"nType": 3, "type": "NULL_DATA", "reqSigs": 0, "data": script[3:]}
return {"nType": 8, "type": "NULL_DATA_NON_STANDARD", "reqSigs": 0, "script": script}
if script[0] >= 81 and script[0] <= 96:
if script[-1] == 174:
if script[-2] >= 81 and script[-2] <= 96:

View File

@ -26,3 +26,30 @@ class ScriptFunctionsTests(unittest.TestCase):
"bc1qwqdg6squsna38e46795at95yu9atm8azzmyvckulcc7kytlcckxswvvzej")
def test_op_return_parse(self):
self.assertEqual(parse_script(OP_RETURN + b"\x00")["type"], "NULL_DATA")
self.assertEqual(parse_script(OP_RETURN + b"\x00")["data"], b"")
self.assertEqual(parse_script(OP_RETURN + b"\x2012345678901234567890123456789012")["type"], "NULL_DATA")
self.assertEqual(parse_script(OP_RETURN + b"\x2012345678901234567890123456789012")["data"],
b"12345678901234567890123456789012")
self.assertEqual(parse_script(OP_RETURN + b"\x201234567890123456789012345678901211")["type"],
"NULL_DATA_NON_STANDARD")
self.assertEqual(parse_script(OP_RETURN + OP_PUSHDATA1 + b"\x00")["type"], "NULL_DATA")
self.assertEqual(parse_script(OP_RETURN + OP_PUSHDATA1 + b"\x00")["data"], b"")
self.assertEqual(parse_script(OP_RETURN + OP_PUSHDATA1 + b"\x2012345678901234567890123456789012")["type"],
"NULL_DATA")
self.assertEqual(parse_script(OP_RETURN + OP_PUSHDATA1 + b"\x2012345678901234567890123456789012")["data"],
b"12345678901234567890123456789012")
self.assertEqual(parse_script(OP_RETURN + OP_PUSHDATA1 + b"\x201234567890123456789012345678901211")["type"],
"NULL_DATA_NON_STANDARD")
self.assertEqual(parse_script(OP_RETURN + OP_PUSHDATA1 + b"\x5012345678901234567890123456789012345678901234567890123456789012345678901234567890")["type"],
"NULL_DATA")
self.assertEqual(parse_script(OP_RETURN + OP_PUSHDATA1 + b"\x5012345678901234567890123456789012345678901234567890123456789012345678901234567890")["data"],
b"12345678901234567890123456789012345678901234567890123456789012345678901234567890")
self.assertEqual(parse_script(
OP_RETURN + OP_PUSHDATA1 + b"\x51123456789012345678901234567890123456789012345678901234567890123456789012345678901")["type"],
"NULL_DATA_NON_STANDARD")

View File

@ -84,7 +84,7 @@ class Transaction(dict):
if self["data"] is None:
if s["nType"] == 3:
self["data"] = s["data"]
if s["nType"] not in (3, 4, 7):
if s["nType"] not in (3, 4, 7, 8):
self["vOut"][k]["addressHash"] = s["addressHash"]
self["vOut"][k]["reqSigs"] = s["reqSigs"]
@ -500,7 +500,7 @@ class Transaction(dict):
if self["data"] is None:
if s["nType"] == 3:
self["data"] = s["data"]
if s["nType"] not in (3, 4, 7):
if s["nType"] not in (3, 4, 7, 8):
self["vOut"][k]["addressHash"] = s["addressHash"]
self["vOut"][k]["reqSigs"] = s["reqSigs"]
else:
@ -508,7 +508,7 @@ class Transaction(dict):
if self["data"] is None:
if s["nType"] == 3:
self["data"] = s["data"].hex()
if s["nType"] not in (3, 4, 7):
if s["nType"] not in (3, 4, 7, 8):
self["vOut"][k]["addressHash"] = s["addressHash"].hex()
self["vOut"][k]["reqSigs"] = s["reqSigs"]
self["vOut"][k]["scriptPubKeyOpcodes"] = decode_script(script_pub_key)