From 29ae360d87eac37632755b63a181094096e37e2f Mon Sep 17 00:00:00 2001 From: yperbasis Date: Mon, 23 Oct 2023 10:08:51 +0200 Subject: [PATCH 1/5] Retire calculateBorConfigHelper in favour of borKeyValueConfigHelper --- params/config.go | 24 ++---------------------- params/config_test.go | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/params/config.go b/params/config.go index 8f54f1cb30..f50ecc7b2e 100644 --- a/params/config.go +++ b/params/config.go @@ -711,11 +711,11 @@ func (c *BorConfig) CalculateSprint(number uint64) uint64 { } func (c *BorConfig) CalculateBackupMultiplier(number uint64) uint64 { - return c.calculateBorConfigHelper(c.BackupMultiplier, number) + return borKeyValueConfigHelper(c.BackupMultiplier, number) } func (c *BorConfig) CalculatePeriod(number uint64) uint64 { - return c.calculateBorConfigHelper(c.Period, number) + return borKeyValueConfigHelper(c.Period, number) } func (c *BorConfig) IsJaipur(number *big.Int) bool { @@ -749,26 +749,6 @@ func (c *BorConfig) IsSprintStart(number uint64) bool { return number%c.CalculateSprint(number) == 0 } -func (c *BorConfig) calculateBorConfigHelper(field map[string]uint64, number uint64) uint64 { - keys := make([]string, 0, len(field)) - for k := range field { - keys = append(keys, k) - } - - sort.Strings(keys) - - for i := 0; i < len(keys)-1; i++ { - valUint, _ := strconv.ParseUint(keys[i], 10, 64) - valUintNext, _ := strconv.ParseUint(keys[i+1], 10, 64) - - if number > valUint && number < valUintNext { - return field[keys[i]] - } - } - - return field[keys[len(keys)-1]] -} - func borKeyValueConfigHelper(field map[string]uint64, number uint64) uint64 { keys := make([]string, 0, len(field)) for k := range field { diff --git a/params/config_test.go b/params/config_test.go index 713fbaf880..4011e891d2 100644 --- a/params/config_test.go +++ b/params/config_test.go @@ -22,6 +22,8 @@ import ( "testing" "time" + "gotest.tools/assert" + "github.com/ethereum/go-ethereum/common/math" ) @@ -145,3 +147,19 @@ func TestConfigRules(t *testing.T) { t.Errorf("expected %v to be shanghai", stamp) } } + +func TestBorKeyValueConfigHelper(t *testing.T) { + backupMultiplier := map[string]uint64{ + "0": 2, + "25275000": 5, + "29638656": 2, + } + assert.Equal(t, borKeyValueConfigHelper(backupMultiplier, 0), uint64(2)) + assert.Equal(t, borKeyValueConfigHelper(backupMultiplier, 1), uint64(2)) + assert.Equal(t, borKeyValueConfigHelper(backupMultiplier, 25275000-1), uint64(2)) + assert.Equal(t, borKeyValueConfigHelper(backupMultiplier, 25275000), uint64(5)) + assert.Equal(t, borKeyValueConfigHelper(backupMultiplier, 25275000+1), uint64(5)) + assert.Equal(t, borKeyValueConfigHelper(backupMultiplier, 29638656-1), uint64(5)) + assert.Equal(t, borKeyValueConfigHelper(backupMultiplier, 29638656), uint64(2)) + assert.Equal(t, borKeyValueConfigHelper(backupMultiplier, 29638656+1), uint64(2)) +} From a87d9a0bf9bf3c5b18622812d3055b594307bc65 Mon Sep 17 00:00:00 2001 From: yperbasis Date: Mon, 23 Oct 2023 10:24:42 +0200 Subject: [PATCH 2/5] Use borKeyValueConfigHelper for CalculateBurntContract --- params/config.go | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/params/config.go b/params/config.go index f50ecc7b2e..b6d51df758 100644 --- a/params/config.go +++ b/params/config.go @@ -749,7 +749,7 @@ func (c *BorConfig) IsSprintStart(number uint64) bool { return number%c.CalculateSprint(number) == 0 } -func borKeyValueConfigHelper(field map[string]uint64, number uint64) uint64 { +func borKeyValueConfigHelper[T uint64 | string](field map[string]T, number uint64) T { keys := make([]string, 0, len(field)) for k := range field { keys = append(keys, k) @@ -770,23 +770,7 @@ func borKeyValueConfigHelper(field map[string]uint64, number uint64) uint64 { } func (c *BorConfig) CalculateBurntContract(number uint64) string { - keys := make([]string, 0, len(c.BurntContract)) - for k := range c.BurntContract { - keys = append(keys, k) - } - - sort.Strings(keys) - - for i := 0; i < len(keys)-1; i++ { - valUint, _ := strconv.ParseUint(keys[i], 10, 64) - valUintNext, _ := strconv.ParseUint(keys[i+1], 10, 64) - - if number > valUint && number < valUintNext { - return c.BurntContract[keys[i]] - } - } - - return c.BurntContract[keys[len(keys)-1]] + return borKeyValueConfigHelper(c.BurntContract, number) } // Description returns a human-readable description of ChainConfig. From e07deef7506cd4443d8aa8fb8a4c5c4bb1a0731c Mon Sep 17 00:00:00 2001 From: yperbasis Date: Mon, 23 Oct 2023 10:41:44 +0200 Subject: [PATCH 3/5] Numerical instead of lexicographic sorting of config keys --- params/config.go | 23 +++++++++++++---------- params/config_test.go | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/params/config.go b/params/config.go index b6d51df758..2bbbb805b0 100644 --- a/params/config.go +++ b/params/config.go @@ -750,23 +750,26 @@ func (c *BorConfig) IsSprintStart(number uint64) bool { } func borKeyValueConfigHelper[T uint64 | string](field map[string]T, number uint64) T { - keys := make([]string, 0, len(field)) - for k := range field { - keys = append(keys, k) + keys := make([]uint64, 0, len(field)) + fieldUint := make(map[uint64]T) + for k, v := range field { + keyUint, err := strconv.ParseUint(k, 10, 64) + if err != nil { + panic(err) + } + keys = append(keys, keyUint) + fieldUint[keyUint] = v } - sort.Strings(keys) + sort.Slice(keys, func(i, j int) bool { return keys[i] < keys[j] }) for i := 0; i < len(keys)-1; i++ { - valUint, _ := strconv.ParseUint(keys[i], 10, 64) - valUintNext, _ := strconv.ParseUint(keys[i+1], 10, 64) - - if number >= valUint && number < valUintNext { - return field[keys[i]] + if number >= keys[i] && number < keys[i+1] { + return fieldUint[keys[i]] } } - return field[keys[len(keys)-1]] + return fieldUint[keys[len(keys)-1]] } func (c *BorConfig) CalculateBurntContract(number uint64) string { diff --git a/params/config_test.go b/params/config_test.go index 4011e891d2..e710561058 100644 --- a/params/config_test.go +++ b/params/config_test.go @@ -162,4 +162,18 @@ func TestBorKeyValueConfigHelper(t *testing.T) { assert.Equal(t, borKeyValueConfigHelper(backupMultiplier, 29638656-1), uint64(5)) assert.Equal(t, borKeyValueConfigHelper(backupMultiplier, 29638656), uint64(2)) assert.Equal(t, borKeyValueConfigHelper(backupMultiplier, 29638656+1), uint64(2)) + + config := map[string]uint64{ + "0": 1, + "90000000": 2, + "100000000": 3, + } + assert.Equal(t, borKeyValueConfigHelper(config, 0), uint64(1)) + assert.Equal(t, borKeyValueConfigHelper(config, 1), uint64(1)) + assert.Equal(t, borKeyValueConfigHelper(config, 90000000-1), uint64(1)) + assert.Equal(t, borKeyValueConfigHelper(config, 90000000), uint64(2)) + assert.Equal(t, borKeyValueConfigHelper(config, 90000000+1), uint64(2)) + assert.Equal(t, borKeyValueConfigHelper(config, 100000000-1), uint64(2)) + assert.Equal(t, borKeyValueConfigHelper(config, 100000000), uint64(3)) + assert.Equal(t, borKeyValueConfigHelper(config, 100000000+1), uint64(3)) } From bb8eeb9d752fec35baea035ee4aea6436d133d85 Mon Sep 17 00:00:00 2001 From: yperbasis Date: Mon, 23 Oct 2023 11:01:55 +0200 Subject: [PATCH 4/5] Add test for burntContract --- params/config_test.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/params/config_test.go b/params/config_test.go index e710561058..9d9b4bad7e 100644 --- a/params/config_test.go +++ b/params/config_test.go @@ -176,4 +176,14 @@ func TestBorKeyValueConfigHelper(t *testing.T) { assert.Equal(t, borKeyValueConfigHelper(config, 100000000-1), uint64(2)) assert.Equal(t, borKeyValueConfigHelper(config, 100000000), uint64(3)) assert.Equal(t, borKeyValueConfigHelper(config, 100000000+1), uint64(3)) + + burntContract := map[string]string{ + "22640000": "0x70bcA57F4579f58670aB2d18Ef16e02C17553C38", + "41824608": "0x617b94CCCC2511808A3C9478ebb96f455CF167aA", + } + assert.Equal(t, borKeyValueConfigHelper(burntContract, 22640000), "0x70bcA57F4579f58670aB2d18Ef16e02C17553C38") + assert.Equal(t, borKeyValueConfigHelper(burntContract, 22640000+1), "0x70bcA57F4579f58670aB2d18Ef16e02C17553C38") + assert.Equal(t, borKeyValueConfigHelper(burntContract, 41824608-1), "0x70bcA57F4579f58670aB2d18Ef16e02C17553C38") + assert.Equal(t, borKeyValueConfigHelper(burntContract, 41824608), "0x617b94CCCC2511808A3C9478ebb96f455CF167aA") + assert.Equal(t, borKeyValueConfigHelper(burntContract, 41824608+1), "0x617b94CCCC2511808A3C9478ebb96f455CF167aA") } From b7da6f43a0fb909384a28f7a3361851061b2cd93 Mon Sep 17 00:00:00 2001 From: yperbasis Date: Mon, 23 Oct 2023 11:54:25 +0200 Subject: [PATCH 5/5] fix lint --- params/config.go | 2 ++ params/config_test.go | 2 ++ 2 files changed, 4 insertions(+) diff --git a/params/config.go b/params/config.go index 2bbbb805b0..b0ebfbcba6 100644 --- a/params/config.go +++ b/params/config.go @@ -752,12 +752,14 @@ func (c *BorConfig) IsSprintStart(number uint64) bool { func borKeyValueConfigHelper[T uint64 | string](field map[string]T, number uint64) T { keys := make([]uint64, 0, len(field)) fieldUint := make(map[uint64]T) + for k, v := range field { keyUint, err := strconv.ParseUint(k, 10, 64) if err != nil { panic(err) } keys = append(keys, keyUint) + fieldUint[keyUint] = v } diff --git a/params/config_test.go b/params/config_test.go index 9d9b4bad7e..950ac8543f 100644 --- a/params/config_test.go +++ b/params/config_test.go @@ -149,6 +149,8 @@ func TestConfigRules(t *testing.T) { } func TestBorKeyValueConfigHelper(t *testing.T) { + t.Parallel() + backupMultiplier := map[string]uint64{ "0": 2, "25275000": 5,