From 8696dd39cbb5664a4a6900993e113713e56f3def Mon Sep 17 00:00:00 2001 From: Vinod Damle Date: Wed, 16 Sep 2020 02:39:35 -0400 Subject: [PATCH] params: allow setting Petersburg block before chain head (#21473) * Allow setting PetersburgBlock before chainhead if it is at the same block as ConstantinopleBlock * Add a negative test --- params/config.go | 6 +++++- params/config_test.go | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/params/config.go b/params/config.go index e5ec64b2bf..2cd66acc2f 100644 --- a/params/config.go +++ b/params/config.go @@ -528,7 +528,11 @@ func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *Confi return newCompatError("Constantinople fork block", c.ConstantinopleBlock, newcfg.ConstantinopleBlock) } if isForkIncompatible(c.PetersburgBlock, newcfg.PetersburgBlock, head) { - return newCompatError("Petersburg fork block", c.PetersburgBlock, newcfg.PetersburgBlock) + // the only case where we allow Petersburg to be set in the past is if it is equal to Constantinople + // mainly to satisfy fork ordering requirements which state that Petersburg fork be set if Constantinople fork is set + if isForkIncompatible(c.ConstantinopleBlock, newcfg.PetersburgBlock, head) { + return newCompatError("Petersburg fork block", c.PetersburgBlock, newcfg.PetersburgBlock) + } } if isForkIncompatible(c.IstanbulBlock, newcfg.IstanbulBlock, head) { return newCompatError("Istanbul fork block", c.IstanbulBlock, newcfg.IstanbulBlock) diff --git a/params/config_test.go b/params/config_test.go index 02c5fe2917..3c8ebaf4a5 100644 --- a/params/config_test.go +++ b/params/config_test.go @@ -70,6 +70,23 @@ func TestCheckCompatible(t *testing.T) { RewindTo: 9, }, }, + { + stored: &ChainConfig{ConstantinopleBlock: big.NewInt(30)}, + new: &ChainConfig{ConstantinopleBlock: big.NewInt(30), PetersburgBlock: big.NewInt(30)}, + head: 40, + wantErr: nil, + }, + { + stored: &ChainConfig{ConstantinopleBlock: big.NewInt(30)}, + new: &ChainConfig{ConstantinopleBlock: big.NewInt(30), PetersburgBlock: big.NewInt(31)}, + head: 40, + wantErr: &ConfigCompatError{ + What: "Petersburg fork block", + StoredConfig: nil, + NewConfig: big.NewInt(31), + RewindTo: 30, + }, + }, } for _, test := range tests {