github.com/hardtosaygoodbye/go-ethereum@v1.10.16-0.20220122011429-97003b9e6c15/core/genesis.go (about)

     1  // Copyright 2014 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 core
    18  
    19  import (
    20  	"bytes"
    21  	"encoding/hex"
    22  	"encoding/json"
    23  	"errors"
    24  	"fmt"
    25  	"math/big"
    26  	"strings"
    27  
    28  	"github.com/hardtosaygoodbye/go-ethereum/common"
    29  	"github.com/hardtosaygoodbye/go-ethereum/common/hexutil"
    30  	"github.com/hardtosaygoodbye/go-ethereum/common/math"
    31  	"github.com/hardtosaygoodbye/go-ethereum/core/rawdb"
    32  	"github.com/hardtosaygoodbye/go-ethereum/core/state"
    33  	"github.com/hardtosaygoodbye/go-ethereum/core/types"
    34  	"github.com/hardtosaygoodbye/go-ethereum/crypto"
    35  	"github.com/hardtosaygoodbye/go-ethereum/ethdb"
    36  	"github.com/hardtosaygoodbye/go-ethereum/log"
    37  	"github.com/hardtosaygoodbye/go-ethereum/params"
    38  	"github.com/hardtosaygoodbye/go-ethereum/rlp"
    39  	"github.com/hardtosaygoodbye/go-ethereum/trie"
    40  )
    41  
    42  //go:generate gencodec -type Genesis -field-override genesisSpecMarshaling -out gen_genesis.go
    43  //go:generate gencodec -type GenesisAccount -field-override genesisAccountMarshaling -out gen_genesis_account.go
    44  
    45  var errGenesisNoConfig = errors.New("genesis has no chain configuration")
    46  
    47  // Genesis specifies the header fields, state of a genesis block. It also defines hard
    48  // fork switch-over blocks through the chain configuration.
    49  type Genesis struct {
    50  	Config     *params.ChainConfig `json:"config"`
    51  	Nonce      uint64              `json:"nonce"`
    52  	Timestamp  uint64              `json:"timestamp"`
    53  	ExtraData  []byte              `json:"extraData"`
    54  	GasLimit   uint64              `json:"gasLimit"   gencodec:"required"`
    55  	Difficulty *big.Int            `json:"difficulty" gencodec:"required"`
    56  	Mixhash    common.Hash         `json:"mixHash"`
    57  	Coinbase   common.Address      `json:"coinbase"`
    58  	Alloc      GenesisAlloc        `json:"alloc"      gencodec:"required"`
    59  
    60  	// These fields are used for consensus tests. Please don't use them
    61  	// in actual genesis blocks.
    62  	Number     uint64      `json:"number"`
    63  	GasUsed    uint64      `json:"gasUsed"`
    64  	ParentHash common.Hash `json:"parentHash"`
    65  	BaseFee    *big.Int    `json:"baseFeePerGas"`
    66  }
    67  
    68  // GenesisAlloc specifies the initial state that is part of the genesis block.
    69  type GenesisAlloc map[common.Address]GenesisAccount
    70  
    71  func (ga *GenesisAlloc) UnmarshalJSON(data []byte) error {
    72  	m := make(map[common.UnprefixedAddress]GenesisAccount)
    73  	if err := json.Unmarshal(data, &m); err != nil {
    74  		return err
    75  	}
    76  	*ga = make(GenesisAlloc)
    77  	for addr, a := range m {
    78  		(*ga)[common.Address(addr)] = a
    79  	}
    80  	return nil
    81  }
    82  
    83  // GenesisAccount is an account in the state of the genesis block.
    84  type GenesisAccount struct {
    85  	Code       []byte                      `json:"code,omitempty"`
    86  	Storage    map[common.Hash]common.Hash `json:"storage,omitempty"`
    87  	Balance    *big.Int                    `json:"balance" gencodec:"required"`
    88  	Nonce      uint64                      `json:"nonce,omitempty"`
    89  	PrivateKey []byte                      `json:"secretKey,omitempty"` // for tests
    90  }
    91  
    92  // field type overrides for gencodec
    93  type genesisSpecMarshaling struct {
    94  	Nonce      math.HexOrDecimal64
    95  	Timestamp  math.HexOrDecimal64
    96  	ExtraData  hexutil.Bytes
    97  	GasLimit   math.HexOrDecimal64
    98  	GasUsed    math.HexOrDecimal64
    99  	Number     math.HexOrDecimal64
   100  	Difficulty *math.HexOrDecimal256
   101  	BaseFee    *math.HexOrDecimal256
   102  	Alloc      map[common.UnprefixedAddress]GenesisAccount
   103  }
   104  
   105  type genesisAccountMarshaling struct {
   106  	Code       hexutil.Bytes
   107  	Balance    *math.HexOrDecimal256
   108  	Nonce      math.HexOrDecimal64
   109  	Storage    map[storageJSON]storageJSON
   110  	PrivateKey hexutil.Bytes
   111  }
   112  
   113  // storageJSON represents a 256 bit byte array, but allows less than 256 bits when
   114  // unmarshaling from hex.
   115  type storageJSON common.Hash
   116  
   117  func (h *storageJSON) UnmarshalText(text []byte) error {
   118  	text = bytes.TrimPrefix(text, []byte("0x"))
   119  	if len(text) > 64 {
   120  		return fmt.Errorf("too many hex characters in storage key/value %q", text)
   121  	}
   122  	offset := len(h) - len(text)/2 // pad on the left
   123  	if _, err := hex.Decode(h[offset:], text); err != nil {
   124  		fmt.Println(err)
   125  		return fmt.Errorf("invalid hex storage key/value %q", text)
   126  	}
   127  	return nil
   128  }
   129  
   130  func (h storageJSON) MarshalText() ([]byte, error) {
   131  	return hexutil.Bytes(h[:]).MarshalText()
   132  }
   133  
   134  // GenesisMismatchError is raised when trying to overwrite an existing
   135  // genesis block with an incompatible one.
   136  type GenesisMismatchError struct {
   137  	Stored, New common.Hash
   138  }
   139  
   140  func (e *GenesisMismatchError) Error() string {
   141  	return fmt.Sprintf("database contains incompatible genesis (have %x, new %x)", e.Stored, e.New)
   142  }
   143  
   144  // SetupGenesisBlock writes or updates the genesis block in db.
   145  // The block that will be used is:
   146  //
   147  //                          genesis == nil       genesis != nil
   148  //                       +------------------------------------------
   149  //     db has no genesis |  main-net default  |  genesis
   150  //     db has genesis    |  from DB           |  genesis (if compatible)
   151  //
   152  // The stored chain configuration will be updated if it is compatible (i.e. does not
   153  // specify a fork block below the local head block). In case of a conflict, the
   154  // error is a *params.ConfigCompatError and the new, unwritten config is returned.
   155  //
   156  // The returned chain configuration is never nil.
   157  func SetupGenesisBlock(db ethdb.Database, genesis *Genesis) (*params.ChainConfig, common.Hash, error) {
   158  	return SetupGenesisBlockWithOverride(db, genesis, nil, nil)
   159  }
   160  
   161  func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, overrideArrowGlacier, overrideTerminalTotalDifficulty *big.Int) (*params.ChainConfig, common.Hash, error) {
   162  	if genesis != nil && genesis.Config == nil {
   163  		return params.AllEthashProtocolChanges, common.Hash{}, errGenesisNoConfig
   164  	}
   165  	// Just commit the new block if there is no stored genesis block.
   166  	stored := rawdb.ReadCanonicalHash(db, 0)
   167  	if (stored == common.Hash{}) {
   168  		if genesis == nil {
   169  			log.Info("Writing default main-net genesis block")
   170  			genesis = DefaultGenesisBlock()
   171  		} else {
   172  			log.Info("Writing custom genesis block")
   173  		}
   174  		block, err := genesis.Commit(db)
   175  		if err != nil {
   176  			return genesis.Config, common.Hash{}, err
   177  		}
   178  		return genesis.Config, block.Hash(), nil
   179  	}
   180  	// We have the genesis block in database(perhaps in ancient database)
   181  	// but the corresponding state is missing.
   182  	header := rawdb.ReadHeader(db, stored, 0)
   183  	if _, err := state.New(header.Root, state.NewDatabaseWithConfig(db, nil), nil); err != nil {
   184  		if genesis == nil {
   185  			genesis = DefaultGenesisBlock()
   186  		}
   187  		// Ensure the stored genesis matches with the given one.
   188  		hash := genesis.ToBlock(nil).Hash()
   189  		if hash != stored {
   190  			return genesis.Config, hash, &GenesisMismatchError{stored, hash}
   191  		}
   192  		block, err := genesis.Commit(db)
   193  		if err != nil {
   194  			return genesis.Config, hash, err
   195  		}
   196  		return genesis.Config, block.Hash(), nil
   197  	}
   198  	// Check whether the genesis block is already written.
   199  	if genesis != nil {
   200  		hash := genesis.ToBlock(nil).Hash()
   201  		if hash != stored {
   202  			return genesis.Config, hash, &GenesisMismatchError{stored, hash}
   203  		}
   204  	}
   205  	// Get the existing chain configuration.
   206  	newcfg := genesis.configOrDefault(stored)
   207  	if overrideArrowGlacier != nil {
   208  		newcfg.ArrowGlacierBlock = overrideArrowGlacier
   209  	}
   210  	if overrideTerminalTotalDifficulty != nil {
   211  		newcfg.TerminalTotalDifficulty = overrideTerminalTotalDifficulty
   212  	}
   213  	if err := newcfg.CheckConfigForkOrder(); err != nil {
   214  		return newcfg, common.Hash{}, err
   215  	}
   216  	storedcfg := rawdb.ReadChainConfig(db, stored)
   217  	if storedcfg == nil {
   218  		log.Warn("Found genesis block without chain config")
   219  		rawdb.WriteChainConfig(db, stored, newcfg)
   220  		return newcfg, stored, nil
   221  	}
   222  	// Special case: don't change the existing config of a non-mainnet chain if no new
   223  	// config is supplied. These chains would get AllProtocolChanges (and a compat error)
   224  	// if we just continued here.
   225  	if genesis == nil && stored != params.MainnetGenesisHash {
   226  		return storedcfg, stored, nil
   227  	}
   228  	// Check config compatibility and write the config. Compatibility errors
   229  	// are returned to the caller unless we're already at block zero.
   230  	height := rawdb.ReadHeaderNumber(db, rawdb.ReadHeadHeaderHash(db))
   231  	if height == nil {
   232  		return newcfg, stored, fmt.Errorf("missing block number for head header hash")
   233  	}
   234  	compatErr := storedcfg.CheckCompatible(newcfg, *height)
   235  	if compatErr != nil && *height != 0 && compatErr.RewindTo != 0 {
   236  		return newcfg, stored, compatErr
   237  	}
   238  	rawdb.WriteChainConfig(db, stored, newcfg)
   239  	return newcfg, stored, nil
   240  }
   241  
   242  func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig {
   243  	switch {
   244  	case g != nil:
   245  		return g.Config
   246  	case ghash == params.MainnetGenesisHash:
   247  		return params.MainnetChainConfig
   248  	case ghash == params.RopstenGenesisHash:
   249  		return params.RopstenChainConfig
   250  	case ghash == params.SepoliaGenesisHash:
   251  		return params.SepoliaChainConfig
   252  	case ghash == params.RinkebyGenesisHash:
   253  		return params.RinkebyChainConfig
   254  	case ghash == params.GoerliGenesisHash:
   255  		return params.GoerliChainConfig
   256  	default:
   257  		return params.AllEthashProtocolChanges
   258  	}
   259  }
   260  
   261  // ToBlock creates the genesis block and writes state of a genesis specification
   262  // to the given database (or discards it if nil).
   263  func (g *Genesis) ToBlock(db ethdb.Database) *types.Block {
   264  	if db == nil {
   265  		db = rawdb.NewMemoryDatabase()
   266  	}
   267  	statedb, err := state.New(common.Hash{}, state.NewDatabase(db), nil)
   268  	if err != nil {
   269  		panic(err)
   270  	}
   271  	for addr, account := range g.Alloc {
   272  		statedb.AddBalance(addr, account.Balance)
   273  		statedb.SetCode(addr, account.Code)
   274  		statedb.SetNonce(addr, account.Nonce)
   275  		for key, value := range account.Storage {
   276  			statedb.SetState(addr, key, value)
   277  		}
   278  	}
   279  	root := statedb.IntermediateRoot(false)
   280  	head := &types.Header{
   281  		Number:     new(big.Int).SetUint64(g.Number),
   282  		Nonce:      types.EncodeNonce(g.Nonce),
   283  		Time:       g.Timestamp,
   284  		ParentHash: g.ParentHash,
   285  		Extra:      g.ExtraData,
   286  		GasLimit:   g.GasLimit,
   287  		GasUsed:    g.GasUsed,
   288  		BaseFee:    g.BaseFee,
   289  		Difficulty: g.Difficulty,
   290  		MixDigest:  g.Mixhash,
   291  		Coinbase:   g.Coinbase,
   292  		Root:       root,
   293  	}
   294  	if g.GasLimit == 0 {
   295  		head.GasLimit = params.GenesisGasLimit
   296  	}
   297  	if g.Difficulty == nil && g.Mixhash == (common.Hash{}) {
   298  		head.Difficulty = params.GenesisDifficulty
   299  	}
   300  	if g.Config != nil && g.Config.IsLondon(common.Big0) {
   301  		if g.BaseFee != nil {
   302  			head.BaseFee = g.BaseFee
   303  		} else {
   304  			head.BaseFee = new(big.Int).SetUint64(params.InitialBaseFee)
   305  		}
   306  	}
   307  	statedb.Commit(false)
   308  	statedb.Database().TrieDB().Commit(root, true, nil)
   309  
   310  	return types.NewBlock(head, nil, nil, nil, trie.NewStackTrie(nil))
   311  }
   312  
   313  // Commit writes the block and state of a genesis specification to the database.
   314  // The block is committed as the canonical head block.
   315  func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) {
   316  	block := g.ToBlock(db)
   317  	if block.Number().Sign() != 0 {
   318  		return nil, errors.New("can't commit genesis block with number > 0")
   319  	}
   320  	config := g.Config
   321  	if config == nil {
   322  		config = params.AllEthashProtocolChanges
   323  	}
   324  	if err := config.CheckConfigForkOrder(); err != nil {
   325  		return nil, err
   326  	}
   327  	if config.Clique != nil && len(block.Extra()) == 0 {
   328  		return nil, errors.New("can't start clique chain without signers")
   329  	}
   330  	rawdb.WriteTd(db, block.Hash(), block.NumberU64(), block.Difficulty())
   331  	rawdb.WriteBlock(db, block)
   332  	rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), nil)
   333  	rawdb.WriteCanonicalHash(db, block.Hash(), block.NumberU64())
   334  	rawdb.WriteHeadBlockHash(db, block.Hash())
   335  	rawdb.WriteHeadFastBlockHash(db, block.Hash())
   336  	rawdb.WriteHeadHeaderHash(db, block.Hash())
   337  	rawdb.WriteChainConfig(db, block.Hash(), config)
   338  	return block, nil
   339  }
   340  
   341  // MustCommit writes the genesis block and state to db, panicking on error.
   342  // The block is committed as the canonical head block.
   343  func (g *Genesis) MustCommit(db ethdb.Database) *types.Block {
   344  	block, err := g.Commit(db)
   345  	if err != nil {
   346  		panic(err)
   347  	}
   348  	return block
   349  }
   350  
   351  // GenesisBlockForTesting creates and writes a block in which addr has the given wei balance.
   352  func GenesisBlockForTesting(db ethdb.Database, addr common.Address, balance *big.Int) *types.Block {
   353  	g := Genesis{
   354  		Alloc:   GenesisAlloc{addr: {Balance: balance}},
   355  		BaseFee: big.NewInt(params.InitialBaseFee),
   356  	}
   357  	return g.MustCommit(db)
   358  }
   359  
   360  // DefaultGenesisBlock returns the Ethereum main net genesis block.
   361  func DefaultGenesisBlock() *Genesis {
   362  	return &Genesis{
   363  		Config:     params.MainnetChainConfig,
   364  		Nonce:      66,
   365  		ExtraData:  hexutil.MustDecode("0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa"),
   366  		GasLimit:   5000,
   367  		Difficulty: big.NewInt(17179869184),
   368  		Alloc:      decodePrealloc(mainnetAllocData),
   369  	}
   370  }
   371  
   372  // DefaultRopstenGenesisBlock returns the Ropsten network genesis block.
   373  func DefaultRopstenGenesisBlock() *Genesis {
   374  	return &Genesis{
   375  		Config:     params.RopstenChainConfig,
   376  		Nonce:      66,
   377  		ExtraData:  hexutil.MustDecode("0x3535353535353535353535353535353535353535353535353535353535353535"),
   378  		GasLimit:   16777216,
   379  		Difficulty: big.NewInt(1048576),
   380  		Alloc:      decodePrealloc(ropstenAllocData),
   381  	}
   382  }
   383  
   384  // DefaultRinkebyGenesisBlock returns the Rinkeby network genesis block.
   385  func DefaultRinkebyGenesisBlock() *Genesis {
   386  	return &Genesis{
   387  		Config:     params.RinkebyChainConfig,
   388  		Timestamp:  1492009146,
   389  		ExtraData:  hexutil.MustDecode("0x52657370656374206d7920617574686f7269746168207e452e436172746d616e42eb768f2244c8811c63729a21a3569731535f067ffc57839b00206d1ad20c69a1981b489f772031b279182d99e65703f0076e4812653aab85fca0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
   390  		GasLimit:   4700000,
   391  		Difficulty: big.NewInt(1),
   392  		Alloc:      decodePrealloc(rinkebyAllocData),
   393  	}
   394  }
   395  
   396  // DefaultGoerliGenesisBlock returns the Görli network genesis block.
   397  func DefaultGoerliGenesisBlock() *Genesis {
   398  	return &Genesis{
   399  		Config:     params.GoerliChainConfig,
   400  		Timestamp:  1548854791,
   401  		ExtraData:  hexutil.MustDecode("0x22466c6578692069732061207468696e6722202d204166726900000000000000e0a2bd4258d2768837baa26a28fe71dc079f84c70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
   402  		GasLimit:   10485760,
   403  		Difficulty: big.NewInt(1),
   404  		Alloc:      decodePrealloc(goerliAllocData),
   405  	}
   406  }
   407  
   408  // DefaultSepoliaGenesisBlock returns the Sepolia network genesis block.
   409  func DefaultSepoliaGenesisBlock() *Genesis {
   410  	return &Genesis{
   411  		Config:     params.SepoliaChainConfig,
   412  		Nonce:      0,
   413  		ExtraData:  []byte("Sepolia, Athens, Attica, Greece!"),
   414  		GasLimit:   0x1c9c380,
   415  		Difficulty: big.NewInt(0x20000),
   416  		Timestamp:  1633267481,
   417  		Alloc:      decodePrealloc(sepoliaAllocData),
   418  	}
   419  }
   420  
   421  // DeveloperGenesisBlock returns the 'geth --dev' genesis block.
   422  func DeveloperGenesisBlock(period uint64, gasLimit uint64, faucet common.Address) *Genesis {
   423  	// Override the default period to the user requested one
   424  	config := *params.AllCliqueProtocolChanges
   425  	config.Clique = &params.CliqueConfig{
   426  		Period: period,
   427  		Epoch:  config.Clique.Epoch,
   428  	}
   429  
   430  	// Assemble and return the genesis with the precompiles and faucet pre-funded
   431  	return &Genesis{
   432  		Config:     &config,
   433  		ExtraData:  append(append(make([]byte, 32), faucet[:]...), make([]byte, crypto.SignatureLength)...),
   434  		GasLimit:   gasLimit,
   435  		BaseFee:    big.NewInt(params.InitialBaseFee),
   436  		Difficulty: big.NewInt(1),
   437  		Alloc: map[common.Address]GenesisAccount{
   438  			common.BytesToAddress([]byte{1}): {Balance: big.NewInt(1)}, // ECRecover
   439  			common.BytesToAddress([]byte{2}): {Balance: big.NewInt(1)}, // SHA256
   440  			common.BytesToAddress([]byte{3}): {Balance: big.NewInt(1)}, // RIPEMD
   441  			common.BytesToAddress([]byte{4}): {Balance: big.NewInt(1)}, // Identity
   442  			common.BytesToAddress([]byte{5}): {Balance: big.NewInt(1)}, // ModExp
   443  			common.BytesToAddress([]byte{6}): {Balance: big.NewInt(1)}, // ECAdd
   444  			common.BytesToAddress([]byte{7}): {Balance: big.NewInt(1)}, // ECScalarMul
   445  			common.BytesToAddress([]byte{8}): {Balance: big.NewInt(1)}, // ECPairing
   446  			common.BytesToAddress([]byte{9}): {Balance: big.NewInt(1)}, // BLAKE2b
   447  			faucet:                           {Balance: new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(9))},
   448  		},
   449  	}
   450  }
   451  
   452  func decodePrealloc(data string) GenesisAlloc {
   453  	var p []struct{ Addr, Balance *big.Int }
   454  	if err := rlp.NewStream(strings.NewReader(data), 0).Decode(&p); err != nil {
   455  		panic(err)
   456  	}
   457  	ga := make(GenesisAlloc, len(p))
   458  	for _, account := range p {
   459  		ga[common.BigToAddress(account.Addr)] = GenesisAccount{Balance: account.Balance}
   460  	}
   461  	return ga
   462  }