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  }