예제 #1
0
 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)
예제 #2
0
 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)
예제 #3
0
 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)
예제 #4
0
 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
예제 #5
0
 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)
예제 #6
0
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}")
예제 #7
0
 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",
     )