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