Re: [bitcoin-dev] Unbreaking testnet4

207 views
Skip to first unread message

Angelo

unread,
Jan 18, 2026, 6:35:17 PMJan 18
to bitco...@googlegroups.com
Hello mailing list.

I have forked Bitcoin Core and modified the code to fix testnet4 by disabling the min difficulty rule after block 150,000: https://github.com/bitcoin/bitcoin/compare/master...batmanbytes:bitcoin:testnet4-fix

The changes in the code are minimal. As I've written in Bitcointalk:
I have introduced int nMinDifficultyBlocksForkHeight which is 0 by default in consensus/params.h, only ever used by the CTestNet4Params class. GetNextWorkRequired and PermittedDifficultyTransition are also modified to check whether min difficulty blocks are enabled, and if yes, whether nMinDifficultyBlocksForkHeight is 0 (which would indicate it is not testnet4). 

With no other changes to the code, during the epoch that includes block 150,000 (which already began at block 149,184), we should expect the block interval to increase by roughly sixfold (to about one hour per block). This is because the effective hashrate would correspond to approximately one-sixth of the difficulty. The difficulty increases by about 6x since there are roughly six times more difficulty-1 blocks than blocks at the normal difficulty.

We could modify the code to not suffer from the temporary 1-hour block interval if needed. I'm just interested to see what you think of those changes, so that we can move forward.  

Saint Wenhao

unread,
Jan 19, 2026, 5:28:40 AMJan 19
to Angelo, bitco...@googlegroups.com
> The changes in the code are minimal.

Yes, but you need some test cases as well.


> We could modify the code to not suffer from the temporary 1-hour block interval if needed.

It is not needed. Testnet4 overproduced around 30k blocks, if we count the time between today, and the Genesis Block. If it will take three months, instead of two weeks, to re-adjust the difficulty, then it wouldn't matter that much, because we already have around 1.5 million more coins, than we should have today.

Also, rejecting all blocks with CPU difficulty would mean, that the updated network will be stuck from time to time, when ASIC miners will come in, raise the difficulty, and then go away, leaving the rest of the users with halted chain.

--
You received this message because you are subscribed to the Google Groups "Bitcoin Development Mailing List" group.
To unsubscribe from this group and stop receiving emails from it, send an email to bitcoindev+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/bitcoindev/85djL2Ah0Mh9Appt934138jLRE23gGmaIr96y8q-clEmMa_APPZLerKrrUZN524_Diq4pOydQLaEOZ3XBy4-sQIPxYODOHreM5RWuNHILto%3D%40protonmail.com.

Angelo

unread,
Jan 22, 2026, 6:37:51 AMJan 22
to Saint Wenhao, bitco...@googlegroups.com
  • Yes, but you need some test cases as well.

I added unit tests that test the modified functions in isolation. Check my changes again.

Testnet4 fork behavior (4 tests):

1. testnet4_min_difficulty_pre_fork: At height 149,999, min-difficulty blocks ARE allowed (returns powLimit when block is >20min late)
2. testnet4_min_difficulty_at_fork: At height 150,000, min-difficulty blocks are NOT allowed (returns previous difficulty instead)
3. testnet4_min_difficulty_post_fork: At height 150,001, min-difficulty blocks are NOT allowed.
4. testnet4_permitted_difficulty_transition: PermittedDifficultyTransition() is permissive before fork, strict after.

Other chains unaffected (3 tests):
5. regtest_min_difficulty_unaffected: Regtest still allows min-difficulty at any height (nMinDifficultyBlocksForkHeight=0 means no fork)
6. mainnet_min_difficulty_unaffected: Mainnet unaffected (fPowAllowMinDifficultyBlocks=false)
7. Existing ChainParams_TESTNET4_sanity already verifies basic testnet4 param sanity.
  
Running the proof-of-work tests, I get no errors detected:

​$ ./build/bin/test_bitcoin --run_test=pow_tests  
Running 21 test cases...

*** No errors detected

$ ./build/bin/test_bitcoin --run_test=pow_tests/testnet4*
Running 4 test cases...

*** No errors detected

If you have any other unit tests in mind, let me know, but I think those are enough.

  • Also, rejecting all blocks with CPU difficulty would mean, that the updated network will be stuck from time to time, when ASIC miners will come in, raise the difficulty, and then go away, leaving the rest of the users with halted chain.

The network is already in a halted chain, because empty blocks are propagated faster than non-empty, and transactions are confirmed most often when ASIC miners include them in their blocks. When ASIC miners go away with the current model, the users will have to wait for a much longer time, due to empty blocks.

Angelo

unread,
Feb 2, 2026, 6:36:59 PMFeb 2
to Angelo, Saint Wenhao, bitco...@googlegroups.com

- The hardfork activates at block 151200 instead of 150000. The reason is that block 151200 is the start of epoch 75, and this is less prone to error and confusion.
- At block 151200, difficulty is reset to 1 million, to compensate for the artificially high difficulty caused by the CPU miners. This would result in a small mining race for epochs 75 to around 78, where miners with hashpower would find blocks in a matter of seconds. The difficulty will then 4x in the 76th epoch, then again 4x, and it goes up until it naturally finds the 10 minute block interval.

The number 1 million was selected arbitrarily to get the best of both worlds: (1) it won't result in a block storm (as it would if difficulty was reset to 1) and (2) it won't result in very long block intervals. If there weren't any difficulty reset, and difficulty would just be calculated as normal, it'd take around an hour for a block to be found, and this would mean epoch 75 alone would take around three months instead of two weeks. 

(Original message is from Bitcointalk)

Angelo

unread,
Feb 2, 2026, 6:36:59 PMFeb 2
to Saint Wenhao, bitco...@googlegroups.com

- The hardfork activates at block 151200 instead of 150000. The reason is that block 151200 is the start of epoch 75, and this is less prone to error and confusion.
- At block 151200, difficulty is reset to 1 million, to compensate for the artificially high difficulty caused by the CPU miners. This would result in a small mining race for epochs 75 to around 78, where miners with hashpower would find blocks in a matter of seconds. The difficulty will then 4x in the 76th epoch, then again 4x, and it goes up until it naturally finds the 10 minute block interval.

The number 1 million was selected arbitrarily to get the best of both worlds: (1) it won't result in a block storm (as it would if difficulty was reset to 1) and (2) it won't result in very long block intervals. If there weren't any difficulty reset, and difficulty would just be calculated as normal, it'd take around an hour for a block to be found, and this would mean epoch 75 alone would take around three months instead of two weeks. 

(Original message is from Bitcointalk)
Reply all
Reply to author
Forward
0 new messages