Example #1
0
    def test_sign_transaction(self):
        tx = Tx(version=1, 
                in_list=[TxIn(previous_output=Outpoint(hash=Uint256.from_hexstr("d2a42ebcb98b598ddcb6d430ce9061dba76804a97f7c1413dd3faef744f909a8"),index=0), 
                   script=Script(instructions=[]), 
                   sequence=4294967295),TxIn(previous_output=Outpoint(hash=Uint256.from_hexstr("2be8e319be1d15c1ba54708bdd7969b638e7e6fa2154819136e363ea6d33664a"),index=1), 
                   script=Script(instructions=[]), 
                   sequence=4294967295)], 
                out_list=[TxOut(value=3315075843, 
                    script=Script(instructions=[Instruction(OP_DUP),Instruction(OP_HASH160),Instruction(20,  decodehexstr("297c5a2ee31a1ab721115722d83f8654ca21d5df")),Instruction(OP_EQUALVERIFY),Instruction(OP_CHECKSIG)])),TxOut(value=2971972133, 
                    script=Script(instructions=[Instruction(OP_DUP),Instruction(OP_HASH160),Instruction(20,  decodehexstr("7d5feab86e31e8fc99d8e735d56226de9043e5fc")),Instruction(OP_EQUALVERIFY),Instruction(OP_CHECKSIG)])),TxOut(value=1046301823, 
                    script=Script(instructions=[Instruction(OP_DUP),Instruction(OP_HASH160),Instruction(20,  decodehexstr("fd91232a2fa0c389fa0188efde26c8a6165f4c50")),Instruction(OP_EQUALVERIFY),Instruction(OP_CHECKSIG)]))], 
                locktime=0)

        outscript0 = Script(instructions=[Instruction(33,  decodehexstr("03409fe679bdff9e801692c999b86d0c47b62dc02cdd10591ee70ca8056cd05023")),Instruction(OP_CHECKSIG)])
        outscript1 = Script(instructions=[Instruction(OP_DUP),Instruction(OP_HASH160),Instruction(20,  decodehexstr("5fb7fdb3d1ab0f3fec90b38417cca8ab736b10c6")),Instruction(OP_EQUALVERIFY),Instruction(OP_CHECKSIG)])

        # Sign TX_PUBKEY 
        sign_transaction(tx, 
                         [TxOut(None, outscript0), TxOut(None, outscript1)],
                         [decodehexstr("f006b27418527b1c400bbc434a3f22ee57c376bd4819cfe2a1162682788ae714"),
                          decodehexstr("c693115901c2840badd1e404706a4866a90d3afa16a542c1a3d0de9aad0875fe")])

        vm = TxValidationVM()
        valid, reason = vm.validate(tx, 0, outscript0, tx.in_list[0].script)
        if not valid:
            raise Exception(reason)
        valid, reason = vm.validate(tx, 1, outscript1, tx.in_list[1].script)
        if not valid:
            raise Exception(reason)
Example #2
0
 def test_validate_pubkeyhash(self):
     # tx 5 of block 506 on testnet 3 (2 PUBKEYHASH inputs)
     # tx: e79d5732b9914a511c0ad002c930271aa843ae64ed0abf54bff2869596c04a59
     tx, _ =  TxSerializer().deserialize(decodehexstr("010000000202f630b1641c6988224295e4299c14d176fb4446d0f62a682efc6adbd049de77000000006b483045022100cb6600d5be418a84e3f5c7e7ece2836de358ccbdb26fc1a4e4c262c0db117cf2022058cceb2e810ed5c7c3a4d47c0fec4e09e2672490645767579893ce89c0c50087012102de4a86f3c045cfa9460dbe867ebedab96df36aa662800e2f1d8645374f0d10a4ffffffff3b7de9fe37b52af96fd4f7134df83c91358c40687430812f8e29841085363a87000000006a47304402205b26712719619a2d8510d888a2e2cd65ceba00b104f95d1bc46da04f71814a7d022046af82c57609914a855de48ea0036a09fdbccc7996c79406a6eef383242f994301210321b73cc97e906155d3c5bf65e5a2ee75f6792c97916f1c6ceda59777baa0dcc5ffffffff02b3c40e00000000001976a9146d9ad15ddc32b1f96d9f496a4a8a89a77ab88fa388ac87200f00000000001976a914431143b62421c12c1149f1252ae1e181547b0e5d88ac00000000"))
     outscript1 = ScriptSerializer().deserialize(decodehexstr("76a9141b05d1cc4b3158519041814fdac587326422865b88ac"))
     outscript2 = ScriptSerializer().deserialize(decodehexstr("76a914b5d23a56ad5657163698a6817420f17b47cf3c4588ac"))
     vm = TxValidationVM()
     valid, reason = vm.validate(tx, 0, outscript1, tx.in_list[0].script)
     assert valid, reason
     vm = TxValidationVM()
     valid, reason = vm.validate(tx, 1, outscript2, tx.in_list[1].script)
     assert valid, reason
Example #3
0
    def test_validate_pubkey(self):
        # tx 1 of block 383 on testnet 3 (2 PUBKEY inputs)
        # tx: 43cd28c3b56543298ee264e3c01ef2dd8189276bd0c1cf6b86269018c710ce28
        tx, _ =  TxSerializer().deserialize(decodehexstr("01000000028e3430573cfde2f3e1eece8aefe661dd841bcb665d35832415bab4f75267852200000000494830450221009cca8fb1c4a34982c4e9a59fd15856404c02085f926043cfc6664924a5b9e36d02205811f85b395c43492164b8b33867d745211d8c7ffdcd1b288e56f74dbdaed15b01ffffffffe3abf5981a1bd6457ec0cdcab76cc2a176dc0d7e16f6d3781aebc684f13cc4fd00000000484730440220387bbcee99e370ea2115eaccfd8c48eb380653303b66c6946e0903fb0bbc6f8602202b2ef048519d45525413f64b727a1d85ff2cf7d91ab4607308224b4c30d5846801ffffffff0240f1f23a000000001976a9142203ca59edf66969757e6cc9238b1b36f4dc35b888acc0f218190200000017a9149eb21980dc9d413d8eac27314938b9da920ee53e8700000000"))
        outscript1 = ScriptSerializer().deserialize(decodehexstr("2102547b223d58eb5da7c7690748f70a3bab1509cb7578faac9032399f0b6bce31d6ac"))
        outscript2 = ScriptSerializer().deserialize(decodehexstr("2103fcc9ce029ad74af9fecacce68bcc775cc6efcb000a0b8cc2b3aacad4850bc4b0ac"))

        vm = TxValidationVM()
        valid, reason = vm.validate(tx, 0, outscript1, tx.in_list[0].script)
        assert valid, reason
        valid, reason = vm.validate(tx, 1, outscript2, tx.in_list[1].script)
        assert valid, reason
Example #4
0
    def test_validate_scripthash_multisig(self):
        # tx 1 of block 504 on testnet 3, 2 TX_SCRIPTHASH inputs, 2 PUBKEYHASH outputs
        # SCRIPTHASH of 1-of-2 and 2-of-3 multisig transactions
        # tx: 1915695f1de19d9a2e1fb1bd9c5e2f816022ec41a58e9f298396c8a4586a8c5e
        tx, _ =  TxSerializer().deserialize(decodehexstr("0100000002c142078d793bb5b4aadba6009e2b142872b1ed3a7f0f7336ebe0e38180d8d682010000009200483045022100d6868ef86978ffad889a312be2991cbfe2c2d27b40fed038dc65da83565f5b0f02205f7019af9b75a5e9ba9c394f6ce883fa72e8e0951cf2ca5011af5888026663f3014751210341d8a934cfca197c7acaa358a1c39b3317a3e6d80b808ad367278ddb6661d16f210220108eea941a69b20d320e9a82c4bc5f096edb7e7c74638810227594a8033c1d52aeffffffff3f2dc10288706fe1c3116bec01dc2a259bfc2802b60d9b13787195fa8205f0cf01000000b400473044022066952731f8c5663fd61b2cbc33361e79e27a8c0937c32b42cc2dd125215b98bb02202c90d8022337c868c1f00ab59a9cd833cad2522de4b703264e9b4e271d11cd12014c6951210220108eea941a69b20d320e9a82c4bc5f096edb7e7c74638810227594a8033c1d210386380591c6fe54fe67d54e809d38d2db63886c1d228beb744abc9327bee392882102c4c0101075ed2d413dd328841c87f7a39ff5a75d793decab1da9fb1128082c3b53aeffffffff02c11e1400000000001976a914724192ac202d067d06635dc043b84abdad14de0088ac2b540400000000001976a914342e5d1f2eb9c6e99fda90c85ca05aa36616644c88ac00000000"))
        outscript1 = ScriptSerializer().deserialize(decodehexstr("a914d9f26cca817fa116dc76e1be7a17067eb843625087"))
        outscript2 = ScriptSerializer().deserialize(decodehexstr("a9145fc04212c7fb1103d99dd7ff454797a281ef92f587"))

        vm = TxValidationVM()
        valid, reason = vm.validate(tx, 0, outscript1, tx.in_list[0].script)
        assert valid, reason
        valid, reason = vm.validate(tx, 1, outscript2, tx.in_list[1].script)
        assert valid, reason
Example #5
0
class TestScriptsJson(unittest.TestCase):
    def setUp(self):
        self.vm = TxValidationVM()
        self.current_dir = os.path.dirname(__file__)

    def test_scripts_valid(self):
        with open(os.path.join(self.current_dir, "data",
                               "script_valid.json")) as fp:
            testcase_list = json.load(fp)
        for testcase in testcase_list:
            claim_script = parse_script(testcase[0])
            unspent_script = parse_script(testcase[1])
            valid, reason = self.vm.validate(None, None, unspent_script,
                                             claim_script)
            if not valid:
                raise Exception(reason)

    def test_scripts_invalid(self):
        with open(os.path.join(self.current_dir, "data",
                               "script_invalid.json")) as fp:
            testcase_list = json.load(fp)
        for testcase in testcase_list:
            valid, reason = test_script(self.vm, testcase[0], testcase[1])
            if valid:
                raise Exception("Script is valid %s" % (testcase))
Example #6
0
    def test_validate_scripthash_multisig(self):
        # tx 1 of block 504 on testnet 3, 2 TX_SCRIPTHASH inputs, 2 PUBKEYHASH outputs
        # SCRIPTHASH of 1-of-2 and 2-of-3 multisig transactions
        # tx: 1915695f1de19d9a2e1fb1bd9c5e2f816022ec41a58e9f298396c8a4586a8c5e
        tx, _ = TxSerializer().deserialize(
            decodehexstr(
                "0100000002c142078d793bb5b4aadba6009e2b142872b1ed3a7f0f7336ebe0e38180d8d682010000009200483045022100d6868ef86978ffad889a312be2991cbfe2c2d27b40fed038dc65da83565f5b0f02205f7019af9b75a5e9ba9c394f6ce883fa72e8e0951cf2ca5011af5888026663f3014751210341d8a934cfca197c7acaa358a1c39b3317a3e6d80b808ad367278ddb6661d16f210220108eea941a69b20d320e9a82c4bc5f096edb7e7c74638810227594a8033c1d52aeffffffff3f2dc10288706fe1c3116bec01dc2a259bfc2802b60d9b13787195fa8205f0cf01000000b400473044022066952731f8c5663fd61b2cbc33361e79e27a8c0937c32b42cc2dd125215b98bb02202c90d8022337c868c1f00ab59a9cd833cad2522de4b703264e9b4e271d11cd12014c6951210220108eea941a69b20d320e9a82c4bc5f096edb7e7c74638810227594a8033c1d210386380591c6fe54fe67d54e809d38d2db63886c1d228beb744abc9327bee392882102c4c0101075ed2d413dd328841c87f7a39ff5a75d793decab1da9fb1128082c3b53aeffffffff02c11e1400000000001976a914724192ac202d067d06635dc043b84abdad14de0088ac2b540400000000001976a914342e5d1f2eb9c6e99fda90c85ca05aa36616644c88ac00000000"
            ))
        outscript1 = ScriptSerializer().deserialize(
            decodehexstr("a914d9f26cca817fa116dc76e1be7a17067eb843625087"))
        outscript2 = ScriptSerializer().deserialize(
            decodehexstr("a9145fc04212c7fb1103d99dd7ff454797a281ef92f587"))

        vm = TxValidationVM()
        valid, reason = vm.validate(tx, 0, outscript1, tx.in_list[0].script)
        assert valid, reason
        valid, reason = vm.validate(tx, 1, outscript2, tx.in_list[1].script)
        assert valid, reason
Example #7
0
    def test_validate_pubkey(self):
        # tx 1 of block 383 on testnet 3 (2 PUBKEY inputs)
        # tx: 43cd28c3b56543298ee264e3c01ef2dd8189276bd0c1cf6b86269018c710ce28
        tx, _ = TxSerializer().deserialize(
            decodehexstr(
                "01000000028e3430573cfde2f3e1eece8aefe661dd841bcb665d35832415bab4f75267852200000000494830450221009cca8fb1c4a34982c4e9a59fd15856404c02085f926043cfc6664924a5b9e36d02205811f85b395c43492164b8b33867d745211d8c7ffdcd1b288e56f74dbdaed15b01ffffffffe3abf5981a1bd6457ec0cdcab76cc2a176dc0d7e16f6d3781aebc684f13cc4fd00000000484730440220387bbcee99e370ea2115eaccfd8c48eb380653303b66c6946e0903fb0bbc6f8602202b2ef048519d45525413f64b727a1d85ff2cf7d91ab4607308224b4c30d5846801ffffffff0240f1f23a000000001976a9142203ca59edf66969757e6cc9238b1b36f4dc35b888acc0f218190200000017a9149eb21980dc9d413d8eac27314938b9da920ee53e8700000000"
            ))
        outscript1 = ScriptSerializer().deserialize(
            decodehexstr(
                "2102547b223d58eb5da7c7690748f70a3bab1509cb7578faac9032399f0b6bce31d6ac"
            ))
        outscript2 = ScriptSerializer().deserialize(
            decodehexstr(
                "2103fcc9ce029ad74af9fecacce68bcc775cc6efcb000a0b8cc2b3aacad4850bc4b0ac"
            ))

        vm = TxValidationVM()
        valid, reason = vm.validate(tx, 0, outscript1, tx.in_list[0].script)
        assert valid, reason
        valid, reason = vm.validate(tx, 1, outscript2, tx.in_list[1].script)
        assert valid, reason
class TestScriptsJson(unittest.TestCase):
    def setUp(self):
        self.vm = TxValidationVM()
        self.current_dir = os.path.dirname(__file__)
        
    def test_scripts_valid(self):
        with open(os.path.join(self.current_dir, "data","script_valid.json")) as fp:
            testcase_list = json.load(fp)
        for testcase in testcase_list:
            claim_script = parse_script(testcase[0])
            unspent_script  = parse_script(testcase[1])
            valid, reason = self.vm.validate(None, None, unspent_script, claim_script)
            if not valid:
                raise Exception(reason)
                
    def test_scripts_invalid(self):
        with open(os.path.join(self.current_dir, "data","script_invalid.json")) as fp:
            testcase_list = json.load(fp)
        for testcase in testcase_list:
            valid, reason = test_script(self.vm, testcase[0], testcase[1])
            if valid:
                raise Exception("Script is valid %s" % (testcase))
Example #9
0
 def test_validate_pubkeyhash(self):
     # tx 5 of block 506 on testnet 3 (2 PUBKEYHASH inputs)
     # tx: e79d5732b9914a511c0ad002c930271aa843ae64ed0abf54bff2869596c04a59
     tx, _ = TxSerializer().deserialize(
         decodehexstr(
             "010000000202f630b1641c6988224295e4299c14d176fb4446d0f62a682efc6adbd049de77000000006b483045022100cb6600d5be418a84e3f5c7e7ece2836de358ccbdb26fc1a4e4c262c0db117cf2022058cceb2e810ed5c7c3a4d47c0fec4e09e2672490645767579893ce89c0c50087012102de4a86f3c045cfa9460dbe867ebedab96df36aa662800e2f1d8645374f0d10a4ffffffff3b7de9fe37b52af96fd4f7134df83c91358c40687430812f8e29841085363a87000000006a47304402205b26712719619a2d8510d888a2e2cd65ceba00b104f95d1bc46da04f71814a7d022046af82c57609914a855de48ea0036a09fdbccc7996c79406a6eef383242f994301210321b73cc97e906155d3c5bf65e5a2ee75f6792c97916f1c6ceda59777baa0dcc5ffffffff02b3c40e00000000001976a9146d9ad15ddc32b1f96d9f496a4a8a89a77ab88fa388ac87200f00000000001976a914431143b62421c12c1149f1252ae1e181547b0e5d88ac00000000"
         ))
     outscript1 = ScriptSerializer().deserialize(
         decodehexstr("76a9141b05d1cc4b3158519041814fdac587326422865b88ac"))
     outscript2 = ScriptSerializer().deserialize(
         decodehexstr("76a914b5d23a56ad5657163698a6817420f17b47cf3c4588ac"))
     vm = TxValidationVM()
     valid, reason = vm.validate(tx, 0, outscript1, tx.in_list[0].script)
     assert valid, reason
     vm = TxValidationVM()
     valid, reason = vm.validate(tx, 1, outscript2, tx.in_list[1].script)
     assert valid, reason
 def setUp(self):
     self.vm = TxValidationVM()
     self.current_dir = os.path.dirname(__file__)
    from coinpy.model.constants.bitcoin import COIN
    from coinpy.lib.vm.vm import TxValidationVM

    import os

    runmode = TESTNET
    wallet_filename = "D:\\repositories\\coinpy\\coinpy-client\\src\\data\\testnet\\wallet_testnet.dat"
    directory, filename = os.path.split(wallet_filename)
    bsddb_env = BSDDBEnv(directory)
    wallet = Wallet(None, BSDDBWalletDatabase(bsddb_env, filename), runmode)

    selector = CoinSelector()
    amount, fee = 145.0065 * COIN, 0 * COIN
    #list of (txhash, tx, index, txout)
    outputs = list(wallet.iter_my_outputs())
    selected_outputs = selector.select_coins(outputs, amount + fee)
    tx = create_pubkeyhash_transaction(
        selected_outputs,
        decode_base58check("n4MsBRWD7VxKGsqYRSLaFZC6hQrsrKLaZo"),
        decode_base58check("n4MsBRWD7VxKGsqYRSLaFZC6hQrsrKLaZo"), amount, fee)
    sign_transaction(tx, selected_outputs)
    vm = TxValidationVM()
    print tx
    print len(selected_outputs)
    print vm.validate(tx, 0, selected_outputs[0].txout.script,
                      tx.in_list[0].script)
    print vm.validate(tx, 1, selected_outputs[1].txout.script,
                      tx.in_list[1].script)
    print vm.validate(tx, 2, selected_outputs[2].txout.script,
                      tx.in_list[2].script)
import unittest
import cPickle
from coinpy.lib.vm.vm import TxValidationVM
import time
import traceback
import multiprocessing
import random

vm = TxValidationVM()


def validate_txin(input):
    tx, index, txout = input
    if not vm.validate(tx, index, txout.script, tx.in_list[index].script):
        return False
    return True


def validate_txin_mock(input):
    tx, index, txout = input
    return True


class TestPerfValidateTxin(unittest.TestCase):
    def setUp(self):
        with open("1000_txin_1.pkl", "rb") as f:
            self.txin_1000_2 = cPickle.load(f)

        self.txin_100 = random.sample(self.txin_1000_2, 100)

    def test_validate_1000_txin(self):
Example #13
0
 def setUp(self):
     self.vm = TxValidationVM()
     self.current_dir = os.path.dirname(__file__)
Example #14
0
    from coinpy.model.constants.bitcoin import COIN
    from coinpy.lib.vm.vm import TxValidationVM

    import os

    runmode = TESTNET
    wallet_filename = "D:\\repositories\\coinpy\\coinpy-client\\src\\data\\testnet\\wallet_testnet.dat"
    directory, filename = os.path.split(wallet_filename)
    bsddb_env = BSDDBEnv(directory)
    wallet = Wallet(None, BSDDBWalletDatabase(bsddb_env, filename), runmode)

    selector = CoinSelector()
    amount, fee = 145.0065 * COIN, 0 * COIN
    # list of (txhash, tx, index, txout)
    outputs = list(wallet.iter_my_outputs())
    selected_outputs = selector.select_coins(outputs, amount + fee)
    tx = create_pubkeyhash_transaction(
        selected_outputs,
        decode_base58check("n4MsBRWD7VxKGsqYRSLaFZC6hQrsrKLaZo"),
        decode_base58check("n4MsBRWD7VxKGsqYRSLaFZC6hQrsrKLaZo"),
        amount,
        fee,
    )
    sign_transaction(tx, selected_outputs)
    vm = TxValidationVM()
    print tx
    print len(selected_outputs)
    print vm.validate(tx, 0, selected_outputs[0].txout.script, tx.in_list[0].script)
    print vm.validate(tx, 1, selected_outputs[1].txout.script, tx.in_list[1].script)
    print vm.validate(tx, 2, selected_outputs[2].txout.script, tx.in_list[2].script)