github.com/ccm-chain/ccmchain@v1.0.0/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/ccm-chain/ccmchain/common"
    29  	"github.com/ccm-chain/ccmchain/common/hexutil"
    30  	"github.com/ccm-chain/ccmchain/common/math"
    31  	"github.com/ccm-chain/ccmchain/core/rawdb"
    32  	"github.com/ccm-chain/ccmchain/core/state"
    33  	"github.com/ccm-chain/ccmchain/core/types"
    34  	"github.com/ccm-chain/ccmchain/crypto"
    35  	"github.com/ccm-chain/ccmchain/database"
    36  	"github.com/ccm-chain/ccmchain/log"
    37  	"github.com/ccm-chain/ccmchain/params"
    38  	"github.com/ccm-chain/ccmchain/rlp"
    39  	"github.com/ccm-chain/ccmchain/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  }
    66  
    67  // GenesisAlloc specifies the initial state that is part of the genesis block.
    68  type GenesisAlloc map[common.Address]GenesisAccount
    69  
    70  func (ga *GenesisAlloc) UnmarshalJSON(data []byte) error {
    71  	m := make(map[common.UnprefixedAddress]GenesisAccount)
    72  	if err := json.Unmarshal(data, &m); err != nil {
    73  		return err
    74  	}
    75  	*ga = make(GenesisAlloc)
    76  	for addr, a := range m {
    77  		(*ga)[common.Address(addr)] = a
    78  	}
    79  	return nil
    80  }
    81  
    82  // GenesisAccount is an account in the state of the genesis block.
    83  type GenesisAccount struct {
    84  	Code       []byte                      `json:"code,omitempty"`
    85  	Storage    map[common.Hash]common.Hash `json:"storage,omitempty"`
    86  	Balance    *big.Int                    `json:"balance" gencodec:"required"`
    87  	Nonce      uint64                      `json:"nonce,omitempty"`
    88  	PrivateKey []byte                      `json:"secretKey,omitempty"` // for tests
    89  }
    90  
    91  // field type overrides for gencodec
    92  type genesisSpecMarshaling struct {
    93  	Nonce      math.HexOrDecimal64
    94  	Timestamp  math.HexOrDecimal64
    95  	ExtraData  hexutil.Bytes
    96  	GasLimit   math.HexOrDecimal64
    97  	GasUsed    math.HexOrDecimal64
    98  	Number     math.HexOrDecimal64
    99  	Difficulty *math.HexOrDecimal256
   100  	Alloc      map[common.UnprefixedAddress]GenesisAccount
   101  }
   102  
   103  type genesisAccountMarshaling struct {
   104  	Code       hexutil.Bytes
   105  	Balance    *math.HexOrDecimal256
   106  	Nonce      math.HexOrDecimal64
   107  	Storage    map[storageJSON]storageJSON
   108  	PrivateKey hexutil.Bytes
   109  }
   110  
   111  // storageJSON represents a 256 bit byte array, but allows less than 256 bits when
   112  // unmarshaling from hex.
   113  type storageJSON common.Hash
   114  
   115  func (h *storageJSON) UnmarshalText(text []byte) error {
   116  	text = bytes.TrimPrefix(text, []byte("0x"))
   117  	if len(text) > 64 {
   118  		return fmt.Errorf("too many hex characters in storage key/value %q", text)
   119  	}
   120  	offset := len(h) - len(text)/2 // pad on the left
   121  	if _, err := hex.Decode(h[offset:], text); err != nil {
   122  		fmt.Println(err)
   123  		return fmt.Errorf("invalid hex storage key/value %q", text)
   124  	}
   125  	return nil
   126  }
   127  
   128  func (h storageJSON) MarshalText() ([]byte, error) {
   129  	return hexutil.Bytes(h[:]).MarshalText()
   130  }
   131  
   132  // GenesisMismatchError is raised when trying to overwrite an existing
   133  // genesis block with an incompatible one.
   134  type GenesisMismatchError struct {
   135  	Stored, New common.Hash
   136  }
   137  
   138  func (e *GenesisMismatchError) Error() string {
   139  	return fmt.Sprintf("database contains incompatible genesis (have %x, new %x)", e.Stored, e.New)
   140  }
   141  
   142  // SetupGenesisBlock writes or updates the genesis block in db.
   143  // The block that will be used is:
   144  //
   145  //                          genesis == nil       genesis != nil
   146  //                       +------------------------------------------
   147  //     db has no genesis |  main-net default  |  genesis
   148  //     db has genesis    |  from DB           |  genesis (if compatible)
   149  //
   150  // The stored chain configuration will be updated if it is compatible (i.e. does not
   151  // specify a fork block below the local head block). In case of a conflict, the
   152  // error is a *params.ConfigCompatError and the new, unwritten config is returned.
   153  //
   154  // The returned chain configuration is never nil.
   155  func SetupGenesisBlock(db database.Database, genesis *Genesis) (*params.ChainConfig, common.Hash, error) {
   156  	return SetupGenesisBlockWithOverride(db, genesis)
   157  }
   158  
   159  func SetupGenesisBlockWithOverride(db database.Database, genesis *Genesis) (*params.ChainConfig, common.Hash, error) {
   160  	if genesis != nil && genesis.Config == nil {
   161  		return params.AllEthashProtocolChanges, common.Hash{}, errGenesisNoConfig
   162  	}
   163  	// Just commit the new block if there is no stored genesis block.
   164  	stored := rawdb.ReadCanonicalHash(db, 0)
   165  	if (stored == common.Hash{}) {
   166  		if genesis == nil {
   167  			log.Info("Writing default main-net genesis block")
   168  			genesis = DefaultGenesisBlock()
   169  		} else {
   170  			log.Info("Writing custom genesis block")
   171  		}
   172  		block, err := genesis.Commit(db)
   173  		if err != nil {
   174  			return genesis.Config, common.Hash{}, err
   175  		}
   176  		return genesis.Config, block.Hash(), nil
   177  	}
   178  
   179  	// We have the genesis block in database(perhaps in ancient database)
   180  	// but the corresponding state is missing.
   181  	header := rawdb.ReadHeader(db, stored, 0)
   182  	if _, err := state.New(header.Root, state.NewDatabaseWithCache(db, 0, ""), nil); err != nil {
   183  		if genesis == nil {
   184  			genesis = DefaultGenesisBlock()
   185  		}
   186  		// Ensure the stored genesis matches with the given one.
   187  		hash := genesis.ToBlock(nil).Hash()
   188  		if hash != stored {
   189  			return genesis.Config, hash, &GenesisMismatchError{stored, hash}
   190  		}
   191  		block, err := genesis.Commit(db)
   192  		if err != nil {
   193  			return genesis.Config, hash, err
   194  		}
   195  		return genesis.Config, block.Hash(), nil
   196  	}
   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  
   206  	// Get the existing chain configuration.
   207  	newcfg := genesis.configOrDefault(stored)
   208  	storedcfg := rawdb.ReadChainConfig(db, stored)
   209  	if storedcfg == nil {
   210  		log.Warn("Found genesis block without chain config")
   211  		rawdb.WriteChainConfig(db, stored, newcfg)
   212  		return newcfg, stored, nil
   213  	}
   214  	// Special case: don't change the existing config of a non-mainnet chain if no new
   215  	// config is supplied. These chains would get AllProtocolChanges (and a compat error)
   216  	// if we just continued here.
   217  	if genesis == nil && stored != params.MainnetGenesisHash {
   218  		return storedcfg, stored, nil
   219  	}
   220  
   221  	// Check config compatibility and write the config. Compatibility errors
   222  	// are returned to the caller unless we're already at block zero.
   223  	height := rawdb.ReadHeaderNumber(db, rawdb.ReadHeadHeaderHash(db))
   224  	if height == nil {
   225  		return newcfg, stored, fmt.Errorf("missing block number for head header hash")
   226  	}
   227  	compatErr := storedcfg.CheckCompatible(newcfg, *height)
   228  	if compatErr != nil && *height != 0 && compatErr.RewindTo != 0 {
   229  		return newcfg, stored, compatErr
   230  	}
   231  	rawdb.WriteChainConfig(db, stored, newcfg)
   232  	return newcfg, stored, nil
   233  }
   234  
   235  func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig {
   236  	switch {
   237  	case g != nil:
   238  		return g.Config
   239  	case ghash == params.MainnetGenesisHash:
   240  		return params.MainnetChainConfig
   241  	case ghash == params.TestnetGenesisHash:
   242  		return params.TestnetChainConfig
   243  	default:
   244  		return params.AllEthashProtocolChanges
   245  	}
   246  }
   247  
   248  // ToBlock creates the genesis block and writes state of a genesis specification
   249  // to the given database (or discards it if nil).
   250  func (g *Genesis) ToBlock(db database.Database) *types.Block {
   251  	if db == nil {
   252  		db = rawdb.NewMemoryDatabase()
   253  	}
   254  	statedb, _ := state.New(common.Hash{}, state.NewDatabase(db), nil)
   255  	for addr, account := range g.Alloc {
   256  		statedb.AddBalance(addr, account.Balance)
   257  		statedb.SetCode(addr, account.Code)
   258  		statedb.SetNonce(addr, account.Nonce)
   259  		for key, value := range account.Storage {
   260  			statedb.SetState(addr, key, value)
   261  		}
   262  	}
   263  	root := statedb.IntermediateRoot(false)
   264  	head := &types.Header{
   265  		Number:     new(big.Int).SetUint64(g.Number),
   266  		Nonce:      types.EncodeNonce(g.Nonce),
   267  		Time:       g.Timestamp,
   268  		ParentHash: g.ParentHash,
   269  		Extra:      g.ExtraData,
   270  		GasLimit:   g.GasLimit,
   271  		GasUsed:    g.GasUsed,
   272  		Difficulty: g.Difficulty,
   273  		MixDigest:  g.Mixhash,
   274  		Coinbase:   g.Coinbase,
   275  		Root:       root,
   276  	}
   277  	if g.GasLimit == 0 {
   278  		head.GasLimit = params.GenesisGasLimit
   279  	}
   280  	if g.Difficulty == nil {
   281  		head.Difficulty = params.GenesisDifficulty
   282  	}
   283  	statedb.Commit(false)
   284  	statedb.Database().TrieDB().Commit(root, true, nil)
   285  
   286  	return types.NewBlock(head, nil, nil, nil, new(trie.Trie))
   287  }
   288  
   289  // Commit writes the block and state of a genesis specification to the database.
   290  // The block is committed as the canonical head block.
   291  func (g *Genesis) Commit(db database.Database) (*types.Block, error) {
   292  	block := g.ToBlock(db)
   293  	if block.Number().Sign() != 0 {
   294  		return nil, fmt.Errorf("can't commit genesis block with number > 0")
   295  	}
   296  	config := g.Config
   297  	if config == nil {
   298  		config = params.AllEthashProtocolChanges
   299  	}
   300  	rawdb.WriteTd(db, block.Hash(), block.NumberU64(), g.Difficulty)
   301  	rawdb.WriteBlock(db, block)
   302  	rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), nil)
   303  	rawdb.WriteCanonicalHash(db, block.Hash(), block.NumberU64())
   304  	rawdb.WriteHeadBlockHash(db, block.Hash())
   305  	rawdb.WriteHeadFastBlockHash(db, block.Hash())
   306  	rawdb.WriteHeadHeaderHash(db, block.Hash())
   307  	rawdb.WriteChainConfig(db, block.Hash(), config)
   308  	return block, nil
   309  }
   310  
   311  // MustCommit writes the genesis block and state to db, panicking on error.
   312  // The block is committed as the canonical head block.
   313  func (g *Genesis) MustCommit(db database.Database) *types.Block {
   314  	block, err := g.Commit(db)
   315  	if err != nil {
   316  		panic(err)
   317  	}
   318  	return block
   319  }
   320  
   321  // GenesisBlockForTesting creates and writes a block in which addr has the given wei balance.
   322  func GenesisBlockForTesting(db database.Database, addr common.Address, balance *big.Int) *types.Block {
   323  	g := Genesis{Alloc: GenesisAlloc{addr: {Balance: balance}}}
   324  	return g.MustCommit(db)
   325  }
   326  
   327  // DefaultGenesisBlock returns the Ethereum main net genesis block.
   328  func DefaultGenesisBlock() *Genesis {
   329  	return &Genesis{
   330  		Config:     params.MainnetChainConfig,
   331  		Nonce:      66,
   332  		ExtraData:  hexutil.MustDecode("0x"),
   333  		GasLimit:   3141592,
   334  		Difficulty: big.NewInt(1051072),
   335  		Alloc:      decodePrealloc(mainnetAllocData),
   336  	}
   337  }
   338  
   339  // DefaultTestnetGenesisBlock returns the Ropsten network genesis block.
   340  func DefaultTestnetGenesisBlock() *Genesis {
   341  	return &Genesis{
   342  		Config:     params.TestnetChainConfig,
   343  		Nonce:      66,
   344  		ExtraData:  hexutil.MustDecode("0x3535353535353535353535353535353535353535353535353535353535353535"),
   345  		GasLimit:   16777216,
   346  		Difficulty: big.NewInt(1048576),
   347  		Alloc:      decodePrealloc(testnetAllocData),
   348  	}
   349  }
   350  
   351  // DeveloperGenesisBlock returns the 'geth --dev' genesis block.
   352  func DeveloperGenesisBlock(period uint64, faucet common.Address) *Genesis {
   353  	// Override the default period to the user requested one
   354  	config := *params.AllCliqueProtocolChanges
   355  	config.Clique.Period = period
   356  
   357  	// Assemble and return the genesis with the precompiles and faucet pre-funded
   358  	return &Genesis{
   359  		Config:     &config,
   360  		ExtraData:  append(append(make([]byte, 32), faucet[:]...), make([]byte, crypto.SignatureLength)...),
   361  		GasLimit:   11500000,
   362  		Difficulty: big.NewInt(1),
   363  		Alloc: map[common.Address]GenesisAccount{
   364  			common.BytesToAddress([]byte{1}): {Balance: big.NewInt(1)}, // ECRecover
   365  			common.BytesToAddress([]byte{2}): {Balance: big.NewInt(1)}, // SHA256
   366  			common.BytesToAddress([]byte{3}): {Balance: big.NewInt(1)}, // RIPEMD
   367  			common.BytesToAddress([]byte{4}): {Balance: big.NewInt(1)}, // Identity
   368  			common.BytesToAddress([]byte{5}): {Balance: big.NewInt(1)}, // ModExp
   369  			common.BytesToAddress([]byte{6}): {Balance: big.NewInt(1)}, // ECAdd
   370  			common.BytesToAddress([]byte{7}): {Balance: big.NewInt(1)}, // ECScalarMul
   371  			common.BytesToAddress([]byte{8}): {Balance: big.NewInt(1)}, // ECPairing
   372  			common.BytesToAddress([]byte{9}): {Balance: big.NewInt(1)}, // BLAKE2b
   373  			faucet:                           {Balance: new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(9))},
   374  		},
   375  	}
   376  }
   377  
   378  func decodePrealloc(data string) GenesisAlloc {
   379  	var p []struct{ Addr, Balance *big.Int }
   380  	if err := rlp.NewStream(strings.NewReader(data), 0).Decode(&p); err != nil {
   381  		panic(err)
   382  	}
   383  	ga := make(GenesisAlloc, len(p))
   384  	for _, account := range p {
   385  		ga[common.BigToAddress(account.Addr)] = GenesisAccount{Balance: account.Balance}
   386  	}
   387  	return ga
   388  }