@@ -125,6 +125,8 @@ var (
125
125
// adding flags to the config to also have to set these fields.
126
126
AllCliqueProtocolChanges = & ChainConfig {big .NewInt (1337 ), big .NewInt (0 ), nil , false , big .NewInt (0 ), common.Hash {}, big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), nil , nil , nil , nil , nil , & CliqueConfig {Period : 0 , Epoch : 30000 }, nil }
127
127
128
+ AllCongressProtocolChanges = & ChainConfig {big .NewInt (1337 ), big .NewInt (0 ), nil , false , big .NewInt (0 ), common.Hash {}, big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), nil , nil , big .NewInt (2 ), big .NewInt (3 ), nil , nil , & CongressConfig {Period : 0 , Epoch : 30000 }}
129
+
128
130
TestChainConfig = & ChainConfig {big .NewInt (1 ), big .NewInt (0 ), nil , false , big .NewInt (0 ), common.Hash {}, big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), big .NewInt (0 ), nil , nil , nil , new (EthashConfig ), nil , nil }
129
131
TestRules = TestChainConfig .Rules (new (big.Int ))
130
132
)
@@ -210,8 +212,8 @@ type ChainConfig struct {
210
212
// the network that triggers the consensus upgrade.
211
213
TerminalTotalDifficulty * big.Int `json:"terminalTotalDifficulty,omitempty"`
212
214
213
- RedCoastBlock * big.Int `json:"redCoastBlock,omitempty"` // RedCoast switch block (nil = no fork, 0 = already activated )
214
- SophonBlock * big.Int `json:"sophonBlock,omitempty"`
215
+ RedCoastBlock * big.Int `json:"redCoastBlock,omitempty"` // RedCoast switch block (nil = no fork, set value ≥ 2 to activate it )
216
+ SophonBlock * big.Int `json:"sophonBlock,omitempty"` // Sophon switch block (nil = no fork, set > RedCoastBlock to activate it)
215
217
216
218
// Various consensus engines
217
219
Ethash * EthashConfig `json:"ethash,omitempty"`
@@ -264,7 +266,7 @@ func (c *ChainConfig) String() string {
264
266
default :
265
267
engine = "unknown"
266
268
}
267
- return fmt .Sprintf ("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Petersburg: %v Istanbul: %v, Muir Glacier: %v, RedCoastBlock: %v, Berlin: %v, London: %v, Arrow Glacier : %v, Engine: %v}" ,
269
+ return fmt .Sprintf ("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Petersburg: %v Istanbul: %v, Muir Glacier: %v, RedCoastBlock: %v, Berlin: %v, London: %v, Sophon : %v, Engine: %v}" ,
268
270
c .ChainID ,
269
271
c .HomesteadBlock ,
270
272
c .DAOForkBlock ,
@@ -280,7 +282,7 @@ func (c *ChainConfig) String() string {
280
282
c .RedCoastBlock ,
281
283
c .BerlinBlock ,
282
284
c .LondonBlock ,
283
- c .ArrowGlacierBlock ,
285
+ c .SophonBlock ,
284
286
engine ,
285
287
)
286
288
}
@@ -395,6 +397,7 @@ func (c *ChainConfig) CheckConfigForkOrder() error {
395
397
name string
396
398
block * big.Int
397
399
optional bool // if true, the fork may be nil and next fork is still allowed
400
+ minValue * big.Int
398
401
}
399
402
var lastFork fork
400
403
for _ , cur := range []fork {
@@ -408,20 +411,47 @@ func (c *ChainConfig) CheckConfigForkOrder() error {
408
411
{name : "petersburgBlock" , block : c .PetersburgBlock },
409
412
{name : "istanbulBlock" , block : c .IstanbulBlock },
410
413
{name : "muirGlacierBlock" , block : c .MuirGlacierBlock , optional : true },
411
- {name : "redCoastBlock" , block : c .RedCoastBlock , optional : true },
412
414
{name : "berlinBlock" , block : c .BerlinBlock },
413
415
{name : "londonBlock" , block : c .LondonBlock },
416
+ } {
417
+ if lastFork .name != "" {
418
+ // Next one must be higher or the same number
419
+ if lastFork .block == nil && cur .block != nil {
420
+ return fmt .Errorf ("unsupported fork ordering: %v not enabled, but %v enabled at %v" ,
421
+ lastFork .name , cur .name , cur .block )
422
+ }
423
+ if lastFork .block != nil && cur .block != nil {
424
+ if lastFork .block .Cmp (cur .block ) > 0 {
425
+ return fmt .Errorf ("unsupported fork ordering: %v enabled at %v, but %v enabled at %v" ,
426
+ lastFork .name , lastFork .block , cur .name , cur .block )
427
+ }
428
+ }
429
+ }
430
+ // If it was optional and not set, then ignore it
431
+ if ! cur .optional || cur .block != nil {
432
+ lastFork = cur
433
+ }
434
+ }
435
+ // congress fork
436
+ lastFork = fork {}
437
+ for _ , cur := range []fork {
438
+ {name : "redCoastBlock" , block : c .RedCoastBlock , minValue : big .NewInt (2 )},
414
439
{name : "sophonBlock" , block : c .SophonBlock },
415
- {name : "arrowGlacierBlock" , block : c .ArrowGlacierBlock , optional : true },
416
440
} {
441
+ // check minimal fork block
442
+ if cur .block != nil && cur .minValue != nil {
443
+ if cur .block .Cmp (cur .minValue ) < 0 {
444
+ return fmt .Errorf ("unsupported fork ordering: %v enabled at %v, but it must greater than %v " , cur .name , cur .block , cur .minValue )
445
+ }
446
+ }
417
447
if lastFork .name != "" {
418
448
// Next one must be higher number
419
449
if lastFork .block == nil && cur .block != nil {
420
450
return fmt .Errorf ("unsupported fork ordering: %v not enabled, but %v enabled at %v" ,
421
451
lastFork .name , cur .name , cur .block )
422
452
}
423
453
if lastFork .block != nil && cur .block != nil {
424
- if lastFork .block .Cmp (cur .block ) > 0 {
454
+ if lastFork .block .Cmp (cur .block ) >= 0 {
425
455
return fmt .Errorf ("unsupported fork ordering: %v enabled at %v, but %v enabled at %v" ,
426
456
lastFork .name , lastFork .block , cur .name , cur .block )
427
457
}
0 commit comments