pyflo/pybtc/test/script_deserialize.py
2018-07-03 16:04:32 +04:00

170 lines
11 KiB
Python

import unittest
import os, sys
parentPath = os.path.abspath("..")
if parentPath not in sys.path:
sys.path.insert(0, parentPath)
from pybtc import blockchain
from binascii import unhexlify
from pybtc import address_to_hash
class ScriptDeserializeTests(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("\nTesting Script class deserialization:\n")
def test_p2pkh(self):
print("Deserialize P2PKH")
s = blockchain.Script("76a9143520dd524f6ca66f63182bb23efff6cc8ee3ee6388ac")
self.assertEqual(s.type, "P2PKH")
self.assertEqual(s.ntype, 0)
self.assertEqual(s.asm, "OP_DUP OP_HASH160 3520dd524f6ca66f63182bb23efff6cc8ee3ee63 OP_EQUALVERIFY OP_CHECKSIG")
self.assertEqual(s.address[0], address_to_hash("15qvBdqSWQCuLQPXVoWViG2GvjeARmpYPw"))
self.assertEqual(s.pattern, "OP_DUP OP_HASH160 <20> OP_EQUALVERIFY OP_CHECKSIG")
self.assertEqual(s.op_sig_count, 1)
def test_p2sh(self):
print("Deserialize P2SH")
s = blockchain.Script("a91469f37572ab1b69f304f987b119e2450e0b71bf5c87")
self.assertEqual(s.type, "P2SH")
self.assertEqual(s.ntype, 1)
self.assertEqual(s.asm, "OP_HASH160 69f37572ab1b69f304f987b119e2450e0b71bf5c OP_EQUAL")
self.assertEqual(s.address[0], address_to_hash("3BMEXVsYyfKB5h3m53XRSFHkqi1zPwsvcK"))
self.assertEqual(s.pattern, "OP_HASH160 <20> OP_EQUAL")
self.assertEqual(s.op_sig_count, 0)
def test_null_data(self):
print("Deserialize NULL_DATA")
# 20 bytes valid
s = blockchain.Script("6a144279b52d6ee8393a9a755e8c6f633b5dd034bd67")
self.assertEqual(s.type, "NULL_DATA")
self.assertEqual(s.ntype, 3)
self.assertEqual(s.asm, "OP_RETURN 4279b52d6ee8393a9a755e8c6f633b5dd034bd67")
self.assertEqual(len(s.address), 0)
self.assertEqual(s.pattern, "OP_RETURN <20>")
self.assertEqual(s.op_sig_count, 0)
# 81 bytes invalid
s = blockchain.Script("6a4c51000000000000000000000000000000000000000000000000000000000000"
"000000000000000000000000000000000000000000000000000000000000"
"000000000000000000000000000000000000000000")
self.assertEqual(s.asm, "OP_RETURN 000000000000000000000000000000000000000000000000000"
"0000000000000000000000000000000000000000000000000000000000000"
"00000000000000000000000000000000000000000000000000")
self.assertEqual(s.pattern, "OP_RETURN <81>")
self.assertEqual(len(s.address), 0)
self.assertEqual(s.op_sig_count, 0)
self.assertEqual(s.type, "NON_STANDARD")
self.assertEqual(s.ntype, 7)
def test_multisig(self):
print("Deserialize MULTISIG")
# 15 from 15
s = blockchain.Script("5f210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c"
"71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c"
"71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c"
"71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c"
"71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c"
"71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c"
"71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c"
"71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c"
"71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c"
"71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c"
"71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c"
"71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c"
"71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c"
"71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c"
"71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c"
"715fae")
self.assertEqual(s.pattern, "OP_15 <33> <33> <33> <33> <33> <33> <33> <33> <33> <33> <33> <33> "
"<33> <33> <33> OP_15 OP_CHECKMULTISIG")
self.assertEqual(s.type, "MULTISIG")
self.assertEqual(s.ntype, 4)
self.assertEqual(s.asm, "OP_15 0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab"
"35c71 0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab"
"35c71 0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab"
"35c71 0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab"
"35c71 0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab"
"35c71 0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab"
"35c71 0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab"
"35c71 0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab"
"35c71 0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab"
"35c71 0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab"
"35c71 0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab"
"35c71 0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab"
"35c71 0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab"
"35c71 0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab"
"35c71 0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab"
"35c71 OP_15 OP_CHECKMULTISIG")
self.assertEqual(len(s.address), 15)
self.assertEqual(s.op_sig_count, 15)
# 1 from 3
s = blockchain.Script("512102953397b893148acec2a9da8341159e9e7fb3d32987c3563e8bdf22116213623"
"441048da561da64584fb1457e906bc2840a1f963b401b632ab98761d12d74dd795bbf"
"410c7b6d6fd39acf9d870cb9726578eaf8ba430bb296eac24957f3fb3395b8b042060"
"466616fb675310aeb024f957b4387298dc28305bc7276bf1f7f662a6764bcdffb6a97"
"40de596f89ad8000f8fa6741d65ff1338f53eb39e98179dd18c6e6be8e3953ae")
self.assertEqual(s.pattern, "OP_1 <33> <65> <66> OP_3 OP_CHECKMULTISIG")
self.assertEqual(s.type, "MULTISIG")
self.assertEqual(s.ntype, 4)
self.assertEqual(s.asm, "OP_1 02953397b893148acec2a9da8341159e9e7fb3d32987c3563e8bdf22116213"
"6234 048da561da64584fb1457e906bc2840a1f963b401b632ab98761d12d74dd79"
"5bbf410c7b6d6fd39acf9d870cb9726578eaf8ba430bb296eac24957f3fb3395b8b"
"0 060466616fb675310aeb024f957b4387298dc28305bc7276bf1f7f662a6764bcd"
"ffb6a9740de596f89ad8000f8fa6741d65ff1338f53eb39e98179dd18c6e6be8e39"
" OP_3 OP_CHECKMULTISIG")
self.assertEqual(len(s.address), 3)
self.assertEqual(s.op_sig_count, 3)
def test_segwit_p2wpkh(self):
print("Deserialize segwit P2WPKH")
s = blockchain.Script("00144160bb1870159a08724557f75c7bb665a3a132e0")
self.assertEqual(s.type, "P2WPKH")
self.assertEqual(s.ntype, 5)
self.assertEqual(s.asm, "OP_0 4160bb1870159a08724557f75c7bb665a3a132e0")
self.assertEqual(s.address[0], unhexlify("4160bb1870159a08724557f75c7bb665a3a132e0"))
self.assertEqual(s.pattern, "OP_0 <20>")
self.assertEqual(s.op_sig_count, 1)
s = blockchain.Script("00144160bb1870159a08724557f75c7bb665a3a132e0", segwit=False)
self.assertEqual(s.type, "NON_STANDARD")
self.assertEqual(s.ntype, 7)
self.assertEqual(s.asm, "OP_0 4160bb1870159a08724557f75c7bb665a3a132e0")
self.assertEqual(len(s.address), 0)
self.assertEqual(s.pattern, "OP_0 <20>")
self.assertEqual(s.op_sig_count, 0)
def test_segwit_p2wsh(self):
print("Deserialize segwit P2WSH")
s = blockchain.Script("0020cdbf909e935c855d3e8d1b61aeb9c5e3c03ae8021b286839b1a72f2e48fdba70")
self.assertEqual(s.type, "P2WSH")
self.assertEqual(s.ntype, 6)
self.assertEqual(s.asm, "OP_0 cdbf909e935c855d3e8d1b61aeb9c5e3c03ae8021b286839b1a72f2e48fdba70")
self.assertEqual(s.address[0], unhexlify("cdbf909e935c855d3e8d1b61aeb9c5e3c03ae8021b286839b1a72f2e48fdba70"))
self.assertEqual(s.pattern, "OP_0 <32>")
self.assertEqual(s.op_sig_count, 0)
s = blockchain.Script("0020cdbf909e935c855d3e8d1b61aeb9c5e3c03ae8021b286839b1a72f2e48fdba70", segwit=False)
self.assertEqual(s.type, "NON_STANDARD")
self.assertEqual(s.ntype, 7)
self.assertEqual(s.asm, "OP_0 cdbf909e935c855d3e8d1b61aeb9c5e3c03ae8021b286839b1a72f2e48fdba70")
self.assertEqual(len(s.address), 0)
self.assertEqual(s.pattern, "OP_0 <32>")
self.assertEqual(s.op_sig_count, 0)
# class TransactionDeserializeTests(unittest.TestCase):
# @classmethod
# def setUpClass(cls):
# print("\nTesting Transaction class deserialization:\n")
#
# def test_p2pkh(self):
# print("Deserialize P2PKH")
# tx = blockchain.Transaction.deserialize("0200000001df2d507c1c765e526f8dbe6527fc34be1c30b27fdb88c521060b82"
# "45dd9f4e2e010000006b483045022100b00c4efde901f2efb92679681bef359c"
# "7639ba79979e0c436cb10a266d0b4c5d0220730d854aa51fbe715387256956f3"
# "71d2199297f7b4ea6bf9b4b87bf8bba8417e012102530c548d402670b13ad888"
# "7ff99c294e67fc18097d236d57880c69261b42def70000000001b88800000000"
# "00001600144160bb1870159a08724557f75c7bb665a3a132e000000000")
# "0200000001df2d507c1c765e526f8dbe6527fc34be1c30b27fdb88c521060b8245dd9f4e2e010000006b483045022100b00c4efde901f2efb92679681bef359c7639ba79979e0c436cb10a266d0b4c5d0220730d854aa51fbe715387256956f371d2199297f7b4ea6bf9b4b87bf8bba8417e012102530c548d402670b13ad8887ff99c294e67fc18097d236d57880c69261b42def70000000001b8880000000000001600144160bb1870159a08724557f75c7bb665a3a132e000000000"
# t = "0100000000010198f4f454fbb0aeae5bd167879ca65560b3b7073cd57aaee9cb5903d6f0f883860000000000ffffffff01204e0000000000001976a9143e2585f7b9e642ad9030c0812490ea5b83c511fa88ac02483045022100849b9929f619933224743d14dde08ad521540d9c2b1b85a20ec1ce5db77e4fa1022035222f713f5753119783e049e1c3ef8f819b2af4946cf150c98fe66fd1898409012102530c548d402670b13ad8887ff99c294e67fc18097d236d57880c69261b42def700000000"
# tx = blockchain.Transaction.deserialize(t)
# print(tx.json())