github.com/bearnetworkchain/go-bearnetwork@v1.10.19-0.20220604150648-d63890c2e42b/params/config.go (about) 1 // Copyright 2016 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package params 18 19 import ( 20 "encoding/binary" 21 "fmt" 22 "math/big" 23 24 "github.com/bearnetworkchain/go-bearnetwork/common" 25 "golang.org/x/crypto/sha3" 26 ) 27 28 // Genesis hashes to enforce below configs on. 29 var ( 30 MainnetGenesisHash = common.HexToHash("0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3") 31 RopstenGenesisHash = common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d") 32 SepoliaGenesisHash = common.HexToHash("0x25a5cc106eea7138acab33231d7160d69cb777ee0c2c553fcddf5138993e6dd9") 33 RinkebyGenesisHash = common.HexToHash("0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177") 34 GoerliGenesisHash = common.HexToHash("0xbf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a") 35 KilnGenesisHash = common.HexToHash("0x51c7fe41be669f69c45c33a56982cbde405313342d9e2b00d7c91a7b284dd4f8") 36 ) 37 38 // TrustedCheckpoints associates each known checkpoint with the genesis hash of 39 // the chain it belongs to. 40 var TrustedCheckpoints = map[common.Hash]*TrustedCheckpoint{ 41 MainnetGenesisHash: MainnetTrustedCheckpoint, 42 RopstenGenesisHash: RopstenTrustedCheckpoint, 43 SepoliaGenesisHash: SepoliaTrustedCheckpoint, 44 RinkebyGenesisHash: RinkebyTrustedCheckpoint, 45 GoerliGenesisHash: GoerliTrustedCheckpoint, 46 } 47 48 // CheckpointOracles associates each known checkpoint oracles with the genesis hash of 49 // the chain it belongs to. 50 var CheckpointOracles = map[common.Hash]*CheckpointOracleConfig{ 51 MainnetGenesisHash: MainnetCheckpointOracle, 52 RopstenGenesisHash: RopstenCheckpointOracle, 53 RinkebyGenesisHash: RinkebyCheckpointOracle, 54 GoerliGenesisHash: GoerliCheckpointOracle, 55 } 56 57 var ( 58 // MainnetChainConfig is the chain parameters to run a node on the main network. 59 MainnetChainConfig = &ChainConfig{ 60 ChainID: big.NewInt(1), 61 HomesteadBlock: big.NewInt(1_150_000), 62 DAOForkBlock: big.NewInt(1_920_000), 63 DAOForkSupport: true, 64 EIP150Block: big.NewInt(2_463_000), 65 EIP150Hash: common.HexToHash("0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0"), 66 EIP155Block: big.NewInt(2_675_000), 67 EIP158Block: big.NewInt(2_675_000), 68 ByzantiumBlock: big.NewInt(4_370_000), 69 ConstantinopleBlock: big.NewInt(7_280_000), 70 PetersburgBlock: big.NewInt(7_280_000), 71 IstanbulBlock: big.NewInt(9_069_000), 72 MuirGlacierBlock: big.NewInt(9_200_000), 73 BerlinBlock: big.NewInt(12_244_000), 74 LondonBlock: big.NewInt(12_965_000), 75 ArrowGlacierBlock: big.NewInt(13_773_000), 76 Ethash: new(EthashConfig), 77 } 78 79 // MainnetTrustedCheckpoint contains the light client trusted checkpoint for the main network. 80 MainnetTrustedCheckpoint = &TrustedCheckpoint{ 81 SectionIndex: 451, 82 SectionHead: common.HexToHash("0xe47f84b9967eb2ad2afff74d59901b63134660011822fdababaf8fdd18a75aa6"), 83 CHTRoot: common.HexToHash("0xc31e0462ca3d39a46111bb6b63ac4e1cac84089472b7474a319d582f72b3f0c0"), 84 BloomRoot: common.HexToHash("0x7c9f25ce3577a3ab330d52a7343f801899cf9d4980c69f81de31ccc1a055c809"), 85 } 86 87 // MainnetCheckpointOracle contains a set of configs for the main network oracle. 88 MainnetCheckpointOracle = &CheckpointOracleConfig{ 89 Address: common.HexToAddress("0x9a9070028361F7AAbeB3f2F2Dc07F82C4a98A02a"), 90 Signers: []common.Address{ 91 common.HexToAddress("0x1b2C260efc720BE89101890E4Db589b44E950527"), // Peter 92 common.HexToAddress("0x78d1aD571A1A09D60D9BBf25894b44e4C8859595"), // Martin 93 common.HexToAddress("0x286834935f4A8Cfb4FF4C77D5770C2775aE2b0E7"), // Zsolt 94 common.HexToAddress("0xb86e2B0Ab5A4B1373e40c51A7C712c70Ba2f9f8E"), // Gary 95 common.HexToAddress("0x0DF8fa387C602AE62559cC4aFa4972A7045d6707"), // Guillaume 96 }, 97 Threshold: 2, 98 } 99 100 // RopstenChainConfig contains the chain parameters to run a node on the Ropsten test network. 101 RopstenChainConfig = &ChainConfig{ 102 ChainID: big.NewInt(3), 103 HomesteadBlock: big.NewInt(0), 104 DAOForkBlock: nil, 105 DAOForkSupport: true, 106 EIP150Block: big.NewInt(0), 107 EIP150Hash: common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d"), 108 EIP155Block: big.NewInt(10), 109 EIP158Block: big.NewInt(10), 110 ByzantiumBlock: big.NewInt(1_700_000), 111 ConstantinopleBlock: big.NewInt(4_230_000), 112 PetersburgBlock: big.NewInt(4_939_394), 113 IstanbulBlock: big.NewInt(6_485_846), 114 MuirGlacierBlock: big.NewInt(7_117_117), 115 BerlinBlock: big.NewInt(9_812_189), 116 LondonBlock: big.NewInt(10_499_401), 117 TerminalTotalDifficulty: new(big.Int).SetBytes([]byte{0x15, 0x2D, 0x02, 0xC7, 0xE1, 0x4A, 0xF6, 0x80, 0x00, 0x00}), // 100_000_000_000_000_000_000_000 118 Ethash: new(EthashConfig), 119 } 120 121 // RopstenTrustedCheckpoint contains the light client trusted checkpoint for the Ropsten test network. 122 RopstenTrustedCheckpoint = &TrustedCheckpoint{ 123 SectionIndex: 346, 124 SectionHead: common.HexToHash("0xafa0384ebd13a751fb7475aaa7fc08ac308925c8b2e2195bca2d4ab1878a7a84"), 125 CHTRoot: common.HexToHash("0x522ae1f334bfa36033b2315d0b9954052780700b69448ecea8d5877e0f7ee477"), 126 BloomRoot: common.HexToHash("0x4093fd53b0d2cc50181dca353fe66f03ae113e7cb65f869a4dfb5905de6a0493"), 127 } 128 129 // RopstenCheckpointOracle contains a set of configs for the Ropsten test network oracle. 130 RopstenCheckpointOracle = &CheckpointOracleConfig{ 131 Address: common.HexToAddress("0xEF79475013f154E6A65b54cB2742867791bf0B84"), 132 Signers: []common.Address{ 133 common.HexToAddress("0x32162F3581E88a5f62e8A61892B42C46E2c18f7b"), // Peter 134 common.HexToAddress("0x78d1aD571A1A09D60D9BBf25894b44e4C8859595"), // Martin 135 common.HexToAddress("0x286834935f4A8Cfb4FF4C77D5770C2775aE2b0E7"), // Zsolt 136 common.HexToAddress("0xb86e2B0Ab5A4B1373e40c51A7C712c70Ba2f9f8E"), // Gary 137 common.HexToAddress("0x0DF8fa387C602AE62559cC4aFa4972A7045d6707"), // Guillaume 138 }, 139 Threshold: 2, 140 } 141 142 // SepoliaChainConfig contains the chain parameters to run a node on the Sepolia test network. 143 SepoliaChainConfig = &ChainConfig{ 144 ChainID: big.NewInt(11155111), 145 HomesteadBlock: big.NewInt(0), 146 DAOForkBlock: nil, 147 DAOForkSupport: true, 148 EIP150Block: big.NewInt(0), 149 EIP155Block: big.NewInt(0), 150 EIP158Block: big.NewInt(0), 151 ByzantiumBlock: big.NewInt(0), 152 ConstantinopleBlock: big.NewInt(0), 153 PetersburgBlock: big.NewInt(0), 154 IstanbulBlock: big.NewInt(0), 155 MuirGlacierBlock: big.NewInt(0), 156 BerlinBlock: big.NewInt(0), 157 LondonBlock: big.NewInt(0), 158 Ethash: new(EthashConfig), 159 } 160 161 // SepoliaTrustedCheckpoint contains the light client trusted checkpoint for the Sepolia test network. 162 SepoliaTrustedCheckpoint = &TrustedCheckpoint{ 163 SectionIndex: 34, 164 SectionHead: common.HexToHash("0xe361400fcbc468d641e7bdd0b0946a3548e97c5d2703b124f04a3f1deccec244"), 165 CHTRoot: common.HexToHash("0xea6768fd288dce7d84f590884908ec39e4de78e6e1a38de5c5419b0f49a42f91"), 166 BloomRoot: common.HexToHash("0x06d32f35d5a611bfd0333ad44e39c619449824167d8ef2913edc48a8112be2cd"), 167 } 168 169 // RinkebyChainConfig contains the chain parameters to run a node on the Rinkeby test network. 170 RinkebyChainConfig = &ChainConfig{ 171 ChainID: big.NewInt(4), 172 HomesteadBlock: big.NewInt(1), 173 DAOForkBlock: nil, 174 DAOForkSupport: true, 175 EIP150Block: big.NewInt(2), 176 EIP150Hash: common.HexToHash("0x9b095b36c15eaf13044373aef8ee0bd3a382a5abb92e402afa44b8249c3a90e9"), 177 EIP155Block: big.NewInt(3), 178 EIP158Block: big.NewInt(3), 179 ByzantiumBlock: big.NewInt(1_035_301), 180 ConstantinopleBlock: big.NewInt(3_660_663), 181 PetersburgBlock: big.NewInt(4_321_234), 182 IstanbulBlock: big.NewInt(5_435_345), 183 MuirGlacierBlock: nil, 184 BerlinBlock: big.NewInt(8_290_928), 185 LondonBlock: big.NewInt(8_897_988), 186 ArrowGlacierBlock: nil, 187 Clique: &CliqueConfig{ 188 Period: 15, 189 Epoch: 30000, 190 }, 191 } 192 193 // RinkebyTrustedCheckpoint contains the light client trusted checkpoint for the Rinkeby test network. 194 RinkebyTrustedCheckpoint = &TrustedCheckpoint{ 195 SectionIndex: 326, 196 SectionHead: common.HexToHash("0x941a41a153b0e36cb15d9d193d1d0f9715bdb2435efd1c95119b64168667ce00"), 197 CHTRoot: common.HexToHash("0xe2331e00d579cf4093091dee35bef772e63c2341380c276041dc22563c8aba2e"), 198 BloomRoot: common.HexToHash("0x595206febcf118958c2bc1218ea71d01fd04b8f97ad71813df4be0af5b36b0e5"), 199 } 200 201 // RinkebyCheckpointOracle contains a set of configs for the Rinkeby test network oracle. 202 RinkebyCheckpointOracle = &CheckpointOracleConfig{ 203 Address: common.HexToAddress("0xebe8eFA441B9302A0d7eaECc277c09d20D684540"), 204 Signers: []common.Address{ 205 common.HexToAddress("0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3"), // Peter 206 common.HexToAddress("0x78d1aD571A1A09D60D9BBf25894b44e4C8859595"), // Martin 207 common.HexToAddress("0x286834935f4A8Cfb4FF4C77D5770C2775aE2b0E7"), // Zsolt 208 common.HexToAddress("0xb86e2B0Ab5A4B1373e40c51A7C712c70Ba2f9f8E"), // Gary 209 }, 210 Threshold: 2, 211 } 212 213 // GoerliChainConfig contains the chain parameters to run a node on the Görli test network. 214 GoerliChainConfig = &ChainConfig{ 215 ChainID: big.NewInt(5), 216 HomesteadBlock: big.NewInt(0), 217 DAOForkBlock: nil, 218 DAOForkSupport: true, 219 EIP150Block: big.NewInt(0), 220 EIP155Block: big.NewInt(0), 221 EIP158Block: big.NewInt(0), 222 ByzantiumBlock: big.NewInt(0), 223 ConstantinopleBlock: big.NewInt(0), 224 PetersburgBlock: big.NewInt(0), 225 IstanbulBlock: big.NewInt(1_561_651), 226 MuirGlacierBlock: nil, 227 BerlinBlock: big.NewInt(4_460_644), 228 LondonBlock: big.NewInt(5_062_605), 229 ArrowGlacierBlock: nil, 230 Clique: &CliqueConfig{ 231 Period: 15, 232 Epoch: 30000, 233 }, 234 } 235 236 // GoerliTrustedCheckpoint contains the light client trusted checkpoint for the Görli test network. 237 GoerliTrustedCheckpoint = &TrustedCheckpoint{ 238 SectionIndex: 210, 239 SectionHead: common.HexToHash("0xbb11eaf551a6c06f74a6c7bbfe1699cbf64b8f248b64691da916dd443176db2f"), 240 CHTRoot: common.HexToHash("0x9934ae326d00d9c7de2e074c0e51689efb7fa7fcba18929ff4279c27259c45e6"), 241 BloomRoot: common.HexToHash("0x7fe3bd4fd45194aa8a5cfe5ac590edff1f870d3d98d3c310494e7f67613a87ff"), 242 } 243 244 // GoerliCheckpointOracle contains a set of configs for the Goerli test network oracle. 245 GoerliCheckpointOracle = &CheckpointOracleConfig{ 246 Address: common.HexToAddress("0x18CA0E045F0D772a851BC7e48357Bcaab0a0795D"), 247 Signers: []common.Address{ 248 common.HexToAddress("0x4769bcaD07e3b938B7f43EB7D278Bc7Cb9efFb38"), // Peter 249 common.HexToAddress("0x78d1aD571A1A09D60D9BBf25894b44e4C8859595"), // Martin 250 common.HexToAddress("0x286834935f4A8Cfb4FF4C77D5770C2775aE2b0E7"), // Zsolt 251 common.HexToAddress("0xb86e2B0Ab5A4B1373e40c51A7C712c70Ba2f9f8E"), // Gary 252 common.HexToAddress("0x0DF8fa387C602AE62559cC4aFa4972A7045d6707"), // Guillaume 253 }, 254 Threshold: 2, 255 } 256 257 // AllEthashProtocolChanges contains every protocol change (EIPs) introduced 258 // and accepted by the Ethereum core developers into the Ethash consensus. 259 // 260 // This configuration is intentionally not using keyed fields to force anyone 261 // adding flags to the config to also have to set these fields. 262 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), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, new(EthashConfig), nil} 263 264 // AllCliqueProtocolChanges contains every protocol change (EIPs) introduced 265 // and accepted by the Ethereum core developers into the Clique consensus. 266 // 267 // This configuration is intentionally not using keyed fields to force anyone 268 // adding flags to the config to also have to set these fields. 269 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, &CliqueConfig{Period: 0, Epoch: 30000}} 270 271 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, new(EthashConfig), nil} 272 TestRules = TestChainConfig.Rules(new(big.Int), false) 273 ) 274 275 // TrustedCheckpoint represents a set of post-processed trie roots (CHT and 276 // BloomTrie) associated with the appropriate section index and head hash. It is 277 // used to start light syncing from this checkpoint and avoid downloading the 278 // entire header chain while still being able to securely access old headers/logs. 279 type TrustedCheckpoint struct { 280 SectionIndex uint64 `json:"sectionIndex"` 281 SectionHead common.Hash `json:"sectionHead"` 282 CHTRoot common.Hash `json:"chtRoot"` 283 BloomRoot common.Hash `json:"bloomRoot"` 284 } 285 286 // HashEqual returns an indicator comparing the itself hash with given one. 287 func (c *TrustedCheckpoint) HashEqual(hash common.Hash) bool { 288 if c.Empty() { 289 return hash == common.Hash{} 290 } 291 return c.Hash() == hash 292 } 293 294 // Hash returns the hash of checkpoint's four key fields(index, sectionHead, chtRoot and bloomTrieRoot). 295 func (c *TrustedCheckpoint) Hash() common.Hash { 296 var sectionIndex [8]byte 297 binary.BigEndian.PutUint64(sectionIndex[:], c.SectionIndex) 298 299 w := sha3.NewLegacyKeccak256() 300 w.Write(sectionIndex[:]) 301 w.Write(c.SectionHead[:]) 302 w.Write(c.CHTRoot[:]) 303 w.Write(c.BloomRoot[:]) 304 305 var h common.Hash 306 w.Sum(h[:0]) 307 return h 308 } 309 310 // Empty returns an indicator whether the checkpoint is regarded as empty. 311 func (c *TrustedCheckpoint) Empty() bool { 312 return c.SectionHead == (common.Hash{}) || c.CHTRoot == (common.Hash{}) || c.BloomRoot == (common.Hash{}) 313 } 314 315 // CheckpointOracleConfig represents a set of checkpoint contract(which acts as an oracle) 316 // config which used for light client checkpoint syncing. 317 type CheckpointOracleConfig struct { 318 Address common.Address `json:"address"` 319 Signers []common.Address `json:"signers"` 320 Threshold uint64 `json:"threshold"` 321 } 322 323 // ChainConfig is the core config which determines the blockchain settings. 324 // 325 // ChainConfig is stored in the database on a per block basis. This means 326 // that any network, identified by its genesis block, can have its own 327 // set of configuration options. 328 type ChainConfig struct { 329 ChainID *big.Int `json:"chainId"` // chainId identifies the current chain and is used for replay protection 330 331 HomesteadBlock *big.Int `json:"homesteadBlock,omitempty"` // Homestead switch block (nil = no fork, 0 = already homestead) 332 333 DAOForkBlock *big.Int `json:"daoForkBlock,omitempty"` // TheDAO hard-fork switch block (nil = no fork) 334 DAOForkSupport bool `json:"daoForkSupport,omitempty"` // Whether the nodes supports or opposes the DAO hard-fork 335 336 // EIP150 implements the Gas price changes (https://github.com/ethereum/EIPs/issues/150) 337 EIP150Block *big.Int `json:"eip150Block,omitempty"` // EIP150 HF block (nil = no fork) 338 EIP150Hash common.Hash `json:"eip150Hash,omitempty"` // EIP150 HF hash (needed for header only clients as only gas pricing changed) 339 340 EIP155Block *big.Int `json:"eip155Block,omitempty"` // EIP155 HF block 341 EIP158Block *big.Int `json:"eip158Block,omitempty"` // EIP158 HF block 342 343 ByzantiumBlock *big.Int `json:"byzantiumBlock,omitempty"` // Byzantium switch block (nil = no fork, 0 = already on byzantium) 344 ConstantinopleBlock *big.Int `json:"constantinopleBlock,omitempty"` // Constantinople switch block (nil = no fork, 0 = already activated) 345 PetersburgBlock *big.Int `json:"petersburgBlock,omitempty"` // Petersburg switch block (nil = same as Constantinople) 346 IstanbulBlock *big.Int `json:"istanbulBlock,omitempty"` // Istanbul switch block (nil = no fork, 0 = already on istanbul) 347 MuirGlacierBlock *big.Int `json:"muirGlacierBlock,omitempty"` // Eip-2384 (bomb delay) switch block (nil = no fork, 0 = already activated) 348 BerlinBlock *big.Int `json:"berlinBlock,omitempty"` // Berlin switch block (nil = no fork, 0 = already on berlin) 349 LondonBlock *big.Int `json:"londonBlock,omitempty"` // London switch block (nil = no fork, 0 = already on london) 350 ArrowGlacierBlock *big.Int `json:"arrowGlacierBlock,omitempty"` // Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated) 351 MergeForkBlock *big.Int `json:"mergeForkBlock,omitempty"` // EIP-3675 (TheMerge) switch block (nil = no fork, 0 = already in merge proceedings) 352 353 // TerminalTotalDifficulty is the amount of total difficulty reached by 354 // the network that triggers the consensus upgrade. 355 TerminalTotalDifficulty *big.Int `json:"terminalTotalDifficulty,omitempty"` 356 357 // Various consensus engines 358 Ethash *EthashConfig `json:"ethash,omitempty"` 359 Clique *CliqueConfig `json:"clique,omitempty"` 360 } 361 362 // EthashConfig is the consensus engine configs for proof-of-work based sealing. 363 type EthashConfig struct{} 364 365 // String implements the stringer interface, returning the consensus engine details. 366 func (c *EthashConfig) String() string { 367 return "ethash" 368 } 369 370 // CliqueConfig is the consensus engine configs for proof-of-authority based sealing. 371 type CliqueConfig struct { 372 Period uint64 `json:"period"` // Number of seconds between blocks to enforce 373 Epoch uint64 `json:"epoch"` // Epoch length to reset votes and checkpoint 374 } 375 376 // String implements the stringer interface, returning the consensus engine details. 377 func (c *CliqueConfig) String() string { 378 return "clique" 379 } 380 381 // String implements the fmt.Stringer interface. 382 func (c *ChainConfig) String() string { 383 var engine interface{} 384 switch { 385 case c.Ethash != nil: 386 engine = c.Ethash 387 case c.Clique != nil: 388 engine = c.Clique 389 default: 390 engine = "unknown" 391 } 392 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, Berlin: %v, London: %v, Arrow Glacier: %v, MergeFork: %v, Terminal TD: %v, Engine: %v}", 393 c.ChainID, 394 c.HomesteadBlock, 395 c.DAOForkBlock, 396 c.DAOForkSupport, 397 c.EIP150Block, 398 c.EIP155Block, 399 c.EIP158Block, 400 c.ByzantiumBlock, 401 c.ConstantinopleBlock, 402 c.PetersburgBlock, 403 c.IstanbulBlock, 404 c.MuirGlacierBlock, 405 c.BerlinBlock, 406 c.LondonBlock, 407 c.ArrowGlacierBlock, 408 c.MergeForkBlock, 409 c.TerminalTotalDifficulty, 410 engine, 411 ) 412 } 413 414 // IsHomestead returns whether num is either equal to the homestead block or greater. 415 func (c *ChainConfig) IsHomestead(num *big.Int) bool { 416 return isForked(c.HomesteadBlock, num) 417 } 418 419 // IsDAOFork returns whether num is either equal to the DAO fork block or greater. 420 func (c *ChainConfig) IsDAOFork(num *big.Int) bool { 421 return isForked(c.DAOForkBlock, num) 422 } 423 424 // IsEIP150 returns whether num is either equal to the EIP150 fork block or greater. 425 func (c *ChainConfig) IsEIP150(num *big.Int) bool { 426 return isForked(c.EIP150Block, num) 427 } 428 429 // IsEIP155 returns whether num is either equal to the EIP155 fork block or greater. 430 func (c *ChainConfig) IsEIP155(num *big.Int) bool { 431 return isForked(c.EIP155Block, num) 432 } 433 434 // IsEIP158 returns whether num is either equal to the EIP158 fork block or greater. 435 func (c *ChainConfig) IsEIP158(num *big.Int) bool { 436 return isForked(c.EIP158Block, num) 437 } 438 439 // IsByzantium returns whether num is either equal to the Byzantium fork block or greater. 440 func (c *ChainConfig) IsByzantium(num *big.Int) bool { 441 return isForked(c.ByzantiumBlock, num) 442 } 443 444 // IsConstantinople returns whether num is either equal to the Constantinople fork block or greater. 445 func (c *ChainConfig) IsConstantinople(num *big.Int) bool { 446 return isForked(c.ConstantinopleBlock, num) 447 } 448 449 // IsMuirGlacier returns whether num is either equal to the Muir Glacier (EIP-2384) fork block or greater. 450 func (c *ChainConfig) IsMuirGlacier(num *big.Int) bool { 451 return isForked(c.MuirGlacierBlock, num) 452 } 453 454 // IsPetersburg returns whether num is either 455 // - equal to or greater than the PetersburgBlock fork block, 456 // - OR is nil, and Constantinople is active 457 func (c *ChainConfig) IsPetersburg(num *big.Int) bool { 458 return isForked(c.PetersburgBlock, num) || c.PetersburgBlock == nil && isForked(c.ConstantinopleBlock, num) 459 } 460 461 // IsIstanbul returns whether num is either equal to the Istanbul fork block or greater. 462 func (c *ChainConfig) IsIstanbul(num *big.Int) bool { 463 return isForked(c.IstanbulBlock, num) 464 } 465 466 // IsBerlin returns whether num is either equal to the Berlin fork block or greater. 467 func (c *ChainConfig) IsBerlin(num *big.Int) bool { 468 return isForked(c.BerlinBlock, num) 469 } 470 471 // IsLondon returns whether num is either equal to the London fork block or greater. 472 func (c *ChainConfig) IsLondon(num *big.Int) bool { 473 return isForked(c.LondonBlock, num) 474 } 475 476 // IsArrowGlacier returns whether num is either equal to the Arrow Glacier (EIP-4345) fork block or greater. 477 func (c *ChainConfig) IsArrowGlacier(num *big.Int) bool { 478 return isForked(c.ArrowGlacierBlock, num) 479 } 480 481 // IsTerminalPoWBlock returns whether the given block is the last block of PoW stage. 482 func (c *ChainConfig) IsTerminalPoWBlock(parentTotalDiff *big.Int, totalDiff *big.Int) bool { 483 if c.TerminalTotalDifficulty == nil { 484 return false 485 } 486 return parentTotalDiff.Cmp(c.TerminalTotalDifficulty) < 0 && totalDiff.Cmp(c.TerminalTotalDifficulty) >= 0 487 } 488 489 // CheckCompatible checks whether scheduled fork transitions have been imported 490 // with a mismatching chain configuration. 491 func (c *ChainConfig) CheckCompatible(newcfg *ChainConfig, height uint64) *ConfigCompatError { 492 bhead := new(big.Int).SetUint64(height) 493 494 // Iterate checkCompatible to find the lowest conflict. 495 var lasterr *ConfigCompatError 496 for { 497 err := c.checkCompatible(newcfg, bhead) 498 if err == nil || (lasterr != nil && err.RewindTo == lasterr.RewindTo) { 499 break 500 } 501 lasterr = err 502 bhead.SetUint64(err.RewindTo) 503 } 504 return lasterr 505 } 506 507 // CheckConfigForkOrder checks that we don't "skip" any forks, geth isn't pluggable enough 508 // to guarantee that forks can be implemented in a different order than on official networks 509 func (c *ChainConfig) CheckConfigForkOrder() error { 510 type fork struct { 511 name string 512 block *big.Int 513 optional bool // if true, the fork may be nil and next fork is still allowed 514 } 515 var lastFork fork 516 for _, cur := range []fork{ 517 {name: "homesteadBlock", block: c.HomesteadBlock}, 518 {name: "daoForkBlock", block: c.DAOForkBlock, optional: true}, 519 {name: "eip150Block", block: c.EIP150Block}, 520 {name: "eip155Block", block: c.EIP155Block}, 521 {name: "eip158Block", block: c.EIP158Block}, 522 {name: "byzantiumBlock", block: c.ByzantiumBlock}, 523 {name: "constantinopleBlock", block: c.ConstantinopleBlock}, 524 {name: "petersburgBlock", block: c.PetersburgBlock}, 525 {name: "istanbulBlock", block: c.IstanbulBlock}, 526 {name: "muirGlacierBlock", block: c.MuirGlacierBlock, optional: true}, 527 {name: "berlinBlock", block: c.BerlinBlock}, 528 {name: "londonBlock", block: c.LondonBlock}, 529 {name: "arrowGlacierBlock", block: c.ArrowGlacierBlock, optional: true}, 530 {name: "mergeStartBlock", block: c.MergeForkBlock, optional: true}, 531 } { 532 if lastFork.name != "" { 533 // Next one must be higher number 534 if lastFork.block == nil && cur.block != nil { 535 return fmt.Errorf("unsupported fork ordering: %v not enabled, but %v enabled at %v", 536 lastFork.name, cur.name, cur.block) 537 } 538 if lastFork.block != nil && cur.block != nil { 539 if lastFork.block.Cmp(cur.block) > 0 { 540 return fmt.Errorf("unsupported fork ordering: %v enabled at %v, but %v enabled at %v", 541 lastFork.name, lastFork.block, cur.name, cur.block) 542 } 543 } 544 } 545 // If it was optional and not set, then ignore it 546 if !cur.optional || cur.block != nil { 547 lastFork = cur 548 } 549 } 550 return nil 551 } 552 553 func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *ConfigCompatError { 554 if isForkIncompatible(c.HomesteadBlock, newcfg.HomesteadBlock, head) { 555 return newCompatError("Homestead fork block", c.HomesteadBlock, newcfg.HomesteadBlock) 556 } 557 if isForkIncompatible(c.DAOForkBlock, newcfg.DAOForkBlock, head) { 558 return newCompatError("DAO fork block", c.DAOForkBlock, newcfg.DAOForkBlock) 559 } 560 if c.IsDAOFork(head) && c.DAOForkSupport != newcfg.DAOForkSupport { 561 return newCompatError("DAO fork support flag", c.DAOForkBlock, newcfg.DAOForkBlock) 562 } 563 if isForkIncompatible(c.EIP150Block, newcfg.EIP150Block, head) { 564 return newCompatError("EIP150 fork block", c.EIP150Block, newcfg.EIP150Block) 565 } 566 if isForkIncompatible(c.EIP155Block, newcfg.EIP155Block, head) { 567 return newCompatError("EIP155 fork block", c.EIP155Block, newcfg.EIP155Block) 568 } 569 if isForkIncompatible(c.EIP158Block, newcfg.EIP158Block, head) { 570 return newCompatError("EIP158 fork block", c.EIP158Block, newcfg.EIP158Block) 571 } 572 if c.IsEIP158(head) && !configNumEqual(c.ChainID, newcfg.ChainID) { 573 return newCompatError("EIP158 chain ID", c.EIP158Block, newcfg.EIP158Block) 574 } 575 if isForkIncompatible(c.ByzantiumBlock, newcfg.ByzantiumBlock, head) { 576 return newCompatError("Byzantium fork block", c.ByzantiumBlock, newcfg.ByzantiumBlock) 577 } 578 if isForkIncompatible(c.ConstantinopleBlock, newcfg.ConstantinopleBlock, head) { 579 return newCompatError("Constantinople fork block", c.ConstantinopleBlock, newcfg.ConstantinopleBlock) 580 } 581 if isForkIncompatible(c.PetersburgBlock, newcfg.PetersburgBlock, head) { 582 // the only case where we allow Petersburg to be set in the past is if it is equal to Constantinople 583 // mainly to satisfy fork ordering requirements which state that Petersburg fork be set if Constantinople fork is set 584 if isForkIncompatible(c.ConstantinopleBlock, newcfg.PetersburgBlock, head) { 585 return newCompatError("Petersburg fork block", c.PetersburgBlock, newcfg.PetersburgBlock) 586 } 587 } 588 if isForkIncompatible(c.IstanbulBlock, newcfg.IstanbulBlock, head) { 589 return newCompatError("Istanbul fork block", c.IstanbulBlock, newcfg.IstanbulBlock) 590 } 591 if isForkIncompatible(c.MuirGlacierBlock, newcfg.MuirGlacierBlock, head) { 592 return newCompatError("Muir Glacier fork block", c.MuirGlacierBlock, newcfg.MuirGlacierBlock) 593 } 594 if isForkIncompatible(c.BerlinBlock, newcfg.BerlinBlock, head) { 595 return newCompatError("Berlin fork block", c.BerlinBlock, newcfg.BerlinBlock) 596 } 597 if isForkIncompatible(c.LondonBlock, newcfg.LondonBlock, head) { 598 return newCompatError("London fork block", c.LondonBlock, newcfg.LondonBlock) 599 } 600 if isForkIncompatible(c.ArrowGlacierBlock, newcfg.ArrowGlacierBlock, head) { 601 return newCompatError("Arrow Glacier fork block", c.ArrowGlacierBlock, newcfg.ArrowGlacierBlock) 602 } 603 if isForkIncompatible(c.MergeForkBlock, newcfg.MergeForkBlock, head) { 604 return newCompatError("Merge Start fork block", c.MergeForkBlock, newcfg.MergeForkBlock) 605 } 606 return nil 607 } 608 609 // isForkIncompatible returns true if a fork scheduled at s1 cannot be rescheduled to 610 // block s2 because head is already past the fork. 611 func isForkIncompatible(s1, s2, head *big.Int) bool { 612 return (isForked(s1, head) || isForked(s2, head)) && !configNumEqual(s1, s2) 613 } 614 615 // isForked returns whether a fork scheduled at block s is active at the given head block. 616 func isForked(s, head *big.Int) bool { 617 if s == nil || head == nil { 618 return false 619 } 620 return s.Cmp(head) <= 0 621 } 622 623 func configNumEqual(x, y *big.Int) bool { 624 if x == nil { 625 return y == nil 626 } 627 if y == nil { 628 return x == nil 629 } 630 return x.Cmp(y) == 0 631 } 632 633 // ConfigCompatError is raised if the locally-stored blockchain is initialised with a 634 // ChainConfig that would alter the past. 635 type ConfigCompatError struct { 636 What string 637 // block numbers of the stored and new configurations 638 StoredConfig, NewConfig *big.Int 639 // the block number to which the local chain must be rewound to correct the error 640 RewindTo uint64 641 } 642 643 func newCompatError(what string, storedblock, newblock *big.Int) *ConfigCompatError { 644 var rew *big.Int 645 switch { 646 case storedblock == nil: 647 rew = newblock 648 case newblock == nil || storedblock.Cmp(newblock) < 0: 649 rew = storedblock 650 default: 651 rew = newblock 652 } 653 err := &ConfigCompatError{what, storedblock, newblock, 0} 654 if rew != nil && rew.Sign() > 0 { 655 err.RewindTo = rew.Uint64() - 1 656 } 657 return err 658 } 659 660 func (err *ConfigCompatError) Error() string { 661 return fmt.Sprintf("mismatching %s in database (have %d, want %d, rewindto %d)", err.What, err.StoredConfig, err.NewConfig, err.RewindTo) 662 } 663 664 // Rules wraps ChainConfig and is merely syntactic sugar or can be used for functions 665 // that do not have or require information about the block. 666 // 667 // Rules is a one time interface meaning that it shouldn't be used in between transition 668 // phases. 669 type Rules struct { 670 ChainID *big.Int 671 IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool 672 IsByzantium, IsConstantinople, IsPetersburg, IsIstanbul bool 673 IsBerlin, IsLondon bool 674 IsMerge bool 675 } 676 677 // Rules ensures c's ChainID is not nil. 678 func (c *ChainConfig) Rules(num *big.Int, isMerge bool) Rules { 679 chainID := c.ChainID 680 if chainID == nil { 681 chainID = new(big.Int) 682 } 683 return Rules{ 684 ChainID: new(big.Int).Set(chainID), 685 IsHomestead: c.IsHomestead(num), 686 IsEIP150: c.IsEIP150(num), 687 IsEIP155: c.IsEIP155(num), 688 IsEIP158: c.IsEIP158(num), 689 IsByzantium: c.IsByzantium(num), 690 IsConstantinople: c.IsConstantinople(num), 691 IsPetersburg: c.IsPetersburg(num), 692 IsIstanbul: c.IsIstanbul(num), 693 IsBerlin: c.IsBerlin(num), 694 IsLondon: c.IsLondon(num), 695 IsMerge: isMerge, 696 } 697 }