From 01ff5c81f61746b7c5ceabb19b10215b8f617da2 Mon Sep 17 00:00:00 2001 From: Duke Leto Date: Tue, 6 Dec 2022 14:23:53 -0500 Subject: [PATCH] Improve some comments and ensure backcompat on HUSH mainnet Some comments turned out to be wrong and some could be more helpful. It turns out that when AveragingWindowTimespan was changed to fix a HUSH mainnet bug long ago, that introduced a bug for HSC's that do not use a 75s block time. Since the default is 60s that likely means all HSC's that will be created. There were no production HSC's in use at the time of that bugfix, so the bug went unnoticed until DRAGONX was launched. The bug then manifested as the DRAGONX difficulty bug, which cause the difficulty to never correct down, only up and lead to extremely long block times on DRAGONX mainnet. This code change ensures that HUSH mainnet uses the same hardcoded AWT as it did previously and all other HSC's will use params.AveragingWindowTimespan() , including DRAGONX mainnet. This seems less dangerous than changing AveragingWindowTimespan() on HUSH mainnet. --- src/pow.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/pow.cpp b/src/pow.cpp index 31c9eafcf..a63ac8d21 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -509,8 +509,9 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead } // Changing this requires changing many other things and -// changes consensus. Have fun -- Duke -int64_t AveragingWindowTimespan(int32_t height) { +// might change consensus. Have fun -- Duke +// NOTE: Ony HUSH3 mainnet should use this function, all HSC's should use params.AveragigWindowTimespan() +int64_t AveragingWindowTimespan() { // used in const methods, beware! // This is the correct AWT for 75s blocktime, before block 340k // the correct value was 2550 when the blocktime was 150s @@ -527,9 +528,9 @@ unsigned int CalculateNextWorkRequired(arith_uint256 bnAvg, int64_t nActualTimespan = nLastBlockTime - nFirstBlockTime; LogPrint("pow", " nActualTimespan = %d before dampening\n", nActualTimespan); - //NOTE: this will break HUSH+DRAGONX mainnet! For testing only. - int64_t AWT = params.AveragingWindowTimespan(); - //int64_t AWT = AveragingWindowTimespan(height) ; + bool ishush3 = strncmp(SMART_CHAIN_SYMBOL, "HUSH3",5) == 0 ? true : false; + // If this is HUSH3, use AWT function defined above, else use the one in params + int64_t AWT = ishush3 ? AveragingWindowTimespan() : params.AveragingWindowTimespan(); nActualTimespan = AWT + (nActualTimespan - AWT)/4; LogPrint("pow", " nActualTimespan = %d before bounds\n", nActualTimespan);