Re: [bitcoin-dev] Unbreaking testnet4

89 views
Skip to first unread message

Angelo

unread,
Jan 18, 2026, 6:35:17 PM (4 days ago) Jan 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 AM (4 days ago) Jan 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,
6:37 AM (12 hours ago) 6:37 AM
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.
Reply all
Reply to author
Forward
0 new messages