Subject: Re: [bitcoindev] Unbreaking testnet4

From: Saint Wenhao <[email-masked]>
Date: Mon, 28 Apr 2025 20:15:35 +0200

> Which means that in practice, instead of seeing huge or overflowed
amounts in UTXOs, we will probably see a lot of repeated entries in the
UTXO set, holding MAX_MONEY each.

Now I applied "doubling" patch in my local regtest, and I can confirm it.
After 2849 blocks, when trying to mine block number 2850, the UTXO amount
exceeded 21 million coins, and then it failed.

```
2025-04-28T17:45:39Z CreateNewBlock(): block weight: 820 txs: 0 fees: 0
sigops 400
2025-04-28T17:45:39Z Saw new header
hash=16d1899aba71f27e7e527f559db7472cbf18f80c2da7e26acb3c2b8476651c54
height=2847
2025-04-28T17:45:39Z UpdateTip: new
best=16d1899aba71f27e7e527f559db7472cbf18f80c2da7e26acb3c2b8476651c54
height=2847 version=0x20000000 log2_work=12.475733 tx=2848
date='2025-04-28T17:50:11Z' progress=1.000000 cache=0.5MiB(2847txo)
2025-04-28T17:45:39Z CreateNewBlock(): block weight: 820 txs: 0 fees: 0
sigops 400
2025-04-28T17:45:39Z Saw new header
hash=1c639e9656dcea7c2c8c694d27bc9dd82bd327bc8c95c4be1d5ec576c99638fe
height=2848
2025-04-28T17:45:39Z UpdateTip: new
best=1c639e9656dcea7c2c8c694d27bc9dd82bd327bc8c95c4be1d5ec576c99638fe
height=2848 version=0x20000000 log2_work=12.476240 tx=2849
date='2025-04-28T17:50:11Z' progress=1.000000 cache=0.5MiB(2848txo)
2025-04-28T17:45:39Z CreateNewBlock(): block weight: 820 txs: 0 fees: 0
sigops 400
2025-04-28T17:45:39Z Saw new header
hash=1e119d36bcd683d4ff2d10c63b60d33431fd141be5cd20d3b0fd074f036b409a
height=2849
2025-04-28T17:45:39Z UpdateTip: new
best=1e119d36bcd683d4ff2d10c63b60d33431fd141be5cd20d3b0fd074f036b409a
height=2849 version=0x20000000 log2_work=12.476746 tx=2850
date='2025-04-28T17:50:11Z' progress=1.000000 cache=0.5MiB(2849txo)
2025-04-28T17:45:39Z CreateNewBlock(): block weight: 820 txs: 0 fees: 0
sigops 400
2025-04-28T17:45:39Z [error] TestBlockValidity: Consensus::CheckBlock:
bad-txns-vout-toolarge, Transaction check failed (tx hash
5802b7370153f8c415fcf689bda204adebe4483c306110ae33a35a88a593d495)
2025-04-28T17:49:41Z CreateNewBlock(): block weight: 808 txs: 0 fees: 0
sigops 400
2025-04-28T17:49:41Z [error] TestBlockValidity: Consensus::CheckBlock:
bad-txns-vout-toolarge, Transaction check failed (tx hash
f9a54543470144efc33e975d02f44188a7a0d88c16fb997018e33b4e66244f37)
```

And it also failed immediately, after calling "getblocktemplate".

However, after manually crafting a block with 21 million coins, it
succeeded:

$ ./bitcoin-cli -regtest getblock
627434e2e29fb3409aa9bca6b27b261210b3adf274e6e091da889ece9142901b 0
000000209a406b034f07fdb0d320cde51b14fd3134d3603bc6102dffd483d6bc369d111e9d347f2c3a7114151cdc93c9cccc2f6ce64cf7c1b71bb454d005202c9140d413d5bf0f68ffff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0402220b00ffffffff020040075af07507000451024e730000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000

2025-04-28T18:06:27Z Saw new header
hash=627434e2e29fb3409aa9bca6b27b261210b3adf274e6e091da889ece9142901b
height=2850
2025-04-28T18:06:27Z UpdateTip: new
best=627434e2e29fb3409aa9bca6b27b261210b3adf274e6e091da889ece9142901b
height=2850 version=0x20000000 log2_work=12.477252 tx=2851
date='2025-04-28T17:50:13Z' progress=1.000000 cache=0.5MiB(2850txo)

Which means, that after reaching 21 million coins, that kind of UTXOs will
be produced forever. And I guess it won't be even possible to send more
coins than that in a single transaction, which means, that we are quite
safe from any kinds of overflows, but we are not safe from flooding the
UTXO set with max coin amounts.

pon., 28 kwi 2025 o 14:47 Sjors Provoost <[email-masked]> napisał(a):

> Jameson Lopp wrote:
>
> > Encoding an "end of life date" into testnets is actually an interesting
> idea worth discussing. As far as I'm aware it's never been done before on
> any network.
>
> Keep in mind that testnet-specific code has to live right next to, even
> inside of, mainnet consensus code. We want the change to be as simple as
> possible, so as to not accidentally break mainnet.
>
> Unless and until coin expiration is something we're seriously considering
> for mainnet, we'd rather not implement it for testnet.
>
> This particular idea probably requires a lot of changes all over the place
> (consensus, mempool, wallet) because it breaks the assumption that coins
> don't expire.
>
>
> Something I've proposed in person a few times, is to double the coins
> every halving. In terms of code, it boils down to changing GetBlockSubsidy:
>
> CAmount nSubsidy = 50 * COIN;
> // Subsidy is cut in half every 210,000 blocks which will occur
> approximately every 4 years.
> If (consensusParams.inflation) {
>     // Except on testnet5
>     nSubsidy <<= halvings;
> } else {
>   nSubsidy >>= halvings;
> }
>
> This will eventually overflow, but that seems fine for a testnet. Along
> with the timewarp fix, the network might even grind to a halt in 2106, long
> before we overflow 64 bit numbers.
>
> Rust Bitcoin [0] currently refuses amounts above 21 million BTC, but they
> would have many years to fix that.
>
>
> Strong inflation has been battle tested by governments around the world
> for millennia as a way to discourage saving.
>
> - Sjors
>
> [0] https://github.com/rust-bitcoin/rust-bitcoin/issues/4273

-- 
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 [email-masked].
To view this discussion visit https://groups.google.com/d/msgid/bitcoindev/CACgYNOL3gH6zhmNyiKLenqoiM9mydsxs3XExxJX1ZSVvOmX2bA%40mail.gmail.com.