示例#1
0
 def test_bad_key(self):
     with pytest.raises(ValueError):
         XPublicKey.from_hex(
             '034339a901d8526c4d733c8ea7c861f1a6324f37f6b86f838725820e0c5fc1957000')
     with pytest.raises(AssertionError):
         XPublicKey.from_hex(
         'ff0488b21e000000000000000000f79d7a4d3ea07099f09fbf35c3103908cbb4b1f30e8602a06ffbdb'
         'b213d0025602e9aa22cc7106abab85e4c41f18f030c370213769c18d6754f3d0584e69a7fa1201000a'
         )
示例#2
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()
    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]}]}]}'
示例#4
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
示例#5
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'
         ))
示例#6
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'
     )
 def test_raw_public_keys(self, raw_hex, coin):
     public_key = PublicKey.from_hex(raw_hex)
     x_pubkey = XPublicKey.from_hex(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
 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.from_hex(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
示例#9
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'
            ))
示例#10
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
 def test_parse_xpub(self):
     res = XPublicKey.from_hex(
         'fe4e13b0f311a55b8a5db9a32e959da9f011b131019d4cebe6141b9e2c93edcbfc0954c358b062a9f94111548e50bde5847a3096b8b7872dcffadb0e9579b9017b01000200'
     ).to_address()
     assert res == address_from_string('19h943e4diLc68GXW7G75QNe2KWuMu7BaJ')
示例#12
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()