5.4.7.0-leisure
[5.4.7.0], 2024-03-13, leisure
This release is solely to implement the disconnection of version 5.4.5.0 and
below nodes as the last cleanup action due to the inadvertent fork caused at
3190603/4 as a result of the inadvertent protocol change introduced in
5.4.6.0. A more detailed explanation is in order:
The default contract version is supposed to change from 2 to 3 at the block v13
hardfork, which was envisioned to be set as part of the Natasha milestone
release. The way this is accomplished is that the default contract version is
incremented to 3, and then logic is used to ensure the contract version actually
used is 2 until the v13 fork point is reached. The fork point for v13 was not
set in version 5.4.6.0, as it was intended to be 100% protocol compatible with
5.4.0.0 - 5.4.5.0, i.e. a leisure upgrade; however, a coding omission caused tx
messages sent from 5.4.6.0 nodes to be version 3 instead of version 2
immediately. This caused nodes 5.4.5.0 and below to reject the transaction
containing the message and the block causing a fork.
This mistake is mine and mine alone, and I am regretful about it. This is the
first forking incident we have had in a number of years, but I take this type
of event very seriously. Regression testing is done as well as longer time
testnet testing and some mainnet testing before that, but this particular type
of issue is hard to catch.
By the time this actually occurred on mainnet, there was far more weight on the
5.4.6.0 side of the fork than the 5.4.5.0 side, so it made the most sense to
continue forward with the 5.4.6.0 side, and require everybody that had not
already upgraded to upgrade, essentially turning 5.4.6.0 into a mandatory.
All but a few folks have upgraded now to 5.4.6.0, but we still have a few nodes
(with aggregrate difficulty ~ 1.0) on the 5.4.5.0 fork and these nodes are
connecting to 5.4.6.0 peers. Given that the fork common block is fairly deep at
this point (the fork point was at 3190603/4 and the head of the chain is at
3194579 as of this writing), this is causing a lot of unnecessary network
traffic between 5.4.5.0 and 5.4.6.0 nodes to pass orphan blocks around.
At this point it makes sense to implement an automatic disconnect for all nodes
5.4.5.0 and below. The code already disconnected nodes below 5.4.0.0 as the
protocol version in wallets less than 5.4.0.0 is out of date. Because the
protocol version was not incremented from 5.4.5.0 to 5.4.6.0, we have to
distinguish and disconnect here based on the node sub version string, which
contains 5.4.x (and is also displayed in the peers table).
Note this is similar in concept to what we do in a normal mandatory, where we
normally disconnect pre-mandatory version nodes after a grace period from the
hard fork height. Obviously the conditions are not ideal here, but this is the
best answer at this point.
This should solve the elevated CPU usage and network bandwidth of wallets that
are receiving all of the orphan block traffic.
This release also includes the small adjustment to the Fraction class to solve
the compilation problems on Arch.
Added
- net, consensus: Ban nodes 5.4.5.0 and below #2751 (@jamescowens)
Changed
Removed
Fixed
- util: Adjust Fraction class addition overload overflow tests #2748 (@jamescowens)