/test/functional/test_framework/wallet_util.py

https://github.com/soitun/bitcoin · Python · 121 lines · 96 code · 9 blank · 16 comment · 7 complexity · 5603bf62e8b552c113442a988e72832e MD5 · raw file

  1. #!/usr/bin/env python3
  2. # Copyright (c) 2018-2021 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. """Useful util functions for testing the wallet"""
  6. from collections import namedtuple
  7. from test_framework.address import (
  8. byte_to_base58,
  9. key_to_p2pkh,
  10. key_to_p2sh_p2wpkh,
  11. key_to_p2wpkh,
  12. script_to_p2sh,
  13. script_to_p2sh_p2wsh,
  14. script_to_p2wsh,
  15. )
  16. from test_framework.key import ECKey
  17. from test_framework.script_util import (
  18. key_to_p2pkh_script,
  19. key_to_p2wpkh_script,
  20. keys_to_multisig_script,
  21. script_to_p2sh_script,
  22. script_to_p2wsh_script,
  23. )
  24. Key = namedtuple('Key', ['privkey',
  25. 'pubkey',
  26. 'p2pkh_script',
  27. 'p2pkh_addr',
  28. 'p2wpkh_script',
  29. 'p2wpkh_addr',
  30. 'p2sh_p2wpkh_script',
  31. 'p2sh_p2wpkh_redeem_script',
  32. 'p2sh_p2wpkh_addr'])
  33. Multisig = namedtuple('Multisig', ['privkeys',
  34. 'pubkeys',
  35. 'p2sh_script',
  36. 'p2sh_addr',
  37. 'redeem_script',
  38. 'p2wsh_script',
  39. 'p2wsh_addr',
  40. 'p2sh_p2wsh_script',
  41. 'p2sh_p2wsh_addr'])
  42. def get_key(node):
  43. """Generate a fresh key on node
  44. Returns a named tuple of privkey, pubkey and all address and scripts."""
  45. addr = node.getnewaddress()
  46. pubkey = node.getaddressinfo(addr)['pubkey']
  47. return Key(privkey=node.dumpprivkey(addr),
  48. pubkey=pubkey,
  49. p2pkh_script=key_to_p2pkh_script(pubkey).hex(),
  50. p2pkh_addr=key_to_p2pkh(pubkey),
  51. p2wpkh_script=key_to_p2wpkh_script(pubkey).hex(),
  52. p2wpkh_addr=key_to_p2wpkh(pubkey),
  53. p2sh_p2wpkh_script=script_to_p2sh_script(key_to_p2wpkh_script(pubkey)).hex(),
  54. p2sh_p2wpkh_redeem_script=key_to_p2wpkh_script(pubkey).hex(),
  55. p2sh_p2wpkh_addr=key_to_p2sh_p2wpkh(pubkey))
  56. def get_generate_key():
  57. """Generate a fresh key
  58. Returns a named tuple of privkey, pubkey and all address and scripts."""
  59. eckey = ECKey()
  60. eckey.generate()
  61. privkey = bytes_to_wif(eckey.get_bytes())
  62. pubkey = eckey.get_pubkey().get_bytes().hex()
  63. return Key(privkey=privkey,
  64. pubkey=pubkey,
  65. p2pkh_script=key_to_p2pkh_script(pubkey).hex(),
  66. p2pkh_addr=key_to_p2pkh(pubkey),
  67. p2wpkh_script=key_to_p2wpkh_script(pubkey).hex(),
  68. p2wpkh_addr=key_to_p2wpkh(pubkey),
  69. p2sh_p2wpkh_script=script_to_p2sh_script(key_to_p2wpkh_script(pubkey)).hex(),
  70. p2sh_p2wpkh_redeem_script=key_to_p2wpkh_script(pubkey).hex(),
  71. p2sh_p2wpkh_addr=key_to_p2sh_p2wpkh(pubkey))
  72. def get_multisig(node):
  73. """Generate a fresh 2-of-3 multisig on node
  74. Returns a named tuple of privkeys, pubkeys and all address and scripts."""
  75. addrs = []
  76. pubkeys = []
  77. for _ in range(3):
  78. addr = node.getaddressinfo(node.getnewaddress())
  79. addrs.append(addr['address'])
  80. pubkeys.append(addr['pubkey'])
  81. script_code = keys_to_multisig_script(pubkeys, k=2)
  82. witness_script = script_to_p2wsh_script(script_code)
  83. return Multisig(privkeys=[node.dumpprivkey(addr) for addr in addrs],
  84. pubkeys=pubkeys,
  85. p2sh_script=script_to_p2sh_script(script_code).hex(),
  86. p2sh_addr=script_to_p2sh(script_code),
  87. redeem_script=script_code.hex(),
  88. p2wsh_script=witness_script.hex(),
  89. p2wsh_addr=script_to_p2wsh(script_code),
  90. p2sh_p2wsh_script=script_to_p2sh_script(witness_script).hex(),
  91. p2sh_p2wsh_addr=script_to_p2sh_p2wsh(script_code))
  92. def test_address(node, address, **kwargs):
  93. """Get address info for `address` and test whether the returned values are as expected."""
  94. addr_info = node.getaddressinfo(address)
  95. for key, value in kwargs.items():
  96. if value is None:
  97. if key in addr_info.keys():
  98. raise AssertionError("key {} unexpectedly returned in getaddressinfo.".format(key))
  99. elif addr_info[key] != value:
  100. raise AssertionError("key {} value {} did not match expected value {}".format(key, addr_info[key], value))
  101. def bytes_to_wif(b, compressed=True):
  102. if compressed:
  103. b += b'\x01'
  104. return byte_to_base58(b, 239)
  105. def generate_wif_key():
  106. # Makes a WIF privkey for imports
  107. k = ECKey()
  108. k.generate()
  109. return bytes_to_wif(k.get_bytes(), k.is_compressed)