Пример #1
0
 def test_bad_key(self):
     with pytest.raises(ValueError):
         XPublicKey('034339a901d8526c4d733c8ea7c861f1a6324f37f6b86f838725820e0c5fc1957000')
     with pytest.raises(ValueError):
         XPublicKey(
         'ff0488b21e000000000000000000f79d7a4d3ea07099f09fbf35c3103908cbb4b1f30e8602a06ffbdb'
         'b213d0025602e9aa22cc7106abab85e4c41f18f030c370213769c18d6754f3d0584e69a7fa1201000a'
         )
Пример #2
0
 def test_xpubkey(self):
     xpub = ('xpub661MyMwAqRbcH1RHYeZc1zgwYLJ1dNozE8npCe81pnNYtN6e5KsF6cmt17Fv8w'
             'GvJrRiv6Kewm8ggBG6N3XajhoioH3stUmLRi53tk46CiA')
     assert XPublicKey(
         'ff0488b21e000000000000000000f79d7a4d3ea07099f09fbf35c3103908cbb4b1f30e8602a06ffbdb'
         'b213d0025602e9aa22cc7106abab85e4c41f18f030c370213769c18d6754f3d0584e69a7fa1201000a00'
     ).bip32_extended_key_and_path() == (xpub, [1, 10])
     assert XPublicKey(
         'ff0488b21e000000000000000000f79d7a4d3ea07099f09fbf35c3103908cbb4b1f30e8602a06ffbdbb2'
         '13d0025602e9aa22cc7106abab85e4c41f18f030c370213769c18d6754f3d0584e69a7fa1200001900'
     ).bip32_extended_key_and_path() == (xpub, [0, 25])
Пример #3
0
 def test_xpubkey(self):
     xpub = ('xpub661MyMwAqRbcH1RHYeZc1zgwYLJ1dNozE8npCe81pnNYtN6e5KsF6cmt17Fv8w'
             'GvJrRiv6Kewm8ggBG6N3XajhoioH3stUmLRi53tk46CiA')
     xpubkey_hex =(
         'ff0488b21e000000000000000000f79d7a4d3ea07099f09fbf35c3103908cbb4b1f30e8602a06ffbdb'
         'b213d0025602e9aa22cc7106abab85e4c41f18f030c370213769c18d6754f3d0584e69a7fa12')
     # The 1-depth case falls back to the old 2 byte 2 byte parsing.
     assert XPublicKey.from_hex(
         xpubkey_hex + '01000a00').bip32_extended_key_and_path() == (xpub, (1, 10))
     # Derivation path size must be multiples of 16 bit.
     with pytest.raises(AssertionError):
         assert XPublicKey.from_hex(xpubkey_hex + '0a').bip32_extended_key_and_path()
Пример #4
0
 def test_old_keystore(self, raw_hex, public_key_hex, coin):
     public_key = PublicKey.from_hex(public_key_hex)
     assert public_key.is_compressed() is False
     x_pubkey = XPublicKey(raw_hex)
     assert x_pubkey.to_bytes() == bytes.fromhex(raw_hex)
     assert x_pubkey.to_hex() == raw_hex
     assert not x_pubkey.is_bip32_key()
     assert x_pubkey.to_public_key() == public_key
     assert x_pubkey.to_public_key().is_compressed() is False
     assert x_pubkey.to_address() == public_key.to_address(coin=coin)
     assert x_pubkey.to_address().coin() is coin
Пример #5
0
 def sign_tx(self, unsigned_tx_hex, priv_keys):
     keypairs = {XPublicKey.from_hex(priv_key.public_key.to_hex()):
                 (priv_key.to_bytes(), priv_key.is_compressed())
                 for priv_key in priv_keys}
     tx = Transaction.from_extended_bytes(bytes.fromhex(unsigned_tx_hex))
     tx.sign(keypairs)
     return tx
Пример #6
0
    def test_tx_unsigned(self):
        tx = Transaction.from_extended_bytes(bytes.fromhex(unsigned_blob))
        assert tx.version == 1
        assert len(tx.inputs) == 1
        txin = tx.inputs[0]
        assert txin.prev_hash.hex(
        ) == '49f35e43fefd22d8bb9e4b3ff294c6286154c25712baf6ab77b646e5074d6aed'
        assert txin.prev_idx == 1
        assert txin.script_sig.to_hex(
        ) == '01ff4c53ff0488b21e0000000000000000004f130d773e678a58366711837ec2e33ea601858262f8eaef246a7ebd19909c9a03c3b30e38ca7d797fee1223df1c9827b2a9f3379768f520910260220e0560014600002300'
        assert txin.sequence == 4294967294
        assert txin.value == 20112600
        assert txin.signatures == [NO_SIGNATURE]
        assert txin.x_pubkeys == [
            XPublicKey.from_hex(
                'ff0488b21e0000000000000000004f130d773e678a58366711837ec2e33ea601858262f8eaef246a7ebd19909c9a03c3b30e38ca7d797fee1223df1c9827b2a9f3379768f520910260220e0560014600002300'
            )
        ]
        assert txin.threshold == 1
        assert (tx.outputs[0].value == 20112408 and tx.outputs[0].script_pubkey == \
            address_from_string('1MYXdf4moacvaEKZ57ozerpJ3t9xSeN6LK').to_script())
        assert tx.locktime == 507231

        assert json.dumps(
            tx.to_dict()
        ) == '{"version": 1, "hex": "010000000149f35e43fefd22d8bb9e4b3ff294c6286154c25712baf6ab77b646e5074d6aed010000002401ff2103b5bbebceeb33c1b61f649596b9c3611c6b2853a1f6b48bce05dd54f667fa2166feffffff0118e43201000000001976a914e158fb15c888037fdc40fb9133b4c1c3c688706488ac5fbd0700", "complete": false, "inputs": [{"script_type": 2, "threshold": 1, "value": 20112600, "signatures": ["ff"], "x_pubkeys": [{"bip32_xpub": "xpub661MyMwAqRbcFL6WFqND2XM2w1EfpBwFfhsSUcw9xDR3nH8eYLv4z4HAhxv5zkqjHojWsPYK1ZSK7yCr8fZ9iWU6D361G2ryv5UgsKjbeDq", "derivation_path": [0, 35]}]}]}'
Пример #7
0
    def test_tx_unsigned(self):
        tx = Transaction.from_hex(unsigned_blob)
        assert tx.version == 1
        assert len(tx.inputs) == 1
        txin = tx.inputs[0]
        assert txin.prev_hash.hex(
        ) == '49f35e43fefd22d8bb9e4b3ff294c6286154c25712baf6ab77b646e5074d6aed'
        assert txin.prev_idx == 1
        assert txin.script_sig.to_hex(
        ) == '01ff4c53ff0488b21e0000000000000000004f130d773e678a58366711837ec2e33ea601858262f8eaef246a7ebd19909c9a03c3b30e38ca7d797fee1223df1c9827b2a9f3379768f520910260220e0560014600002300'
        assert txin.sequence == 4294967294
        assert txin.value == 20112600
        assert txin.signatures == [NO_SIGNATURE]
        assert txin.x_pubkeys == [
            XPublicKey(
                'ff0488b21e0000000000000000004f130d773e678a58366711837ec2e33ea601858262f8eaef246a7ebd19909c9a03c3b30e38ca7d797fee1223df1c9827b2a9f3379768f520910260220e0560014600002300'
            )
        ]
        assert txin.address == address_from_string(
            '13Vp8Y3hD5Cb6sERfpxePz5vGJizXbWciN')
        assert txin.threshold == 1
        assert tx.outputs == [
            TxOutput(
                20112408,
                address_from_string(
                    '1MYXdf4moacvaEKZ57ozerpJ3t9xSeN6LK').to_script())
        ]
        assert tx.locktime == 507231

        assert tx.as_dict() == {'hex': unsigned_blob, 'complete': False}
Пример #8
0
 def test_raw_public_keys(self, raw_hex, coin):
     public_key = PublicKey.from_hex(raw_hex)
     x_pubkey = XPublicKey(raw_hex)
     assert x_pubkey.to_bytes() == bytes.fromhex(raw_hex)
     assert x_pubkey.to_hex() == raw_hex
     assert not x_pubkey.is_bip32_key()
     assert x_pubkey.to_public_key() == public_key
     assert x_pubkey.to_address() == public_key.to_address(coin=coin)
     assert x_pubkey.to_address().coin() is coin
Пример #9
0
 def test_hex_master_public_key(self):
     # An uncompressed public key in hex form without the 04 prefix
     mpk_hex = ("08863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a688"
                "63b37df75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d0")
     keystore = from_master_key(mpk_hex)
     assert isinstance(keystore, Old_KeyStore)
     assert keystore.get_master_public_key() == mpk_hex
     assert keystore.to_derivation_data() == {'mpk': mpk_hex, 'subpaths':[]}
     assert keystore.is_watching_only()
     assert keystore.get_xpubkey((0, 4)) == XPublicKey.from_hex(
         'fe08863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a68'
         '863b37df75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d000000400'
     )
     assert keystore.get_xpubkey((1, 259)) == XPublicKey.from_hex(
         'fe08863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a68863b37d'
         'f75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d001000301'
     )
Пример #10
0
 def test_is_signature_candidate(self):
     mpk_hex = ("08863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a688"
                "63b37df75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d0")
     keystore = from_master_key(mpk_hex)
     assert keystore.is_signature_candidate(XPublicKey.from_hex(
         'fe08863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a68'
         '863b37df75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d000000400'
     ))
     assert keystore.is_signature_candidate(XPublicKey.from_hex(
         'fe08863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a68863b37d'
         'f75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d001000301'
     ))
     with pytest.raises(ValueError):
         keystore.is_signature_candidate(XPublicKey.from_hex(
             'fe18863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a68863b37d'
             'f75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d001000301'
         ))
Пример #11
0
 def test_get_pubkey_derivation(self):
     mpk_hex = ("08863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a688"
                "63b37df75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d0")
     keystore = from_master_key(mpk_hex)
     assert keystore.get_pubkey_derivation(XPublicKey(
         'fe08863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a68'
         '863b37df75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d000000400'
     )) == [0, 4]
     assert keystore.get_pubkey_derivation(XPublicKey(
         'fe08863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a68863b37d'
         'f75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d001000301'
     )) == [1, 259]
     with pytest.raises(ValueError):
         keystore.get_pubkey_derivation(XPublicKey(
             'fe18863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a68863b37d'
             'f75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d001000301'
         ))
Пример #12
0
 def test_addresses(self, raw_hex, address, coin):
     address = Address.from_string(address)
     address._coin = coin
     x_pubkey = XPublicKey(raw_hex)
     assert x_pubkey.to_bytes() == bytes.fromhex(raw_hex)
     assert x_pubkey.to_hex() == raw_hex
     assert not x_pubkey.is_bip32_key()
     assert x_pubkey.to_public_key() == address
     assert x_pubkey.to_address() == address
     assert x_pubkey.to_address().coin() is coin
Пример #13
0
    def test_bip32_extended_keys(self, raw_hex, path, coin):
        # see test_keystore.py
        xpub = ('xpub661MyMwAqRbcH1RHYeZc1zgwYLJ1dNozE8npCe81pnNYtN6e5KsF6cmt17Fv8w'
                'GvJrRiv6Kewm8ggBG6N3XajhoioH3stUmLRi53tk46CiA')
        root_key = bip32_key_from_string(xpub)
        True_10_public_key = root_key.child(path[0]).child(path[1])

        x_pubkey = XPublicKey(bytes.fromhex(raw_hex))
        assert x_pubkey.to_bytes() == bytes.fromhex(raw_hex)
        assert x_pubkey.to_hex() == raw_hex
        assert x_pubkey.is_bip32_key()
        assert x_pubkey.bip32_extended_key_and_path() == (xpub, path)
        assert x_pubkey.to_public_key() == True_10_public_key
        assert x_pubkey.to_address() == True_10_public_key.to_address(coin=coin)
        assert x_pubkey.to_address().coin() is coin
Пример #14
0
 def test_get_pubkey_derivation(self):
     pubkey = imported_keystore.get_pubkey_derivation(XPublicKey(
         '04e7dd15b4271f8308ff52ad3d3e472b652e78a2c5bc6ed10250a543d28c0128894ae'
         '863d086488e6773c4589be93a1793f685dd3f1e8a1f1b390b23470f7d1095'
     ))
     assert isinstance(pubkey, PublicKey)
     pubkey = imported_keystore.get_pubkey_derivation(XPublicKey(
         '02d0de0aaeaefad02b8bdc8a01a1b8b11c696bd3d66a2c5f10780d95b7df42645c'
     ))
     assert isinstance(pubkey, PublicKey)
     assert imported_keystore.get_pubkey_derivation(XPublicKey(
         '02c113be5c752294f8b0be2727bbf7f1bf71e6bba5c9e9141f611610707bbce4db'
     )) is None
     pubkey = imported_keystore.get_pubkey_derivation(XPublicKey(
         'fd76a914d9351dcbad5b8f3b8bfa2f2cdc85c28118ca932688ac'
     ))
     assert isinstance(pubkey, PublicKey)
     pubkey = imported_keystore.get_pubkey_derivation(XPublicKey(
         'fd76a914753e5cd1dd15a7028daa03fe5e47389297ac227a88ac'
     ))
     assert pubkey is None
Пример #15
0
    def test_is_signature_candidate(self):
        x_pubkey_1 = XPublicKey.from_hex(
            '04e7dd15b4271f8308ff52ad3d3e472b652e78a2c5bc6ed10250a543d28c0128894ae'
            '863d086488e6773c4589be93a1793f685dd3f1e8a1f1b390b23470f7d1095')
        assert imported_keystore.is_signature_candidate(x_pubkey_1)

        x_pubkey_2 = XPublicKey.from_hex(
            '02d0de0aaeaefad02b8bdc8a01a1b8b11c696bd3d66a2c5f10780d95b7df42645c')
        assert imported_keystore.is_signature_candidate(x_pubkey_2)

        assert not imported_keystore.is_signature_candidate(XPublicKey.from_hex(
            '02c113be5c752294f8b0be2727bbf7f1bf71e6bba5c9e9141f611610707bbce4db'
        ))
        with pytest.raises(ValueError):
            imported_keystore.is_signature_candidate(XPublicKey.from_hex(
                'fd76a914d9351dcbad5b8f3b8bfa2f2cdc85c28118ca932688ac'
            ))
        with pytest.raises(ValueError):
            imported_keystore.is_signature_candidate(XPublicKey.from_hex(
                'fd76a914753e5cd1dd15a7028daa03fe5e47389297ac227a88ac'
            ))
Пример #16
0
def get_datacarrier_tx() -> Transaction:
    """datacarrier tx with one op_return output >6000 bytes and an xpubkey in the
    input - only for testing obj size calculation"""
    path = Path(dirname(os.path.realpath(__file__))).joinpath(
        "data/transactions/data_carrier.txt")
    with open(path, "r") as f:
        rawtx = f.read()

    tx = Transaction.from_hex(rawtx)
    priv_key_bytes = bitcoinx.PrivateKey(
        bytes.fromhex(
            'a2d9803c912ab380c1491d3bd1aaab34ca06742d7885a224ec8d386182d26ed2')
    ).public_key.to_bytes()
    tx.inputs[0].x_pubkeys.append(XPublicKey.from_bytes(priv_key_bytes))
    return tx
Пример #17
0
    def test_tx_signed(self):
        # This is testing the extended parsing for a signed transaction.
        tx = Transaction.from_extended_bytes(bytes.fromhex(signed_blob))
        assert tx.version == 1
        assert len(tx.inputs) == 1
        txin = tx.inputs[0]
        assert txin.prev_hash.hex() == '49f35e43fefd22d8bb9e4b3ff294c6286154c25712baf6ab77b646e5074d6aed'
        assert txin.prev_idx == 1
        assert txin.script_sig.to_hex() == '473044022025bdc804c6fe30966f6822dc25086bc6bb0366016e68e880cf6efd2468921f3202200e665db0404f6d6d9f86f73838306ac55bb0d0f6040ac6047d4e820f24f46885412103b5bbebceeb33c1b61f649596b9c3611c6b2853a1f6b48bce05dd54f667fa2166'
        assert txin.sequence == 4294967294
        assert txin.signatures == [bytes.fromhex('3044022025bdc804c6fe30966f6822dc25086bc6bb0366016e68e880cf6efd2468921f3202200e665db0404f6d6d9f86f73838306ac55bb0d0f6040ac6047d4e820f24f4688541')]
        assert txin.x_pubkeys == [XPublicKey.from_hex('03b5bbebceeb33c1b61f649596b9c3611c6b2853a1f6b48bce05dd54f667fa2166')]
        assert txin.threshold == 1
        assert (tx.outputs[0].value == 20112408 and tx.outputs[0].script_pubkey == \
            address_from_string('1MYXdf4moacvaEKZ57ozerpJ3t9xSeN6LK').to_script())
        assert tx.locktime == 507231
        assert tx.to_dict() == {'hex': signed_blob, 'complete': True, 'version': 1}
        assert tx.serialize() == signed_blob

        tx.update_signatures(signed_blob)

        assert tx.estimated_size() == 192
Пример #18
0
        },
    ],
}

result_S = ([
    UTXO(value=45318048,
         script_pubkey=Script.from_hex(
             '76a914cb3e86e38ce37d5add87d3da753adc04a04bf60c88ac'),
         tx_hash=
         '9f2c45a12db0144909b5db269415f7319179105982ac70ed80d76ea79d923ebf',
         out_index=0,
         height=437146,
         address=address_from_string('1KXf5PUHNaV42jE9NbJFPKhGGN1fSSGJNK'),
         is_coinbase=False)
], {
    XPublicKey('04e7dd15b4271f8308ff52ad3d3e472b652e78a2c5bc6ed10250a543d28c0128894ae863d086488e6773c4589be93a1793f685dd3f1e8a1f1b390b23470f7d1095'):
    (b'\x98\xe3\x15\xc3%j\x97\x17\xd4\xdd\xea0\xeb*\n-V\xa1d\x93yN\xb0SSf\xea"\xd8i\xa3 ',
     False),
    XPublicKey('03e7dd15b4271f8308ff52ad3d3e472b652e78a2c5bc6ed10250a543d28c012889'):
    (b'\x98\xe3\x15\xc3%j\x97\x17\xd4\xdd\xea0\xeb*\n-V\xa1d\x93yN\xb0SSf\xea"\xd8i\xa3 ',
     True),
    XPublicKey('fd76a914cb3e86e38ce37d5add87d3da753adc04a04bf60c88ac'):
    (b'\x98\xe3\x15\xc3%j\x97\x17\xd4\xdd\xea0\xeb*\n-V\xa1d\x93yN\xb0SSf\xea"\xd8i\xa3 ',
     False),
    XPublicKey('fd76a9142af9bdc179471526aef15781b00ab6ebd162a45888ac'):
    (b'\x98\xe3\x15\xc3%j\x97\x17\xd4\xdd\xea0\xeb*\n-V\xa1d\x93yN\xb0SSf\xea"\xd8i\xa3 ',
     True),
})

result_K = ([
    UTXO(value=18043706,
Пример #19
0
 def test_parse_xpub(self):
     res = XPublicKey.from_hex(
         'fe4e13b0f311a55b8a5db9a32e959da9f011b131019d4cebe6141b9e2c93edcbfc0954c358b062a9f94111548e50bde5847a3096b8b7872dcffadb0e9579b9017b01000200'
     ).to_address()
     assert res == address_from_string('19h943e4diLc68GXW7G75QNe2KWuMu7BaJ')
Пример #20
0
 def test_bad_type(self):
     public_key = PublicKey.from_hex(
         '034339a901d8526c4d733c8ea7c861f1a6324f37f6b86f838725820e0c5fc19570'
     )
     with pytest.raises(AssertionError):
         XPublicKey(pubkey_bytes=public_key)
Пример #21
0
 def test_derive_pubkey(self, for_change, n, pubkey_hex):
     xpub = ('xpub661MyMwAqRbcH1RHYeZc1zgwYLJ1dNozE8npCe81pnNYtN6e5KsF6cmt17Fv8w'
             'GvJrRiv6Kewm8ggBG6N3XajhoioH3stUmLRi53tk46CiA')
     keystore = BIP32_KeyStore({'xpub': xpub})
     pubkey = keystore.derive_pubkey((for_change, n))
     assert pubkey == XPublicKey.from_hex(pubkey_hex).to_public_key()