@ -42,7 +42,8 @@ var (
EIP155Block : big . NewInt ( 2675000 ) ,
EIP155Block : big . NewInt ( 2675000 ) ,
EIP158Block : big . NewInt ( 2675000 ) ,
EIP158Block : big . NewInt ( 2675000 ) ,
ByzantiumBlock : big . NewInt ( 4370000 ) ,
ByzantiumBlock : big . NewInt ( 4370000 ) ,
ConstantinopleBlock : nil ,
ConstantinopleBlock : big . NewInt ( 7280000 ) ,
PetersburgBlock : big . NewInt ( 7280000 ) ,
Ethash : new ( EthashConfig ) ,
Ethash : new ( EthashConfig ) ,
}
}
@ -67,6 +68,7 @@ var (
EIP158Block : big . NewInt ( 10 ) ,
EIP158Block : big . NewInt ( 10 ) ,
ByzantiumBlock : big . NewInt ( 1700000 ) ,
ByzantiumBlock : big . NewInt ( 1700000 ) ,
ConstantinopleBlock : big . NewInt ( 4230000 ) ,
ConstantinopleBlock : big . NewInt ( 4230000 ) ,
PetersburgBlock : big . NewInt ( 4939394 ) ,
Ethash : new ( EthashConfig ) ,
Ethash : new ( EthashConfig ) ,
}
}
@ -91,6 +93,7 @@ var (
EIP158Block : big . NewInt ( 3 ) ,
EIP158Block : big . NewInt ( 3 ) ,
ByzantiumBlock : big . NewInt ( 1035301 ) ,
ByzantiumBlock : big . NewInt ( 1035301 ) ,
ConstantinopleBlock : big . NewInt ( 3660663 ) ,
ConstantinopleBlock : big . NewInt ( 3660663 ) ,
PetersburgBlock : big . NewInt ( 9999999 ) , //TODO! Insert Rinkeby block number
Clique : & CliqueConfig {
Clique : & CliqueConfig {
Period : 15 ,
Period : 15 ,
Epoch : 30000 ,
Epoch : 30000 ,
@ -111,16 +114,16 @@ var (
//
//
// This configuration is intentionally not using keyed fields to force anyone
// This configuration is intentionally not using keyed fields to force anyone
// adding flags to the config to also have to set these fields.
// adding flags to the config to also have to set these fields.
AllEthashProtocolChanges = & 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 ) , nil , new ( EthashConfig ) , nil }
AllEthashProtocolChanges = & 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 ) , nil , new ( EthashConfig ) , nil }
// AllCliqueProtocolChanges contains every protocol change (EIPs) introduced
// AllCliqueProtocolChanges contains every protocol change (EIPs) introduced
// and accepted by the Ethereum core developers into the Clique consensus.
// and accepted by the Ethereum core developers into the Clique consensus.
//
//
// This configuration is intentionally not using keyed fields to force anyone
// This configuration is intentionally not using keyed fields to force anyone
// adding flags to the config to also have to set these fields.
// adding flags to the config to also have to set these fields.
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 ) , nil , nil , & CliqueConfig { Period : 0 , Epoch : 30000 } }
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 ) , nil , nil , & CliqueConfig { Period : 0 , Epoch : 30000 } }
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 ) , nil , new ( EthashConfig ) , nil }
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 ) , nil , new ( EthashConfig ) , nil }
TestRules = TestChainConfig . Rules ( new ( big . Int ) )
TestRules = TestChainConfig . Rules ( new ( big . Int ) )
)
)
@ -158,6 +161,7 @@ type ChainConfig struct {
ByzantiumBlock * big . Int ` json:"byzantiumBlock,omitempty" ` // Byzantium switch block (nil = no fork, 0 = already on byzantium)
ByzantiumBlock * big . Int ` json:"byzantiumBlock,omitempty" ` // Byzantium switch block (nil = no fork, 0 = already on byzantium)
ConstantinopleBlock * big . Int ` json:"constantinopleBlock,omitempty" ` // Constantinople switch block (nil = no fork, 0 = already activated)
ConstantinopleBlock * big . Int ` json:"constantinopleBlock,omitempty" ` // Constantinople switch block (nil = no fork, 0 = already activated)
PetersburgBlock * big . Int ` json:"petersburgBlock,omitempty" ` // Petersburg switch block (nil = same as Constantinople)
EWASMBlock * big . Int ` json:"ewasmBlock,omitempty" ` // EWASM switch block (nil = no fork, 0 = already activated)
EWASMBlock * big . Int ` json:"ewasmBlock,omitempty" ` // EWASM switch block (nil = no fork, 0 = already activated)
// Various consensus engines
// Various consensus engines
@ -195,7 +199,7 @@ func (c *ChainConfig) String() string {
default :
default :
engine = "unknown"
engine = "unknown"
}
}
return fmt . Sprintf ( "{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Engine: %v}" ,
return fmt . Sprintf ( "{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v ConstantinopleFix: %v Engine: %v}" ,
c . ChainID ,
c . ChainID ,
c . HomesteadBlock ,
c . HomesteadBlock ,
c . DAOForkBlock ,
c . DAOForkBlock ,
@ -205,6 +209,7 @@ func (c *ChainConfig) String() string {
c . EIP158Block ,
c . EIP158Block ,
c . ByzantiumBlock ,
c . ByzantiumBlock ,
c . ConstantinopleBlock ,
c . ConstantinopleBlock ,
c . PetersburgBlock ,
engine ,
engine ,
)
)
}
}
@ -244,6 +249,13 @@ func (c *ChainConfig) IsConstantinople(num *big.Int) bool {
return isForked ( c . ConstantinopleBlock , num )
return isForked ( c . ConstantinopleBlock , num )
}
}
// IsPetersburg returns whether num is either
// - equal to or greater than the PetersburgBlock fork block,
// - OR is nil, and Constantinople is active
func ( c * ChainConfig ) IsPetersburg ( num * big . Int ) bool {
return isForked ( c . PetersburgBlock , num ) || c . PetersburgBlock == nil && isForked ( c . ConstantinopleBlock , num )
}
// IsEWASM returns whether num represents a block number after the EWASM fork
// IsEWASM returns whether num represents a block number after the EWASM fork
func ( c * ChainConfig ) IsEWASM ( num * big . Int ) bool {
func ( c * ChainConfig ) IsEWASM ( num * big . Int ) bool {
return isForked ( c . EWASMBlock , num )
return isForked ( c . EWASMBlock , num )
@ -314,6 +326,9 @@ func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *Confi
if isForkIncompatible ( c . ConstantinopleBlock , newcfg . ConstantinopleBlock , head ) {
if isForkIncompatible ( c . ConstantinopleBlock , newcfg . ConstantinopleBlock , head ) {
return newCompatError ( "Constantinople fork block" , c . ConstantinopleBlock , newcfg . ConstantinopleBlock )
return newCompatError ( "Constantinople fork block" , c . ConstantinopleBlock , newcfg . ConstantinopleBlock )
}
}
if isForkIncompatible ( c . PetersburgBlock , newcfg . PetersburgBlock , head ) {
return newCompatError ( "ConstantinopleFix fork block" , c . PetersburgBlock , newcfg . PetersburgBlock )
}
if isForkIncompatible ( c . EWASMBlock , newcfg . EWASMBlock , head ) {
if isForkIncompatible ( c . EWASMBlock , newcfg . EWASMBlock , head ) {
return newCompatError ( "ewasm fork block" , c . EWASMBlock , newcfg . EWASMBlock )
return newCompatError ( "ewasm fork block" , c . EWASMBlock , newcfg . EWASMBlock )
}
}
@ -381,9 +396,9 @@ func (err *ConfigCompatError) Error() string {
// Rules is a one time interface meaning that it shouldn't be used in between transition
// Rules is a one time interface meaning that it shouldn't be used in between transition
// phases.
// phases.
type Rules struct {
type Rules struct {
ChainID * big . Int
ChainID * big . Int
IsHomestead , IsEIP150 , IsEIP155 , IsEIP158 bool
IsHomestead , IsEIP150 , IsEIP155 , IsEIP158 bool
IsByzantium , IsConstantinople bool
IsByzantium , IsConstantinople , IsPetersburg bool
}
}
// Rules ensures c's ChainID is not nil.
// Rules ensures c's ChainID is not nil.
@ -400,5 +415,6 @@ func (c *ChainConfig) Rules(num *big.Int) Rules {
IsEIP158 : c . IsEIP158 ( num ) ,
IsEIP158 : c . IsEIP158 ( num ) ,
IsByzantium : c . IsByzantium ( num ) ,
IsByzantium : c . IsByzantium ( num ) ,
IsConstantinople : c . IsConstantinople ( num ) ,
IsConstantinople : c . IsConstantinople ( num ) ,
IsPetersburg : c . IsPetersburg ( num ) ,
}
}
}
}