core/state/snapshot, tests: sync snap gen + snaps in consensus tests
This commit is contained in:
@ -45,11 +45,13 @@ func TestBlockchain(t *testing.T) {
|
||||
bt.skipLoad(`.*randomStatetest94.json.*`)
|
||||
|
||||
bt.walk(t, blockTestDir, func(t *testing.T, name string, test *BlockTest) {
|
||||
if err := bt.checkFailure(t, name, test.Run()); err != nil {
|
||||
t.Error(err)
|
||||
if err := bt.checkFailure(t, name+"/trie", test.Run(false)); err != nil {
|
||||
t.Errorf("test without snapshotter failed: %v", err)
|
||||
}
|
||||
if err := bt.checkFailure(t, name+"/snap", test.Run(true)); err != nil {
|
||||
t.Errorf("test with snapshotter failed: %v", err)
|
||||
}
|
||||
})
|
||||
|
||||
// There is also a LegacyTests folder, containing blockchain tests generated
|
||||
// prior to Istanbul. However, they are all derived from GeneralStateTests,
|
||||
// which run natively, so there's no reason to run them here.
|
||||
|
@ -94,7 +94,7 @@ type btHeaderMarshaling struct {
|
||||
Timestamp math.HexOrDecimal64
|
||||
}
|
||||
|
||||
func (t *BlockTest) Run() error {
|
||||
func (t *BlockTest) Run(snapshotter bool) error {
|
||||
config, ok := Forks[t.json.Network]
|
||||
if !ok {
|
||||
return UnsupportedForkError{t.json.Network}
|
||||
@ -118,7 +118,12 @@ func (t *BlockTest) Run() error {
|
||||
} else {
|
||||
engine = ethash.NewShared()
|
||||
}
|
||||
chain, err := core.NewBlockChain(db, &core.CacheConfig{TrieCleanLimit: 0}, config, engine, vm.Config{}, nil)
|
||||
cache := &core.CacheConfig{TrieCleanLimit: 0}
|
||||
if snapshotter {
|
||||
cache.SnapshotLimit = 1
|
||||
cache.SnapshotWait = true
|
||||
}
|
||||
chain, err := core.NewBlockChain(db, cache, config, engine, vm.Config{}, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -63,10 +63,17 @@ func TestState(t *testing.T) {
|
||||
subtest := subtest
|
||||
key := fmt.Sprintf("%s/%d", subtest.Fork, subtest.Index)
|
||||
name := name + "/" + key
|
||||
t.Run(key, func(t *testing.T) {
|
||||
|
||||
t.Run(key+"/trie", func(t *testing.T) {
|
||||
withTrace(t, test.gasLimit(subtest), func(vmconfig vm.Config) error {
|
||||
_, err := test.Run(subtest, vmconfig)
|
||||
return st.checkFailure(t, name, err)
|
||||
_, err := test.Run(subtest, vmconfig, false)
|
||||
return st.checkFailure(t, name+"/trie", err)
|
||||
})
|
||||
})
|
||||
t.Run(key+"/snap", func(t *testing.T) {
|
||||
withTrace(t, test.gasLimit(subtest), func(vmconfig vm.Config) error {
|
||||
_, err := test.Run(subtest, vmconfig, true)
|
||||
return st.checkFailure(t, name+"/snap", err)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
@ -24,6 +24,8 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/ethereum/go-ethereum/core/state/snapshot"
|
||||
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||
"github.com/ethereum/go-ethereum/common/math"
|
||||
@ -145,8 +147,8 @@ func (t *StateTest) Subtests() []StateSubtest {
|
||||
}
|
||||
|
||||
// Run executes a specific subtest and verifies the post-state and logs
|
||||
func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) (*state.StateDB, error) {
|
||||
statedb, root, err := t.RunNoVerify(subtest, vmconfig)
|
||||
func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config, snapshotter bool) (*state.StateDB, error) {
|
||||
statedb, root, err := t.RunNoVerify(subtest, vmconfig, snapshotter)
|
||||
if err != nil {
|
||||
return statedb, err
|
||||
}
|
||||
@ -163,14 +165,14 @@ func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) (*state.StateD
|
||||
}
|
||||
|
||||
// RunNoVerify runs a specific subtest and returns the statedb and post-state root
|
||||
func (t *StateTest) RunNoVerify(subtest StateSubtest, vmconfig vm.Config) (*state.StateDB, common.Hash, error) {
|
||||
func (t *StateTest) RunNoVerify(subtest StateSubtest, vmconfig vm.Config, snapshotter bool) (*state.StateDB, common.Hash, error) {
|
||||
config, eips, err := getVMConfig(subtest.Fork)
|
||||
if err != nil {
|
||||
return nil, common.Hash{}, UnsupportedForkError{subtest.Fork}
|
||||
}
|
||||
vmconfig.ExtraEips = eips
|
||||
block := t.genesis(config).ToBlock(nil)
|
||||
statedb := MakePreState(rawdb.NewMemoryDatabase(), t.json.Pre)
|
||||
statedb := MakePreState(rawdb.NewMemoryDatabase(), t.json.Pre, snapshotter)
|
||||
|
||||
post := t.json.Post[subtest.Fork][subtest.Index]
|
||||
msg, err := t.json.Tx.toMessage(post)
|
||||
@ -204,7 +206,7 @@ func (t *StateTest) gasLimit(subtest StateSubtest) uint64 {
|
||||
return t.json.Tx.GasLimit[t.json.Post[subtest.Fork][subtest.Index].Indexes.Gas]
|
||||
}
|
||||
|
||||
func MakePreState(db ethdb.Database, accounts core.GenesisAlloc) *state.StateDB {
|
||||
func MakePreState(db ethdb.Database, accounts core.GenesisAlloc, snapshotter bool) *state.StateDB {
|
||||
sdb := state.NewDatabase(db)
|
||||
statedb, _ := state.New(common.Hash{}, sdb, nil)
|
||||
for addr, a := range accounts {
|
||||
@ -217,7 +219,12 @@ func MakePreState(db ethdb.Database, accounts core.GenesisAlloc) *state.StateDB
|
||||
}
|
||||
// Commit and re-open to start with a clean state.
|
||||
root, _ := statedb.Commit(false)
|
||||
statedb, _ = state.New(root, sdb, nil)
|
||||
|
||||
var snaps *snapshot.Tree
|
||||
if snapshotter {
|
||||
snaps = snapshot.New(db, sdb.TrieDB(), 1, root, false)
|
||||
}
|
||||
statedb, _ = state.New(root, sdb, snaps)
|
||||
return statedb
|
||||
}
|
||||
|
||||
|
@ -45,7 +45,6 @@ type ttFork struct {
|
||||
}
|
||||
|
||||
func (tt *TransactionTest) Run(config *params.ChainConfig) error {
|
||||
|
||||
validateTx := func(rlpData hexutil.Bytes, signer types.Signer, isHomestead bool, isIstanbul bool) (*common.Address, *common.Hash, error) {
|
||||
tx := new(types.Transaction)
|
||||
if err := rlp.DecodeBytes(rlpData, tx); err != nil {
|
||||
|
@ -30,7 +30,10 @@ func TestVM(t *testing.T) {
|
||||
|
||||
vmt.walk(t, vmTestDir, func(t *testing.T, name string, test *VMTest) {
|
||||
withTrace(t, test.json.Exec.GasLimit, func(vmconfig vm.Config) error {
|
||||
return vmt.checkFailure(t, name, test.Run(vmconfig))
|
||||
return vmt.checkFailure(t, name+"/trie", test.Run(vmconfig, false))
|
||||
})
|
||||
withTrace(t, test.json.Exec.GasLimit, func(vmconfig vm.Config) error {
|
||||
return vmt.checkFailure(t, name+"/snap", test.Run(vmconfig, true))
|
||||
})
|
||||
})
|
||||
}
|
||||
|
@ -78,8 +78,8 @@ type vmExecMarshaling struct {
|
||||
GasPrice *math.HexOrDecimal256
|
||||
}
|
||||
|
||||
func (t *VMTest) Run(vmconfig vm.Config) error {
|
||||
statedb := MakePreState(rawdb.NewMemoryDatabase(), t.json.Pre)
|
||||
func (t *VMTest) Run(vmconfig vm.Config, snapshotter bool) error {
|
||||
statedb := MakePreState(rawdb.NewMemoryDatabase(), t.json.Pre, snapshotter)
|
||||
ret, gasRemaining, err := t.exec(statedb, vmconfig)
|
||||
|
||||
if t.json.GasRemaining == nil {
|
||||
|
Reference in New Issue
Block a user