github.com/Consensys/quorum@v21.1.0+incompatible/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/ethereum/go-ethereum/common"
    29  	"github.com/ethereum/go-ethereum/common/hexutil"
    30  	"github.com/ethereum/go-ethereum/common/math"
    31  	"github.com/ethereum/go-ethereum/core/rawdb"
    32  	"github.com/ethereum/go-ethereum/core/state"
    33  	"github.com/ethereum/go-ethereum/core/types"
    34  	"github.com/ethereum/go-ethereum/crypto"
    35  	"github.com/ethereum/go-ethereum/ethdb"
    36  	"github.com/ethereum/go-ethereum/log"
    37  	"github.com/ethereum/go-ethereum/params"
    38  	"github.com/ethereum/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)
   156  }
   157  
   158  func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, overrideIstanbul *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  
   172  		// Quorum: Set default transaction size limit if not set in genesis
   173  		if genesis.Config.TransactionSizeLimit == 0 {
   174  			genesis.Config.TransactionSizeLimit = DefaultTxPoolConfig.TransactionSizeLimit
   175  		}
   176  
   177  		// Check transaction size limit and max contract code size
   178  		err := genesis.Config.IsValid()
   179  		if err != nil {
   180  			return genesis.Config, common.Hash{}, err
   181  		}
   182  
   183  		// /Quorum
   184  
   185  		block, err := genesis.Commit(db)
   186  		if err != nil {
   187  			return genesis.Config, common.Hash{}, err
   188  		}
   189  		checkAndPrintPrivacyEnhancementsWarning(genesis.Config)
   190  		return genesis.Config, block.Hash(), nil
   191  	}
   192  
   193  	// We have the genesis block in database(perhaps in ancient database)
   194  	// but the corresponding state is missing.
   195  	header := rawdb.ReadHeader(db, stored, 0)
   196  	if _, err := state.New(header.Root, state.NewDatabaseWithCache(db, 0)); err != nil {
   197  		if genesis == nil {
   198  			genesis = DefaultGenesisBlock()
   199  		}
   200  		// Ensure the stored genesis matches with the given one.
   201  		hash := genesis.ToBlock(nil).Hash()
   202  		if hash != stored {
   203  			return genesis.Config, hash, &GenesisMismatchError{stored, hash}
   204  		}
   205  		block, err := genesis.Commit(db)
   206  		if err != nil {
   207  			return genesis.Config, hash, err
   208  		}
   209  		return genesis.Config, block.Hash(), nil
   210  	}
   211  
   212  	// Check whether the genesis block is already written.
   213  	if genesis != nil {
   214  		hash := genesis.ToBlock(nil).Hash()
   215  		if hash != stored {
   216  			return genesis.Config, hash, &GenesisMismatchError{stored, hash}
   217  		}
   218  	}
   219  
   220  	// Get the existing chain configuration.
   221  	newcfg := genesis.configOrDefault(stored)
   222  	if overrideIstanbul != nil {
   223  		newcfg.IstanbulBlock = overrideIstanbul
   224  	}
   225  	if err := newcfg.CheckConfigForkOrder(); err != nil {
   226  		return newcfg, common.Hash{}, err
   227  	}
   228  	storedcfg := rawdb.ReadChainConfig(db, stored)
   229  	if storedcfg == nil {
   230  		log.Warn("Found genesis block without chain config")
   231  		rawdb.WriteChainConfig(db, stored, newcfg)
   232  		checkAndPrintPrivacyEnhancementsWarning(newcfg)
   233  		return newcfg, stored, nil
   234  	}
   235  	// Special case: don't change the existing config of a non-mainnet chain if no new
   236  	// config is supplied. These chains would get AllProtocolChanges (and a compat error)
   237  	// if we just continued here.
   238  	if genesis == nil && stored != params.MainnetGenesisHash {
   239  		return storedcfg, stored, nil
   240  	}
   241  
   242  	// Check config compatibility and write the config. Compatibility errors
   243  	// are returned to the caller unless we're already at block zero.
   244  	height := rawdb.ReadHeaderNumber(db, rawdb.ReadHeadHeaderHash(db))
   245  	if height == nil {
   246  		return newcfg, stored, fmt.Errorf("missing block number for head header hash")
   247  	}
   248  	compatErr := storedcfg.CheckCompatible(newcfg, *height, rawdb.GetIsQuorumEIP155Activated(db))
   249  	if compatErr != nil && *height != 0 && compatErr.RewindTo != 0 {
   250  		return newcfg, stored, compatErr
   251  	}
   252  	rawdb.WriteChainConfig(db, stored, newcfg)
   253  	if storedcfg.PrivacyEnhancementsBlock == nil {
   254  		checkAndPrintPrivacyEnhancementsWarning(newcfg)
   255  	}
   256  	return newcfg, stored, nil
   257  }
   258  
   259  func checkAndPrintPrivacyEnhancementsWarning(config *params.ChainConfig) {
   260  	if config.PrivacyEnhancementsBlock != nil {
   261  		log.Warn("Privacy enhancements have been enabled from block height " + config.PrivacyEnhancementsBlock.String() +
   262  			". Please ensure your privacy manager is upgraded and supports privacy enhancements (tessera version 1.*) " +
   263  			"otherwise your quorum node will fail to start.")
   264  	}
   265  }
   266  
   267  func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig {
   268  	switch {
   269  	case g != nil:
   270  		return g.Config
   271  	case ghash == params.MainnetGenesisHash:
   272  		return params.MainnetChainConfig
   273  	case ghash == params.TestnetGenesisHash:
   274  		return params.TestnetChainConfig
   275  	default:
   276  		return params.AllEthashProtocolChanges
   277  	}
   278  }
   279  
   280  // ToBlock creates the genesis block and writes state of a genesis specification
   281  // to the given database (or discards it if nil).
   282  func (g *Genesis) ToBlock(db ethdb.Database) *types.Block {
   283  	if db == nil {
   284  		db = rawdb.NewMemoryDatabase()
   285  	}
   286  	statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
   287  	for addr, account := range g.Alloc {
   288  		statedb.AddBalance(addr, account.Balance)
   289  		statedb.SetCode(addr, account.Code)
   290  		statedb.SetNonce(addr, account.Nonce)
   291  		for key, value := range account.Storage {
   292  			statedb.SetState(addr, key, value)
   293  		}
   294  	}
   295  	root := statedb.IntermediateRoot(false)
   296  	head := &types.Header{
   297  		Number:     new(big.Int).SetUint64(g.Number),
   298  		Nonce:      types.EncodeNonce(g.Nonce),
   299  		Time:       g.Timestamp,
   300  		ParentHash: g.ParentHash,
   301  		Extra:      g.ExtraData,
   302  		GasLimit:   g.GasLimit,
   303  		GasUsed:    g.GasUsed,
   304  		Difficulty: g.Difficulty,
   305  		MixDigest:  g.Mixhash,
   306  		Coinbase:   g.Coinbase,
   307  		Root:       root,
   308  	}
   309  	if g.GasLimit == 0 {
   310  		head.GasLimit = params.GenesisGasLimit
   311  	}
   312  	if g.Difficulty == nil {
   313  		head.Difficulty = params.GenesisDifficulty
   314  	}
   315  	statedb.Commit(false)
   316  	statedb.Database().TrieDB().Commit(root, true)
   317  
   318  	return types.NewBlock(head, nil, nil, nil)
   319  }
   320  
   321  // Commit writes the block and state of a genesis specification to the database.
   322  // The block is committed as the canonical head block.
   323  func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) {
   324  	block := g.ToBlock(db)
   325  	if block.Number().Sign() != 0 {
   326  		return nil, fmt.Errorf("can't commit genesis block with number > 0")
   327  	}
   328  	config := g.Config
   329  	if config == nil {
   330  		config = params.AllEthashProtocolChanges
   331  	}
   332  	if err := config.CheckConfigForkOrder(); err != nil {
   333  		return nil, err
   334  	}
   335  	rawdb.WriteTd(db, block.Hash(), block.NumberU64(), g.Difficulty)
   336  	rawdb.WriteBlock(db, block)
   337  	rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), nil)
   338  	rawdb.WriteCanonicalHash(db, block.Hash(), block.NumberU64())
   339  	rawdb.WriteHeadBlockHash(db, block.Hash())
   340  	rawdb.WriteHeadFastBlockHash(db, block.Hash())
   341  	rawdb.WriteHeadHeaderHash(db, block.Hash())
   342  	rawdb.WriteChainConfig(db, block.Hash(), config)
   343  	return block, nil
   344  }
   345  
   346  // MustCommit writes the genesis block and state to db, panicking on error.
   347  // The block is committed as the canonical head block.
   348  func (g *Genesis) MustCommit(db ethdb.Database) *types.Block {
   349  	block, err := g.Commit(db)
   350  	if err != nil {
   351  		panic(err)
   352  	}
   353  	return block
   354  }
   355  
   356  // GenesisBlockForTesting creates and writes a block in which addr has the given wei balance.
   357  func GenesisBlockForTesting(db ethdb.Database, addr common.Address, balance *big.Int) *types.Block {
   358  	g := Genesis{Alloc: GenesisAlloc{addr: {Balance: balance}}}
   359  	return g.MustCommit(db)
   360  }
   361  
   362  // DefaultGenesisBlock returns the Ethereum main net genesis block.
   363  func DefaultGenesisBlock() *Genesis {
   364  	return &Genesis{
   365  		Config:     params.MainnetChainConfig,
   366  		Nonce:      66,
   367  		ExtraData:  hexutil.MustDecode("0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa"),
   368  		GasLimit:   5000,
   369  		Difficulty: big.NewInt(17179869184),
   370  		Alloc:      decodePrealloc(mainnetAllocData),
   371  	}
   372  }
   373  
   374  // DefaultTestnetGenesisBlock returns the Ropsten network genesis block.
   375  func DefaultTestnetGenesisBlock() *Genesis {
   376  	return &Genesis{
   377  		Config:     params.TestnetChainConfig,
   378  		Nonce:      66,
   379  		ExtraData:  hexutil.MustDecode("0x3535353535353535353535353535353535353535353535353535353535353535"),
   380  		GasLimit:   16777216,
   381  		Difficulty: big.NewInt(1048576),
   382  		Alloc:      decodePrealloc(testnetAllocData),
   383  	}
   384  }
   385  
   386  // DefaultRinkebyGenesisBlock returns the Rinkeby network genesis block.
   387  func DefaultRinkebyGenesisBlock() *Genesis {
   388  	return &Genesis{
   389  		Config:     params.RinkebyChainConfig,
   390  		Timestamp:  1492009146,
   391  		ExtraData:  hexutil.MustDecode("0x52657370656374206d7920617574686f7269746168207e452e436172746d616e42eb768f2244c8811c63729a21a3569731535f067ffc57839b00206d1ad20c69a1981b489f772031b279182d99e65703f0076e4812653aab85fca0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
   392  		GasLimit:   4700000,
   393  		Difficulty: big.NewInt(1),
   394  		Alloc:      decodePrealloc(rinkebyAllocData),
   395  	}
   396  }
   397  
   398  // DefaultGoerliGenesisBlock returns the Görli network genesis block.
   399  func DefaultGoerliGenesisBlock() *Genesis {
   400  	return &Genesis{
   401  		Config:     params.GoerliChainConfig,
   402  		Timestamp:  1548854791,
   403  		ExtraData:  hexutil.MustDecode("0x22466c6578692069732061207468696e6722202d204166726900000000000000e0a2bd4258d2768837baa26a28fe71dc079f84c70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
   404  		GasLimit:   10485760,
   405  		Difficulty: big.NewInt(1),
   406  		Alloc:      decodePrealloc(goerliAllocData),
   407  	}
   408  }
   409  
   410  // DeveloperGenesisBlock returns the 'geth --dev' genesis block. Note, this must
   411  // be seeded with the
   412  func DeveloperGenesisBlock(period uint64, faucet common.Address) *Genesis {
   413  	// Override the default period to the user requested one
   414  	config := *params.AllCliqueProtocolChanges
   415  	config.Clique.Period = period
   416  
   417  	// Assemble and return the genesis with the precompiles and faucet pre-funded
   418  	return &Genesis{
   419  		Config:     &config,
   420  		ExtraData:  append(append(make([]byte, 32), faucet[:]...), make([]byte, crypto.SignatureLength)...),
   421  		GasLimit:   6283185,
   422  		Difficulty: big.NewInt(1),
   423  		Alloc: map[common.Address]GenesisAccount{
   424  			common.BytesToAddress([]byte{1}): {Balance: big.NewInt(1)}, // ECRecover
   425  			common.BytesToAddress([]byte{2}): {Balance: big.NewInt(1)}, // SHA256
   426  			common.BytesToAddress([]byte{3}): {Balance: big.NewInt(1)}, // RIPEMD
   427  			common.BytesToAddress([]byte{4}): {Balance: big.NewInt(1)}, // Identity
   428  			common.BytesToAddress([]byte{5}): {Balance: big.NewInt(1)}, // ModExp
   429  			common.BytesToAddress([]byte{6}): {Balance: big.NewInt(1)}, // ECAdd
   430  			common.BytesToAddress([]byte{7}): {Balance: big.NewInt(1)}, // ECScalarMul
   431  			common.BytesToAddress([]byte{8}): {Balance: big.NewInt(1)}, // ECPairing
   432  			faucet:                           {Balance: new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(9))},
   433  		},
   434  	}
   435  }
   436  
   437  func decodePrealloc(data string) GenesisAlloc {
   438  	var p []struct{ Addr, Balance *big.Int }
   439  	if err := rlp.NewStream(strings.NewReader(data), 0).Decode(&p); err != nil {
   440  		panic(err)
   441  	}
   442  	ga := make(GenesisAlloc, len(p))
   443  	for _, account := range p {
   444  		ga[common.BigToAddress(account.Addr)] = GenesisAccount{Balance: account.Balance}
   445  	}
   446  	return ga
   447  }