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