diff --git a/blockchain/blockchain.go b/blockchain/blockchain.go index e7939f1f..49817b67 100644 --- a/blockchain/blockchain.go +++ b/blockchain/blockchain.go @@ -723,7 +723,7 @@ func (chain *Blockchain) applyNewEpoch(appState *appstate.AppState, block *types appState.State.IncEpoch() validationTime := appState.State.NextValidationTime() - nextValidationTime := chain.config.Validation.GetNextValidationTime(validationTime, networkSize) + nextValidationTime := chain.config.Validation.GetNextValidationTime(validationTime, networkSize, chain.config.Consensus.EnableUpgrade12) appState.State.SetNextValidationTime(nextValidationTime) appState.State.SetFlipWordsSeed(block.Seed()) diff --git a/common/network.go b/common/network.go index dc62b2ff..114b71d2 100644 --- a/common/network.go +++ b/common/network.go @@ -76,9 +76,32 @@ func NetworkParams(networkSize int) (epochDuration int, flips int) { return } -func NormalizedEpochDuration(validationTime time.Time, networkSize int) time.Duration { +func NormalizedEpochDuration(validationTime time.Time, networkSize int, enableUpgrade12 bool) time.Duration { const day = 24 * time.Hour baseEpochDays, _ := NetworkParams(networkSize) + if enableUpgrade12 { + if baseEpochDays < 7 { + return day * time.Duration(baseEpochDays) + } + var normalizedDays int + switch { + case baseEpochDays < 18: + normalizedDays = 14 + case baseEpochDays < 25: + normalizedDays = 21 + default: + normalizedDays = 28 + } + + if validationTime.Weekday() != time.Saturday { + if validationTime.Weekday() >= time.Wednesday { + normalizedDays += 1 + } else { + normalizedDays -= 1 + } + } + return day * time.Duration(normalizedDays) + } if baseEpochDays < 21 { return day * time.Duration(baseEpochDays) } diff --git a/common/network_test.go b/common/network_test.go index 4525afe2..e52ec40b 100644 --- a/common/network_test.go +++ b/common/network_test.go @@ -48,53 +48,112 @@ func TestLongSessionFlipsCount(t *testing.T) { require.Equal(uint(30), LongSessionFlipsCount(100000)) } -func TestNormalizedEpochDuration(t *testing.T) { +func TestNormalizedEpochDurationOld(t *testing.T) { + const enableUpgrade12 = false day := time.Hour * 24 saturday := time.Date(2020, 1, 4, 0, 0, 0, 0, time.UTC) - require.Equal(t, day, NormalizedEpochDuration(saturday, 1)) - require.Equal(t, day*3, NormalizedEpochDuration(saturday, 17)) - require.Equal(t, day*4, NormalizedEpochDuration(saturday, 45)) - require.Equal(t, day*5, NormalizedEpochDuration(saturday, 96)) - require.Equal(t, day*5, NormalizedEpochDuration(saturday, 124)) - require.Equal(t, day*6, NormalizedEpochDuration(saturday, 183)) - require.Equal(t, day*6, NormalizedEpochDuration(saturday, 270)) - require.Equal(t, day*6, NormalizedEpochDuration(saturday, 275)) - require.Equal(t, day*8, NormalizedEpochDuration(saturday, 449)) - require.Equal(t, day*10, NormalizedEpochDuration(saturday, 1158)) - require.Equal(t, day*15, NormalizedEpochDuration(saturday, 3306)) - require.Equal(t, day*21, NormalizedEpochDuration(saturday, 24284)) - require.Equal(t, day*21, NormalizedEpochDuration(saturday, 34700)) - require.Equal(t, day*28, NormalizedEpochDuration(saturday, 34701)) - require.Equal(t, day*28, NormalizedEpochDuration(saturday, 50000)) - require.Equal(t, day*28, NormalizedEpochDuration(saturday, 60000)) - require.Equal(t, day*28, NormalizedEpochDuration(saturday, 75000)) - require.Equal(t, day*28, NormalizedEpochDuration(saturday, 100000)) - require.Equal(t, day*28, NormalizedEpochDuration(saturday, 500000)) - require.Equal(t, day*28, NormalizedEpochDuration(saturday, 1000000)) - require.Equal(t, day*28, NormalizedEpochDuration(saturday, 100000000)) + require.Equal(t, day, NormalizedEpochDuration(saturday, 1, enableUpgrade12)) + require.Equal(t, day*3, NormalizedEpochDuration(saturday, 17, enableUpgrade12)) + require.Equal(t, day*4, NormalizedEpochDuration(saturday, 45, enableUpgrade12)) + require.Equal(t, day*5, NormalizedEpochDuration(saturday, 96, enableUpgrade12)) + require.Equal(t, day*5, NormalizedEpochDuration(saturday, 124, enableUpgrade12)) + require.Equal(t, day*6, NormalizedEpochDuration(saturday, 183, enableUpgrade12)) + require.Equal(t, day*6, NormalizedEpochDuration(saturday, 270, enableUpgrade12)) + require.Equal(t, day*6, NormalizedEpochDuration(saturday, 275, enableUpgrade12)) + require.Equal(t, day*8, NormalizedEpochDuration(saturday, 449, enableUpgrade12)) + require.Equal(t, day*10, NormalizedEpochDuration(saturday, 1158, enableUpgrade12)) + require.Equal(t, day*15, NormalizedEpochDuration(saturday, 3306, enableUpgrade12)) + require.Equal(t, day*21, NormalizedEpochDuration(saturday, 24284, enableUpgrade12)) + require.Equal(t, day*21, NormalizedEpochDuration(saturday, 34700, enableUpgrade12)) + require.Equal(t, day*28, NormalizedEpochDuration(saturday, 34701, enableUpgrade12)) + require.Equal(t, day*28, NormalizedEpochDuration(saturday, 50000, enableUpgrade12)) + require.Equal(t, day*28, NormalizedEpochDuration(saturday, 60000, enableUpgrade12)) + require.Equal(t, day*28, NormalizedEpochDuration(saturday, 75000, enableUpgrade12)) + require.Equal(t, day*28, NormalizedEpochDuration(saturday, 100000, enableUpgrade12)) + require.Equal(t, day*28, NormalizedEpochDuration(saturday, 500000, enableUpgrade12)) + require.Equal(t, day*28, NormalizedEpochDuration(saturday, 1000000, enableUpgrade12)) + require.Equal(t, day*28, NormalizedEpochDuration(saturday, 100000000, enableUpgrade12)) notSaturday := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC) - require.Equal(t, day, NormalizedEpochDuration(notSaturday, 1)) - require.Equal(t, day*3, NormalizedEpochDuration(notSaturday, 17)) - require.Equal(t, day*4, NormalizedEpochDuration(notSaturday, 45)) - require.Equal(t, day*5, NormalizedEpochDuration(notSaturday, 96)) - require.Equal(t, day*5, NormalizedEpochDuration(notSaturday, 124)) - require.Equal(t, day*6, NormalizedEpochDuration(notSaturday, 183)) - require.Equal(t, day*6, NormalizedEpochDuration(notSaturday, 270)) - require.Equal(t, day*6, NormalizedEpochDuration(notSaturday, 275)) - require.Equal(t, day*8, NormalizedEpochDuration(notSaturday, 449)) - require.Equal(t, day*10, NormalizedEpochDuration(notSaturday, 1158)) - require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 9441)) - require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 9442)) - require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 24284)) - require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 34701)) - require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 50000)) - require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 60000)) - require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 75000)) - require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 100000)) - require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 500000)) - require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 1000000)) - require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 100000000)) + require.Equal(t, day, NormalizedEpochDuration(notSaturday, 1, enableUpgrade12)) + require.Equal(t, day*3, NormalizedEpochDuration(notSaturday, 17, enableUpgrade12)) + require.Equal(t, day*4, NormalizedEpochDuration(notSaturday, 45, enableUpgrade12)) + require.Equal(t, day*5, NormalizedEpochDuration(notSaturday, 96, enableUpgrade12)) + require.Equal(t, day*5, NormalizedEpochDuration(notSaturday, 124, enableUpgrade12)) + require.Equal(t, day*6, NormalizedEpochDuration(notSaturday, 183, enableUpgrade12)) + require.Equal(t, day*6, NormalizedEpochDuration(notSaturday, 270, enableUpgrade12)) + require.Equal(t, day*6, NormalizedEpochDuration(notSaturday, 275, enableUpgrade12)) + require.Equal(t, day*8, NormalizedEpochDuration(notSaturday, 449, enableUpgrade12)) + require.Equal(t, day*10, NormalizedEpochDuration(notSaturday, 1158, enableUpgrade12)) + require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 9441, enableUpgrade12)) + require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 9442, enableUpgrade12)) + require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 24284, enableUpgrade12)) + require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 34701, enableUpgrade12)) + require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 50000, enableUpgrade12)) + require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 60000, enableUpgrade12)) + require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 75000, enableUpgrade12)) + require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 100000, enableUpgrade12)) + require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 500000, enableUpgrade12)) + require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 1000000, enableUpgrade12)) + require.Equal(t, day*20, NormalizedEpochDuration(notSaturday, 100000000, enableUpgrade12)) +} + +func TestNormalizedEpochDuration(t *testing.T) { + const enableUpgrade12 = true + day := time.Hour * 24 + saturday := time.Date(2020, 1, 4, 0, 0, 0, 0, time.UTC) + require.Equal(t, day, NormalizedEpochDuration(saturday, 1, enableUpgrade12)) + require.Equal(t, day*2, NormalizedEpochDuration(saturday, 16, enableUpgrade12)) + require.Equal(t, day*3, NormalizedEpochDuration(saturday, 17, enableUpgrade12)) + require.Equal(t, day*3, NormalizedEpochDuration(saturday, 44, enableUpgrade12)) + require.Equal(t, day*4, NormalizedEpochDuration(saturday, 45, enableUpgrade12)) + require.Equal(t, day*4, NormalizedEpochDuration(saturday, 95, enableUpgrade12)) + require.Equal(t, day*5, NormalizedEpochDuration(saturday, 96, enableUpgrade12)) + require.Equal(t, day*5, NormalizedEpochDuration(saturday, 175, enableUpgrade12)) + require.Equal(t, day*6, NormalizedEpochDuration(saturday, 176, enableUpgrade12)) + require.Equal(t, day*6, NormalizedEpochDuration(saturday, 290, enableUpgrade12)) + require.Equal(t, day*14, NormalizedEpochDuration(saturday, 291, enableUpgrade12)) + require.Equal(t, day*14, NormalizedEpochDuration(saturday, 5844, enableUpgrade12)) + require.Equal(t, day*21, NormalizedEpochDuration(saturday, 5845, enableUpgrade12)) + require.Equal(t, day*21, NormalizedEpochDuration(saturday, 16202, enableUpgrade12)) + require.Equal(t, day*28, NormalizedEpochDuration(saturday, 16203, enableUpgrade12)) + require.Equal(t, day*28, NormalizedEpochDuration(saturday, 9999999, enableUpgrade12)) + + sunday := time.Date(2019, 12, 29, 0, 0, 0, 0, time.UTC) + require.Equal(t, day, NormalizedEpochDuration(sunday, 1, enableUpgrade12)) + require.Equal(t, day*2, NormalizedEpochDuration(sunday, 16, enableUpgrade12)) + require.Equal(t, day*3, NormalizedEpochDuration(sunday, 17, enableUpgrade12)) + require.Equal(t, day*3, NormalizedEpochDuration(sunday, 44, enableUpgrade12)) + require.Equal(t, day*4, NormalizedEpochDuration(sunday, 45, enableUpgrade12)) + require.Equal(t, day*4, NormalizedEpochDuration(sunday, 95, enableUpgrade12)) + require.Equal(t, day*5, NormalizedEpochDuration(sunday, 96, enableUpgrade12)) + require.Equal(t, day*5, NormalizedEpochDuration(sunday, 175, enableUpgrade12)) + require.Equal(t, day*6, NormalizedEpochDuration(sunday, 176, enableUpgrade12)) + require.Equal(t, day*6, NormalizedEpochDuration(sunday, 290, enableUpgrade12)) + require.Equal(t, day*13, NormalizedEpochDuration(sunday, 291, enableUpgrade12)) + require.Equal(t, day*13, NormalizedEpochDuration(sunday, 5844, enableUpgrade12)) + require.Equal(t, day*20, NormalizedEpochDuration(sunday, 5845, enableUpgrade12)) + require.Equal(t, day*20, NormalizedEpochDuration(sunday, 16202, enableUpgrade12)) + require.Equal(t, day*27, NormalizedEpochDuration(sunday, 16203, enableUpgrade12)) + require.Equal(t, day*27, NormalizedEpochDuration(sunday, 9999999, enableUpgrade12)) + + wednesday := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC) + require.Equal(t, day, NormalizedEpochDuration(wednesday, 1, enableUpgrade12)) + require.Equal(t, day*2, NormalizedEpochDuration(wednesday, 16, enableUpgrade12)) + require.Equal(t, day*3, NormalizedEpochDuration(wednesday, 17, enableUpgrade12)) + require.Equal(t, day*3, NormalizedEpochDuration(wednesday, 44, enableUpgrade12)) + require.Equal(t, day*4, NormalizedEpochDuration(wednesday, 45, enableUpgrade12)) + require.Equal(t, day*4, NormalizedEpochDuration(wednesday, 95, enableUpgrade12)) + require.Equal(t, day*5, NormalizedEpochDuration(wednesday, 96, enableUpgrade12)) + require.Equal(t, day*5, NormalizedEpochDuration(wednesday, 175, enableUpgrade12)) + require.Equal(t, day*6, NormalizedEpochDuration(wednesday, 176, enableUpgrade12)) + require.Equal(t, day*6, NormalizedEpochDuration(wednesday, 290, enableUpgrade12)) + require.Equal(t, day*15, NormalizedEpochDuration(wednesday, 291, enableUpgrade12)) + require.Equal(t, day*15, NormalizedEpochDuration(wednesday, 5844, enableUpgrade12)) + require.Equal(t, day*22, NormalizedEpochDuration(wednesday, 5845, enableUpgrade12)) + require.Equal(t, day*22, NormalizedEpochDuration(wednesday, 16202, enableUpgrade12)) + require.Equal(t, day*29, NormalizedEpochDuration(wednesday, 16203, enableUpgrade12)) + require.Equal(t, day*29, NormalizedEpochDuration(wednesday, 9999999, enableUpgrade12)) } func Test_Scores(t *testing.T) { diff --git a/config/validation.go b/config/validation.go index 0e97d5a7..035e0a65 100644 --- a/config/validation.go +++ b/config/validation.go @@ -22,11 +22,11 @@ type ValidationConfig struct { LongSessionDuration time.Duration } -func (cfg *ValidationConfig) GetNextValidationTime(validationTime time.Time, networkSize int) time.Time { +func (cfg *ValidationConfig) GetNextValidationTime(validationTime time.Time, networkSize int, enableUpgrade12 bool) time.Time { if cfg.ValidationInterval > 0 { return validationTime.Add(cfg.ValidationInterval) } - return validationTime.Add(common.NormalizedEpochDuration(validationTime, networkSize)) + return validationTime.Add(common.NormalizedEpochDuration(validationTime, networkSize, enableUpgrade12)) } func (cfg *ValidationConfig) GetFlipLotteryDuration() time.Duration { diff --git a/config/validation_test.go b/config/validation_test.go index da081ccc..02bc1ae1 100644 --- a/config/validation_test.go +++ b/config/validation_test.go @@ -10,12 +10,12 @@ func TestGetNextValidationTime(t *testing.T) { conf := &ValidationConfig{} validationTime := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC) - nextValidationTime := conf.GetNextValidationTime(validationTime, 449) - require.Equal(t, time.Date(2020, 1, 9, 0, 0, 0, 0, time.UTC), + nextValidationTime := conf.GetNextValidationTime(validationTime, 449, true) + require.Equal(t, time.Date(2020, 1, 16, 0, 0, 0, 0, time.UTC), nextValidationTime) conf.ValidationInterval = 2*time.Hour + time.Minute*3 - nextValidationTime = conf.GetNextValidationTime(validationTime, 449) + nextValidationTime = conf.GetNextValidationTime(validationTime, 449, true) require.Equal(t, time.Date(2020, 1, 1, 2, 3, 0, 0, time.UTC), nextValidationTime) }