/ test / functional / data / README.md
README.md
 1  # Various test vectors
 2  
 3  ## mainnet_alt.json
 4  
 5  For easier testing the difficulty is maximally increased in the first (and only)
 6  retarget period, by producing blocks approximately 2 minutes apart.
 7  
 8  The alternate mainnet chain was generated as follows:
 9  - use faketime to set node clock to 2 minutes after genesis block
10  - mine a block using a CPU miner such as https://github.com/pooler/cpuminer
11  - restart node with a faketime 2 minutes later
12  
13  ```sh
14  for i in {1..2016}
15  do
16   t=$(( 1231006505 + $i * 120 ))
17   faketime "`date -d @$t  +'%Y-%m-%d %H:%M:%S'`" \
18   bitcoind -connect=0 -nocheckpoints -stopatheight=$i
19  done
20  ```
21  
22  The CPU miner is kept running as follows:
23  
24  ```sh
25  ./minerd -u ... -p ... -o http://127.0.0.1:8332 --no-stratum \
26          --coinbase-addr 1NQpH6Nf8QtR2HphLRcvuVqfhXBXsiWn8r \
27          --algo sha256d --no-longpoll --scantime 3 --retry-pause 1
28  ```
29  
30  The payout address is derived from first BIP32 test vector master key:
31  
32  ```
33  pkh(xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi/44h/0h/0h/<0;1>/*)#fkjtr0yn
34  ```
35  
36  It uses `pkh()` because `tr()` outputs at low heights are not spendable (`unexpected-witness`).
37  
38  This makes each block deterministic except for its timestamp and nonce, which
39  are stored in `mainnet_alt.json` and used to reconstruct the chain without
40  having to redo the proof-of-work.
41  
42  The timestamp was not kept constant because at difficulty 1 it's not sufficient
43  to only grind the nonce. Grinding the extra_nonce or version field instead
44  would have required additional (stratum) software. It would also make it more
45  complicated to reconstruct the blocks in this test.
46  
47  The `getblocktemplate` RPC code needs to be patched to ignore not being connected
48  to any peers, and to ignore the IBD status check.
49  
50  On macOS use `faketime "@$t"` instead.