def ExtendedKey(self, private=True, encoded=True): "Return extended private or public key as string, optionally base58 encoded" if self.public is True and private is True: raise Exception( "Cannot export an extended private key from a public-only deterministic key" ) if not self.testnet: version = param_query(NETWORK, 'hd_prv')[0] if private else param_query( NETWORK, 'hd_pub')[0] else: version = EX_TEST_PRIVATE[0] if private else EX_TEST_PUBLIC[0] depth = bytes(bytearray([self.depth])) fpr = self.parent_fpr child = struct.pack('>L', self.index) chain = self.C if self.public is True or private is False: data = self.PublicKey() else: data = b'\x00' + self.PrivateKey() raw = version + depth + fpr + child + chain + data if not encoded: return raw else: return base58.check_encode(raw)
def public_key_to_bc_address(public_key, ip=False): i = hashlib.new('ripemd160', hashlib.sha256(public_key).digest()).digest() prefix_to_use = str( int(param_query(NETWORK, 'address_version').encode('hex'))) if not ip else '66' vh160 = prefix_to_use.decode('hex') + i return base58.check_encode(vh160)
def WalletImportFormat(self): "Returns private key encoded for wallet import" if self.public: raise Exception( "Publicly derived deterministic keys have no private half") addressversion = param_query( NETWORK, 'wif_version') if not self.testnet else '\xef' raw = addressversion + self.k.to_string() + '\x01' # Always compressed return base58.check_encode(raw)
def public_key_to_address(public_key, prefix=103): i = hashlib.new('ripemd160', hashlib.sha256(public_key).digest()).digest() prefix = str(hex(prefix)).strip("0x") if prefix == "": prefix = "00" elif len(prefix) < 2: prefix = "0" + prefix vh160 = prefix.decode('hex') + i return base58.check_encode(vh160)
def P2WPKHoP2SHAddress(self): "Return P2WPKH over P2SH segwit address" pk_bytes = self.PublicKey() assert len(pk_bytes) == 33 and (pk_bytes.startswith(b"\x02") or pk_bytes.startswith(b"\x03")), \ "Only compressed public keys are compatible with p2sh-p2wpkh addresses. " \ "See https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki." pk_hash = hashlib.new('ripemd160', sha256(pk_bytes).digest()).digest() push_20 = bytes.fromhex('0014') script_sig = push_20 + pk_hash address_bytes = hashlib.new('ripemd160', sha256(script_sig).digest()).digest() prefix = b"\xc4" if self.testnet else b"\x05" return base58.check_encode(prefix + address_bytes)
def Address(self, ip=False): "Return compressed public key address" addressversion = param_query(NETWORK, 'address_version') if not ip else '\x66' vh160 = addressversion + self.Identifier() return base58.check_encode(vh160)