rpc_validateaddress.py raw

   1  #!/usr/bin/env python3
   2  # Copyright (c) 2023-present The Bitcoin Core developers
   3  # Distributed under the MIT software license, see the accompanying
   4  # file COPYING or http://www.opensource.org/licenses/mit-license.php.
   5  """Test validateaddress for main chain"""
   6  
   7  from test_framework.test_framework import BitcoinTestFramework
   8  
   9  from test_framework.util import assert_equal
  10  
  11  INVALID_DATA = [
  12      # BIP 173
  13      (
  14          "tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty",
  15          "Invalid or unsupported Segwit (Bech32) or Base58 encoding.",  # Invalid hrp
  16          [],
  17      ),
  18      ("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5", "Invalid Bech32 checksum", [41]),
  19      (
  20          "BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2",
  21          "Version 1+ witness address must use Bech32m checksum",
  22          [],
  23      ),
  24      (
  25          "bc1rw5uspcuh",
  26          "Version 1+ witness address must use Bech32m checksum",  # Invalid program length
  27          [],
  28      ),
  29      (
  30          "bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90",
  31          "Version 1+ witness address must use Bech32m checksum",  # Invalid program length
  32          [],
  33      ),
  34      (
  35          "BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P",
  36          "Invalid Bech32 v0 address program size (16 bytes), per BIP141",
  37          [],
  38      ),
  39      (
  40          "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7",
  41          "Invalid or unsupported Segwit (Bech32) or Base58 encoding.",  # tb1, Mixed case
  42          [],
  43      ),
  44      (
  45          "BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3t4",
  46          "Invalid character or mixed case",  # bc1, Mixed case, not in BIP 173 test vectors
  47          [40],
  48      ),
  49      (
  50          "bc1zw508d6qejxtdg4y5r3zarvaryvqyzf3du",
  51          "Version 1+ witness address must use Bech32m checksum",  # Wrong padding
  52          [],
  53      ),
  54      (
  55          "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv",
  56          "Invalid or unsupported Segwit (Bech32) or Base58 encoding.",  # tb1, Non-zero padding in 8-to-5 conversion
  57          [],
  58      ),
  59      ("bc1gmk9yu", "Empty Bech32 data section", []),
  60      # BIP 350
  61      (
  62          "tc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vq5zuyut",
  63          "Invalid or unsupported Segwit (Bech32) or Base58 encoding.",  # Invalid human-readable part
  64          [],
  65      ),
  66      (
  67          "bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqh2y7hd",
  68          "Version 1+ witness address must use Bech32m checksum",  # Invalid checksum (Bech32 instead of Bech32m)
  69          [],
  70      ),
  71      (
  72          "tb1z0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqglt7rf",
  73          "Invalid or unsupported Segwit (Bech32) or Base58 encoding.",  # tb1, Invalid checksum (Bech32 instead of Bech32m)
  74          [],
  75      ),
  76      (
  77          "BC1S0XLXVLHEMJA6C4DQV22UAPCTQUPFHLXM9H8Z3K2E72Q4K9HCZ7VQ54WELL",
  78          "Version 1+ witness address must use Bech32m checksum",  # Invalid checksum (Bech32 instead of Bech32m)
  79          [],
  80      ),
  81      (
  82          "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kemeawh",
  83          "Version 0 witness address must use Bech32 checksum",  # Invalid checksum (Bech32m instead of Bech32)
  84          [],
  85      ),
  86      (
  87          "tb1q0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vq24jc47",
  88          "Invalid or unsupported Segwit (Bech32) or Base58 encoding.",  # tb1, Invalid checksum (Bech32m instead of Bech32)
  89          [],
  90      ),
  91      (
  92          "bc1p38j9r5y49hruaue7wxjce0updqjuyyx0kh56v8s25huc6995vvpql3jow4",
  93          "Invalid Base 32 character",  # Invalid character in checksum
  94          [59],
  95      ),
  96      (
  97          "BC130XLXVLHEMJA6C4DQV22UAPCTQUPFHLXM9H8Z3K2E72Q4K9HCZ7VQ7ZWS8R",
  98          "Invalid Bech32 address witness version",
  99          [],
 100      ),
 101      ("bc1pw5dgrnzv", "Invalid Bech32 address program size (1 byte)", []),
 102      (
 103          "bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7v8n0nx0muaewav253zgeav",
 104          "Invalid Bech32 address program size (41 bytes)",
 105          [],
 106      ),
 107      (
 108          "BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P",
 109          "Invalid Bech32 v0 address program size (16 bytes), per BIP141",
 110          [],
 111      ),
 112      (
 113          "tb1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vq47Zagq",
 114          "Invalid or unsupported Segwit (Bech32) or Base58 encoding.",  # tb1, Mixed case
 115          [],
 116      ),
 117      (
 118          "bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7v07qwwzcrf",
 119          "Invalid padding in Bech32 data section",  # zero padding of more than 4 bits
 120          [],
 121      ),
 122      (
 123          "tb1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vpggkg4j",
 124          "Invalid or unsupported Segwit (Bech32) or Base58 encoding.",  # tb1, Non-zero padding in 8-to-5 conversion
 125          [],
 126      ),
 127      ("bc1gmk9yu", "Empty Bech32 data section", []),
 128  ]
 129  VALID_DATA = [
 130      # BIP 350
 131      (
 132          "BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4",
 133          "0014751e76e8199196d454941c45d1b3a323f1433bd6",
 134      ),
 135      # (
 136      #   "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7",
 137      #   "00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262",
 138      # ),
 139      (
 140          "bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3",
 141          "00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262",
 142      ),
 143      (
 144          "bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kt5nd6y",
 145          "5128751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd6",
 146      ),
 147      ("BC1SW50QGDZ25J", "6002751e"),
 148      ("bc1zw508d6qejxtdg4y5r3zarvaryvaxxpcs", "5210751e76e8199196d454941c45d1b3a323"),
 149      # (
 150      #   "tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy",
 151      #   "0020000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433",
 152      # ),
 153      (
 154          "bc1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvses5wp4dt",
 155          "0020000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433",
 156      ),
 157      # (
 158      #   "tb1pqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesf3hn0c",
 159      #   "5120000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433",
 160      # ),
 161      (
 162          "bc1pqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvses7epu4h",
 163          "5120000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433",
 164      ),
 165      (
 166          "bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqzk5jj0",
 167          "512079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
 168      ),
 169      # PayToAnchor(P2A)
 170      (
 171          "bc1pfeessrawgf",
 172          "51024e73",
 173      ),
 174  ]
 175  
 176  
 177  class ValidateAddressMainTest(BitcoinTestFramework):
 178      def set_test_params(self):
 179          self.setup_clean_chain = True
 180          self.chain = ""  # main
 181          self.num_nodes = 1
 182          self.extra_args = [["-prune=899"]] * self.num_nodes
 183  
 184      def check_valid(self, addr, spk):
 185          info = self.nodes[0].validateaddress(addr)
 186          assert_equal(info["isvalid"], True)
 187          assert_equal(info["scriptPubKey"], spk)
 188          assert "error" not in info
 189          assert "error_locations" not in info
 190  
 191      def check_invalid(self, addr, error_str, error_locations):
 192          res = self.nodes[0].validateaddress(addr)
 193          assert_equal(res["isvalid"], False)
 194          assert_equal(res["error"], error_str)
 195          assert_equal(res["error_locations"], error_locations)
 196  
 197      def test_validateaddress(self):
 198          for (addr, error, locs) in INVALID_DATA:
 199              self.check_invalid(addr, error, locs)
 200          for (addr, spk) in VALID_DATA:
 201              self.check_valid(addr, spk)
 202  
 203      def run_test(self):
 204          self.test_validateaddress()
 205  
 206  
 207  if __name__ == "__main__":
 208      ValidateAddressMainTest(__file__).main()
 209