tool_signet_miner.py
1 #!/usr/bin/env python3 2 # Copyright (c) 2022 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 signet miner tool""" 6 7 import os.path 8 import subprocess 9 import sys 10 import time 11 12 from test_framework.key import ECKey 13 from test_framework.script_util import key_to_p2wpkh_script 14 from test_framework.test_framework import BitcoinTestFramework 15 from test_framework.util import assert_equal 16 from test_framework.wallet_util import bytes_to_wif 17 18 19 CHALLENGE_PRIVATE_KEY = (42).to_bytes(32, 'big') 20 21 22 class SignetMinerTest(BitcoinTestFramework): 23 def add_options(self, parser): 24 self.add_wallet_options(parser) 25 26 def set_test_params(self): 27 self.chain = "signet" 28 self.setup_clean_chain = True 29 self.num_nodes = 1 30 31 # generate and specify signet challenge (simple p2wpkh script) 32 privkey = ECKey() 33 privkey.set(CHALLENGE_PRIVATE_KEY, True) 34 pubkey = privkey.get_pubkey().get_bytes() 35 challenge = key_to_p2wpkh_script(pubkey) 36 self.extra_args = [[f'-signetchallenge={challenge.hex()}']] 37 38 def skip_test_if_missing_module(self): 39 self.skip_if_no_cli() 40 self.skip_if_no_wallet() 41 self.skip_if_no_bitcoin_util() 42 43 def run_test(self): 44 node = self.nodes[0] 45 # import private key needed for signing block 46 node.importprivkey(bytes_to_wif(CHALLENGE_PRIVATE_KEY)) 47 48 # generate block with signet miner tool 49 base_dir = self.config["environment"]["SRCDIR"] 50 signet_miner_path = os.path.join(base_dir, "contrib", "signet", "miner") 51 subprocess.run([ 52 sys.executable, 53 signet_miner_path, 54 f'--cli={node.cli.binary} -datadir={node.cli.datadir}', 55 'generate', 56 f'--address={node.getnewaddress()}', 57 f'--grind-cmd={self.options.bitcoinutil} grind', 58 '--nbits=1d00ffff', 59 f'--set-block-time={int(time.time())}', 60 ], check=True, stderr=subprocess.STDOUT) 61 assert_equal(node.getblockcount(), 1) 62 63 64 if __name__ == "__main__": 65 SignetMinerTest().main()