2015-07-06 19:54:22 -05:00
|
|
|
// Copyright 2014 The go-ethereum Authors
|
2015-07-22 11:48:40 -05:00
|
|
|
// This file is part of the go-ethereum library.
|
2015-07-06 19:54:22 -05:00
|
|
|
//
|
2015-07-23 11:35:11 -05:00
|
|
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
2015-07-06 19:54:22 -05:00
|
|
|
// 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.
|
|
|
|
//
|
2015-07-22 11:48:40 -05:00
|
|
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
2015-07-06 19:54:22 -05:00
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2015-07-22 11:48:40 -05:00
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
2015-07-06 19:54:22 -05:00
|
|
|
// GNU Lesser General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Lesser General Public License
|
2015-07-22 11:48:40 -05:00
|
|
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
2015-07-06 19:54:22 -05:00
|
|
|
|
2014-12-04 03:28:02 -06:00
|
|
|
package core
|
2014-02-14 16:56:09 -06:00
|
|
|
|
|
|
|
import (
|
2017-07-11 06:49:14 -05:00
|
|
|
"bytes"
|
|
|
|
"encoding/json"
|
2017-03-02 07:03:33 -06:00
|
|
|
"errors"
|
2015-02-20 11:05:46 -06:00
|
|
|
"fmt"
|
2015-06-18 18:57:16 -05:00
|
|
|
"math/big"
|
2015-07-10 07:29:40 -05:00
|
|
|
"strings"
|
2014-08-21 07:47:58 -05:00
|
|
|
|
2015-03-17 05:19:23 -05:00
|
|
|
"github.com/ethereum/go-ethereum/common"
|
2017-03-02 07:03:33 -06:00
|
|
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
common: move big integer math to common/math (#3699)
* common: remove CurrencyToString
Move denomination values to params instead.
* common: delete dead code
* common: move big integer operations to common/math
This commit consolidates all big integer operations into common/math and
adds tests and documentation.
There should be no change in semantics for BigPow, BigMin, BigMax, S256,
U256, Exp and their behaviour is now locked in by tests.
The BigD, BytesToBig and Bytes2Big functions don't provide additional
value, all uses are replaced by new(big.Int).SetBytes().
BigToBytes is now called PaddedBigBytes, its minimum output size
parameter is now specified as the number of bytes instead of bits. The
single use of this function is in the EVM's MSTORE instruction.
Big and String2Big are replaced by ParseBig, which is slightly stricter.
It previously accepted leading zeros for hexadecimal inputs but treated
decimal inputs as octal if a leading zero digit was present.
ParseUint64 is used in places where String2Big was used to decode a
uint64.
The new functions MustParseBig and MustParseUint64 are now used in many
places where parsing errors were previously ignored.
* common: delete unused big integer variables
* accounts/abi: replace uses of BytesToBig with use of encoding/binary
* common: remove BytesToBig
* common: remove Bytes2Big
* common: remove BigTrue
* cmd/utils: add BigFlag and use it for error-checked integer flags
While here, remove environment variable processing for DirectoryFlag
because we don't use it.
* core: add missing error checks in genesis block parser
* common: remove String2Big
* cmd/evm: use utils.BigFlag
* common/math: check for 256 bit overflow in ParseBig
This is supposed to prevent silent overflow/truncation of values in the
genesis block JSON. Without this check, a genesis block that set a
balance larger than 256 bits would lead to weird behaviour in the VM.
* cmd/utils: fixup import
2017-02-26 15:21:51 -06:00
|
|
|
"github.com/ethereum/go-ethereum/common/math"
|
2018-05-07 06:35:06 -05:00
|
|
|
"github.com/ethereum/go-ethereum/core/rawdb"
|
2015-03-23 10:59:09 -05:00
|
|
|
"github.com/ethereum/go-ethereum/core/state"
|
2024-03-22 12:53:53 -05:00
|
|
|
"github.com/ethereum/go-ethereum/core/tracing"
|
2015-03-31 08:30:55 -05:00
|
|
|
"github.com/ethereum/go-ethereum/core/types"
|
2019-08-22 08:14:06 -05:00
|
|
|
"github.com/ethereum/go-ethereum/crypto"
|
2015-09-14 02:35:57 -05:00
|
|
|
"github.com/ethereum/go-ethereum/ethdb"
|
2017-02-22 06:10:07 -06:00
|
|
|
"github.com/ethereum/go-ethereum/log"
|
2015-04-01 22:17:15 -05:00
|
|
|
"github.com/ethereum/go-ethereum/params"
|
2017-03-02 07:03:33 -06:00
|
|
|
"github.com/ethereum/go-ethereum/rlp"
|
2020-08-21 07:10:40 -05:00
|
|
|
"github.com/ethereum/go-ethereum/trie"
|
2024-02-13 07:49:53 -06:00
|
|
|
"github.com/ethereum/go-ethereum/triedb"
|
|
|
|
"github.com/ethereum/go-ethereum/triedb/pathdb"
|
2024-01-23 07:51:58 -06:00
|
|
|
"github.com/holiman/uint256"
|
2014-02-14 16:56:09 -06:00
|
|
|
)
|
|
|
|
|
2022-04-12 13:24:02 -05:00
|
|
|
//go:generate go run github.com/fjl/gencodec -type Genesis -field-override genesisSpecMarshaling -out gen_genesis.go
|
2015-07-10 07:29:40 -05:00
|
|
|
|
2017-03-02 07:03:33 -06:00
|
|
|
var errGenesisNoConfig = errors.New("genesis has no chain configuration")
|
2014-12-23 06:48:44 -06:00
|
|
|
|
2024-03-11 05:05:48 -05:00
|
|
|
// Deprecated: use types.Account instead.
|
2024-02-16 12:05:33 -06:00
|
|
|
type GenesisAccount = types.Account
|
|
|
|
|
|
|
|
// Deprecated: use types.GenesisAlloc instead.
|
|
|
|
type GenesisAlloc = types.GenesisAlloc
|
|
|
|
|
2017-03-02 07:03:33 -06:00
|
|
|
// 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 {
|
2017-04-06 03:38:21 -05:00
|
|
|
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"`
|
2024-02-16 12:05:33 -06:00
|
|
|
Alloc types.GenesisAlloc `json:"alloc" gencodec:"required"`
|
2017-07-11 06:49:14 -05:00
|
|
|
|
|
|
|
// These fields are used for consensus tests. Please don't use them
|
|
|
|
// in actual genesis blocks.
|
2023-07-15 16:27:36 -05:00
|
|
|
Number uint64 `json:"number"`
|
|
|
|
GasUsed uint64 `json:"gasUsed"`
|
|
|
|
ParentHash common.Hash `json:"parentHash"`
|
|
|
|
BaseFee *big.Int `json:"baseFeePerGas"` // EIP-1559
|
2023-07-27 08:53:28 -05:00
|
|
|
ExcessBlobGas *uint64 `json:"excessBlobGas"` // EIP-4844
|
|
|
|
BlobGasUsed *uint64 `json:"blobGasUsed"` // EIP-4844
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
|
|
|
|
2022-09-26 06:55:18 -05:00
|
|
|
func ReadGenesis(db ethdb.Database) (*Genesis, error) {
|
|
|
|
var genesis Genesis
|
|
|
|
stored := rawdb.ReadCanonicalHash(db, 0)
|
|
|
|
if (stored == common.Hash{}) {
|
|
|
|
return nil, fmt.Errorf("invalid genesis hash in database: %x", stored)
|
|
|
|
}
|
|
|
|
blob := rawdb.ReadGenesisStateSpec(db, stored)
|
|
|
|
if blob == nil {
|
2023-05-25 07:24:09 -05:00
|
|
|
return nil, errors.New("genesis state missing from db")
|
2022-09-26 06:55:18 -05:00
|
|
|
}
|
|
|
|
if len(blob) != 0 {
|
|
|
|
if err := genesis.Alloc.UnmarshalJSON(blob); err != nil {
|
|
|
|
return nil, fmt.Errorf("could not unmarshal genesis state json: %s", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
genesis.Config = rawdb.ReadChainConfig(db, stored)
|
|
|
|
if genesis.Config == nil {
|
2023-05-25 07:24:09 -05:00
|
|
|
return nil, errors.New("genesis config missing from db")
|
2022-09-26 06:55:18 -05:00
|
|
|
}
|
|
|
|
genesisBlock := rawdb.ReadBlock(db, stored, 0)
|
|
|
|
if genesisBlock == nil {
|
2023-05-25 07:24:09 -05:00
|
|
|
return nil, errors.New("genesis block missing from db")
|
2022-09-26 06:55:18 -05:00
|
|
|
}
|
|
|
|
genesisHeader := genesisBlock.Header()
|
|
|
|
genesis.Nonce = genesisHeader.Nonce.Uint64()
|
|
|
|
genesis.Timestamp = genesisHeader.Time
|
|
|
|
genesis.ExtraData = genesisHeader.Extra
|
|
|
|
genesis.GasLimit = genesisHeader.GasLimit
|
|
|
|
genesis.Difficulty = genesisHeader.Difficulty
|
|
|
|
genesis.Mixhash = genesisHeader.MixDigest
|
|
|
|
genesis.Coinbase = genesisHeader.Coinbase
|
2023-07-15 16:27:36 -05:00
|
|
|
genesis.BaseFee = genesisHeader.BaseFee
|
2023-07-27 08:53:28 -05:00
|
|
|
genesis.ExcessBlobGas = genesisHeader.ExcessBlobGas
|
|
|
|
genesis.BlobGasUsed = genesisHeader.BlobGasUsed
|
2022-09-26 06:55:18 -05:00
|
|
|
|
|
|
|
return &genesis, nil
|
|
|
|
}
|
|
|
|
|
2024-02-16 12:05:33 -06:00
|
|
|
// hashAlloc computes the state root according to the genesis specification.
|
|
|
|
func hashAlloc(ga *types.GenesisAlloc, isVerkle bool) (common.Hash, error) {
|
2023-11-14 06:09:40 -06:00
|
|
|
// If a genesis-time verkle trie is requested, create a trie config
|
|
|
|
// with the verkle trie enabled so that the tree can be initialized
|
|
|
|
// as such.
|
2024-02-13 07:49:53 -06:00
|
|
|
var config *triedb.Config
|
2023-11-14 06:09:40 -06:00
|
|
|
if isVerkle {
|
2024-02-13 07:49:53 -06:00
|
|
|
config = &triedb.Config{
|
2023-11-14 06:09:40 -06:00
|
|
|
PathDB: pathdb.Defaults,
|
|
|
|
IsVerkle: true,
|
|
|
|
}
|
|
|
|
}
|
2022-08-09 04:44:39 -05:00
|
|
|
// Create an ephemeral in-memory database for computing hash,
|
|
|
|
// all the derived states will be discarded to not pollute disk.
|
2025-01-10 06:51:19 -06:00
|
|
|
emptyRoot := types.EmptyRootHash
|
|
|
|
if isVerkle {
|
|
|
|
emptyRoot = types.EmptyVerkleHash
|
|
|
|
}
|
2024-09-05 05:10:47 -05:00
|
|
|
db := rawdb.NewMemoryDatabase()
|
2025-01-10 06:51:19 -06:00
|
|
|
statedb, err := state.New(emptyRoot, state.NewDatabase(triedb.NewDatabase(db, config), nil))
|
2022-03-22 04:53:22 -05:00
|
|
|
if err != nil {
|
|
|
|
return common.Hash{}, err
|
|
|
|
}
|
|
|
|
for addr, account := range *ga {
|
2023-08-25 08:59:40 -05:00
|
|
|
if account.Balance != nil {
|
2024-03-22 12:53:53 -05:00
|
|
|
statedb.AddBalance(addr, uint256.MustFromBig(account.Balance), tracing.BalanceIncreaseGenesisBalance)
|
2023-08-25 08:59:40 -05:00
|
|
|
}
|
2022-03-22 04:53:22 -05:00
|
|
|
statedb.SetCode(addr, account.Code)
|
|
|
|
statedb.SetNonce(addr, account.Nonce)
|
|
|
|
for key, value := range account.Storage {
|
|
|
|
statedb.SetState(addr, key, value)
|
|
|
|
}
|
|
|
|
}
|
all: implement state history v2 (#30107)
This pull request delivers the new version of the state history, where
the raw storage key is used instead of the hash.
Before the cancun fork, it's supported by protocol to destruct a
specific account and therefore, all the storage slot owned by it should
be wiped in the same transition.
Technically, storage wiping should be performed through storage
iteration, and only the storage key hash will be available for traversal
if the state snapshot is not available. Therefore, the storage key hash
is chosen as the identifier in the old version state history.
Fortunately, account self-destruction has been deprecated by the
protocol since the Cancun fork, and there are no empty accounts eligible
for deletion under EIP-158. Therefore, we can conclude that no storage
wiping should occur after the Cancun fork. In this case, it makes no
sense to keep using hash.
Besides, another big reason for making this change is the current format
state history is unusable if verkle is activated. Verkle tree has a
different key derivation scheme (merkle uses keccak256), the preimage of
key hash must be provided in order to make verkle rollback functional.
This pull request is a prerequisite for landing verkle.
Additionally, the raw storage key is more human-friendly for those who
want to manually check the history, even though Solidity already
performs some hashing to derive the storage location.
---
This pull request doesn't bump the database version, as I believe the
database should still be compatible if users degrade from the new geth
version to old one, the only side effect is the persistent new version
state history will be unusable.
---------
Co-authored-by: Zsolt Felfoldi <zsfelfoldi@gmail.com>
2025-01-16 19:59:02 -06:00
|
|
|
return statedb.Commit(0, false, false)
|
2022-08-09 04:44:39 -05:00
|
|
|
}
|
|
|
|
|
2024-08-15 02:16:23 -05:00
|
|
|
// flushAlloc is very similar with hash, but the main difference is all the
|
|
|
|
// generated states will be persisted into the given database.
|
2024-09-05 05:10:47 -05:00
|
|
|
func flushAlloc(ga *types.GenesisAlloc, triedb *triedb.Database) (common.Hash, error) {
|
2025-01-10 06:51:19 -06:00
|
|
|
emptyRoot := types.EmptyRootHash
|
|
|
|
if triedb.IsVerkle() {
|
|
|
|
emptyRoot = types.EmptyVerkleHash
|
|
|
|
}
|
|
|
|
statedb, err := state.New(emptyRoot, state.NewDatabase(triedb, nil))
|
2022-08-09 04:44:39 -05:00
|
|
|
if err != nil {
|
2024-08-15 02:16:23 -05:00
|
|
|
return common.Hash{}, err
|
2022-08-09 04:44:39 -05:00
|
|
|
}
|
|
|
|
for addr, account := range *ga {
|
2023-08-25 08:59:40 -05:00
|
|
|
if account.Balance != nil {
|
2024-03-22 12:53:53 -05:00
|
|
|
// This is not actually logged via tracer because OnGenesisBlock
|
|
|
|
// already captures the allocations.
|
|
|
|
statedb.AddBalance(addr, uint256.MustFromBig(account.Balance), tracing.BalanceIncreaseGenesisBalance)
|
2023-08-25 08:59:40 -05:00
|
|
|
}
|
2022-08-09 04:44:39 -05:00
|
|
|
statedb.SetCode(addr, account.Code)
|
|
|
|
statedb.SetNonce(addr, account.Nonce)
|
|
|
|
for key, value := range account.Storage {
|
|
|
|
statedb.SetState(addr, key, value)
|
|
|
|
}
|
|
|
|
}
|
all: implement state history v2 (#30107)
This pull request delivers the new version of the state history, where
the raw storage key is used instead of the hash.
Before the cancun fork, it's supported by protocol to destruct a
specific account and therefore, all the storage slot owned by it should
be wiped in the same transition.
Technically, storage wiping should be performed through storage
iteration, and only the storage key hash will be available for traversal
if the state snapshot is not available. Therefore, the storage key hash
is chosen as the identifier in the old version state history.
Fortunately, account self-destruction has been deprecated by the
protocol since the Cancun fork, and there are no empty accounts eligible
for deletion under EIP-158. Therefore, we can conclude that no storage
wiping should occur after the Cancun fork. In this case, it makes no
sense to keep using hash.
Besides, another big reason for making this change is the current format
state history is unusable if verkle is activated. Verkle tree has a
different key derivation scheme (merkle uses keccak256), the preimage of
key hash must be provided in order to make verkle rollback functional.
This pull request is a prerequisite for landing verkle.
Additionally, the raw storage key is more human-friendly for those who
want to manually check the history, even though Solidity already
performs some hashing to derive the storage location.
---
This pull request doesn't bump the database version, as I believe the
database should still be compatible if users degrade from the new geth
version to old one, the only side effect is the persistent new version
state history will be unusable.
---------
Co-authored-by: Zsolt Felfoldi <zsfelfoldi@gmail.com>
2025-01-16 19:59:02 -06:00
|
|
|
root, err := statedb.Commit(0, false, false)
|
2022-03-22 04:53:22 -05:00
|
|
|
if err != nil {
|
2024-08-15 02:16:23 -05:00
|
|
|
return common.Hash{}, err
|
2022-03-22 04:53:22 -05:00
|
|
|
}
|
2022-11-28 07:31:28 -06:00
|
|
|
// Commit newly generated states into disk if it's not empty.
|
|
|
|
if root != types.EmptyRootHash {
|
2023-02-08 05:14:34 -06:00
|
|
|
if err := triedb.Commit(root, true); err != nil {
|
2024-08-15 02:16:23 -05:00
|
|
|
return common.Hash{}, err
|
2022-11-28 07:31:28 -06:00
|
|
|
}
|
2022-03-22 04:53:22 -05:00
|
|
|
}
|
2024-08-15 02:16:23 -05:00
|
|
|
return root, nil
|
2022-03-22 04:53:22 -05:00
|
|
|
}
|
|
|
|
|
2024-03-22 12:53:53 -05:00
|
|
|
func getGenesisState(db ethdb.Database, blockhash common.Hash) (alloc types.GenesisAlloc, err error) {
|
|
|
|
blob := rawdb.ReadGenesisStateSpec(db, blockhash)
|
|
|
|
if len(blob) != 0 {
|
|
|
|
if err := alloc.UnmarshalJSON(blob); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return alloc, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Genesis allocation is missing and there are several possibilities:
|
|
|
|
// the node is legacy which doesn't persist the genesis allocation or
|
|
|
|
// the persisted allocation is just lost.
|
|
|
|
// - supported networks(mainnet, testnets), recover with defined allocations
|
|
|
|
// - private network, can't recover
|
|
|
|
var genesis *Genesis
|
|
|
|
switch blockhash {
|
|
|
|
case params.MainnetGenesisHash:
|
|
|
|
genesis = DefaultGenesisBlock()
|
|
|
|
case params.SepoliaGenesisHash:
|
|
|
|
genesis = DefaultSepoliaGenesisBlock()
|
|
|
|
case params.HoleskyGenesisHash:
|
|
|
|
genesis = DefaultHoleskyGenesisBlock()
|
|
|
|
}
|
|
|
|
if genesis != nil {
|
|
|
|
return genesis.Alloc, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
|
2017-03-02 07:03:33 -06:00
|
|
|
// field type overrides for gencodec
|
|
|
|
type genesisSpecMarshaling struct {
|
2023-07-15 16:27:36 -05:00
|
|
|
Nonce math.HexOrDecimal64
|
|
|
|
Timestamp math.HexOrDecimal64
|
|
|
|
ExtraData hexutil.Bytes
|
|
|
|
GasLimit math.HexOrDecimal64
|
|
|
|
GasUsed math.HexOrDecimal64
|
|
|
|
Number math.HexOrDecimal64
|
|
|
|
Difficulty *math.HexOrDecimal256
|
2024-02-16 12:05:33 -06:00
|
|
|
Alloc map[common.UnprefixedAddress]types.Account
|
2023-07-15 16:27:36 -05:00
|
|
|
BaseFee *math.HexOrDecimal256
|
2023-07-27 08:53:28 -05:00
|
|
|
ExcessBlobGas *math.HexOrDecimal64
|
|
|
|
BlobGasUsed *math.HexOrDecimal64
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
2017-07-11 06:49:14 -05:00
|
|
|
|
2017-03-02 07:03:33 -06:00
|
|
|
// 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 {
|
2018-09-24 07:57:49 -05:00
|
|
|
return fmt.Sprintf("database contains incompatible genesis (have %x, new %x)", e.Stored, e.New)
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
|
|
|
|
2022-08-30 11:22:28 -05:00
|
|
|
// ChainOverrides contains the changes to chain config.
|
|
|
|
type ChainOverrides struct {
|
2023-04-26 10:17:37 -05:00
|
|
|
OverrideCancun *uint64
|
2023-06-28 04:08:48 -05:00
|
|
|
OverrideVerkle *uint64
|
2022-08-30 11:22:28 -05:00
|
|
|
}
|
|
|
|
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
// apply applies the chain overrides on the supplied chain config.
|
|
|
|
func (o *ChainOverrides) apply(cfg *params.ChainConfig) (*params.ChainConfig, error) {
|
|
|
|
if o == nil || cfg == nil {
|
|
|
|
return cfg, nil
|
|
|
|
}
|
|
|
|
cpy := *cfg
|
|
|
|
if o.OverrideCancun != nil {
|
|
|
|
cpy.CancunTime = o.OverrideCancun
|
|
|
|
}
|
|
|
|
if o.OverrideVerkle != nil {
|
|
|
|
cpy.VerkleTime = o.OverrideVerkle
|
|
|
|
}
|
|
|
|
if err := cpy.CheckConfigForkOrder(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return &cpy, nil
|
|
|
|
}
|
|
|
|
|
2017-03-02 07:03:33 -06:00
|
|
|
// SetupGenesisBlock writes or updates the genesis block in db.
|
|
|
|
// The block that will be used is:
|
|
|
|
//
|
2022-09-10 06:25:40 -05:00
|
|
|
// genesis == nil genesis != nil
|
|
|
|
// +------------------------------------------
|
|
|
|
// db has no genesis | main-net default | genesis
|
|
|
|
// db has genesis | from DB | genesis (if compatible)
|
2017-03-02 07:03:33 -06:00
|
|
|
//
|
|
|
|
// 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.
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
func SetupGenesisBlock(db ethdb.Database, triedb *triedb.Database, genesis *Genesis) (*params.ChainConfig, common.Hash, *params.ConfigCompatError, error) {
|
2022-11-28 07:31:28 -06:00
|
|
|
return SetupGenesisBlockWithOverride(db, triedb, genesis, nil)
|
2021-02-25 01:10:30 -06:00
|
|
|
}
|
|
|
|
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
func SetupGenesisBlockWithOverride(db ethdb.Database, triedb *triedb.Database, genesis *Genesis, overrides *ChainOverrides) (*params.ChainConfig, common.Hash, *params.ConfigCompatError, error) {
|
|
|
|
// Sanitize the supplied genesis, ensuring it has the associated chain
|
|
|
|
// config attached.
|
2017-03-02 07:03:33 -06:00
|
|
|
if genesis != nil && genesis.Config == nil {
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
return nil, common.Hash{}, nil, errGenesisNoConfig
|
2022-07-04 04:25:17 -05:00
|
|
|
}
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
// Commit the genesis if the database is empty
|
|
|
|
ghash := rawdb.ReadCanonicalHash(db, 0)
|
|
|
|
if (ghash == common.Hash{}) {
|
2017-03-02 07:03:33 -06:00
|
|
|
if genesis == nil {
|
|
|
|
log.Info("Writing default main-net genesis block")
|
|
|
|
genesis = DefaultGenesisBlock()
|
|
|
|
} else {
|
|
|
|
log.Info("Writing custom genesis block")
|
common: move big integer math to common/math (#3699)
* common: remove CurrencyToString
Move denomination values to params instead.
* common: delete dead code
* common: move big integer operations to common/math
This commit consolidates all big integer operations into common/math and
adds tests and documentation.
There should be no change in semantics for BigPow, BigMin, BigMax, S256,
U256, Exp and their behaviour is now locked in by tests.
The BigD, BytesToBig and Bytes2Big functions don't provide additional
value, all uses are replaced by new(big.Int).SetBytes().
BigToBytes is now called PaddedBigBytes, its minimum output size
parameter is now specified as the number of bytes instead of bits. The
single use of this function is in the EVM's MSTORE instruction.
Big and String2Big are replaced by ParseBig, which is slightly stricter.
It previously accepted leading zeros for hexadecimal inputs but treated
decimal inputs as octal if a leading zero digit was present.
ParseUint64 is used in places where String2Big was used to decode a
uint64.
The new functions MustParseBig and MustParseUint64 are now used in many
places where parsing errors were previously ignored.
* common: delete unused big integer variables
* accounts/abi: replace uses of BytesToBig with use of encoding/binary
* common: remove BytesToBig
* common: remove Bytes2Big
* common: remove BigTrue
* cmd/utils: add BigFlag and use it for error-checked integer flags
While here, remove environment variable processing for DirectoryFlag
because we don't use it.
* core: add missing error checks in genesis block parser
* common: remove String2Big
* cmd/evm: use utils.BigFlag
* common/math: check for 256 bit overflow in ParseBig
This is supposed to prevent silent overflow/truncation of values in the
genesis block JSON. Without this check, a genesis block that set a
balance larger than 256 bits would lead to weird behaviour in the VM.
* cmd/utils: fixup import
2017-02-26 15:21:51 -06:00
|
|
|
}
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
chainCfg, err := overrides.apply(genesis.Config)
|
|
|
|
if err != nil {
|
|
|
|
return nil, common.Hash{}, nil, err
|
|
|
|
}
|
|
|
|
genesis.Config = chainCfg
|
2024-03-22 12:53:53 -05:00
|
|
|
|
2022-11-28 07:31:28 -06:00
|
|
|
block, err := genesis.Commit(db, triedb)
|
2019-07-18 07:26:22 -05:00
|
|
|
if err != nil {
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
return nil, common.Hash{}, nil, err
|
2019-07-18 07:26:22 -05:00
|
|
|
}
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
return chainCfg, block.Hash(), nil, nil
|
|
|
|
}
|
|
|
|
// Commit the genesis if the genesis block exists in the ancient database
|
|
|
|
// but the key-value database is empty without initializing the genesis
|
|
|
|
// fields. This scenario can occur when the node is created from scratch
|
|
|
|
// with an existing ancient store.
|
|
|
|
storedCfg := rawdb.ReadChainConfig(db, ghash)
|
|
|
|
if storedCfg == nil {
|
|
|
|
// Ensure the stored genesis block matches with the given genesis. Private
|
|
|
|
// networks must explicitly specify the genesis in the config file, mainnet
|
|
|
|
// genesis will be used as default and the initialization will always fail.
|
core, cmd, vendor: fixes and database inspection tool (#15)
* core, eth: some fixes for freezer
* vendor, core/rawdb, cmd/geth: add db inspector
* core, cmd/utils: check ancient store path forceily
* cmd/geth, common, core/rawdb: a few fixes
* cmd/geth: support windows file rename and fix rename error
* core: support ancient plugin
* core, cmd: streaming file copy
* cmd, consensus, core, tests: keep genesis in leveldb
* core: write txlookup during ancient init
* core: bump database version
2019-05-14 09:07:44 -05:00
|
|
|
if genesis == nil {
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
log.Info("Writing default main-net genesis block")
|
core, cmd, vendor: fixes and database inspection tool (#15)
* core, eth: some fixes for freezer
* vendor, core/rawdb, cmd/geth: add db inspector
* core, cmd/utils: check ancient store path forceily
* cmd/geth, common, core/rawdb: a few fixes
* cmd/geth: support windows file rename and fix rename error
* core: support ancient plugin
* core, cmd: streaming file copy
* cmd, consensus, core, tests: keep genesis in leveldb
* core: write txlookup during ancient init
* core: bump database version
2019-05-14 09:07:44 -05:00
|
|
|
genesis = DefaultGenesisBlock()
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
} else {
|
|
|
|
log.Info("Writing custom genesis block")
|
core, cmd, vendor: fixes and database inspection tool (#15)
* core, eth: some fixes for freezer
* vendor, core/rawdb, cmd/geth: add db inspector
* core, cmd/utils: check ancient store path forceily
* cmd/geth, common, core/rawdb: a few fixes
* cmd/geth: support windows file rename and fix rename error
* core: support ancient plugin
* core, cmd: streaming file copy
* cmd, consensus, core, tests: keep genesis in leveldb
* core: write txlookup during ancient init
* core: bump database version
2019-05-14 09:07:44 -05:00
|
|
|
}
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
chainCfg, err := overrides.apply(genesis.Config)
|
|
|
|
if err != nil {
|
|
|
|
return nil, common.Hash{}, nil, err
|
|
|
|
}
|
|
|
|
genesis.Config = chainCfg
|
|
|
|
|
|
|
|
if hash := genesis.ToBlock().Hash(); hash != ghash {
|
|
|
|
return nil, common.Hash{}, nil, &GenesisMismatchError{ghash, hash}
|
core, cmd, vendor: fixes and database inspection tool (#15)
* core, eth: some fixes for freezer
* vendor, core/rawdb, cmd/geth: add db inspector
* core, cmd/utils: check ancient store path forceily
* cmd/geth, common, core/rawdb: a few fixes
* cmd/geth: support windows file rename and fix rename error
* core: support ancient plugin
* core, cmd: streaming file copy
* cmd, consensus, core, tests: keep genesis in leveldb
* core: write txlookup during ancient init
* core: bump database version
2019-05-14 09:07:44 -05:00
|
|
|
}
|
2022-11-28 07:31:28 -06:00
|
|
|
block, err := genesis.Commit(db, triedb)
|
2019-07-18 07:26:22 -05:00
|
|
|
if err != nil {
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
return nil, common.Hash{}, nil, err
|
2019-07-18 07:26:22 -05:00
|
|
|
}
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
return chainCfg, block.Hash(), nil, nil
|
core, cmd, vendor: fixes and database inspection tool (#15)
* core, eth: some fixes for freezer
* vendor, core/rawdb, cmd/geth: add db inspector
* core, cmd/utils: check ancient store path forceily
* cmd/geth, common, core/rawdb: a few fixes
* cmd/geth: support windows file rename and fix rename error
* core: support ancient plugin
* core, cmd: streaming file copy
* cmd, consensus, core, tests: keep genesis in leveldb
* core: write txlookup during ancient init
* core: bump database version
2019-05-14 09:07:44 -05:00
|
|
|
}
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
// The genesis block has already been committed previously. Verify that the
|
|
|
|
// provided genesis with chain overrides matches the existing one, and update
|
|
|
|
// the stored chain config if necessary.
|
2017-03-02 07:03:33 -06:00
|
|
|
if genesis != nil {
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
chainCfg, err := overrides.apply(genesis.Config)
|
|
|
|
if err != nil {
|
|
|
|
return nil, common.Hash{}, nil, err
|
|
|
|
}
|
|
|
|
genesis.Config = chainCfg
|
|
|
|
|
|
|
|
if hash := genesis.ToBlock().Hash(); hash != ghash {
|
|
|
|
return nil, common.Hash{}, nil, &GenesisMismatchError{ghash, hash}
|
2015-07-10 07:29:40 -05:00
|
|
|
}
|
common: move big integer math to common/math (#3699)
* common: remove CurrencyToString
Move denomination values to params instead.
* common: delete dead code
* common: move big integer operations to common/math
This commit consolidates all big integer operations into common/math and
adds tests and documentation.
There should be no change in semantics for BigPow, BigMin, BigMax, S256,
U256, Exp and their behaviour is now locked in by tests.
The BigD, BytesToBig and Bytes2Big functions don't provide additional
value, all uses are replaced by new(big.Int).SetBytes().
BigToBytes is now called PaddedBigBytes, its minimum output size
parameter is now specified as the number of bytes instead of bits. The
single use of this function is in the EVM's MSTORE instruction.
Big and String2Big are replaced by ParseBig, which is slightly stricter.
It previously accepted leading zeros for hexadecimal inputs but treated
decimal inputs as octal if a leading zero digit was present.
ParseUint64 is used in places where String2Big was used to decode a
uint64.
The new functions MustParseBig and MustParseUint64 are now used in many
places where parsing errors were previously ignored.
* common: delete unused big integer variables
* accounts/abi: replace uses of BytesToBig with use of encoding/binary
* common: remove BytesToBig
* common: remove Bytes2Big
* common: remove BigTrue
* cmd/utils: add BigFlag and use it for error-checked integer flags
While here, remove environment variable processing for DirectoryFlag
because we don't use it.
* core: add missing error checks in genesis block parser
* common: remove String2Big
* cmd/evm: use utils.BigFlag
* common/math: check for 256 bit overflow in ParseBig
This is supposed to prevent silent overflow/truncation of values in the
genesis block JSON. Without this check, a genesis block that set a
balance larger than 256 bits would lead to weird behaviour in the VM.
* cmd/utils: fixup import
2017-02-26 15:21:51 -06:00
|
|
|
}
|
2017-03-02 07:03:33 -06:00
|
|
|
// Check config compatibility and write the config. Compatibility errors
|
|
|
|
// are returned to the caller unless we're already at block zero.
|
2022-12-15 01:40:33 -06:00
|
|
|
head := rawdb.ReadHeadHeader(db)
|
|
|
|
if head == nil {
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
return nil, common.Hash{}, nil, errors.New("missing head header")
|
common: move big integer math to common/math (#3699)
* common: remove CurrencyToString
Move denomination values to params instead.
* common: delete dead code
* common: move big integer operations to common/math
This commit consolidates all big integer operations into common/math and
adds tests and documentation.
There should be no change in semantics for BigPow, BigMin, BigMax, S256,
U256, Exp and their behaviour is now locked in by tests.
The BigD, BytesToBig and Bytes2Big functions don't provide additional
value, all uses are replaced by new(big.Int).SetBytes().
BigToBytes is now called PaddedBigBytes, its minimum output size
parameter is now specified as the number of bytes instead of bits. The
single use of this function is in the EVM's MSTORE instruction.
Big and String2Big are replaced by ParseBig, which is slightly stricter.
It previously accepted leading zeros for hexadecimal inputs but treated
decimal inputs as octal if a leading zero digit was present.
ParseUint64 is used in places where String2Big was used to decode a
uint64.
The new functions MustParseBig and MustParseUint64 are now used in many
places where parsing errors were previously ignored.
* common: delete unused big integer variables
* accounts/abi: replace uses of BytesToBig with use of encoding/binary
* common: remove BytesToBig
* common: remove Bytes2Big
* common: remove BigTrue
* cmd/utils: add BigFlag and use it for error-checked integer flags
While here, remove environment variable processing for DirectoryFlag
because we don't use it.
* core: add missing error checks in genesis block parser
* common: remove String2Big
* cmd/evm: use utils.BigFlag
* common/math: check for 256 bit overflow in ParseBig
This is supposed to prevent silent overflow/truncation of values in the
genesis block JSON. Without this check, a genesis block that set a
balance larger than 256 bits would lead to weird behaviour in the VM.
* cmd/utils: fixup import
2017-02-26 15:21:51 -06:00
|
|
|
}
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
newCfg := genesis.chainConfigOrDefault(ghash, storedCfg)
|
|
|
|
|
|
|
|
// TODO(rjl493456442) better to define the comparator of chain config
|
|
|
|
// and short circuit if the chain config is not changed.
|
|
|
|
compatErr := storedCfg.CheckCompatible(newCfg, head.Number.Uint64(), head.Time)
|
2022-12-15 01:40:33 -06:00
|
|
|
if compatErr != nil && ((head.Number.Uint64() != 0 && compatErr.RewindToBlock != 0) || (head.Time != 0 && compatErr.RewindToTime != 0)) {
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
return newCfg, ghash, compatErr, nil
|
common: move big integer math to common/math (#3699)
* common: remove CurrencyToString
Move denomination values to params instead.
* common: delete dead code
* common: move big integer operations to common/math
This commit consolidates all big integer operations into common/math and
adds tests and documentation.
There should be no change in semantics for BigPow, BigMin, BigMax, S256,
U256, Exp and their behaviour is now locked in by tests.
The BigD, BytesToBig and Bytes2Big functions don't provide additional
value, all uses are replaced by new(big.Int).SetBytes().
BigToBytes is now called PaddedBigBytes, its minimum output size
parameter is now specified as the number of bytes instead of bits. The
single use of this function is in the EVM's MSTORE instruction.
Big and String2Big are replaced by ParseBig, which is slightly stricter.
It previously accepted leading zeros for hexadecimal inputs but treated
decimal inputs as octal if a leading zero digit was present.
ParseUint64 is used in places where String2Big was used to decode a
uint64.
The new functions MustParseBig and MustParseUint64 are now used in many
places where parsing errors were previously ignored.
* common: delete unused big integer variables
* accounts/abi: replace uses of BytesToBig with use of encoding/binary
* common: remove BytesToBig
* common: remove Bytes2Big
* common: remove BigTrue
* cmd/utils: add BigFlag and use it for error-checked integer flags
While here, remove environment variable processing for DirectoryFlag
because we don't use it.
* core: add missing error checks in genesis block parser
* common: remove String2Big
* cmd/evm: use utils.BigFlag
* common/math: check for 256 bit overflow in ParseBig
This is supposed to prevent silent overflow/truncation of values in the
genesis block JSON. Without this check, a genesis block that set a
balance larger than 256 bits would lead to weird behaviour in the VM.
* cmd/utils: fixup import
2017-02-26 15:21:51 -06:00
|
|
|
}
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
// Don't overwrite if the old is identical to the new. It's useful
|
|
|
|
// for the scenarios that database is opened in the read-only mode.
|
|
|
|
storedData, _ := json.Marshal(storedCfg)
|
|
|
|
if newData, _ := json.Marshal(newCfg); !bytes.Equal(storedData, newData) {
|
|
|
|
rawdb.WriteChainConfig(db, ghash, newCfg)
|
2022-10-19 01:20:39 -05:00
|
|
|
}
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
return newCfg, ghash, nil, nil
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
common: move big integer math to common/math (#3699)
* common: remove CurrencyToString
Move denomination values to params instead.
* common: delete dead code
* common: move big integer operations to common/math
This commit consolidates all big integer operations into common/math and
adds tests and documentation.
There should be no change in semantics for BigPow, BigMin, BigMax, S256,
U256, Exp and their behaviour is now locked in by tests.
The BigD, BytesToBig and Bytes2Big functions don't provide additional
value, all uses are replaced by new(big.Int).SetBytes().
BigToBytes is now called PaddedBigBytes, its minimum output size
parameter is now specified as the number of bytes instead of bits. The
single use of this function is in the EVM's MSTORE instruction.
Big and String2Big are replaced by ParseBig, which is slightly stricter.
It previously accepted leading zeros for hexadecimal inputs but treated
decimal inputs as octal if a leading zero digit was present.
ParseUint64 is used in places where String2Big was used to decode a
uint64.
The new functions MustParseBig and MustParseUint64 are now used in many
places where parsing errors were previously ignored.
* common: delete unused big integer variables
* accounts/abi: replace uses of BytesToBig with use of encoding/binary
* common: remove BytesToBig
* common: remove Bytes2Big
* common: remove BigTrue
* cmd/utils: add BigFlag and use it for error-checked integer flags
While here, remove environment variable processing for DirectoryFlag
because we don't use it.
* core: add missing error checks in genesis block parser
* common: remove String2Big
* cmd/evm: use utils.BigFlag
* common/math: check for 256 bit overflow in ParseBig
This is supposed to prevent silent overflow/truncation of values in the
genesis block JSON. Without this check, a genesis block that set a
balance larger than 256 bits would lead to weird behaviour in the VM.
* cmd/utils: fixup import
2017-02-26 15:21:51 -06:00
|
|
|
|
2023-05-03 04:58:39 -05:00
|
|
|
// LoadChainConfig loads the stored chain config if it is already present in
|
|
|
|
// database, otherwise, return the config in the provided genesis specification.
|
|
|
|
func LoadChainConfig(db ethdb.Database, genesis *Genesis) (*params.ChainConfig, error) {
|
2022-08-30 11:22:28 -05:00
|
|
|
// Load the stored chain config from the database. It can be nil
|
|
|
|
// in case the database is empty. Notably, we only care about the
|
|
|
|
// chain config corresponds to the canonical chain.
|
|
|
|
stored := rawdb.ReadCanonicalHash(db, 0)
|
|
|
|
if stored != (common.Hash{}) {
|
|
|
|
storedcfg := rawdb.ReadChainConfig(db, stored)
|
|
|
|
if storedcfg != nil {
|
2023-05-03 04:58:39 -05:00
|
|
|
return storedcfg, nil
|
2022-08-30 11:22:28 -05:00
|
|
|
}
|
|
|
|
}
|
2023-05-03 04:58:39 -05:00
|
|
|
// Load the config from the provided genesis specification
|
2022-08-30 11:22:28 -05:00
|
|
|
if genesis != nil {
|
|
|
|
// Reject invalid genesis spec without valid chain config
|
|
|
|
if genesis.Config == nil {
|
|
|
|
return nil, errGenesisNoConfig
|
|
|
|
}
|
|
|
|
// If the canonical genesis header is present, but the chain
|
|
|
|
// config is missing(initialize the empty leveldb with an
|
|
|
|
// external ancient chain segment), ensure the provided genesis
|
|
|
|
// is matched.
|
|
|
|
if stored != (common.Hash{}) && genesis.ToBlock().Hash() != stored {
|
|
|
|
return nil, &GenesisMismatchError{stored, genesis.ToBlock().Hash()}
|
|
|
|
}
|
2023-05-03 04:58:39 -05:00
|
|
|
return genesis.Config, nil
|
2022-08-30 11:22:28 -05:00
|
|
|
}
|
|
|
|
// There is no stored chain config and no new config provided,
|
2023-05-03 04:58:39 -05:00
|
|
|
// In this case the default chain config(mainnet) will be used
|
|
|
|
return params.MainnetChainConfig, nil
|
2022-08-30 11:22:28 -05:00
|
|
|
}
|
|
|
|
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
// chainConfigOrDefault retrieves the attached chain configuration. If the genesis
|
|
|
|
// object is null, it returns the default chain configuration based on the given
|
|
|
|
// genesis hash, or the locally stored config if it's not a pre-defined network.
|
|
|
|
func (g *Genesis) chainConfigOrDefault(ghash common.Hash, stored *params.ChainConfig) *params.ChainConfig {
|
2017-03-02 07:03:33 -06:00
|
|
|
switch {
|
|
|
|
case g != nil:
|
|
|
|
return g.Config
|
2017-07-04 04:28:58 -05:00
|
|
|
case ghash == params.MainnetGenesisHash:
|
2017-03-02 07:03:33 -06:00
|
|
|
return params.MainnetChainConfig
|
2024-02-07 10:19:14 -06:00
|
|
|
case ghash == params.HoleskyGenesisHash:
|
|
|
|
return params.HoleskyChainConfig
|
2021-11-08 05:06:01 -06:00
|
|
|
case ghash == params.SepoliaGenesisHash:
|
|
|
|
return params.SepoliaChainConfig
|
2017-03-02 07:03:33 -06:00
|
|
|
default:
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
return stored
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
|
|
|
}
|
2015-02-20 11:05:46 -06:00
|
|
|
|
2023-11-14 06:09:40 -06:00
|
|
|
// IsVerkle indicates whether the state is already stored in a verkle
|
|
|
|
// tree at genesis time.
|
|
|
|
func (g *Genesis) IsVerkle() bool {
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
return g.Config.IsVerkleGenesis()
|
2023-11-14 06:09:40 -06:00
|
|
|
}
|
|
|
|
|
2022-08-09 04:44:39 -05:00
|
|
|
// ToBlock returns the genesis block according to genesis specification.
|
|
|
|
func (g *Genesis) ToBlock() *types.Block {
|
2024-02-16 12:05:33 -06:00
|
|
|
root, err := hashAlloc(&g.Alloc, g.IsVerkle())
|
2021-05-11 10:12:10 -05:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2024-08-15 02:16:23 -05:00
|
|
|
return g.toBlockWithRoot(root)
|
|
|
|
}
|
|
|
|
|
|
|
|
// toBlockWithRoot constructs the genesis block with the given genesis state root.
|
|
|
|
func (g *Genesis) toBlockWithRoot(root common.Hash) *types.Block {
|
2017-03-02 07:03:33 -06:00
|
|
|
head := &types.Header{
|
2017-07-11 06:49:14 -05:00
|
|
|
Number: new(big.Int).SetUint64(g.Number),
|
2017-03-02 07:03:33 -06:00
|
|
|
Nonce: types.EncodeNonce(g.Nonce),
|
2019-04-02 15:28:48 -05:00
|
|
|
Time: g.Timestamp,
|
2017-03-02 07:03:33 -06:00
|
|
|
ParentHash: g.ParentHash,
|
|
|
|
Extra: g.ExtraData,
|
2017-11-13 05:47:27 -06:00
|
|
|
GasLimit: g.GasLimit,
|
|
|
|
GasUsed: g.GasUsed,
|
2021-06-15 05:56:14 -05:00
|
|
|
BaseFee: g.BaseFee,
|
2017-03-02 07:03:33 -06:00
|
|
|
Difficulty: g.Difficulty,
|
|
|
|
MixDigest: g.Mixhash,
|
|
|
|
Coinbase: g.Coinbase,
|
|
|
|
Root: root,
|
|
|
|
}
|
|
|
|
if g.GasLimit == 0 {
|
|
|
|
head.GasLimit = params.GenesisGasLimit
|
|
|
|
}
|
2022-01-10 01:44:21 -06:00
|
|
|
if g.Difficulty == nil && g.Mixhash == (common.Hash{}) {
|
2017-03-02 07:03:33 -06:00
|
|
|
head.Difficulty = params.GenesisDifficulty
|
|
|
|
}
|
2021-05-17 08:13:22 -05:00
|
|
|
if g.Config != nil && g.Config.IsLondon(common.Big0) {
|
2021-06-07 07:37:56 -05:00
|
|
|
if g.BaseFee != nil {
|
|
|
|
head.BaseFee = g.BaseFee
|
|
|
|
} else {
|
|
|
|
head.BaseFee = new(big.Int).SetUint64(params.InitialBaseFee)
|
|
|
|
}
|
2021-05-17 08:13:22 -05:00
|
|
|
}
|
2024-09-04 07:33:51 -05:00
|
|
|
var (
|
|
|
|
withdrawals []*types.Withdrawal
|
|
|
|
)
|
2023-07-15 16:27:36 -05:00
|
|
|
if conf := g.Config; conf != nil {
|
|
|
|
num := big.NewInt(int64(g.Number))
|
|
|
|
if conf.IsShanghai(num, g.Timestamp) {
|
|
|
|
head.WithdrawalsHash = &types.EmptyWithdrawalsHash
|
|
|
|
withdrawals = make([]*types.Withdrawal, 0)
|
|
|
|
}
|
|
|
|
if conf.IsCancun(num, g.Timestamp) {
|
2023-08-25 21:52:12 -05:00
|
|
|
// EIP-4788: The parentBeaconBlockRoot of the genesis block is always
|
|
|
|
// the zero hash. This is because the genesis block does not have a parent
|
|
|
|
// by definition.
|
|
|
|
head.ParentBeaconRoot = new(common.Hash)
|
|
|
|
// EIP-4844 fields
|
2023-07-27 08:53:28 -05:00
|
|
|
head.ExcessBlobGas = g.ExcessBlobGas
|
|
|
|
head.BlobGasUsed = g.BlobGasUsed
|
|
|
|
if head.ExcessBlobGas == nil {
|
|
|
|
head.ExcessBlobGas = new(uint64)
|
2023-07-15 16:27:36 -05:00
|
|
|
}
|
2023-07-27 08:53:28 -05:00
|
|
|
if head.BlobGasUsed == nil {
|
|
|
|
head.BlobGasUsed = new(uint64)
|
2023-07-15 16:27:36 -05:00
|
|
|
}
|
|
|
|
}
|
2024-09-04 07:33:51 -05:00
|
|
|
if conf.IsPrague(num, g.Timestamp) {
|
2024-11-28 04:48:50 -06:00
|
|
|
head.RequestsHash = &types.EmptyRequestsHash
|
2024-09-04 07:33:51 -05:00
|
|
|
}
|
2023-01-25 08:32:25 -06:00
|
|
|
}
|
2024-10-09 05:24:58 -05:00
|
|
|
return types.NewBlock(head, &types.Body{Withdrawals: withdrawals}, nil, trie.NewStackTrie(nil))
|
2017-03-02 07:03:33 -06:00
|
|
|
}
|
2015-07-10 07:29:40 -05:00
|
|
|
|
2017-03-02 07:03:33 -06:00
|
|
|
// Commit writes the block and state of a genesis specification to the database.
|
|
|
|
// The block is committed as the canonical head block.
|
2024-02-13 07:49:53 -06:00
|
|
|
func (g *Genesis) Commit(db ethdb.Database, triedb *triedb.Database) (*types.Block, error) {
|
2024-08-15 02:16:23 -05:00
|
|
|
if g.Number != 0 {
|
2021-09-21 03:46:08 -05:00
|
|
|
return nil, errors.New("can't commit genesis block with number > 0")
|
2017-07-11 06:49:14 -05:00
|
|
|
}
|
2019-10-16 06:23:14 -05:00
|
|
|
config := g.Config
|
|
|
|
if config == nil {
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
return nil, errors.New("invalid genesis without chain config")
|
2019-10-16 06:23:14 -05:00
|
|
|
}
|
|
|
|
if err := config.CheckConfigForkOrder(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2024-08-15 02:16:23 -05:00
|
|
|
if config.Clique != nil && len(g.ExtraData) < 32+crypto.SignatureLength {
|
2021-09-21 03:46:08 -05:00
|
|
|
return nil, errors.New("can't start clique chain without signers")
|
|
|
|
}
|
2024-08-15 02:16:23 -05:00
|
|
|
// flush the data to disk and compute the state root
|
2024-09-05 05:10:47 -05:00
|
|
|
root, err := flushAlloc(&g.Alloc, triedb)
|
2024-08-15 02:16:23 -05:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
block := g.toBlockWithRoot(root)
|
|
|
|
|
|
|
|
// Marshal the genesis state specification and persist.
|
|
|
|
blob, err := json.Marshal(g.Alloc)
|
|
|
|
if err != nil {
|
2022-03-22 04:53:22 -05:00
|
|
|
return nil, err
|
|
|
|
}
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
batch := db.NewBatch()
|
|
|
|
rawdb.WriteGenesisStateSpec(batch, block.Hash(), blob)
|
|
|
|
rawdb.WriteTd(batch, block.Hash(), block.NumberU64(), block.Difficulty())
|
|
|
|
rawdb.WriteBlock(batch, block)
|
|
|
|
rawdb.WriteReceipts(batch, block.Hash(), block.NumberU64(), nil)
|
|
|
|
rawdb.WriteCanonicalHash(batch, block.Hash(), block.NumberU64())
|
|
|
|
rawdb.WriteHeadBlockHash(batch, block.Hash())
|
|
|
|
rawdb.WriteHeadFastBlockHash(batch, block.Hash())
|
|
|
|
rawdb.WriteHeadHeaderHash(batch, block.Hash())
|
|
|
|
rawdb.WriteChainConfig(batch, block.Hash(), config)
|
|
|
|
return block, batch.Write()
|
2015-06-18 18:57:16 -05:00
|
|
|
}
|
2015-07-10 07:29:40 -05:00
|
|
|
|
2017-03-02 07:03:33 -06:00
|
|
|
// MustCommit writes the genesis block and state to db, panicking on error.
|
|
|
|
// The block is committed as the canonical head block.
|
2024-02-13 07:49:53 -06:00
|
|
|
func (g *Genesis) MustCommit(db ethdb.Database, triedb *triedb.Database) *types.Block {
|
all: activate pbss as experimental feature (#26274)
* all: activate pbss
* core/rawdb: fix compilation error
* cma, core, eth, les, trie: address comments
* cmd, core, eth, trie: polish code
* core, cmd, eth: address comments
* cmd, core, eth, les, light, tests: address comment
* cmd/utils: shorten log message
* trie/triedb/pathdb: limit node buffer size to 1gb
* cmd/utils: fix opening non-existing db
* cmd/utils: rename flag name
* cmd, core: group chain history flags and fix tests
* core, eth, trie: fix memory leak in snapshot generation
* cmd, eth, internal: deprecate flags
* all: enable state tests for pathdb, fixes
* cmd, core: polish code
* trie/triedb/pathdb: limit the node buffer size to 256mb
---------
Co-authored-by: Martin Holst Swende <martin@swende.se>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2023-08-10 14:21:36 -05:00
|
|
|
block, err := g.Commit(db, triedb)
|
common: move big integer math to common/math (#3699)
* common: remove CurrencyToString
Move denomination values to params instead.
* common: delete dead code
* common: move big integer operations to common/math
This commit consolidates all big integer operations into common/math and
adds tests and documentation.
There should be no change in semantics for BigPow, BigMin, BigMax, S256,
U256, Exp and their behaviour is now locked in by tests.
The BigD, BytesToBig and Bytes2Big functions don't provide additional
value, all uses are replaced by new(big.Int).SetBytes().
BigToBytes is now called PaddedBigBytes, its minimum output size
parameter is now specified as the number of bytes instead of bits. The
single use of this function is in the EVM's MSTORE instruction.
Big and String2Big are replaced by ParseBig, which is slightly stricter.
It previously accepted leading zeros for hexadecimal inputs but treated
decimal inputs as octal if a leading zero digit was present.
ParseUint64 is used in places where String2Big was used to decode a
uint64.
The new functions MustParseBig and MustParseUint64 are now used in many
places where parsing errors were previously ignored.
* common: delete unused big integer variables
* accounts/abi: replace uses of BytesToBig with use of encoding/binary
* common: remove BytesToBig
* common: remove Bytes2Big
* common: remove BigTrue
* cmd/utils: add BigFlag and use it for error-checked integer flags
While here, remove environment variable processing for DirectoryFlag
because we don't use it.
* core: add missing error checks in genesis block parser
* common: remove String2Big
* cmd/evm: use utils.BigFlag
* common/math: check for 256 bit overflow in ParseBig
This is supposed to prevent silent overflow/truncation of values in the
genesis block JSON. Without this check, a genesis block that set a
balance larger than 256 bits would lead to weird behaviour in the VM.
* cmd/utils: fixup import
2017-02-26 15:21:51 -06:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2015-07-10 07:29:40 -05:00
|
|
|
return block
|
|
|
|
}
|
|
|
|
|
cmd, core, miner: rework genesis setup (#30907)
This pull request refactors the genesis setup function, the major
changes are highlighted here:
**(a) Triedb is opened in verkle mode if `EnableVerkleAtGenesis` is
configured in chainConfig or the database has been initialized previously with
`EnableVerkleAtGenesis` configured**.
A new config field `EnableVerkleAtGenesis` has been added in the
chainConfig. This field must be configured with True if Geth wants to initialize
the genesis in Verkle mode.
In the verkle devnet-7, the verkle transition is activated at genesis.
Therefore, the verkle rules should be used since the genesis. In production
networks (mainnet and public testnets), verkle activation always occurs after
the genesis block. Therefore, this flag is only made for devnet and should be
deprecated later. Besides, verkle transition at non-genesis block hasn't been
implemented yet, it should be done in the following PRs.
**(b) The genesis initialization condition has been simplified**
There is a special mode supported by the Geth is that: Geth can be
initialized with an existing chain segment, which can fasten the node sync
process by retaining the chain freezer folder.
Originally, if the triedb is regarded as uninitialized and the genesis block can
be found in the chain freezer, the genesis block along with genesis state will be
committed. This condition has been simplified to checking the presence of chain
config in key-value store. The existence of chain config can represent the genesis
has been committed.
2025-01-14 04:49:30 -06:00
|
|
|
// EnableVerkleAtGenesis indicates whether the verkle fork should be activated
|
|
|
|
// at genesis. This is a temporary solution only for verkle devnet testing, where
|
|
|
|
// verkle fork is activated at genesis, and the configured activation date has
|
|
|
|
// already passed.
|
|
|
|
//
|
|
|
|
// In production networks (mainnet and public testnets), verkle activation always
|
|
|
|
// occurs after the genesis block, making this function irrelevant in those cases.
|
|
|
|
func EnableVerkleAtGenesis(db ethdb.Database, genesis *Genesis) (bool, error) {
|
|
|
|
if genesis != nil {
|
|
|
|
if genesis.Config == nil {
|
|
|
|
return false, errGenesisNoConfig
|
|
|
|
}
|
|
|
|
return genesis.Config.EnableVerkleAtGenesis, nil
|
|
|
|
}
|
|
|
|
if ghash := rawdb.ReadCanonicalHash(db, 0); ghash != (common.Hash{}) {
|
|
|
|
chainCfg := rawdb.ReadChainConfig(db, ghash)
|
|
|
|
if chainCfg != nil {
|
|
|
|
return chainCfg.EnableVerkleAtGenesis, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false, nil
|
|
|
|
}
|
|
|
|
|
2017-03-02 07:03:33 -06:00
|
|
|
// 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),
|
|
|
|
}
|
2015-11-17 10:33:25 -06:00
|
|
|
}
|
|
|
|
|
2021-11-08 05:06:01 -06:00
|
|
|
// 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),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-08-25 10:11:40 -05:00
|
|
|
// DefaultHoleskyGenesisBlock returns the Holesky network genesis block.
|
|
|
|
func DefaultHoleskyGenesisBlock() *Genesis {
|
|
|
|
return &Genesis{
|
|
|
|
Config: params.HoleskyChainConfig,
|
|
|
|
Nonce: 0x1234,
|
|
|
|
GasLimit: 0x17d7840,
|
|
|
|
Difficulty: big.NewInt(0x01),
|
2023-09-25 08:10:23 -05:00
|
|
|
Timestamp: 1695902100,
|
2023-08-25 10:11:40 -05:00
|
|
|
Alloc: decodePrealloc(holeskyAllocData),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-10 04:50:16 -06:00
|
|
|
// DeveloperGenesisBlock returns the 'geth --dev' genesis block.
|
2023-11-22 05:08:39 -06:00
|
|
|
func DeveloperGenesisBlock(gasLimit uint64, faucet *common.Address) *Genesis {
|
2017-10-24 05:40:42 -05:00
|
|
|
// Override the default period to the user requested one
|
2023-07-06 03:42:34 -05:00
|
|
|
config := *params.AllDevChainProtocolChanges
|
2017-10-24 05:40:42 -05:00
|
|
|
|
|
|
|
// Assemble and return the genesis with the precompiles and faucet pre-funded
|
2023-11-22 05:08:39 -06:00
|
|
|
genesis := &Genesis{
|
2017-10-24 05:40:42 -05:00
|
|
|
Config: &config,
|
2021-11-16 06:45:02 -06:00
|
|
|
GasLimit: gasLimit,
|
2021-06-15 05:56:14 -05:00
|
|
|
BaseFee: big.NewInt(params.InitialBaseFee),
|
2024-04-08 06:01:22 -05:00
|
|
|
Difficulty: big.NewInt(0),
|
2024-02-16 12:05:33 -06:00
|
|
|
Alloc: map[common.Address]types.Account{
|
2017-11-08 04:45:52 -06:00
|
|
|
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
|
2020-07-16 07:08:38 -05:00
|
|
|
common.BytesToAddress([]byte{9}): {Balance: big.NewInt(1)}, // BLAKE2b
|
2024-10-11 14:36:13 -05:00
|
|
|
// Pre-deploy system contracts
|
|
|
|
params.BeaconRootsAddress: {Nonce: 1, Code: params.BeaconRootsCode, Balance: common.Big0},
|
|
|
|
params.HistoryStorageAddress: {Nonce: 1, Code: params.HistoryStorageCode, Balance: common.Big0},
|
|
|
|
params.WithdrawalQueueAddress: {Nonce: 1, Code: params.WithdrawalQueueCode, Balance: common.Big0},
|
|
|
|
params.ConsolidationQueueAddress: {Nonce: 1, Code: params.ConsolidationQueueCode, Balance: common.Big0},
|
2017-10-24 05:40:42 -05:00
|
|
|
},
|
2016-11-20 15:32:31 -06:00
|
|
|
}
|
2023-11-22 05:08:39 -06:00
|
|
|
if faucet != nil {
|
2024-02-16 12:05:33 -06:00
|
|
|
genesis.Alloc[*faucet] = types.Account{Balance: new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(9))}
|
2023-11-22 05:08:39 -06:00
|
|
|
}
|
|
|
|
return genesis
|
2016-11-20 15:32:31 -06:00
|
|
|
}
|
|
|
|
|
2024-02-16 12:05:33 -06:00
|
|
|
func decodePrealloc(data string) types.GenesisAlloc {
|
2023-08-25 10:11:40 -05:00
|
|
|
var p []struct {
|
|
|
|
Addr *big.Int
|
|
|
|
Balance *big.Int
|
|
|
|
Misc *struct {
|
|
|
|
Nonce uint64
|
|
|
|
Code []byte
|
|
|
|
Slots []struct {
|
|
|
|
Key common.Hash
|
|
|
|
Val common.Hash
|
|
|
|
}
|
|
|
|
} `rlp:"optional"`
|
|
|
|
}
|
2017-03-02 07:03:33 -06:00
|
|
|
if err := rlp.NewStream(strings.NewReader(data), 0).Decode(&p); err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2024-02-16 12:05:33 -06:00
|
|
|
ga := make(types.GenesisAlloc, len(p))
|
2017-03-02 07:03:33 -06:00
|
|
|
for _, account := range p {
|
2024-02-16 12:05:33 -06:00
|
|
|
acc := types.Account{Balance: account.Balance}
|
2023-08-25 10:11:40 -05:00
|
|
|
if account.Misc != nil {
|
|
|
|
acc.Nonce = account.Misc.Nonce
|
|
|
|
acc.Code = account.Misc.Code
|
|
|
|
|
|
|
|
acc.Storage = make(map[common.Hash]common.Hash)
|
|
|
|
for _, slot := range account.Misc.Slots {
|
|
|
|
acc.Storage[slot.Key] = slot.Val
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ga[common.BigToAddress(account.Addr)] = acc
|
2017-01-09 05:09:37 -06:00
|
|
|
}
|
2017-03-02 07:03:33 -06:00
|
|
|
return ga
|
2015-11-17 10:33:25 -06:00
|
|
|
}
|