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.