def test_base58(self): addr = "mnrVtF8DWjMu839VW3rBfgYaAfKk8983Xf" h160 = decode_base58(addr).hex() want = "507b27411ccf7f16f10297de6cef3f291623eddf" self.assertEqual(h160, want) got = encode_base58_checksum(b"\x6f" + bytes.fromhex(h160)) self.assertEqual(got, addr) addr = "1111111111111111111114oLvT2" h160 = decode_base58(addr).hex() want = "0000000000000000000000000000000000000000" self.assertEqual(h160, want) got = encode_base58_checksum(b"\x00" + bytes.fromhex(h160)) self.assertEqual(got, addr)
def test_address(self): address_1 = "3CLoMMyuoDQTPRD3XYZtCvgvkadrAdvdXh" h160 = decode_base58(address_1) p2sh_script_pubkey = P2SHScriptPubKey(h160) self.assertEqual(p2sh_script_pubkey.address(), address_1) address_2 = "2N3u1R6uwQfuobCqbCgBkpsgBxvr1tZpe7B" self.assertEqual(p2sh_script_pubkey.address(network="testnet"), address_2) self.assertEqual(p2sh_script_pubkey.address(network="signet"), address_2)
def test_address(self): address_1 = "1BenRpVUFK65JFWcQSuHnJKzc4M8ZP8Eqa" h160 = decode_base58(address_1) p2pkh_script_pubkey = P2PKHScriptPubKey(h160) self.assertEqual(p2pkh_script_pubkey.address(), address_1) address_2 = "mrAjisaT4LXL5MzE81sfcDYKU3wqWSvf9q" self.assertEqual(p2pkh_script_pubkey.address(network="testnet"), address_2) self.assertEqual(p2pkh_script_pubkey.address(network="signet"), address_2)
def find_utxos(self, address): """Returns transaction outputs that matches the address""" h160 = decode_base58(address) # utxos are a list of tuples: (hash, index, amount) utxos = [] for index, tx_out in enumerate(self.tx_outs): if tx_out.script_pubkey.hash160() == h160: utxos.append((self.hash(), index, tx_out.amount)) return utxos
def to_address(cls, address, amount): """Takes an address and an amount and makes a TxOut object""" if address.startswith("bc1") or address.startswith("tb1"): _, version, h = decode_bech32(address) if version == 0: if len(h) == 20: script_pubkey = P2WPKHScriptPubKey(h) elif len(h) == 32: script_pubkey = P2WSHScriptPubKey(h) else: raise ValueError( f"{address} is not a valid bech32 address") elif version == 1: if len(h) == 32: script_pubkey = P2TRScriptPubKey(h) else: raise ValueError( f"{address} is not a valid bech32 address") else: raise ValueError( f"{address} is an unknown type of segwit address") elif address[0] in ("3", "2"): h = decode_base58(address) if len(h) == 20: script_pubkey = P2SHScriptPubKey(h) else: raise ValueError( f"{address} is not a valid base58 p2sh address") elif address[0] in ("1", "m", "n"): h = decode_base58(address) if len(h) == 20: script_pubkey = P2PKHScriptPubKey(h) else: raise ValueError( f"{address} is not a valid base58 p2pkh address") else: raise ValueError( f"{address} is an unknown or invalid type of address") return cls(amount=amount, script_pubkey=script_pubkey)
def address_to_script_pubkey(s): if s[:1] in ("1", "m", "n"): # p2pkh h160 = decode_base58(s) return P2PKHScriptPubKey(h160) elif s[:1] in ("2", "3"): # p2sh h160 = decode_base58(s) return P2SHScriptPubKey(h160) elif s[:4] in ("bc1q", "tb1q"): if len(s) == 42: # p2wpkh return P2WPKHScriptPubKey(decode_bech32(s)[2]) elif len(s) == 62: # p2wskh return P2WSHScriptPubKey(decode_bech32(s)[2]) elif s[:4] in ("bc1p", "tb1p"): if len(s) != 62: raise RuntimeError(f"unknown type of address: {s}") # p2tr return P2TRScriptPubKey(decode_bech32(s)[2]) raise RuntimeError(f"unknown type of address: {s}")
def test_get_filtered_txs(self): bf = BloomFilter(30, 5, 90210) h160 = decode_base58("mseRGXB89UTFVkWJhTRTzzZ9Ujj4ZPbGK5") bf.add(h160) node = SimpleNode("testnet.programmingbitcoin.com", network="testnet") node.handshake() node.send(bf.filterload()) block_hash = bytes.fromhex( "00000000000377db7fde98411876c53e318a395af7304de298fd47b7c549d125" ) txs = node.get_filtered_txs([block_hash]) self.assertEqual( txs[0].id(), "0c024b9d3aa2ae8faae96603b8d40c88df2fc6bf50b3f446295206f70f3cf6ad", ) self.assertEqual( txs[1].id(), "0886537e27969a12478e0d33707bf6b9fe4fdaec8d5d471b5304453b04135e7e", ) self.assertEqual( txs[2].id(), "23d4effc88b80fb7dbcc2e6a0b0af9821c6fe3bb4c8dc3b61bcab7c45f0f6888", )