Exemple #1
0
 def test_parse_p2wpkh_in_p2sh_priv(self):
     key = BTC.parse(
         "yprvAHcaFzWG6Xu7N2Tum3WGs6gj4sbSv6DSrWyWgNaHmm6i9aHP8uG2f"
         "qUHzgHQc4S48Q5cfS8MfBdhCY32e15AZ6qVnXGzZsJe8njSKXh8Y3g")
     subkey = key.subkey_for_path("0/0")
     self.assertEqual(subkey.address(),
                      "3F6bDarXnXbCsVuE5CbquM6ubg16qDRbHh")
Exemple #2
0
 def test_parse_p2wpkh_priv(self):
     key = BTC.parse(
         "zprvAYkZ9vLqSk9bAb9xL9sZEKTUqbURWBYGhz8kU33d7k1zfNzJr4Wy"
         "jBqEs8iCWn6jATSJGHdmPUNWXAUHm3hX1f4XjFcP1YsQUvGR9zJd6e5")
     subkey = key.subkey_for_path("0/0")
     self.assertEqual(subkey.address(),
                      "bc1qz0e8kyqvhr2j4xzlzr2r5rkpxykerv6vdawckn")
Exemple #3
0
 def test_parse_p2wpkh_in_pub(self):
     key = BTC.parse(
         "ypub6WbvfW39vuTQaWYNs53HEEdTcuRwKYwJDju7UkyuL6dh2NcXgSaHDdnmqyg2sRSxXYCLix5r5JAEufkNeS2ugPj3UA6o98W7yWrcUzg8HoD"
     )
     self.assertEqual(key.secret_exponent(), None)
     subkey = key.subkey_for_path("0/0")
     self.assertEqual(subkey.address(),
                      "3F6bDarXnXbCsVuE5CbquM6ubg16qDRbHh")
Exemple #4
0
 def test_parse_p2wpkh_pub(self):
     key = BTC.parse(
         "zpub6mjuZRsjH7htP5ERSBQZbTQDPdJuueG85D4MGRTEg5YyYBKTPbqEGz9iiPmKkCrTn2dMFsp2tgs3MQ1zExvNFTEnHrrABy4dayJk9foR6K9"
     )
     self.assertEqual(key.secret_exponent(), None)
     subkey = key.subkey_for_path("0/0")
     self.assertEqual(subkey.address(),
                      "bc1qz0e8kyqvhr2j4xzlzr2r5rkpxykerv6vdawckn")
Exemple #5
0
 def test_parse_electrum_seed(self):
     key = BTC.parse("E:00000000000000000000000000000001")
     self.assertEqual(
         key.secret_exponent(),
         0x2ccdb632d4630c8e5a417858f70876afe5585c15b1c0940771af9ac160201b1d)
     self.assertEqual(key.address(), "16e8FARWaEo7Cf2rYxzr8Lg3S8JP2dwBxh")
     subkey = key.subkey("1")
     self.assertEqual(
         subkey.wif(),
         "5KYqyRxoMGnwsXfEFWtVifAKTzU9RcAZu1hme6GLMECKdWHybns")
Exemple #6
0
 def test_parse_bip32_pub(self):
     key = BTC.parse(
         "xpub661MyMwAqRbcFVF9ULcqLdsEa5WnCCugQAcgNd9iEMQ31tgH6u4"
         "DLQWoQayvtSVYFvXz2vPPpbXE1qpjoUFidhjFj82pVShWu9curWmb2zy")
     self.assertEqual(key.secret_exponent(), None)
     self.assertEqual(key.address(), "19Vqc8uLTfUonmxUEZac7fz1M5c5ZZbAii")
     self.assertEqual(key.address(is_compressed=False),
                      "1MwkRkogzBRMehBntgcq2aJhXCXStJTXHT")
     subkey = key.subkey_for_path("0")
     self.assertEqual(subkey.address(),
                      "1NV3j6NgeAkWBytXiQkWxMFLBtTdbef1rp")
Exemple #7
0
 def test_parse_bip32_prv(self):
     key = BTC.parse(
         "xprv9s21ZrQH143K31AgNK5pyVvW23gHnkBq2wh5aEk6g1s496M8ZMjx"
         "ncCKZKgb5jZoY5eSJMJ2Vbyvi2hbmQnCuHBujZ2WXGTux1X2k9Krdtq")
     self.assertEqual(
         key.secret_exponent(),
         0x91880b0e3017ba586b735fe7d04f1790f3c46b818a2151fb2def5f14dd2fd9c3)
     self.assertEqual(key.address(), "19Vqc8uLTfUonmxUEZac7fz1M5c5ZZbAii")
     self.assertEqual(key.address(is_compressed=False),
                      "1MwkRkogzBRMehBntgcq2aJhXCXStJTXHT")
     subkey = key.subkey_for_path("0")
     self.assertEqual(subkey.address(),
                      "1NV3j6NgeAkWBytXiQkWxMFLBtTdbef1rp")
Exemple #8
0
    def patch_addr_methods(self, method, params):
        # blockchain.address.get_balance(addr) => blockchain.scripthash.get_balance(sh)
        from hashlib import sha256
        from binascii import b2a_hex
        try:
            from pycoin.symbols.btc import network as BTC  # bitcoin only!
        except ImportError:
            raise RuntimeError(
                "we can patch obsolete protocol msgs, but need pycoin>=0.90")

        # convert from base58 into sha256(binary of script)?
        addr = BTC.parse(params[0])
        sh = sha256(addr.script()).digest()[::-1]

        return method.replace('.address.', '.scripthash.'), \
                    [str(b2a_hex(sh), 'ascii')]+list(params[1:])
Exemple #9
0
    def bip32_xprv_to_xprv(self, path, xprv_string):
        path = self._decorate_path(path)
        ent = self.bip32_xprv_to_entropy(path, xprv_string)

        # From Peter Gray
        # Taking 64 bytes of the HMAC digest, the first 32 bytes are the chain code, and second 32 bytes are the private
        # key for BIP32 XPRV value. Child number, depth, and parent fingerprint are forced to zero.
        prefix = b'\x04\x88\xad\xe4'
        depth = b'\x00'
        parent_fingerprint = b'\x00\x00\x00\x00'
        child_num = b'\x00\x00\x00\x00'
        chain_code = ent[:32]
        private_key = b'\x00' + ent[32:]
        extended_key = prefix + depth + parent_fingerprint + child_num + chain_code + private_key
        checksum = hashlib.sha256(
            hashlib.sha256(extended_key).digest()).digest()[:4]
        derived_xprv_string = base58.b58encode(extended_key +
                                               checksum).decode()
        node = BTC.parse(derived_xprv_string)

        return node.hwif(as_private=True)
Exemple #10
0
def main():
    if len(sys.argv) != 2:
        print("usage: %s bip32_key_file" % sys.argv[0])
        sys.exit(-1)
    with open(sys.argv[1], "r") as f:
        hwif = f.readline().strip()

    # turn the bip32 text into a BIP32Node object
    BIP32_KEY = network.parse(hwif)

    # create three sec_keys (these are public keys, streamed using the SEC format)

    SEC_0 = BIP32_KEY.subkey_for_path("0/0/0").sec()
    SEC_1 = BIP32_KEY.subkey_for_path("0/1/0").sec()
    SEC_2 = BIP32_KEY.subkey_for_path("0/2/0").sec()

    public_key_sec_list = [SEC_0, SEC_1, SEC_2]

    # create the 2-of-3 multisig script
    # any 2 signatures can release the funds
    pay_to_multisig_script = network.contract.for_multisig(2, public_key_sec_list)

    # create a "2-of-3" multisig address_for_multisig
    the_address = network.address.for_p2s(pay_to_multisig_script)

    print("Here is your pay 2-of-3 address: %s" % the_address)

    print("Here is the pay 2-of-3 script: %s" % b2h(pay_to_multisig_script))
    print("The hex script should go into p2sh_lookup.hex")

    base_dir = os.path.abspath(os.path.dirname(sys.argv[1]))
    print("The three WIFs are written into %s as wif0, wif1 and wif2" % base_dir)
    for i in range(3):
        wif = BIP32_KEY.subkey_for_path("0/%d/0" % i).wif()
        with open(os.path.join(base_dir, "wif%d" % i), "w") as f:
            f.write(wif)
Exemple #11
0
 def test_parse_p2wpkh_address(self):
     key = BTC.parse("bc1qz0e8kyqvhr2j4xzlzr2r5rkpxykerv6vdawckn")
     self.assertEqual(key.address(),
                      "bc1qz0e8kyqvhr2j4xzlzr2r5rkpxykerv6vdawckn")
Exemple #12
0
 def bip32_xprv_to_entropy(self, path, xprv_string):
     xprv = BTC.parse(xprv_string)
     if xprv is None:
         raise ValueError('ERROR: Invalid xprv')
     return self._hmac_sha512(self._derive_k(path, xprv))
Exemple #13
0
 def test_parse_address(self):
     key = BTC.parse("1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH")
     self.assertEqual(key.address(), "1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH")
Exemple #14
0
 def test_parse_bad_address(self):
     key = BTC.parse("1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMW")
     self.assertEqual(key, None)
Exemple #15
0
 def test_parse_bad_wif(self):
     key = BTC.parse("KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWo")
     self.assertEqual(key, None)
Exemple #16
0
 def test_parse_wif(self):
     key = BTC.parse("KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn")
     self.assertEqual(key.secret_exponent(), 1)
Exemple #17
0
 def test_parse_electrum_master_private(self):
     key = BTC.parse(
         "E:0000000000000000000000000000000000000000000000000000000000000001"
     )
     self.assertEqual(key.secret_exponent(), 1)
Exemple #18
0
 def test_parse_p2wpkh_in_p2sh_address(self):
     key = BTC.parse("3F6bDarXnXbCsVuE5CbquM6ubg16qDRbHh")
     self.assertEqual(key.address(), "3F6bDarXnXbCsVuE5CbquM6ubg16qDRbHh")
Exemple #19
0
 def test_parse_bad_bip32_prv(self):
     key = BTC.parse(
         "xprv9s21ZrQH143K31AgNK5pyVvW23gHnkBq2wh5aEk6g1s496M8ZMjx"
         "ncCKZKgb5jZoY5eSJMJ2Vbyvi2hbmQnCuHBujZ2WXGTux1X2k9Krdtr")
     self.assertEqual(key, None)