good morning!!!!

Skip to content
Snippets Groups Projects
Select Git revision
  • 668c37fde112f42496a16d012b6f7dc7a876d13c
  • master default protected
  • v0.2.16-candidate
  • shivam/rpcAddBorTx
  • default-cli-config
  • shivam/minerRecommitFix
  • vcastellm/pos-296-bump-go-version-in-bor-and-heimdall
  • shivam/ethstats-backend-fix
  • v0.2.16-beta1-candidate
  • v0.2.15-beta3-candidate
  • shivam/newCli-IPC
  • v0.3.0-dev
  • checkpoint-whitelist-master
  • shivam/codecov
  • jdkanani/fix-typo-log
  • shivam/hardcoded-spans-v0.2.14
  • shivam/hardcoded-spans
  • shivam/fast-state-sync
  • shivam/fast-state-sync-master
  • gethv1.10.15-merge
  • fix-txpool-2
  • v0.2.14-tmp-span-hotfix
  • v0.2.15-beta2
  • v0.2.15-beta1
  • v0.3.0-beta3
  • v0.3.0-beta2
  • v0.3.0-beta1
  • v0.2.14
  • v0.2.13
  • v0.2.13-beta2
  • v0.2.13-beta1
  • v0.2.12
  • v0.2.12-beta3
  • v0.2.12-beta1
  • v0.2.12-beta2
  • v0.2.11
  • v0.2.10
  • v0.2.10-beta2
  • v0.2.9
  • v0.2.9-beta1
  • v0.2.8
41 results

config.go

  • Forked from github / maticnetwork / bor
    3304 commits behind the upstream repository.
    user avatar
    EOS Classic authored
    668c37fd
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    config.go 15.80 KiB
    // Copyright 2016 The go-ethereum Authors
    // This file is part of the go-ethereum library.
    //
    // The go-ethereum library is free software: you can redistribute it and/or modify
    // it under the terms of the GNU Lesser General Public License as published by
    // the Free Software Foundation, either version 3 of the License, or
    // (at your option) any later version.
    //
    // The go-ethereum library is distributed in the hope that it will be useful,
    // but WITHOUT ANY WARRANTY; without even the implied warranty of
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    // GNU Lesser General Public License for more details.
    //
    // You should have received a copy of the GNU Lesser General Public License
    // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    
    package params
    
    import (
    	"fmt"
    	"math/big"
    
    	"github.com/ethereum/go-ethereum/common"
    )
    
    // Genesis hashes to enforce below configs on.
    var (
    	MainnetGenesisHash = common.HexToHash("0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3")
    	TestnetGenesisHash = common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d")
    	RinkebyGenesisHash = common.HexToHash("0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177")
    )
    
    var (
    	// MainnetChainConfig is the chain parameters to run a node on the main network.
    	MainnetChainConfig = &ChainConfig{
    		ChainID:             big.NewInt(1),
    		HomesteadBlock:      big.NewInt(1150000),
    		DAOForkBlock:        big.NewInt(1920000),
    		DAOForkSupport:      true,
    		EIP150Block:         big.NewInt(2463000),
    		EIP150Hash:          common.HexToHash("0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0"),
    		EIP155Block:         big.NewInt(2675000),
    		EIP158Block:         big.NewInt(2675000),
    		ByzantiumBlock:      big.NewInt(4370000),
    		ConstantinopleBlock: nil,
    		Ethash:              new(EthashConfig),
    	}
    
    	// MainnetTrustedCheckpoint contains the light client trusted checkpoint for the main network.
    	MainnetTrustedCheckpoint = &TrustedCheckpoint{
    		Name:         "mainnet",
    		SectionIndex: 193,
    		SectionHead:  common.HexToHash("0xc2d574295ecedc4d58530ae24c31a5a98be7d2b3327fba0dd0f4ed3913828a55"),
    		CHTRoot:      common.HexToHash("0x5d1027dfae688c77376e842679ceada87fd94738feb9b32ef165473bfbbb317b"),
    		BloomRoot:    common.HexToHash("0xd38be1a06aabd568e10957fee4fcc523bc64996bcf31bae3f55f86e0a583919f"),
    	}
    
    	// TestnetChainConfig contains the chain parameters to run a node on the Ropsten test network.
    	TestnetChainConfig = &ChainConfig{
    		ChainID:             big.NewInt(3),
    		HomesteadBlock:      big.NewInt(0),
    		DAOForkBlock:        nil,
    		DAOForkSupport:      true,
    		EIP150Block:         big.NewInt(0),
    		EIP150Hash:          common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d"),
    		EIP155Block:         big.NewInt(10),
    		EIP158Block:         big.NewInt(10),
    		ByzantiumBlock:      big.NewInt(1700000),
    		ConstantinopleBlock: big.NewInt(4200000),
    		Ethash:              new(EthashConfig),
    	}
    
    	// TestnetTrustedCheckpoint contains the light client trusted checkpoint for the Ropsten test network.
    	TestnetTrustedCheckpoint = &TrustedCheckpoint{
    		Name:         "testnet",
    		SectionIndex: 123,
    		SectionHead:  common.HexToHash("0xa372a53decb68ce453da12bea1c8ee7b568b276aa2aab94d9060aa7c81fc3dee"),
    		CHTRoot:      common.HexToHash("0x6b02e7fada79cd2a80d4b3623df9c44384d6647fc127462e1c188ccd09ece87b"),
    		BloomRoot:    common.HexToHash("0xf2d27490914968279d6377d42868928632573e823b5d1d4a944cba6009e16259"),
    	}
    
    	// RinkebyChainConfig contains the chain parameters to run a node on the Rinkeby test network.
    	RinkebyChainConfig = &ChainConfig{
    		ChainID:             big.NewInt(4),
    		HomesteadBlock:      big.NewInt(1),
    		DAOForkBlock:        nil,
    		DAOForkSupport:      true,
    		EIP150Block:         big.NewInt(2),
    		EIP150Hash:          common.HexToHash("0x9b095b36c15eaf13044373aef8ee0bd3a382a5abb92e402afa44b8249c3a90e9"),
    		EIP155Block:         big.NewInt(3),
    		EIP158Block:         big.NewInt(3),
    		ByzantiumBlock:      big.NewInt(1035301),
    		ConstantinopleBlock: nil,
    		Clique: &CliqueConfig{
    			Period: 15,
    			Epoch:  30000,
    		},
    	}
    
    	// RinkebyTrustedCheckpoint contains the light client trusted checkpoint for the Rinkeby test network.
    	RinkebyTrustedCheckpoint = &TrustedCheckpoint{
    		Name:         "rinkeby",
    		SectionIndex: 91,
    		SectionHead:  common.HexToHash("0x435b7b2d8a7922f3b9a522f2fb02730e95e0e1782f0f5443894d5415bba37154"),
    		CHTRoot:      common.HexToHash("0x0664bf7ecccfb6775c4eca6f0f264fb5282a22754a2135a1ac4bff2ef02898dd"),
    		BloomRoot:    common.HexToHash("0x2a64df2400c3a2cb6400639bb6ed29389abdb4d93e2e525aa7c21f38767cd96f"),
    	}
    
    	// AllEthashProtocolChanges contains every protocol change (EIPs) introduced
    	// and accepted by the Ethereum core developers into the Ethash consensus.
    	//
    	// This configuration is intentionally not using keyed fields to force anyone
    	// 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), nil, nil, new(EthashConfig), nil}
    
    	// AllCliqueProtocolChanges contains every protocol change (EIPs) introduced
    	// and accepted by the Ethereum core developers into the Clique consensus.
    	//
    	// This configuration is intentionally not using keyed fields to force anyone
    	// 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), nil, 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), nil, nil, new(EthashConfig), nil}
    	TestRules       = TestChainConfig.Rules(new(big.Int))
    )
    
    // TrustedCheckpoint represents a set of post-processed trie roots (CHT and
    // BloomTrie) associated with the appropriate section index and head hash. It is
    // used to start light syncing from this checkpoint and avoid downloading the
    // entire header chain while still being able to securely access old headers/logs.
    type TrustedCheckpoint struct {
    	Name         string      `json:"-"`
    	SectionIndex uint64      `json:"sectionIndex"`
    	SectionHead  common.Hash `json:"sectionHead"`
    	CHTRoot      common.Hash `json:"chtRoot"`
    	BloomRoot    common.Hash `json:"bloomRoot"`
    }
    
    // ChainConfig is the core config which determines the blockchain settings.
    //
    // ChainConfig is stored in the database on a per block basis. This means
    // that any network, identified by its genesis block, can have its own
    // set of configuration options.
    type ChainConfig struct {
    	ChainID *big.Int `json:"chainId"` // chainId identifies the current chain and is used for replay protection
    
    	HomesteadBlock *big.Int `json:"homesteadBlock,omitempty"` // Homestead switch block (nil = no fork, 0 = already homestead)
    
    	DAOForkBlock   *big.Int `json:"daoForkBlock,omitempty"`   // TheDAO hard-fork switch block (nil = no fork)
    	DAOForkSupport bool     `json:"daoForkSupport,omitempty"` // Whether the nodes supports or opposes the DAO hard-fork
    
    	// EIP150 implements the Gas price changes (https://github.com/ethereum/EIPs/issues/150)
    	EIP150Block *big.Int    `json:"eip150Block,omitempty"` // EIP150 HF block (nil = no fork)
    	EIP150Hash  common.Hash `json:"eip150Hash,omitempty"`  // EIP150 HF hash (needed for header only clients as only gas pricing changed)
    
    	EIP155Block *big.Int `json:"eip155Block,omitempty"` // EIP155 HF block
    	EIP158Block *big.Int `json:"eip158Block,omitempty"` // EIP158 HF block
    
    	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)
    	EWASMBlock          *big.Int `json:"ewasmBlock,omitempty"`          // EWASM switch block (nil = no fork, 0 = already activated)
    
    	// Various consensus engines
    	Ethash *EthashConfig `json:"ethash,omitempty"`
    	Clique *CliqueConfig `json:"clique,omitempty"`
    }
    
    // EthashConfig is the consensus engine configs for proof-of-work based sealing.
    type EthashConfig struct{}
    
    // String implements the stringer interface, returning the consensus engine details.
    func (c *EthashConfig) String() string {
    	return "ethash"
    }
    
    // CliqueConfig is the consensus engine configs for proof-of-authority based sealing.
    type CliqueConfig struct {
    	Period uint64 `json:"period"` // Number of seconds between blocks to enforce
    	Epoch  uint64 `json:"epoch"`  // Epoch length to reset votes and checkpoint
    }
    
    // String implements the stringer interface, returning the consensus engine details.
    func (c *CliqueConfig) String() string {
    	return "clique"
    }
    
    // String implements the fmt.Stringer interface.
    func (c *ChainConfig) String() string {
    	var engine interface{}
    	switch {
    	case c.Ethash != nil:
    		engine = c.Ethash
    	case c.Clique != nil:
    		engine = c.Clique
    	default:
    		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}",
    		c.ChainID,
    		c.HomesteadBlock,
    		c.DAOForkBlock,
    		c.DAOForkSupport,
    		c.EIP150Block,
    		c.EIP155Block,
    		c.EIP158Block,
    		c.ByzantiumBlock,
    		c.ConstantinopleBlock,
    		engine,
    	)
    }
    
    // IsHomestead returns whether num is either equal to the homestead block or greater.
    func (c *ChainConfig) IsHomestead(num *big.Int) bool {
    	return isForked(c.HomesteadBlock, num)
    }
    
    // IsDAOFork returns whether num is either equal to the DAO fork block or greater.
    func (c *ChainConfig) IsDAOFork(num *big.Int) bool {
    	return isForked(c.DAOForkBlock, num)
    }
    
    // IsEIP150 returns whether num is either equal to the EIP150 fork block or greater.
    func (c *ChainConfig) IsEIP150(num *big.Int) bool {
    	return isForked(c.EIP150Block, num)
    }
    
    // IsEIP155 returns whether num is either equal to the EIP155 fork block or greater.
    func (c *ChainConfig) IsEIP155(num *big.Int) bool {
    	return isForked(c.EIP155Block, num)
    }
    
    // IsEIP158 returns whether num is either equal to the EIP158 fork block or greater.
    func (c *ChainConfig) IsEIP158(num *big.Int) bool {
    	return isForked(c.EIP158Block, num)
    }
    
    // IsByzantium returns whether num is either equal to the Byzantium fork block or greater.
    func (c *ChainConfig) IsByzantium(num *big.Int) bool {
    	return isForked(c.ByzantiumBlock, num)
    }
    
    // IsConstantinople returns whether num is either equal to the Constantinople fork block or greater.
    func (c *ChainConfig) IsConstantinople(num *big.Int) bool {
    	return isForked(c.ConstantinopleBlock, num)
    }
    
    // IsEWASM returns whether num represents a block number after the EWASM fork
    func (c *ChainConfig) IsEWASM(num *big.Int) bool {
    	return isForked(c.EWASMBlock, num)
    }
    
    // GasTable returns the gas table corresponding to the current phase (homestead or homestead reprice).
    //
    // The returned GasTable's fields shouldn't, under any circumstances, be changed.
    func (c *ChainConfig) GasTable(num *big.Int) GasTable {
    	if num == nil {
    		return GasTableHomestead
    	}
    	switch {
    	case c.IsConstantinople(num):
    		return GasTableConstantinople
    	case c.IsEIP158(num):
    		return GasTableEIP158
    	case c.IsEIP150(num):
    		return GasTableEIP150
    	default:
    		return GasTableHomestead
    	}
    }
    
    // CheckCompatible checks whether scheduled fork transitions have been imported
    // with a mismatching chain configuration.
    func (c *ChainConfig) CheckCompatible(newcfg *ChainConfig, height uint64) *ConfigCompatError {
    	bhead := new(big.Int).SetUint64(height)
    
    	// Iterate checkCompatible to find the lowest conflict.
    	var lasterr *ConfigCompatError
    	for {
    		err := c.checkCompatible(newcfg, bhead)
    		if err == nil || (lasterr != nil && err.RewindTo == lasterr.RewindTo) {
    			break
    		}
    		lasterr = err
    		bhead.SetUint64(err.RewindTo)
    	}
    	return lasterr
    }
    
    func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *ConfigCompatError {
    	if isForkIncompatible(c.HomesteadBlock, newcfg.HomesteadBlock, head) {
    		return newCompatError("Homestead fork block", c.HomesteadBlock, newcfg.HomesteadBlock)
    	}
    	if isForkIncompatible(c.DAOForkBlock, newcfg.DAOForkBlock, head) {
    		return newCompatError("DAO fork block", c.DAOForkBlock, newcfg.DAOForkBlock)
    	}
    	if c.IsDAOFork(head) && c.DAOForkSupport != newcfg.DAOForkSupport {
    		return newCompatError("DAO fork support flag", c.DAOForkBlock, newcfg.DAOForkBlock)
    	}
    	if isForkIncompatible(c.EIP150Block, newcfg.EIP150Block, head) {
    		return newCompatError("EIP150 fork block", c.EIP150Block, newcfg.EIP150Block)
    	}
    	if isForkIncompatible(c.EIP155Block, newcfg.EIP155Block, head) {
    		return newCompatError("EIP155 fork block", c.EIP155Block, newcfg.EIP155Block)
    	}
    	if isForkIncompatible(c.EIP158Block, newcfg.EIP158Block, head) {
    		return newCompatError("EIP158 fork block", c.EIP158Block, newcfg.EIP158Block)
    	}
    	if c.IsEIP158(head) && !configNumEqual(c.ChainID, newcfg.ChainID) {
    		return newCompatError("EIP158 chain ID", c.EIP158Block, newcfg.EIP158Block)
    	}
    	if isForkIncompatible(c.ByzantiumBlock, newcfg.ByzantiumBlock, head) {
    		return newCompatError("Byzantium fork block", c.ByzantiumBlock, newcfg.ByzantiumBlock)
    	}
    	if isForkIncompatible(c.ConstantinopleBlock, newcfg.ConstantinopleBlock, head) {
    		return newCompatError("Constantinople fork block", c.ConstantinopleBlock, newcfg.ConstantinopleBlock)
    	}
    	if isForkIncompatible(c.EWASMBlock, newcfg.EWASMBlock, head) {
    		return newCompatError("ewasm fork block", c.EWASMBlock, newcfg.EWASMBlock)
    	}
    	return nil
    }
    
    // isForkIncompatible returns true if a fork scheduled at s1 cannot be rescheduled to
    // block s2 because head is already past the fork.
    func isForkIncompatible(s1, s2, head *big.Int) bool {
    	return (isForked(s1, head) || isForked(s2, head)) && !configNumEqual(s1, s2)
    }
    
    // isForked returns whether a fork scheduled at block s is active at the given head block.
    func isForked(s, head *big.Int) bool {
    	if s == nil || head == nil {
    		return false
    	}
    	return s.Cmp(head) <= 0
    }
    
    func configNumEqual(x, y *big.Int) bool {
    	if x == nil {
    		return y == nil
    	}
    	if y == nil {
    		return x == nil
    	}
    	return x.Cmp(y) == 0
    }
    
    // ConfigCompatError is raised if the locally-stored blockchain is initialised with a
    // ChainConfig that would alter the past.
    type ConfigCompatError struct {
    	What string
    	// block numbers of the stored and new configurations
    	StoredConfig, NewConfig *big.Int
    	// the block number to which the local chain must be rewound to correct the error
    	RewindTo uint64
    }
    
    func newCompatError(what string, storedblock, newblock *big.Int) *ConfigCompatError {
    	var rew *big.Int
    	switch {
    	case storedblock == nil:
    		rew = newblock
    	case newblock == nil || storedblock.Cmp(newblock) < 0:
    		rew = storedblock
    	default:
    		rew = newblock
    	}
    	err := &ConfigCompatError{what, storedblock, newblock, 0}
    	if rew != nil && rew.Sign() > 0 {
    		err.RewindTo = rew.Uint64() - 1
    	}
    	return err
    }
    
    func (err *ConfigCompatError) Error() string {
    	return fmt.Sprintf("mismatching %s in database (have %d, want %d, rewindto %d)", err.What, err.StoredConfig, err.NewConfig, err.RewindTo)
    }
    
    // Rules wraps ChainConfig and is merely syntactic sugar or can be used for functions
    // that do not have or require information about the block.
    //
    // Rules is a one time interface meaning that it shouldn't be used in between transition
    // phases.
    type Rules struct {
    	ChainID                                   *big.Int
    	IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool
    	IsByzantium, IsConstantinople             bool
    }
    
    // Rules ensures c's ChainID is not nil.
    func (c *ChainConfig) Rules(num *big.Int) Rules {
    	chainID := c.ChainID
    	if chainID == nil {
    		chainID = new(big.Int)
    	}
    	return Rules{
    		ChainID:          new(big.Int).Set(chainID),
    		IsHomestead:      c.IsHomestead(num),
    		IsEIP150:         c.IsEIP150(num),
    		IsEIP155:         c.IsEIP155(num),
    		IsEIP158:         c.IsEIP158(num),
    		IsByzantium:      c.IsByzantium(num),
    		IsConstantinople: c.IsConstantinople(num),
    	}
    }