From 8b2745314d46e0d1672df826b6407b93b07d4c5c Mon Sep 17 00:00:00 2001 From: Luke Williams Date: Sat, 21 Dec 2019 12:06:59 +0100 Subject: [PATCH] consensus/ubqhash: merge calcDifficultyOrig and calcDifficulty2 into calcDifficultyDigishieldV3 --- consensus/ubqhash/consensus.go | 123 ++++++++++----------------------- 1 file changed, 36 insertions(+), 87 deletions(-) diff --git a/consensus/ubqhash/consensus.go b/consensus/ubqhash/consensus.go index ff33a429e8..1e8f9a3905 100644 --- a/consensus/ubqhash/consensus.go +++ b/consensus/ubqhash/consensus.go @@ -312,52 +312,27 @@ func (ubqhash *Ubqhash) verifyHeader(chain consensus.ChainReader, header, parent } // Difficulty timespans -func averagingWindowTimespan() *big.Int { +func averagingWindowTimespan(config *diffConfig) *big.Int { x := new(big.Int) - return x.Mul(digishieldV3Config.AveragingWindow, big88) + return x.Mul(config.AveragingWindow, big88) } -func minActualTimespan() *big.Int { +func minActualTimespan(config *diffConfig) *big.Int { x := new(big.Int) y := new(big.Int) z := new(big.Int) - x.Sub(big.NewInt(100), digishieldV3Config.MaxAdjustUp) - y.Mul(averagingWindowTimespan(), x) + x.Sub(big.NewInt(100), config.MaxAdjustUp) + y.Mul(averagingWindowTimespan(config), x) z.Div(y, big.NewInt(100)) return z } -func maxActualTimespan() *big.Int { +func maxActualTimespan(config *diffConfig) *big.Int { x := new(big.Int) y := new(big.Int) z := new(big.Int) - x.Add(big.NewInt(100), digishieldV3Config.MaxAdjustDown) - y.Mul(averagingWindowTimespan(), x) - z.Div(y, big.NewInt(100)) - return z -} - -func averagingWindowTimespan88() *big.Int { - x := new(big.Int) - return x.Mul(digishieldV3ModConfig.AveragingWindow, big88) -} - -func minActualTimespan2() *big.Int { - x := new(big.Int) - y := new(big.Int) - z := new(big.Int) - x.Sub(big.NewInt(100), digishieldV3ModConfig.MaxAdjustUp) - y.Mul(averagingWindowTimespan88(), x) - z.Div(y, big.NewInt(100)) - return z -} - -func maxActualTimespan2() *big.Int { - x := new(big.Int) - y := new(big.Int) - z := new(big.Int) - x.Add(big.NewInt(100), digishieldV3ModConfig.MaxAdjustDown) - y.Mul(averagingWindowTimespan88(), x) + x.Add(big.NewInt(100), config.MaxAdjustDown) + y.Mul(averagingWindowTimespan(config), x) z.Div(y, big.NewInt(100)) return z } @@ -368,11 +343,11 @@ func minActualTimespanFlux(dampen bool) *big.Int { z := new(big.Int) if dampen { x.Sub(big.NewInt(1000), fluxConfig.Dampen) - y.Mul(averagingWindowTimespan88(), x) + y.Mul(averagingWindowTimespan(fluxConfig), x) z.Div(y, big.NewInt(1000)) } else { x.Sub(big.NewInt(1000), fluxConfig.MaxAdjustUp) - y.Mul(averagingWindowTimespan88(), x) + y.Mul(averagingWindowTimespan(fluxConfig), x) z.Div(y, big.NewInt(1000)) } return z @@ -384,11 +359,11 @@ func maxActualTimespanFlux(dampen bool) *big.Int { z := new(big.Int) if dampen { x.Add(big.NewInt(1000), fluxConfig.Dampen) - y.Mul(averagingWindowTimespan88(), x) + y.Mul(averagingWindowTimespan(fluxConfig), x) z.Div(y, big.NewInt(1000)) } else { x.Add(big.NewInt(1000), fluxConfig.MaxAdjustDown) - y.Mul(averagingWindowTimespan88(), x) + y.Mul(averagingWindowTimespan(fluxConfig), x) z.Div(y, big.NewInt(1000)) } return z @@ -409,15 +384,17 @@ func CalcDifficulty(chain consensus.ChainReader, time uint64, parent *types.Head config := chain.Config() ubqhashConfig := config.Ubqhash - if parentNumber.Cmp(ubqhashConfig.DigishieldModBlock) < 0 { - return calcDifficultyOrig(chain, parentNumber, parentDiff, parent) - } if parentNumber.Cmp(ubqhashConfig.FluxBlock) < 0 { - // (chain consensus.ChainReader, parentNumber, parentDiff *big.Int, parent *types.Header) - return calcDifficulty2(chain, parentNumber, parentDiff, parent) + if parentNumber.Cmp(ubqhashConfig.DigishieldModBlock) < 0 { + // Original DigishieldV3 + return calcDifficultyDigishieldV3(chain, parentNumber, parentDiff, parent, digishieldV3Config) + } else { + // Modified DigishieldV3 + return calcDifficultyDigishieldV3(chain, parentNumber, parentDiff, parent, digishieldV3ModConfig) + } } else { - // (chain consensus.ChainReader, time, parentTime, parentNumber, parentDiff *big.Int, parent *types.Header) - return fluxDifficulty(chain, big.NewInt(int64(time)), big.NewInt(int64(parentTime)), parentNumber, parentDiff, parent) + // Flux + return calcDifficultyFlux(chain, big.NewInt(int64(time)), big.NewInt(int64(parentTime)), parentNumber, parentDiff, parent) } } @@ -464,17 +441,17 @@ func CalcDifficultyLegacy(time, parentTime uint64, parentNumber, parentDiff *big // the difficulty that a new block should have when created at time // given the parent block's time and difficulty. // Rewritten to be based on Digibyte's Digishield v3 retargeting -func calcDifficultyOrig(chain consensus.ChainReader, parentNumber, parentDiff *big.Int, parent *types.Header) *big.Int { +func calcDifficultyDigishieldV3(chain consensus.ChainReader, parentNumber, parentDiff *big.Int, parent *types.Header, digishield *diffConfig) *big.Int { // holds intermediate values to make the algo easier to read & audit x := new(big.Int) nFirstBlock := new(big.Int) - nFirstBlock.Sub(parentNumber, digishieldV3Config.AveragingWindow) + nFirstBlock.Sub(parentNumber, digishield.AveragingWindow) log.Debug(fmt.Sprintf("CalcDifficulty parentNumber: %v parentDiff: %v", parentNumber, parentDiff)) // Check we have enough blocks - if parentNumber.Cmp(digishieldV3Config.AveragingWindow) < 1 { - log.Debug(fmt.Sprintf("CalcDifficulty: parentNumber(%+x) < digishieldV3Config.AveragingWindow(%+x)", parentNumber, digishieldV3Config.AveragingWindow)) + if parentNumber.Cmp(digishield.AveragingWindow) < 1 { + log.Debug(fmt.Sprintf("CalcDifficulty: parentNumber(%+x) < digishieldV3Config.AveragingWindow(%+x)", parentNumber, digishield.AveragingWindow)) x.Set(parentDiff) return x } @@ -490,56 +467,28 @@ func calcDifficultyOrig(chain consensus.ChainReader, parentNumber, parentDiff *b // nActualTimespan = AveragingWindowTimespan() + (nActualTimespan-AveragingWindowTimespan())/4 y := new(big.Int) - y.Sub(nActualTimespan, averagingWindowTimespan()) + y.Sub(nActualTimespan, averagingWindowTimespan(digishield)) y.Div(y, big.NewInt(4)) - nActualTimespan.Add(y, averagingWindowTimespan()) + nActualTimespan.Add(y, averagingWindowTimespan(digishield)) log.Debug(fmt.Sprintf("CalcDifficulty nActualTimespan = %v before bounds", nActualTimespan)) - if nActualTimespan.Cmp(minActualTimespan()) < 0 { - nActualTimespan.Set(minActualTimespan()) + if nActualTimespan.Cmp(minActualTimespan(digishield)) < 0 { + nActualTimespan.Set(minActualTimespan(digishield)) log.Debug("CalcDifficulty Minimum Timespan set") - } else if nActualTimespan.Cmp(maxActualTimespan()) > 0 { - nActualTimespan.Set(maxActualTimespan()) + } else if nActualTimespan.Cmp(maxActualTimespan(digishield)) > 0 { + nActualTimespan.Set(maxActualTimespan(digishield)) log.Debug("CalcDifficulty Maximum Timespan set") } log.Debug(fmt.Sprintf("CalcDifficulty nActualTimespan = %v final\n", nActualTimespan)) // Retarget - x.Mul(parentDiff, averagingWindowTimespan()) + x.Mul(parentDiff, averagingWindowTimespan(digishield)) log.Debug(fmt.Sprintf("CalcDifficulty parentDiff * AveragingWindowTimespan: %v", x)) x.Div(x, nActualTimespan) log.Debug(fmt.Sprintf("CalcDifficulty x / nActualTimespan: %v", x)) - return x -} - -func calcDifficulty2(chain consensus.ChainReader, parentNumber, parentDiff *big.Int, parent *types.Header) *big.Int { - x := new(big.Int) - nFirstBlock := new(big.Int) - nFirstBlock.Sub(parentNumber, digishieldV3ModConfig.AveragingWindow) - - nLastBlockTime := chain.CalcPastMedianTime(parentNumber.Uint64(), parent) - nFirstBlockTime := chain.CalcPastMedianTime(nFirstBlock.Uint64(), parent) - - nActualTimespan := new(big.Int) - nActualTimespan.Sub(nLastBlockTime, nFirstBlockTime) - - y := new(big.Int) - y.Sub(nActualTimespan, averagingWindowTimespan88()) - y.Div(y, big.NewInt(4)) - nActualTimespan.Add(y, averagingWindowTimespan88()) - - if nActualTimespan.Cmp(minActualTimespan2()) < 0 { - nActualTimespan.Set(minActualTimespan2()) - } else if nActualTimespan.Cmp(maxActualTimespan2()) > 0 { - nActualTimespan.Set(maxActualTimespan2()) - } - - x.Mul(parentDiff, averagingWindowTimespan88()) - x.Div(x, nActualTimespan) - if x.Cmp(params.MinimumDifficulty) < 0 { x.Set(params.MinimumDifficulty) } @@ -547,7 +496,7 @@ func calcDifficulty2(chain consensus.ChainReader, parentNumber, parentDiff *big. return x } -func fluxDifficulty(chain consensus.ChainReader, time, parentTime, parentNumber, parentDiff *big.Int, parent *types.Header) *big.Int { +func calcDifficultyFlux(chain consensus.ChainReader, time, parentTime, parentNumber, parentDiff *big.Int, parent *types.Header) *big.Int { x := new(big.Int) nFirstBlock := new(big.Int) nFirstBlock.Sub(parentNumber, fluxConfig.AveragingWindow) @@ -561,9 +510,9 @@ func fluxDifficulty(chain consensus.ChainReader, time, parentTime, parentNumber, nActualTimespan.Sub(nLastBlockTime, nFirstBlockTime) y := new(big.Int) - y.Sub(nActualTimespan, averagingWindowTimespan88()) + y.Sub(nActualTimespan, averagingWindowTimespan(fluxConfig)) y.Div(y, big.NewInt(4)) - nActualTimespan.Add(y, averagingWindowTimespan88()) + nActualTimespan.Add(y, averagingWindowTimespan(fluxConfig)) if nActualTimespan.Cmp(minActualTimespanFlux(false)) < 0 { doubleBig88 := new(big.Int) @@ -583,7 +532,7 @@ func fluxDifficulty(chain consensus.ChainReader, time, parentTime, parentNumber, } } - x.Mul(parentDiff, averagingWindowTimespan88()) + x.Mul(parentDiff, averagingWindowTimespan(fluxConfig)) x.Div(x, nActualTimespan) if x.Cmp(params.MinimumDifficulty) < 0 {