forked from cerc-io/plugeth
all: cleanup the APIs for initializing genesis (#25473)
* all: polish tests * core: apply feedback from Guillaume * core: fix comment
This commit is contained in:
parent
86de2e516e
commit
a41ea8a97c
@ -139,7 +139,7 @@ func loadChain(chainfile string, genesis string) (*Chain, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
gblock := gen.ToBlock(nil)
|
gblock := gen.ToBlock()
|
||||||
|
|
||||||
blocks, err := blocksFromFile(chainfile, gblock)
|
blocks, err := blocksFromFile(chainfile, gblock)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -138,7 +138,7 @@ func runCmd(ctx *cli.Context) error {
|
|||||||
gen := readGenesis(ctx.String(GenesisFlag.Name))
|
gen := readGenesis(ctx.String(GenesisFlag.Name))
|
||||||
genesisConfig = gen
|
genesisConfig = gen
|
||||||
db := rawdb.NewMemoryDatabase()
|
db := rawdb.NewMemoryDatabase()
|
||||||
genesis := gen.ToBlock(db)
|
genesis := gen.MustCommit(db)
|
||||||
statedb, _ = state.New(genesis.Root(), state.NewDatabase(db), nil)
|
statedb, _ = state.New(genesis.Root(), state.NewDatabase(db), nil)
|
||||||
chainConfig = gen.Config
|
chainConfig = gen.Config
|
||||||
} else {
|
} else {
|
||||||
|
@ -248,7 +248,7 @@ func newFaucet(genesis *core.Genesis, port int, enodes []*enode.Node, network ui
|
|||||||
cfg.SyncMode = downloader.LightSync
|
cfg.SyncMode = downloader.LightSync
|
||||||
cfg.NetworkId = network
|
cfg.NetworkId = network
|
||||||
cfg.Genesis = genesis
|
cfg.Genesis = genesis
|
||||||
utils.SetDNSDiscoveryDefaults(&cfg, genesis.ToBlock(nil).Hash())
|
utils.SetDNSDiscoveryDefaults(&cfg, genesis.ToBlock().Hash())
|
||||||
|
|
||||||
lesBackend, err := les.New(stack, &cfg)
|
lesBackend, err := les.New(stack, &cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -403,7 +403,7 @@ func TestClique(t *testing.T) {
|
|||||||
}
|
}
|
||||||
// Create a pristine blockchain with the genesis injected
|
// Create a pristine blockchain with the genesis injected
|
||||||
db := rawdb.NewMemoryDatabase()
|
db := rawdb.NewMemoryDatabase()
|
||||||
genesis.Commit(db)
|
genesisBlock := genesis.MustCommit(db)
|
||||||
|
|
||||||
// Assemble a chain of headers from the cast votes
|
// Assemble a chain of headers from the cast votes
|
||||||
config := *params.TestChainConfig
|
config := *params.TestChainConfig
|
||||||
@ -414,7 +414,7 @@ func TestClique(t *testing.T) {
|
|||||||
engine := New(config.Clique, db)
|
engine := New(config.Clique, db)
|
||||||
engine.fakeDiff = true
|
engine.fakeDiff = true
|
||||||
|
|
||||||
blocks, _ := core.GenerateChain(&config, genesis.ToBlock(db), engine, db, len(tt.votes), func(j int, gen *core.BlockGen) {
|
blocks, _ := core.GenerateChain(&config, genesisBlock, engine, db, len(tt.votes), func(j int, gen *core.BlockGen) {
|
||||||
// Cast the vote contained in this block
|
// Cast the vote contained in this block
|
||||||
gen.SetCoinbase(accounts.address(tt.votes[j].voted))
|
gen.SetCoinbase(accounts.address(tt.votes[j].voted))
|
||||||
if tt.votes[j].auth {
|
if tt.votes[j].auth {
|
||||||
|
@ -1942,7 +1942,7 @@ func testSideImport(t *testing.T, numCanonBlocksInSidechain, blocksBetweenCommon
|
|||||||
BaseFee: big.NewInt(params.InitialBaseFee),
|
BaseFee: big.NewInt(params.InitialBaseFee),
|
||||||
}
|
}
|
||||||
signer = types.LatestSigner(gspec.Config)
|
signer = types.LatestSigner(gspec.Config)
|
||||||
genesis, _ = gspec.Commit(db)
|
genesis = gspec.MustCommit(db)
|
||||||
)
|
)
|
||||||
// Generate and import the canonical chain
|
// Generate and import the canonical chain
|
||||||
diskdb := rawdb.NewMemoryDatabase()
|
diskdb := rawdb.NewMemoryDatabase()
|
||||||
|
@ -80,10 +80,12 @@ func (ga *GenesisAlloc) UnmarshalJSON(data []byte) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// flush adds allocated genesis accounts into a fresh new statedb and
|
// deriveHash computes the state root according to the genesis specification.
|
||||||
// commit the state changes into the given database handler.
|
func (ga *GenesisAlloc) deriveHash() (common.Hash, error) {
|
||||||
func (ga *GenesisAlloc) flush(db ethdb.Database) (common.Hash, error) {
|
// Create an ephemeral in-memory database for computing hash,
|
||||||
statedb, err := state.New(common.Hash{}, state.NewDatabase(db), nil)
|
// all the derived states will be discarded to not pollute disk.
|
||||||
|
db := state.NewDatabase(rawdb.NewMemoryDatabase())
|
||||||
|
statedb, err := state.New(common.Hash{}, db, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return common.Hash{}, err
|
return common.Hash{}, err
|
||||||
}
|
}
|
||||||
@ -95,25 +97,39 @@ func (ga *GenesisAlloc) flush(db ethdb.Database) (common.Hash, error) {
|
|||||||
statedb.SetState(addr, key, value)
|
statedb.SetState(addr, key, value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return statedb.Commit(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// flush is very similar with deriveHash, but the main difference is
|
||||||
|
// all the generated states will be persisted into the given database.
|
||||||
|
// Also, the genesis state specification will be flushed as well.
|
||||||
|
func (ga *GenesisAlloc) flush(db ethdb.Database) error {
|
||||||
|
statedb, err := state.New(common.Hash{}, state.NewDatabase(db), nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for addr, account := range *ga {
|
||||||
|
statedb.AddBalance(addr, account.Balance)
|
||||||
|
statedb.SetCode(addr, account.Code)
|
||||||
|
statedb.SetNonce(addr, account.Nonce)
|
||||||
|
for key, value := range account.Storage {
|
||||||
|
statedb.SetState(addr, key, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
root, err := statedb.Commit(false)
|
root, err := statedb.Commit(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return common.Hash{}, err
|
return err
|
||||||
}
|
}
|
||||||
err = statedb.Database().TrieDB().Commit(root, true, nil)
|
err = statedb.Database().TrieDB().Commit(root, true, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return common.Hash{}, err
|
return err
|
||||||
}
|
}
|
||||||
return root, nil
|
// Marshal the genesis state specification and persist.
|
||||||
}
|
|
||||||
|
|
||||||
// write writes the json marshaled genesis state into database
|
|
||||||
// with the given block hash as the unique identifier.
|
|
||||||
func (ga *GenesisAlloc) write(db ethdb.KeyValueWriter, hash common.Hash) error {
|
|
||||||
blob, err := json.Marshal(ga)
|
blob, err := json.Marshal(ga)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
rawdb.WriteGenesisState(db, hash, blob)
|
rawdb.WriteGenesisStateSpec(db, root, blob)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,7 +137,7 @@ func (ga *GenesisAlloc) write(db ethdb.KeyValueWriter, hash common.Hash) error {
|
|||||||
// hash and commits them into the given database handler.
|
// hash and commits them into the given database handler.
|
||||||
func CommitGenesisState(db ethdb.Database, hash common.Hash) error {
|
func CommitGenesisState(db ethdb.Database, hash common.Hash) error {
|
||||||
var alloc GenesisAlloc
|
var alloc GenesisAlloc
|
||||||
blob := rawdb.ReadGenesisState(db, hash)
|
blob := rawdb.ReadGenesisStateSpec(db, hash)
|
||||||
if len(blob) != 0 {
|
if len(blob) != 0 {
|
||||||
if err := alloc.UnmarshalJSON(blob); err != nil {
|
if err := alloc.UnmarshalJSON(blob); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -151,8 +167,7 @@ func CommitGenesisState(db ethdb.Database, hash common.Hash) error {
|
|||||||
return errors.New("not found")
|
return errors.New("not found")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_, err := alloc.flush(db)
|
return alloc.flush(db)
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GenesisAccount is an account in the state of the genesis block.
|
// GenesisAccount is an account in the state of the genesis block.
|
||||||
@ -273,7 +288,7 @@ func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, override
|
|||||||
genesis = DefaultGenesisBlock()
|
genesis = DefaultGenesisBlock()
|
||||||
}
|
}
|
||||||
// Ensure the stored genesis matches with the given one.
|
// Ensure the stored genesis matches with the given one.
|
||||||
hash := genesis.ToBlock(nil).Hash()
|
hash := genesis.ToBlock().Hash()
|
||||||
if hash != stored {
|
if hash != stored {
|
||||||
return genesis.Config, hash, &GenesisMismatchError{stored, hash}
|
return genesis.Config, hash, &GenesisMismatchError{stored, hash}
|
||||||
}
|
}
|
||||||
@ -286,7 +301,7 @@ func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, override
|
|||||||
}
|
}
|
||||||
// Check whether the genesis block is already written.
|
// Check whether the genesis block is already written.
|
||||||
if genesis != nil {
|
if genesis != nil {
|
||||||
hash := genesis.ToBlock(nil).Hash()
|
hash := genesis.ToBlock().Hash()
|
||||||
if hash != stored {
|
if hash != stored {
|
||||||
return genesis.Config, hash, &GenesisMismatchError{stored, hash}
|
return genesis.Config, hash, &GenesisMismatchError{stored, hash}
|
||||||
}
|
}
|
||||||
@ -347,13 +362,9 @@ func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToBlock creates the genesis block and writes state of a genesis specification
|
// ToBlock returns the genesis block according to genesis specification.
|
||||||
// to the given database (or discards it if nil).
|
func (g *Genesis) ToBlock() *types.Block {
|
||||||
func (g *Genesis) ToBlock(db ethdb.Database) *types.Block {
|
root, err := g.Alloc.deriveHash()
|
||||||
if db == nil {
|
|
||||||
db = rawdb.NewMemoryDatabase()
|
|
||||||
}
|
|
||||||
root, err := g.Alloc.flush(db)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -390,7 +401,7 @@ func (g *Genesis) ToBlock(db ethdb.Database) *types.Block {
|
|||||||
// Commit writes the block and state of a genesis specification to the database.
|
// Commit writes the block and state of a genesis specification to the database.
|
||||||
// The block is committed as the canonical head block.
|
// The block is committed as the canonical head block.
|
||||||
func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) {
|
func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) {
|
||||||
block := g.ToBlock(db)
|
block := g.ToBlock()
|
||||||
if block.Number().Sign() != 0 {
|
if block.Number().Sign() != 0 {
|
||||||
return nil, errors.New("can't commit genesis block with number > 0")
|
return nil, errors.New("can't commit genesis block with number > 0")
|
||||||
}
|
}
|
||||||
@ -404,7 +415,10 @@ func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) {
|
|||||||
if config.Clique != nil && len(block.Extra()) < 32+crypto.SignatureLength {
|
if config.Clique != nil && len(block.Extra()) < 32+crypto.SignatureLength {
|
||||||
return nil, errors.New("can't start clique chain without signers")
|
return nil, errors.New("can't start clique chain without signers")
|
||||||
}
|
}
|
||||||
if err := g.Alloc.write(db, block.Hash()); err != nil {
|
// All the checks has passed, flush the states derived from the genesis
|
||||||
|
// specification as well as the specification itself into the provided
|
||||||
|
// database.
|
||||||
|
if err := g.Alloc.flush(db); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
rawdb.WriteTd(db, block.Hash(), block.NumberU64(), block.Difficulty())
|
rawdb.WriteTd(db, block.Hash(), block.NumberU64(), block.Difficulty())
|
||||||
@ -428,15 +442,6 @@ func (g *Genesis) MustCommit(db ethdb.Database) *types.Block {
|
|||||||
return block
|
return block
|
||||||
}
|
}
|
||||||
|
|
||||||
// GenesisBlockForTesting creates and writes a block in which addr has the given wei balance.
|
|
||||||
func GenesisBlockForTesting(db ethdb.Database, addr common.Address, balance *big.Int) *types.Block {
|
|
||||||
g := Genesis{
|
|
||||||
Alloc: GenesisAlloc{addr: {Balance: balance}},
|
|
||||||
BaseFee: big.NewInt(params.InitialBaseFee),
|
|
||||||
}
|
|
||||||
return g.MustCommit(db)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DefaultGenesisBlock returns the Ethereum main net genesis block.
|
// DefaultGenesisBlock returns the Ethereum main net genesis block.
|
||||||
func DefaultGenesisBlock() *Genesis {
|
func DefaultGenesisBlock() *Genesis {
|
||||||
return &Genesis{
|
return &Genesis{
|
||||||
@ -498,6 +503,7 @@ func DefaultSepoliaGenesisBlock() *Genesis {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DefaultKilnGenesisBlock returns the kiln network genesis block.
|
||||||
func DefaultKilnGenesisBlock() *Genesis {
|
func DefaultKilnGenesisBlock() *Genesis {
|
||||||
g := new(Genesis)
|
g := new(Genesis)
|
||||||
reader := strings.NewReader(KilnAllocData)
|
reader := strings.NewReader(KilnAllocData)
|
||||||
|
@ -178,7 +178,7 @@ func TestGenesisHashes(t *testing.T) {
|
|||||||
t.Errorf("case: %d a), want: %s, got: %s", i, c.want.Hex(), have.Hex())
|
t.Errorf("case: %d a), want: %s, got: %s", i, c.want.Hex(), have.Hex())
|
||||||
}
|
}
|
||||||
// Test via ToBlock
|
// Test via ToBlock
|
||||||
if have := c.genesis.ToBlock(nil).Hash(); have != c.want {
|
if have := c.genesis.ToBlock().Hash(); have != c.want {
|
||||||
t.Errorf("case: %d a), want: %s, got: %s", i, c.want.Hex(), have.Hex())
|
t.Errorf("case: %d a), want: %s, got: %s", i, c.want.Hex(), have.Hex())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -192,11 +192,7 @@ func TestGenesis_Commit(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
db := rawdb.NewMemoryDatabase()
|
db := rawdb.NewMemoryDatabase()
|
||||||
genesisBlock, err := genesis.Commit(db)
|
genesisBlock := genesis.MustCommit(db)
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if genesis.Difficulty != nil {
|
if genesis.Difficulty != nil {
|
||||||
t.Fatalf("assumption wrong")
|
t.Fatalf("assumption wrong")
|
||||||
}
|
}
|
||||||
@ -221,12 +217,12 @@ func TestReadWriteGenesisAlloc(t *testing.T) {
|
|||||||
{1}: {Balance: big.NewInt(1), Storage: map[common.Hash]common.Hash{{1}: {1}}},
|
{1}: {Balance: big.NewInt(1), Storage: map[common.Hash]common.Hash{{1}: {1}}},
|
||||||
{2}: {Balance: big.NewInt(2), Storage: map[common.Hash]common.Hash{{2}: {2}}},
|
{2}: {Balance: big.NewInt(2), Storage: map[common.Hash]common.Hash{{2}: {2}}},
|
||||||
}
|
}
|
||||||
hash = common.HexToHash("0xdeadbeef")
|
hash, _ = alloc.deriveHash()
|
||||||
)
|
)
|
||||||
alloc.write(db, hash)
|
alloc.flush(db)
|
||||||
|
|
||||||
var reload GenesisAlloc
|
var reload GenesisAlloc
|
||||||
err := reload.UnmarshalJSON(rawdb.ReadGenesisState(db, hash))
|
err := reload.UnmarshalJSON(rawdb.ReadGenesisStateSpec(db, hash))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to load genesis state %v", err)
|
t.Fatalf("Failed to load genesis state %v", err)
|
||||||
}
|
}
|
||||||
|
@ -81,15 +81,16 @@ func WriteChainConfig(db ethdb.KeyValueWriter, hash common.Hash, cfg *params.Cha
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadGenesisState retrieves the genesis state based on the given genesis hash.
|
// ReadGenesisStateSpec retrieves the genesis state specification based on the
|
||||||
func ReadGenesisState(db ethdb.KeyValueReader, hash common.Hash) []byte {
|
// given genesis hash.
|
||||||
data, _ := db.Get(genesisKey(hash))
|
func ReadGenesisStateSpec(db ethdb.KeyValueReader, hash common.Hash) []byte {
|
||||||
|
data, _ := db.Get(genesisStateSpecKey(hash))
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteGenesisState writes the genesis state into the disk.
|
// WriteGenesisStateSpec writes the genesis state specification into the disk.
|
||||||
func WriteGenesisState(db ethdb.KeyValueWriter, hash common.Hash, data []byte) {
|
func WriteGenesisStateSpec(db ethdb.KeyValueWriter, hash common.Hash, data []byte) {
|
||||||
if err := db.Put(genesisKey(hash), data); err != nil {
|
if err := db.Put(genesisStateSpecKey(hash), data); err != nil {
|
||||||
log.Crit("Failed to store genesis state", "err", err)
|
log.Crit("Failed to store genesis state", "err", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -220,7 +220,7 @@ func configKey(hash common.Hash) []byte {
|
|||||||
return append(configPrefix, hash.Bytes()...)
|
return append(configPrefix, hash.Bytes()...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// genesisKey = genesisPrefix + hash
|
// genesisStateSpecKey = genesisPrefix + hash
|
||||||
func genesisKey(hash common.Hash) []byte {
|
func genesisStateSpecKey(hash common.Hash) []byte {
|
||||||
return append(genesisPrefix, hash.Bytes()...)
|
return append(genesisPrefix, hash.Bytes()...)
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ func generatePreMergeChain(n int) (*core.Genesis, []*types.Block) {
|
|||||||
g.AddTx(tx)
|
g.AddTx(tx)
|
||||||
testNonce++
|
testNonce++
|
||||||
}
|
}
|
||||||
gblock := genesis.ToBlock(db)
|
gblock := genesis.MustCommit(db)
|
||||||
engine := ethash.NewFaker()
|
engine := ethash.NewFaker()
|
||||||
blocks, _ := core.GenerateChain(config, gblock, engine, db, n, generate)
|
blocks, _ := core.GenerateChain(config, gblock, engine, db, n, generate)
|
||||||
totalDifficulty := big.NewInt(0)
|
totalDifficulty := big.NewInt(0)
|
||||||
|
@ -68,7 +68,11 @@ func newTesterWithNotification(t *testing.T, success func()) *downloadTester {
|
|||||||
t.Cleanup(func() {
|
t.Cleanup(func() {
|
||||||
db.Close()
|
db.Close()
|
||||||
})
|
})
|
||||||
core.GenesisBlockForTesting(db, testAddress, big.NewInt(1000000000000000))
|
gspec := core.Genesis{
|
||||||
|
Alloc: core.GenesisAlloc{testAddress: {Balance: big.NewInt(1000000000000000)}},
|
||||||
|
BaseFee: big.NewInt(params.InitialBaseFee),
|
||||||
|
}
|
||||||
|
gspec.MustCommit(db)
|
||||||
|
|
||||||
chain, err := core.NewBlockChain(db, nil, params.TestChainConfig, ethash.NewFaker(), vm.Config{}, nil, nil)
|
chain, err := core.NewBlockChain(db, nil, params.TestChainConfig, ethash.NewFaker(), vm.Config{}, nil, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -27,24 +27,18 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/consensus/ethash"
|
"github.com/ethereum/go-ethereum/consensus/ethash"
|
||||||
"github.com/ethereum/go-ethereum/core"
|
"github.com/ethereum/go-ethereum/core"
|
||||||
"github.com/ethereum/go-ethereum/core/rawdb"
|
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
"github.com/ethereum/go-ethereum/trie"
|
"github.com/ethereum/go-ethereum/trie"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
testdb = rawdb.NewMemoryDatabase()
|
|
||||||
genesis = core.GenesisBlockForTesting(testdb, testAddress, big.NewInt(1000000000000000))
|
|
||||||
)
|
|
||||||
|
|
||||||
// makeChain creates a chain of n blocks starting at and including parent.
|
// makeChain creates a chain of n blocks starting at and including parent.
|
||||||
// the returned hash chain is ordered head->parent. In addition, every 3rd block
|
// the returned hash chain is ordered head->parent. In addition, every 3rd block
|
||||||
// contains a transaction and every 5th an uncle to allow testing correct block
|
// contains a transaction and every 5th an uncle to allow testing correct block
|
||||||
// reassembly.
|
// reassembly.
|
||||||
func makeChain(n int, seed byte, parent *types.Block, empty bool) ([]*types.Block, []types.Receipts) {
|
func makeChain(n int, seed byte, parent *types.Block, empty bool) ([]*types.Block, []types.Receipts) {
|
||||||
blocks, receipts := core.GenerateChain(params.TestChainConfig, parent, ethash.NewFaker(), testdb, n, func(i int, block *core.BlockGen) {
|
blocks, receipts := core.GenerateChain(params.TestChainConfig, parent, ethash.NewFaker(), testDB, n, func(i int, block *core.BlockGen) {
|
||||||
block.SetCoinbase(common.Address{seed})
|
block.SetCoinbase(common.Address{seed})
|
||||||
// Add one tx to every secondblock
|
// Add one tx to every secondblock
|
||||||
if !empty && i%2 == 0 {
|
if !empty && i%2 == 0 {
|
||||||
@ -70,10 +64,10 @@ var emptyChain *chainData
|
|||||||
func init() {
|
func init() {
|
||||||
// Create a chain of blocks to import
|
// Create a chain of blocks to import
|
||||||
targetBlocks := 128
|
targetBlocks := 128
|
||||||
blocks, _ := makeChain(targetBlocks, 0, genesis, false)
|
blocks, _ := makeChain(targetBlocks, 0, testGenesis, false)
|
||||||
chain = &chainData{blocks, 0}
|
chain = &chainData{blocks, 0}
|
||||||
|
|
||||||
blocks, _ = makeChain(targetBlocks, 0, genesis, true)
|
blocks, _ = makeChain(targetBlocks, 0, testGenesis, true)
|
||||||
emptyChain = &chainData{blocks, 0}
|
emptyChain = &chainData{blocks, 0}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -271,7 +265,7 @@ func TestEmptyBlocks(t *testing.T) {
|
|||||||
// some more advanced scenarios
|
// some more advanced scenarios
|
||||||
func XTestDelivery(t *testing.T) {
|
func XTestDelivery(t *testing.T) {
|
||||||
// the outside network, holding blocks
|
// the outside network, holding blocks
|
||||||
blo, rec := makeChain(128, 0, genesis, false)
|
blo, rec := makeChain(128, 0, testGenesis, false)
|
||||||
world := newNetwork()
|
world := newNetwork()
|
||||||
world.receipts = rec
|
world.receipts = rec
|
||||||
world.chain = blo
|
world.chain = blo
|
||||||
|
@ -37,7 +37,12 @@ var (
|
|||||||
testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
||||||
testAddress = crypto.PubkeyToAddress(testKey.PublicKey)
|
testAddress = crypto.PubkeyToAddress(testKey.PublicKey)
|
||||||
testDB = rawdb.NewMemoryDatabase()
|
testDB = rawdb.NewMemoryDatabase()
|
||||||
testGenesis = core.GenesisBlockForTesting(testDB, testAddress, big.NewInt(1000000000000000))
|
|
||||||
|
testGspec = core.Genesis{
|
||||||
|
Alloc: core.GenesisAlloc{testAddress: {Balance: big.NewInt(1000000000000000)}},
|
||||||
|
BaseFee: big.NewInt(params.InitialBaseFee),
|
||||||
|
}
|
||||||
|
testGenesis = testGspec.MustCommit(testDB)
|
||||||
)
|
)
|
||||||
|
|
||||||
// The common prefix of all test chains:
|
// The common prefix of all test chains:
|
||||||
@ -212,7 +217,7 @@ func newTestBlockchain(blocks []*types.Block) *core.BlockChain {
|
|||||||
panic("Requested chain generation outside of init")
|
panic("Requested chain generation outside of init")
|
||||||
}
|
}
|
||||||
db := rawdb.NewMemoryDatabase()
|
db := rawdb.NewMemoryDatabase()
|
||||||
core.GenesisBlockForTesting(db, testAddress, big.NewInt(1000000000000000))
|
testGspec.MustCommit(db)
|
||||||
|
|
||||||
chain, err := core.NewBlockChain(db, nil, params.TestChainConfig, ethash.NewFaker(), vm.Config{}, nil, nil)
|
chain, err := core.NewBlockChain(db, nil, params.TestChainConfig, ethash.NewFaker(), vm.Config{}, nil, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -39,7 +39,11 @@ var (
|
|||||||
testdb = rawdb.NewMemoryDatabase()
|
testdb = rawdb.NewMemoryDatabase()
|
||||||
testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
||||||
testAddress = crypto.PubkeyToAddress(testKey.PublicKey)
|
testAddress = crypto.PubkeyToAddress(testKey.PublicKey)
|
||||||
genesis = core.GenesisBlockForTesting(testdb, testAddress, big.NewInt(1000000000000000))
|
gspec = core.Genesis{
|
||||||
|
Alloc: core.GenesisAlloc{testAddress: {Balance: big.NewInt(1000000000000000)}},
|
||||||
|
BaseFee: big.NewInt(params.InitialBaseFee),
|
||||||
|
}
|
||||||
|
genesis = gspec.MustCommit(testdb)
|
||||||
unknownBlock = types.NewBlock(&types.Header{GasLimit: params.GenesisGasLimit, BaseFee: big.NewInt(params.InitialBaseFee)}, nil, nil, nil, trie.NewStackTrie(nil))
|
unknownBlock = types.NewBlock(&types.Header{GasLimit: params.GenesisGasLimit, BaseFee: big.NewInt(params.InitialBaseFee)}, nil, nil, nil, trie.NewStackTrie(nil))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -50,10 +50,17 @@ func BenchmarkFilters(b *testing.B) {
|
|||||||
addr2 = common.BytesToAddress([]byte("jeff"))
|
addr2 = common.BytesToAddress([]byte("jeff"))
|
||||||
addr3 = common.BytesToAddress([]byte("ethereum"))
|
addr3 = common.BytesToAddress([]byte("ethereum"))
|
||||||
addr4 = common.BytesToAddress([]byte("random addresses please"))
|
addr4 = common.BytesToAddress([]byte("random addresses please"))
|
||||||
|
|
||||||
|
gspec = core.Genesis{
|
||||||
|
Alloc: core.GenesisAlloc{addr1: {Balance: big.NewInt(1000000)}},
|
||||||
|
BaseFee: big.NewInt(params.InitialBaseFee),
|
||||||
|
}
|
||||||
|
genesis = gspec.ToBlock()
|
||||||
)
|
)
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
|
||||||
genesis := core.GenesisBlockForTesting(db, addr1, big.NewInt(1000000))
|
gspec.MustCommit(db)
|
||||||
|
|
||||||
chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 100010, func(i int, gen *core.BlockGen) {
|
chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 100010, func(i int, gen *core.BlockGen) {
|
||||||
switch i {
|
switch i {
|
||||||
case 2403:
|
case 2403:
|
||||||
@ -105,10 +112,17 @@ func TestFilters(t *testing.T) {
|
|||||||
hash2 = common.BytesToHash([]byte("topic2"))
|
hash2 = common.BytesToHash([]byte("topic2"))
|
||||||
hash3 = common.BytesToHash([]byte("topic3"))
|
hash3 = common.BytesToHash([]byte("topic3"))
|
||||||
hash4 = common.BytesToHash([]byte("topic4"))
|
hash4 = common.BytesToHash([]byte("topic4"))
|
||||||
|
|
||||||
|
gspec = core.Genesis{
|
||||||
|
Alloc: core.GenesisAlloc{addr: {Balance: big.NewInt(1000000)}},
|
||||||
|
BaseFee: big.NewInt(params.InitialBaseFee),
|
||||||
|
}
|
||||||
|
genesis = gspec.ToBlock()
|
||||||
)
|
)
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
|
||||||
genesis := core.GenesisBlockForTesting(db, addr, big.NewInt(1000000))
|
gspec.MustCommit(db)
|
||||||
|
|
||||||
chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 1000, func(i int, gen *core.BlockGen) {
|
chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 1000, func(i int, gen *core.BlockGen) {
|
||||||
switch i {
|
switch i {
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -130,10 +130,8 @@ func newTestBackend(t *testing.T, londonBlock *big.Int, pending bool) *testBacke
|
|||||||
config.TerminalTotalDifficulty = common.Big0
|
config.TerminalTotalDifficulty = common.Big0
|
||||||
engine := ethash.NewFaker()
|
engine := ethash.NewFaker()
|
||||||
db := rawdb.NewMemoryDatabase()
|
db := rawdb.NewMemoryDatabase()
|
||||||
genesis, err := gspec.Commit(db)
|
genesis := gspec.MustCommit(db)
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
// Generate testing blocks
|
// Generate testing blocks
|
||||||
blocks, _ := core.GenerateChain(gspec.Config, genesis, engine, db, testHead+1, func(i int, b *core.BlockGen) {
|
blocks, _ := core.GenerateChain(gspec.Config, genesis, engine, db, testHead+1, func(i int, b *core.BlockGen) {
|
||||||
b.SetCoinbase(common.Address{1})
|
b.SetCoinbase(common.Address{1})
|
||||||
@ -163,7 +161,7 @@ func newTestBackend(t *testing.T, londonBlock *big.Int, pending bool) *testBacke
|
|||||||
})
|
})
|
||||||
// Construct testing chain
|
// Construct testing chain
|
||||||
diskdb := rawdb.NewMemoryDatabase()
|
diskdb := rawdb.NewMemoryDatabase()
|
||||||
gspec.Commit(diskdb)
|
gspec.MustCommit(diskdb)
|
||||||
chain, err := core.NewBlockChain(diskdb, &core.CacheConfig{TrieCleanNoPrefetch: true}, gspec.Config, engine, vm.Config{}, nil, nil)
|
chain, err := core.NewBlockChain(diskdb, &core.CacheConfig{TrieCleanNoPrefetch: true}, gspec.Config, engine, vm.Config{}, nil, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to create local chain, %v", err)
|
t.Fatalf("Failed to create local chain, %v", err)
|
||||||
|
@ -248,7 +248,7 @@ func generateTestChain() []*types.Block {
|
|||||||
g.AddTx(testTx2)
|
g.AddTx(testTx2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gblock := genesis.ToBlock(db)
|
gblock := genesis.MustCommit(db)
|
||||||
engine := ethash.NewFaker()
|
engine := ethash.NewFaker()
|
||||||
blocks, _ := core.GenerateChain(genesis.Config, gblock, engine, db, 2, generate)
|
blocks, _ := core.GenerateChain(genesis.Config, gblock, engine, db, 2, generate)
|
||||||
blocks = append([]*types.Block{gblock}, blocks...)
|
blocks = append([]*types.Block{gblock}, blocks...)
|
||||||
|
@ -83,7 +83,7 @@ func generateTestChain() (*core.Genesis, []*types.Block) {
|
|||||||
g.OffsetTime(5)
|
g.OffsetTime(5)
|
||||||
g.SetExtra([]byte("test"))
|
g.SetExtra([]byte("test"))
|
||||||
}
|
}
|
||||||
gblock := genesis.ToBlock(db)
|
gblock := genesis.MustCommit(db)
|
||||||
engine := ethash.NewFaker()
|
engine := ethash.NewFaker()
|
||||||
blocks, _ := core.GenerateChain(config, gblock, engine, db, 1, generate)
|
blocks, _ := core.GenerateChain(config, gblock, engine, db, 1, generate)
|
||||||
blocks = append([]*types.Block{gblock}, blocks...)
|
blocks = append([]*types.Block{gblock}, blocks...)
|
||||||
|
@ -55,7 +55,7 @@ func generatePreMergeChain(n int) (*core.Genesis, []*types.Header, []*types.Bloc
|
|||||||
Timestamp: 9000,
|
Timestamp: 9000,
|
||||||
BaseFee: big.NewInt(params.InitialBaseFee),
|
BaseFee: big.NewInt(params.InitialBaseFee),
|
||||||
}
|
}
|
||||||
gblock := genesis.ToBlock(db)
|
gblock := genesis.MustCommit(db)
|
||||||
engine := ethash.NewFaker()
|
engine := ethash.NewFaker()
|
||||||
blocks, _ := core.GenerateChain(config, gblock, engine, db, n, nil)
|
blocks, _ := core.GenerateChain(config, gblock, engine, db, n, nil)
|
||||||
totalDifficulty := big.NewInt(0)
|
totalDifficulty := big.NewInt(0)
|
||||||
|
@ -27,23 +27,17 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/consensus/ethash"
|
"github.com/ethereum/go-ethereum/consensus/ethash"
|
||||||
"github.com/ethereum/go-ethereum/core"
|
"github.com/ethereum/go-ethereum/core"
|
||||||
"github.com/ethereum/go-ethereum/core/rawdb"
|
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
testdb = rawdb.NewMemoryDatabase()
|
|
||||||
genesis = core.GenesisBlockForTesting(testdb, testAddress, big.NewInt(1000000000000000))
|
|
||||||
)
|
|
||||||
|
|
||||||
// makeChain creates a chain of n blocks starting at and including parent.
|
// makeChain creates a chain of n blocks starting at and including parent.
|
||||||
// the returned hash chain is ordered head->parent. In addition, every 3rd block
|
// the returned hash chain is ordered head->parent. In addition, every 3rd block
|
||||||
// contains a transaction and every 5th an uncle to allow testing correct block
|
// contains a transaction and every 5th an uncle to allow testing correct block
|
||||||
// reassembly.
|
// reassembly.
|
||||||
func makeChain(n int, seed byte, parent *types.Block, empty bool) ([]*types.Block, []types.Receipts) {
|
func makeChain(n int, seed byte, parent *types.Block, empty bool) ([]*types.Block, []types.Receipts) {
|
||||||
blocks, receipts := core.GenerateChain(params.TestChainConfig, parent, ethash.NewFaker(), testdb, n, func(i int, block *core.BlockGen) {
|
blocks, receipts := core.GenerateChain(params.TestChainConfig, parent, ethash.NewFaker(), testDB, n, func(i int, block *core.BlockGen) {
|
||||||
block.SetCoinbase(common.Address{seed})
|
block.SetCoinbase(common.Address{seed})
|
||||||
// Add one tx to every secondblock
|
// Add one tx to every secondblock
|
||||||
if !empty && i%2 == 0 {
|
if !empty && i%2 == 0 {
|
||||||
@ -69,10 +63,10 @@ var emptyChain *chainData
|
|||||||
func init() {
|
func init() {
|
||||||
// Create a chain of blocks to import
|
// Create a chain of blocks to import
|
||||||
targetBlocks := 128
|
targetBlocks := 128
|
||||||
blocks, _ := makeChain(targetBlocks, 0, genesis, false)
|
blocks, _ := makeChain(targetBlocks, 0, testGenesis, false)
|
||||||
chain = &chainData{blocks, 0}
|
chain = &chainData{blocks, 0}
|
||||||
|
|
||||||
blocks, _ = makeChain(targetBlocks, 0, genesis, true)
|
blocks, _ = makeChain(targetBlocks, 0, testGenesis, true)
|
||||||
emptyChain = &chainData{blocks, 0}
|
emptyChain = &chainData{blocks, 0}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -259,7 +253,7 @@ func TestEmptyBlocks(t *testing.T) {
|
|||||||
// some more advanced scenarios
|
// some more advanced scenarios
|
||||||
func XTestDelivery(t *testing.T) {
|
func XTestDelivery(t *testing.T) {
|
||||||
// the outside network, holding blocks
|
// the outside network, holding blocks
|
||||||
blo, rec := makeChain(128, 0, genesis, false)
|
blo, rec := makeChain(128, 0, testGenesis, false)
|
||||||
world := newNetwork()
|
world := newNetwork()
|
||||||
world.receipts = rec
|
world.receipts = rec
|
||||||
world.chain = blo
|
world.chain = blo
|
||||||
|
@ -35,7 +35,12 @@ var (
|
|||||||
testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
||||||
testAddress = crypto.PubkeyToAddress(testKey.PublicKey)
|
testAddress = crypto.PubkeyToAddress(testKey.PublicKey)
|
||||||
testDB = rawdb.NewMemoryDatabase()
|
testDB = rawdb.NewMemoryDatabase()
|
||||||
testGenesis = core.GenesisBlockForTesting(testDB, testAddress, big.NewInt(1000000000000000))
|
|
||||||
|
gspec = core.Genesis{
|
||||||
|
Alloc: core.GenesisAlloc{testAddress: {Balance: big.NewInt(1000000000000000)}},
|
||||||
|
BaseFee: big.NewInt(params.InitialBaseFee),
|
||||||
|
}
|
||||||
|
testGenesis = gspec.MustCommit(testDB)
|
||||||
)
|
)
|
||||||
|
|
||||||
// The common prefix of all test chains:
|
// The common prefix of all test chains:
|
||||||
|
@ -38,7 +38,12 @@ var (
|
|||||||
testdb = rawdb.NewMemoryDatabase()
|
testdb = rawdb.NewMemoryDatabase()
|
||||||
testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
||||||
testAddress = crypto.PubkeyToAddress(testKey.PublicKey)
|
testAddress = crypto.PubkeyToAddress(testKey.PublicKey)
|
||||||
genesis = core.GenesisBlockForTesting(testdb, testAddress, big.NewInt(1000000000000000))
|
|
||||||
|
gspec = core.Genesis{
|
||||||
|
Alloc: core.GenesisAlloc{testAddress: {Balance: big.NewInt(1000000000000000)}},
|
||||||
|
BaseFee: big.NewInt(params.InitialBaseFee),
|
||||||
|
}
|
||||||
|
genesis = gspec.MustCommit(testdb)
|
||||||
unknownBlock = types.NewBlock(&types.Header{GasLimit: params.GenesisGasLimit, BaseFee: big.NewInt(params.InitialBaseFee)}, nil, nil, nil, trie.NewStackTrie(nil))
|
unknownBlock = types.NewBlock(&types.Header{GasLimit: params.GenesisGasLimit, BaseFee: big.NewInt(params.InitialBaseFee)}, nil, nil, nil, trie.NewStackTrie(nil))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -28,7 +28,6 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/core"
|
"github.com/ethereum/go-ethereum/core"
|
||||||
"github.com/ethereum/go-ethereum/core/forkid"
|
"github.com/ethereum/go-ethereum/core/forkid"
|
||||||
"github.com/ethereum/go-ethereum/core/rawdb"
|
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/p2p"
|
"github.com/ethereum/go-ethereum/p2p"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enode"
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
||||||
@ -100,7 +99,7 @@ type fakeChain struct{}
|
|||||||
|
|
||||||
func (f *fakeChain) Config() *params.ChainConfig { return params.MainnetChainConfig }
|
func (f *fakeChain) Config() *params.ChainConfig { return params.MainnetChainConfig }
|
||||||
func (f *fakeChain) Genesis() *types.Block {
|
func (f *fakeChain) Genesis() *types.Block {
|
||||||
return core.DefaultGenesisBlock().ToBlock(rawdb.NewMemoryDatabase())
|
return core.DefaultGenesisBlock().ToBlock()
|
||||||
}
|
}
|
||||||
func (f *fakeChain) CurrentHeader() *types.Header { return &types.Header{Number: big.NewInt(10000000)} }
|
func (f *fakeChain) CurrentHeader() *types.Header { return &types.Header{Number: big.NewInt(10000000)} }
|
||||||
|
|
||||||
|
@ -236,7 +236,7 @@ func newNodeManager(genesis *core.Genesis) *nodeManager {
|
|||||||
return &nodeManager{
|
return &nodeManager{
|
||||||
close: make(chan struct{}),
|
close: make(chan struct{}),
|
||||||
genesis: genesis,
|
genesis: genesis,
|
||||||
genesisBlock: genesis.ToBlock(nil),
|
genesisBlock: genesis.ToBlock(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,7 +193,7 @@ func runBenchmark(b *testing.B, t *StateTest) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
vmconfig.ExtraEips = eips
|
vmconfig.ExtraEips = eips
|
||||||
block := t.genesis(config).ToBlock(nil)
|
block := t.genesis(config).ToBlock()
|
||||||
_, statedb := MakePreState(rawdb.NewMemoryDatabase(), t.json.Pre, false)
|
_, statedb := MakePreState(rawdb.NewMemoryDatabase(), t.json.Pre, false)
|
||||||
|
|
||||||
var baseFee *big.Int
|
var baseFee *big.Int
|
||||||
|
@ -184,7 +184,7 @@ func (t *StateTest) RunNoVerify(subtest StateSubtest, vmconfig vm.Config, snapsh
|
|||||||
return nil, nil, common.Hash{}, UnsupportedForkError{subtest.Fork}
|
return nil, nil, common.Hash{}, UnsupportedForkError{subtest.Fork}
|
||||||
}
|
}
|
||||||
vmconfig.ExtraEips = eips
|
vmconfig.ExtraEips = eips
|
||||||
block := t.genesis(config).ToBlock(nil)
|
block := t.genesis(config).ToBlock()
|
||||||
snaps, statedb := MakePreState(rawdb.NewMemoryDatabase(), t.json.Pre, snapshotter)
|
snaps, statedb := MakePreState(rawdb.NewMemoryDatabase(), t.json.Pre, snapshotter)
|
||||||
|
|
||||||
var baseFee *big.Int
|
var baseFee *big.Int
|
||||||
|
Loading…
Reference in New Issue
Block a user