@@ -26,23 +26,46 @@ import (
2626 "github.com/ava-labs/libevm/core/rawdb"
2727 "github.com/ava-labs/libevm/core/state/snapshot"
2828 "github.com/ava-labs/libevm/core/types"
29+ "github.com/ava-labs/libevm/ethdb"
2930 "github.com/ava-labs/libevm/libevm/stateconf"
31+ "github.com/ava-labs/libevm/trie"
32+ "github.com/ava-labs/libevm/trie/trienode"
33+ "github.com/ava-labs/libevm/trie/triestate"
34+ "github.com/ava-labs/libevm/triedb"
35+ "github.com/ava-labs/libevm/triedb/database"
36+ "github.com/ava-labs/libevm/triedb/hashdb"
3037)
3138
3239func TestStateDBCommitPropagatesOptions (t * testing.T ) {
40+ memdb := rawdb .NewMemoryDatabase ()
41+ triedb := triedb .NewDatabase (
42+ memdb ,
43+ & triedb.Config {
44+ DBOverride : func (_ ethdb.Database ) triedb.DBOverride {
45+ return & triedbRecorder {Database : hashdb .New (memdb , nil , & trie.MerkleResolver {})}
46+ },
47+ },
48+ )
3349 var rec snapTreeRecorder
34- sdb , err := New (types .EmptyRootHash , NewDatabase ( rawdb . NewMemoryDatabase () ), & rec )
50+ sdb , err := New (types .EmptyRootHash , NewDatabaseWithNodeDB ( memdb , triedb ), & rec )
3551 require .NoError (t , err , "New()" )
3652
3753 // Ensures that rec.Update() will be called.
3854 sdb .SetNonce (common.Address {}, 42 )
3955
40- const payload = "hello world"
41- opt := stateconf .WithUpdatePayload (payload )
42- _ , err = sdb .Commit (0 , false , opt )
43- require .NoErrorf (t , err , "%T.Commit(..., %T)" , sdb , opt )
56+ const snapshotPayload = "hello world"
57+ const trieDBPayload = "goodbye world"
58+ snapshotOpt := stateconf .WithSnapshotUpdatePayload (snapshotPayload )
59+ triedbOpt := stateconf .WithTrieDBUpdatePayload (trieDBPayload )
60+ _ , err = sdb .Commit (0 , false , stateconf .WithSnapshotUpdateOpts (snapshotOpt ), stateconf .WithTrieDBUpdateOpts (triedbOpt ))
61+ require .NoErrorf (t , err , "%T.Commit(..., %T, %T)" , sdb , snapshotOpt , triedbOpt )
4462
45- assert .Equalf (t , payload , rec .gotPayload , "%T payload propagated via %T.Commit() to %T.Update()" , opt , sdb , rec )
63+ assert .Equalf (t , snapshotPayload , rec .gotPayload , "%T payload propagated via %T.Commit() to %T.Update()" , snapshotOpt , sdb , rec )
64+ innerTrieDB , ok := triedb .Backend ().(* triedbRecorder )
65+ if ! ok {
66+ t .Fatalf ("expected %T to be a *triedbRecorder" , triedb .Backend ())
67+ }
68+ assert .Equalf (t , trieDBPayload , innerTrieDB .gotPayload , "%T payload propagated via %T.Commit() to %T.Update()" , triedbOpt , sdb , rec )
4669}
4770
4871type snapTreeRecorder struct {
@@ -57,9 +80,9 @@ func (*snapTreeRecorder) Cap(common.Hash, int) error {
5780func (r * snapTreeRecorder ) Update (
5881 _ , _ common.Hash ,
5982 _ map [common.Hash ]struct {}, _ map [common.Hash ][]byte , _ map [common.Hash ]map [common.Hash ][]byte ,
60- opts ... stateconf.StateUpdateOption ,
83+ opts ... stateconf.SnapshotUpdateOption ,
6184) error {
62- r .gotPayload = stateconf .ExtractUpdatePayload (opts ... )
85+ r .gotPayload = stateconf .ExtractSnapshotUpdatePayload (opts ... )
6386 return nil
6487}
6588
@@ -78,3 +101,24 @@ func (snapshotStub) Account(common.Hash) (*types.SlimAccount, error) {
78101func (snapshotStub ) Root () common.Hash {
79102 return common.Hash {}
80103}
104+
105+ type triedbRecorder struct {
106+ * hashdb.Database
107+ gotPayload any
108+ }
109+
110+ func (r * triedbRecorder ) Update (
111+ root common.Hash ,
112+ parent common.Hash ,
113+ block uint64 ,
114+ nodes * trienode.MergedNodeSet ,
115+ states * triestate.Set ,
116+ opts ... stateconf.TrieDBUpdateOption ,
117+ ) error {
118+ r .gotPayload = stateconf .ExtractTrieDBUpdatePayload (opts ... )
119+ return r .Database .Update (root , parent , block , nodes , states )
120+ }
121+
122+ func (r * triedbRecorder ) Reader (_ common.Hash ) (database.Reader , error ) {
123+ return r .Database .Reader (common.Hash {})
124+ }
0 commit comments