Skip to content

Commit 614e040

Browse files
rjl493456442holiman
authored andcommitted
all: introduce trie owner notion (ethereum#24750)
* cmd, core/state, light, trie, eth: add trie owner notion * all: refactor * tests: fix goimports * core/state/snapshot: fix ineffasigns Co-authored-by: Martin Holst Swende <martin@swende.se>
1 parent 7dcc6d0 commit 614e040

40 files changed

+563
-533
lines changed

cmd/geth/dbcmd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ func dbDumpTrie(ctx *cli.Context) error {
519519
return err
520520
}
521521
}
522-
theTrie, err := trie.New(stRoot, trie.NewDatabase(db))
522+
theTrie, err := trie.New(common.Hash{}, stRoot, trie.NewDatabase(db))
523523
if err != nil {
524524
return err
525525
}

cmd/geth/snapshot.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ func traverseState(ctx *cli.Context) error {
278278
log.Info("Start traversing the state", "root", root, "number", headBlock.NumberU64())
279279
}
280280
triedb := trie.NewDatabase(chaindb)
281-
t, err := trie.NewSecure(root, triedb)
281+
t, err := trie.NewSecure(common.Hash{}, root, triedb)
282282
if err != nil {
283283
log.Error("Failed to open trie", "root", root, "err", err)
284284
return err
@@ -299,7 +299,7 @@ func traverseState(ctx *cli.Context) error {
299299
return err
300300
}
301301
if acc.Root != emptyRoot {
302-
storageTrie, err := trie.NewSecure(acc.Root, triedb)
302+
storageTrie, err := trie.NewSecure(common.BytesToHash(accIter.Key), acc.Root, triedb)
303303
if err != nil {
304304
log.Error("Failed to open storage trie", "root", acc.Root, "err", err)
305305
return err
@@ -367,7 +367,7 @@ func traverseRawState(ctx *cli.Context) error {
367367
log.Info("Start traversing the state", "root", root, "number", headBlock.NumberU64())
368368
}
369369
triedb := trie.NewDatabase(chaindb)
370-
t, err := trie.NewSecure(root, triedb)
370+
t, err := trie.NewSecure(common.Hash{}, root, triedb)
371371
if err != nil {
372372
log.Error("Failed to open trie", "root", root, "err", err)
373373
return err
@@ -413,7 +413,7 @@ func traverseRawState(ctx *cli.Context) error {
413413
return errors.New("invalid account")
414414
}
415415
if acc.Root != emptyRoot {
416-
storageTrie, err := trie.NewSecure(acc.Root, triedb)
416+
storageTrie, err := trie.NewSecure(common.BytesToHash(accIter.LeafKey()), acc.Root, triedb)
417417
if err != nil {
418418
log.Error("Failed to open storage trie", "root", acc.Root, "err", err)
419419
return errors.New("missing storage trie")

core/blockchain.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,7 @@ func (bc *BlockChain) SnapSyncCommitHead(hash common.Hash) error {
675675
if block == nil {
676676
return fmt.Errorf("non existent block [%x..]", hash[:4])
677677
}
678-
if _, err := trie.NewSecure(block.Root(), bc.stateCache.TrieDB()); err != nil {
678+
if _, err := trie.NewSecure(common.Hash{}, block.Root(), bc.stateCache.TrieDB()); err != nil {
679679
return err
680680
}
681681

core/state/database.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ type cachingDB struct {
133133

134134
// OpenTrie opens the main account trie at a specific root hash.
135135
func (db *cachingDB) OpenTrie(root common.Hash) (Trie, error) {
136-
tr, err := trie.NewSecure(root, db.db)
136+
tr, err := trie.NewSecure(common.Hash{}, root, db.db)
137137
if err != nil {
138138
return nil, err
139139
}
@@ -142,7 +142,7 @@ func (db *cachingDB) OpenTrie(root common.Hash) (Trie, error) {
142142

143143
// OpenStorageTrie opens the storage trie of an account.
144144
func (db *cachingDB) OpenStorageTrie(addrHash, root common.Hash) (Trie, error) {
145-
tr, err := trie.NewSecure(root, db.db)
145+
tr, err := trie.NewSecure(addrHash, root, db.db)
146146
if err != nil {
147147
return nil, err
148148
}

core/state/pruner/pruner.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ func extractGenesis(db ethdb.Database, stateBloom *stateBloom) error {
410410
if genesis == nil {
411411
return errors.New("missing genesis block")
412412
}
413-
t, err := trie.NewSecure(genesis.Root(), trie.NewDatabase(db))
413+
t, err := trie.NewSecure(common.Hash{}, genesis.Root(), trie.NewDatabase(db))
414414
if err != nil {
415415
return err
416416
}
@@ -430,7 +430,7 @@ func extractGenesis(db ethdb.Database, stateBloom *stateBloom) error {
430430
return err
431431
}
432432
if acc.Root != emptyRoot {
433-
storageTrie, err := trie.NewSecure(acc.Root, trie.NewDatabase(db))
433+
storageTrie, err := trie.NewSecure(common.BytesToHash(accIter.LeafKey()), acc.Root, trie.NewDatabase(db))
434434
if err != nil {
435435
return err
436436
}

core/state/snapshot/conversion.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ type trieKV struct {
4343
type (
4444
// trieGeneratorFn is the interface of trie generation which can
4545
// be implemented by different trie algorithm.
46-
trieGeneratorFn func(db ethdb.KeyValueWriter, in chan (trieKV), out chan (common.Hash))
46+
trieGeneratorFn func(db ethdb.KeyValueWriter, owner common.Hash, in chan (trieKV), out chan (common.Hash))
4747

4848
// leafCallbackFn is the callback invoked at the leaves of the trie,
4949
// returns the subtrie root with the specified subtrie identifier.
@@ -253,7 +253,7 @@ func generateTrieRoot(db ethdb.KeyValueWriter, it Iterator, account common.Hash,
253253
wg.Add(1)
254254
go func() {
255255
defer wg.Done()
256-
generatorFn(db, in, out)
256+
generatorFn(db, account, in, out)
257257
}()
258258
// Spin up a go-routine for progress logging
259259
if report && stats != nil {
@@ -360,8 +360,8 @@ func generateTrieRoot(db ethdb.KeyValueWriter, it Iterator, account common.Hash,
360360
return stop(nil)
361361
}
362362

363-
func stackTrieGenerate(db ethdb.KeyValueWriter, in chan trieKV, out chan common.Hash) {
364-
t := trie.NewStackTrie(db)
363+
func stackTrieGenerate(db ethdb.KeyValueWriter, owner common.Hash, in chan trieKV, out chan common.Hash) {
364+
t := trie.NewStackTrieWithOwner(db, owner)
365365
for leaf := range in {
366366
t.TryUpdate(leaf.key[:], leaf.value)
367367
}

core/state/snapshot/generate.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ func (result *proofResult) forEach(callback func(key []byte, val []byte) error)
166166
//
167167
// The proof result will be returned if the range proving is finished, otherwise
168168
// the error will be returned to abort the entire procedure.
169-
func (dl *diskLayer) proveRange(ctx *generatorContext, root common.Hash, prefix []byte, kind string, origin []byte, max int, valueConvertFn func([]byte) ([]byte, error)) (*proofResult, error) {
169+
func (dl *diskLayer) proveRange(ctx *generatorContext, owner common.Hash, root common.Hash, prefix []byte, kind string, origin []byte, max int, valueConvertFn func([]byte) ([]byte, error)) (*proofResult, error) {
170170
var (
171171
keys [][]byte
172172
vals [][]byte
@@ -234,7 +234,7 @@ func (dl *diskLayer) proveRange(ctx *generatorContext, root common.Hash, prefix
234234

235235
// The snap state is exhausted, pass the entire key/val set for verification
236236
if origin == nil && !diskMore {
237-
stackTr := trie.NewStackTrie(nil)
237+
stackTr := trie.NewStackTrieWithOwner(nil, owner)
238238
for i, key := range keys {
239239
stackTr.TryUpdate(key, vals[i])
240240
}
@@ -248,7 +248,7 @@ func (dl *diskLayer) proveRange(ctx *generatorContext, root common.Hash, prefix
248248
return &proofResult{keys: keys, vals: vals}, nil
249249
}
250250
// Snap state is chunked, generate edge proofs for verification.
251-
tr, err := trie.New(root, dl.triedb)
251+
tr, err := trie.New(owner, root, dl.triedb)
252252
if err != nil {
253253
ctx.stats.Log("Trie missing, state snapshotting paused", dl.root, dl.genMarker)
254254
return nil, errMissingTrie
@@ -313,9 +313,9 @@ type onStateCallback func(key []byte, val []byte, write bool, delete bool) error
313313
// generateRange generates the state segment with particular prefix. Generation can
314314
// either verify the correctness of existing state through range-proof and skip
315315
// generation, or iterate trie to regenerate state on demand.
316-
func (dl *diskLayer) generateRange(ctx *generatorContext, root common.Hash, prefix []byte, kind string, origin []byte, max int, onState onStateCallback, valueConvertFn func([]byte) ([]byte, error)) (bool, []byte, error) {
316+
func (dl *diskLayer) generateRange(ctx *generatorContext, owner common.Hash, root common.Hash, prefix []byte, kind string, origin []byte, max int, onState onStateCallback, valueConvertFn func([]byte) ([]byte, error)) (bool, []byte, error) {
317317
// Use range prover to check the validity of the flat state in the range
318-
result, err := dl.proveRange(ctx, root, prefix, kind, origin, max, valueConvertFn)
318+
result, err := dl.proveRange(ctx, owner, root, prefix, kind, origin, max, valueConvertFn)
319319
if err != nil {
320320
return false, nil, err
321321
}
@@ -363,7 +363,7 @@ func (dl *diskLayer) generateRange(ctx *generatorContext, root common.Hash, pref
363363
if len(result.keys) > 0 {
364364
snapNodeCache = memorydb.New()
365365
snapTrieDb := trie.NewDatabase(snapNodeCache)
366-
snapTrie, _ := trie.New(common.Hash{}, snapTrieDb)
366+
snapTrie, _ := trie.New(owner, common.Hash{}, snapTrieDb)
367367
for i, key := range result.keys {
368368
snapTrie.Update(key, result.vals[i])
369369
}
@@ -374,7 +374,7 @@ func (dl *diskLayer) generateRange(ctx *generatorContext, root common.Hash, pref
374374
// if it's already opened with some nodes resolved.
375375
tr := result.tr
376376
if tr == nil {
377-
tr, err = trie.New(root, dl.triedb)
377+
tr, err = trie.New(owner, root, dl.triedb)
378378
if err != nil {
379379
ctx.stats.Log("Trie missing, state snapshotting paused", dl.root, dl.genMarker)
380380
return false, nil, errMissingTrie
@@ -537,7 +537,7 @@ func generateStorages(ctx *generatorContext, dl *diskLayer, account common.Hash,
537537
// Loop for re-generating the missing storage slots.
538538
var origin = common.CopyBytes(storeMarker)
539539
for {
540-
exhausted, last, err := dl.generateRange(ctx, storageRoot, append(rawdb.SnapshotStoragePrefix, account.Bytes()...), snapStorage, origin, storageCheckRange, onStorage, nil)
540+
exhausted, last, err := dl.generateRange(ctx, account, storageRoot, append(rawdb.SnapshotStoragePrefix, account.Bytes()...), snapStorage, origin, storageCheckRange, onStorage, nil)
541541
if err != nil {
542542
return err // The procedure it aborted, either by external signal or internal error.
543543
}
@@ -637,7 +637,7 @@ func generateAccounts(ctx *generatorContext, dl *diskLayer, accMarker []byte) er
637637
}
638638
origin := common.CopyBytes(accMarker)
639639
for {
640-
exhausted, last, err := dl.generateRange(ctx, dl.root, rawdb.SnapshotAccountPrefix, snapAccount, origin, accountRange, onAccount, FullAccountRLP)
640+
exhausted, last, err := dl.generateRange(ctx, common.Hash{}, dl.root, rawdb.SnapshotAccountPrefix, snapAccount, origin, accountRange, onAccount, FullAccountRLP)
641641
if err != nil {
642642
return err // The procedure it aborted, either by external signal or internal error.
643643
}

0 commit comments

Comments
 (0)