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")
def test_parse_p2wpkh_priv(self): key = BTC.parse( "zprvAYkZ9vLqSk9bAb9xL9sZEKTUqbURWBYGhz8kU33d7k1zfNzJr4Wy" "jBqEs8iCWn6jATSJGHdmPUNWXAUHm3hX1f4XjFcP1YsQUvGR9zJd6e5") subkey = key.subkey_for_path("0/0") self.assertEqual(subkey.address(), "bc1qz0e8kyqvhr2j4xzlzr2r5rkpxykerv6vdawckn")
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")
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")
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")
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")
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")
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:])
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)
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)
def test_parse_p2wpkh_address(self): key = BTC.parse("bc1qz0e8kyqvhr2j4xzlzr2r5rkpxykerv6vdawckn") self.assertEqual(key.address(), "bc1qz0e8kyqvhr2j4xzlzr2r5rkpxykerv6vdawckn")
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))
def test_parse_address(self): key = BTC.parse("1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH") self.assertEqual(key.address(), "1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH")
def test_parse_bad_address(self): key = BTC.parse("1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMW") self.assertEqual(key, None)
def test_parse_bad_wif(self): key = BTC.parse("KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWo") self.assertEqual(key, None)
def test_parse_wif(self): key = BTC.parse("KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn") self.assertEqual(key.secret_exponent(), 1)
def test_parse_electrum_master_private(self): key = BTC.parse( "E:0000000000000000000000000000000000000000000000000000000000000001" ) self.assertEqual(key.secret_exponent(), 1)
def test_parse_p2wpkh_in_p2sh_address(self): key = BTC.parse("3F6bDarXnXbCsVuE5CbquM6ubg16qDRbHh") self.assertEqual(key.address(), "3F6bDarXnXbCsVuE5CbquM6ubg16qDRbHh")
def test_parse_bad_bip32_prv(self): key = BTC.parse( "xprv9s21ZrQH143K31AgNK5pyVvW23gHnkBq2wh5aEk6g1s496M8ZMjx" "ncCKZKgb5jZoY5eSJMJ2Vbyvi2hbmQnCuHBujZ2WXGTux1X2k9Krdtr") self.assertEqual(key, None)