genesis.go 16.4 KB
Newer Older
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 6 7 8
// 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.
//
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 13 14
// GNU Lesser General Public License for more details.
//
// 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

obscuren's avatar
obscuren committed
17
package core
obscuren's avatar
obscuren committed
18 19

import (
20 21 22
	"bytes"
	"encoding/hex"
	"encoding/json"
23
	"errors"
obscuren's avatar
obscuren committed
24
	"fmt"
25
	"math/big"
26
	"strings"
obscuren's avatar
obscuren committed
27

obscuren's avatar
obscuren committed
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"
obscuren's avatar
obscuren committed
32
	"github.com/ethereum/go-ethereum/core/state"
obscuren's avatar
obscuren committed
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
	"github.com/ethereum/go-ethereum/trie"
obscuren's avatar
obscuren committed
40 41
)

42 43
//go:generate gencodec -type Genesis -field-override genesisSpecMarshaling -out gen_genesis.go
//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 48 49
// Genesis specifies the header fields, state of a genesis block. It also defines hard
// fork switch-over blocks through the chain configuration.
type Genesis struct {
50 51 52 53 54 55 56 57 58
	Config     *params.ChainConfig `json:"config"`
	Nonce      uint64              `json:"nonce"`
	Timestamp  uint64              `json:"timestamp"`
	ExtraData  []byte              `json:"extraData"`
	GasLimit   uint64              `json:"gasLimit"   gencodec:"required"`
	Difficulty *big.Int            `json:"difficulty" gencodec:"required"`
	Mixhash    common.Hash         `json:"mixHash"`
	Coinbase   common.Address      `json:"coinbase"`
	Alloc      GenesisAlloc        `json:"alloc"      gencodec:"required"`
59 60 61 62 63 64

	// These fields are used for consensus tests. Please don't use them
	// in actual genesis blocks.
	Number     uint64      `json:"number"`
	GasUsed    uint64      `json:"gasUsed"`
	ParentHash common.Hash `json:"parentHash"`
65
	BaseFee    *big.Int    `json:"baseFeePerGas"`
66 67 68 69 70
}

// GenesisAlloc specifies the initial state that is part of the genesis block.
type GenesisAlloc map[common.Address]GenesisAccount

71 72 73 74 75 76 77 78 79 80 81 82
func (ga *GenesisAlloc) UnmarshalJSON(data []byte) error {
	m := make(map[common.UnprefixedAddress]GenesisAccount)
	if err := json.Unmarshal(data, &m); err != nil {
		return err
	}
	*ga = make(GenesisAlloc)
	for addr, a := range m {
		(*ga)[common.Address(addr)] = a
	}
	return nil
}

83 84
// GenesisAccount is an account in the state of the genesis block.
type GenesisAccount struct {
85 86 87 88 89
	Code       []byte                      `json:"code,omitempty"`
	Storage    map[common.Hash]common.Hash `json:"storage,omitempty"`
	Balance    *big.Int                    `json:"balance" gencodec:"required"`
	Nonce      uint64                      `json:"nonce,omitempty"`
	PrivateKey []byte                      `json:"secretKey,omitempty"` // for tests
90 91 92 93 94 95 96 97
}

// field type overrides for gencodec
type genesisSpecMarshaling struct {
	Nonce      math.HexOrDecimal64
	Timestamp  math.HexOrDecimal64
	ExtraData  hexutil.Bytes
	GasLimit   math.HexOrDecimal64
98
	GasUsed    math.HexOrDecimal64
99
	Number     math.HexOrDecimal64
100
	Difficulty *math.HexOrDecimal256
101
	BaseFee    *math.HexOrDecimal256
102 103
	Alloc      map[common.UnprefixedAddress]GenesisAccount
}
104

105
type genesisAccountMarshaling struct {
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
	Code       hexutil.Bytes
	Balance    *math.HexOrDecimal256
	Nonce      math.HexOrDecimal64
	Storage    map[storageJSON]storageJSON
	PrivateKey hexutil.Bytes
}

// storageJSON represents a 256 bit byte array, but allows less than 256 bits when
// unmarshaling from hex.
type storageJSON common.Hash

func (h *storageJSON) UnmarshalText(text []byte) error {
	text = bytes.TrimPrefix(text, []byte("0x"))
	if len(text) > 64 {
		return fmt.Errorf("too many hex characters in storage key/value %q", text)
	}
	offset := len(h) - len(text)/2 // pad on the left
	if _, err := hex.Decode(h[offset:], text); err != nil {
		fmt.Println(err)
		return fmt.Errorf("invalid hex storage key/value %q", text)
	}
	return nil
}

func (h storageJSON) MarshalText() ([]byte, error) {
	return hexutil.Bytes(h[:]).MarshalText()
132 133 134 135 136 137 138 139 140
}

// GenesisMismatchError is raised when trying to overwrite an existing
// genesis block with an incompatible one.
type GenesisMismatchError struct {
	Stored, New common.Hash
}

func (e *GenesisMismatchError) Error() string {
141
	return fmt.Sprintf("database contains incompatible genesis (have %x, new %x)", e.Stored, e.New)
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
}

// SetupGenesisBlock writes or updates the genesis block in db.
// The block that will be used is:
//
//                          genesis == nil       genesis != nil
//                       +------------------------------------------
//     db has no genesis |  main-net default  |  genesis
//     db has genesis    |  from DB           |  genesis (if compatible)
//
// The stored chain configuration will be updated if it is compatible (i.e. does not
// specify a fork block below the local head block). In case of a conflict, the
// error is a *params.ConfigCompatError and the new, unwritten config is returned.
//
// The returned chain configuration is never nil.
func SetupGenesisBlock(db ethdb.Database, genesis *Genesis) (*params.ChainConfig, common.Hash, error) {
158 159 160
	return SetupGenesisBlockWithOverride(db, genesis, nil)
}

161
func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, overrideArrowGlacier *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 168 169 170 171 172
	if (stored == common.Hash{}) {
		if genesis == nil {
			log.Info("Writing default main-net genesis block")
			genesis = DefaultGenesisBlock()
		} else {
			log.Info("Writing custom genesis block")
173
		}
174
		block, err := genesis.Commit(db)
175 176 177 178
		if err != nil {
			return genesis.Config, common.Hash{}, err
		}
		return genesis.Config, block.Hash(), nil
179
	}
180 181 182
	// We have the genesis block in database(perhaps in ancient database)
	// but the corresponding state is missing.
	header := rawdb.ReadHeader(db, stored, 0)
183
	if _, err := state.New(header.Root, state.NewDatabaseWithConfig(db, nil), nil); err != nil {
184 185 186 187 188 189 190 191 192
		if genesis == nil {
			genesis = DefaultGenesisBlock()
		}
		// Ensure the stored genesis matches with the given one.
		hash := genesis.ToBlock(nil).Hash()
		if hash != stored {
			return genesis.Config, hash, &GenesisMismatchError{stored, hash}
		}
		block, err := genesis.Commit(db)
193 194 195 196
		if err != nil {
			return genesis.Config, hash, err
		}
		return genesis.Config, block.Hash(), nil
197
	}
198 199
	// Check whether the genesis block is already written.
	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.
	newcfg := genesis.configOrDefault(stored)
207 208
	if overrideArrowGlacier != nil {
		newcfg.ArrowGlacierBlock = overrideArrowGlacier
209
	}
210 211 212
	if err := newcfg.CheckConfigForkOrder(); err != nil {
		return newcfg, common.Hash{}, err
	}
213 214 215 216 217
	storedcfg := rawdb.ReadChainConfig(db, stored)
	if storedcfg == nil {
		log.Warn("Found genesis block without chain config")
		rawdb.WriteChainConfig(db, stored, newcfg)
		return newcfg, stored, nil
218
	}
219 220 221
	// Special case: don't change the existing config of a non-mainnet chain if no new
	// config is supplied. These chains would get AllProtocolChanges (and a compat error)
	// if we just continued here.
222
	if genesis == nil && stored != params.MainnetGenesisHash {
223
		return storedcfg, stored, nil
224
	}
225 226
	// Check config compatibility and write the config. Compatibility errors
	// are returned to the caller unless we're already at block zero.
227 228
	height := rawdb.ReadHeaderNumber(db, rawdb.ReadHeadHeaderHash(db))
	if height == nil {
229
		return newcfg, stored, fmt.Errorf("missing block number for head header hash")
230
	}
231 232
	compatErr := storedcfg.CheckCompatible(newcfg, *height)
	if compatErr != nil && *height != 0 && compatErr.RewindTo != 0 {
233
		return newcfg, stored, compatErr
234
	}
235 236
	rawdb.WriteChainConfig(db, stored, newcfg)
	return newcfg, stored, nil
237
}
238

239 240 241 242
func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig {
	switch {
	case g != nil:
		return g.Config
243
	case ghash == params.MainnetGenesisHash:
244
		return params.MainnetChainConfig
245 246
	case ghash == params.RopstenGenesisHash:
		return params.RopstenChainConfig
247 248
	case ghash == params.SepoliaGenesisHash:
		return params.SepoliaChainConfig
249 250 251 252
	case ghash == params.RinkebyGenesisHash:
		return params.RinkebyChainConfig
	case ghash == params.GoerliGenesisHash:
		return params.GoerliChainConfig
253
	default:
254
		return params.AllEthashProtocolChanges
255 256
	}
}
obscuren's avatar
obscuren committed
257

258 259 260 261
// ToBlock creates the genesis block and writes state of a genesis specification
// to the given database (or discards it if nil).
func (g *Genesis) ToBlock(db ethdb.Database) *types.Block {
	if db == nil {
262
		db = rawdb.NewMemoryDatabase()
263
	}
264 265 266 267
	statedb, err := state.New(common.Hash{}, state.NewDatabase(db), nil)
	if err != nil {
		panic(err)
	}
268 269 270 271 272 273
	for addr, account := range g.Alloc {
		statedb.AddBalance(addr, account.Balance)
		statedb.SetCode(addr, account.Code)
		statedb.SetNonce(addr, account.Nonce)
		for key, value := range account.Storage {
			statedb.SetState(addr, key, value)
274
		}
275
	}
276 277
	root := statedb.IntermediateRoot(false)
	head := &types.Header{
278
		Number:     new(big.Int).SetUint64(g.Number),
279
		Nonce:      types.EncodeNonce(g.Nonce),
280
		Time:       g.Timestamp,
281 282
		ParentHash: g.ParentHash,
		Extra:      g.ExtraData,
283 284
		GasLimit:   g.GasLimit,
		GasUsed:    g.GasUsed,
285
		BaseFee:    g.BaseFee,
286 287 288 289 290 291 292 293 294 295 296
		Difficulty: g.Difficulty,
		MixDigest:  g.Mixhash,
		Coinbase:   g.Coinbase,
		Root:       root,
	}
	if g.GasLimit == 0 {
		head.GasLimit = params.GenesisGasLimit
	}
	if g.Difficulty == nil {
		head.Difficulty = params.GenesisDifficulty
	}
297
	if g.Config != nil && g.Config.IsLondon(common.Big0) {
298 299 300 301 302
		if g.BaseFee != nil {
			head.BaseFee = g.BaseFee
		} else {
			head.BaseFee = new(big.Int).SetUint64(params.InitialBaseFee)
		}
303
	}
304
	statedb.Commit(false)
305
	statedb.Database().TrieDB().Commit(root, true, nil)
306

307
	return types.NewBlock(head, nil, nil, nil, trie.NewStackTrie(nil))
308
}
309

310 311 312
// Commit writes the block and state of a genesis specification to the database.
// The block is committed as the canonical head block.
func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) {
313
	block := g.ToBlock(db)
314
	if block.Number().Sign() != 0 {
315
		return nil, errors.New("can't commit genesis block with number > 0")
316
	}
317 318 319 320 321 322 323
	config := g.Config
	if config == nil {
		config = params.AllEthashProtocolChanges
	}
	if err := config.CheckConfigForkOrder(); err != nil {
		return nil, err
	}
324 325 326
	if config.Clique != nil && len(block.Extra()) == 0 {
		return nil, errors.New("can't start clique chain without signers")
	}
327
	rawdb.WriteTd(db, block.Hash(), block.NumberU64(), block.Difficulty())
328 329 330 331
	rawdb.WriteBlock(db, block)
	rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), nil)
	rawdb.WriteCanonicalHash(db, block.Hash(), block.NumberU64())
	rawdb.WriteHeadBlockHash(db, block.Hash())
332
	rawdb.WriteHeadFastBlockHash(db, block.Hash())
333 334 335
	rawdb.WriteHeadHeaderHash(db, block.Hash())
	rawdb.WriteChainConfig(db, block.Hash(), config)
	return block, nil
336
}
337

338 339 340 341
// MustCommit writes the genesis block and state to db, panicking on error.
// The block is committed as the canonical head block.
func (g *Genesis) MustCommit(db ethdb.Database) *types.Block {
	block, err := g.Commit(db)
342 343 344
	if err != nil {
		panic(err)
	}
345 346 347
	return block
}

348 349
// GenesisBlockForTesting creates and writes a block in which addr has the given wei balance.
func GenesisBlockForTesting(db ethdb.Database, addr common.Address, balance *big.Int) *types.Block {
350 351 352 353
	g := Genesis{
		Alloc:   GenesisAlloc{addr: {Balance: balance}},
		BaseFee: big.NewInt(params.InitialBaseFee),
	}
354
	return g.MustCommit(db)
355 356
}

357 358 359 360 361 362 363 364 365 366
// DefaultGenesisBlock returns the Ethereum main net genesis block.
func DefaultGenesisBlock() *Genesis {
	return &Genesis{
		Config:     params.MainnetChainConfig,
		Nonce:      66,
		ExtraData:  hexutil.MustDecode("0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa"),
		GasLimit:   5000,
		Difficulty: big.NewInt(17179869184),
		Alloc:      decodePrealloc(mainnetAllocData),
	}
367 368
}

369 370
// DefaultRopstenGenesisBlock returns the Ropsten network genesis block.
func DefaultRopstenGenesisBlock() *Genesis {
371
	return &Genesis{
372
		Config:     params.RopstenChainConfig,
373 374 375 376
		Nonce:      66,
		ExtraData:  hexutil.MustDecode("0x3535353535353535353535353535353535353535353535353535353535353535"),
		GasLimit:   16777216,
		Difficulty: big.NewInt(1048576),
377
		Alloc:      decodePrealloc(ropstenAllocData),
378
	}
379 380
}

381 382 383 384 385 386 387 388 389 390 391 392
// DefaultRinkebyGenesisBlock returns the Rinkeby network genesis block.
func DefaultRinkebyGenesisBlock() *Genesis {
	return &Genesis{
		Config:     params.RinkebyChainConfig,
		Timestamp:  1492009146,
		ExtraData:  hexutil.MustDecode("0x52657370656374206d7920617574686f7269746168207e452e436172746d616e42eb768f2244c8811c63729a21a3569731535f067ffc57839b00206d1ad20c69a1981b489f772031b279182d99e65703f0076e4812653aab85fca0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
		GasLimit:   4700000,
		Difficulty: big.NewInt(1),
		Alloc:      decodePrealloc(rinkebyAllocData),
	}
}

393 394 395 396 397 398 399 400 401 402 403 404
// DefaultGoerliGenesisBlock returns the Görli network genesis block.
func DefaultGoerliGenesisBlock() *Genesis {
	return &Genesis{
		Config:     params.GoerliChainConfig,
		Timestamp:  1548854791,
		ExtraData:  hexutil.MustDecode("0x22466c6578692069732061207468696e6722202d204166726900000000000000e0a2bd4258d2768837baa26a28fe71dc079f84c70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
		GasLimit:   10485760,
		Difficulty: big.NewInt(1),
		Alloc:      decodePrealloc(goerliAllocData),
	}
}

405 406 407 408 409 410 411 412 413 414 415 416 417
// DefaultSepoliaGenesisBlock returns the Sepolia network genesis block.
func DefaultSepoliaGenesisBlock() *Genesis {
	return &Genesis{
		Config:     params.SepoliaChainConfig,
		Nonce:      0,
		ExtraData:  []byte("Sepolia, Athens, Attica, Greece!"),
		GasLimit:   0x1c9c380,
		Difficulty: big.NewInt(0x20000),
		Timestamp:  1633267481,
		Alloc:      decodePrealloc(sepoliaAllocData),
	}
}

418
// DeveloperGenesisBlock returns the 'geth --dev' genesis block.
419 420 421
func DeveloperGenesisBlock(period uint64, faucet common.Address) *Genesis {
	// Override the default period to the user requested one
	config := *params.AllCliqueProtocolChanges
422 423 424 425
	config.Clique = &params.CliqueConfig{
		Period: period,
		Epoch:  config.Clique.Epoch,
	}
426 427

	// Assemble and return the genesis with the precompiles and faucet pre-funded
428
	return &Genesis{
429
		Config:     &config,
430
		ExtraData:  append(append(make([]byte, 32), faucet[:]...), make([]byte, crypto.SignatureLength)...),
431
		GasLimit:   11500000,
432
		BaseFee:    big.NewInt(params.InitialBaseFee),
433 434
		Difficulty: big.NewInt(1),
		Alloc: map[common.Address]GenesisAccount{
435 436 437 438 439 440 441 442
			common.BytesToAddress([]byte{1}): {Balance: big.NewInt(1)}, // ECRecover
			common.BytesToAddress([]byte{2}): {Balance: big.NewInt(1)}, // SHA256
			common.BytesToAddress([]byte{3}): {Balance: big.NewInt(1)}, // RIPEMD
			common.BytesToAddress([]byte{4}): {Balance: big.NewInt(1)}, // Identity
			common.BytesToAddress([]byte{5}): {Balance: big.NewInt(1)}, // ModExp
			common.BytesToAddress([]byte{6}): {Balance: big.NewInt(1)}, // ECAdd
			common.BytesToAddress([]byte{7}): {Balance: big.NewInt(1)}, // ECScalarMul
			common.BytesToAddress([]byte{8}): {Balance: big.NewInt(1)}, // ECPairing
443
			common.BytesToAddress([]byte{9}): {Balance: big.NewInt(1)}, // BLAKE2b
444
			faucet:                           {Balance: new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(9))},
445
		},
446 447 448
	}
}

449 450 451 452 453 454 455 456
func decodePrealloc(data string) GenesisAlloc {
	var p []struct{ Addr, Balance *big.Int }
	if err := rlp.NewStream(strings.NewReader(data), 0).Decode(&p); err != nil {
		panic(err)
	}
	ga := make(GenesisAlloc, len(p))
	for _, account := range p {
		ga[common.BigToAddress(account.Addr)] = GenesisAccount{Balance: account.Balance}
457
	}
458
	return ga
459
}