mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
consensus/ubqhash: merge calcDifficultyOrig and calcDifficulty2 into calcDifficultyDigishieldV3
This commit is contained in:
parent
b17e25f2db
commit
8b2745314d
1 changed files with 36 additions and 87 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in a new issue