From d3e61fbdfab8f78c58f86079087aa84d38c041dc Mon Sep 17 00:00:00 2001 From: Krish Date: Fri, 22 Sep 2023 10:33:35 +0800 Subject: [PATCH] fix: use cache first when get StorageTrie/Trie --- core/state/database.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/core/state/database.go b/core/state/database.go index da26719816..f604f0408f 100644 --- a/core/state/database.go +++ b/core/state/database.go @@ -238,19 +238,39 @@ func (db *cachingDB) purgeLoop() { // OpenTrie opens the main account trie at a specific root hash. func (db *cachingDB) OpenTrie(root common.Hash) (Trie, error) { + //try cache first + if db.accountTrieCache != nil { + if tr, ok := db.accountTrieCache.Get(root); ok { + return tr.(*trie.SecureTrie), nil + } + } + tr, err := trie.NewStateTrie(trie.StateTrieID(root), db.triedb) if err != nil { return nil, err } + return tr, nil } // OpenStorageTrie opens the storage trie of an account. func (db *cachingDB) OpenStorageTrie(stateRoot common.Hash, addrHash, root common.Hash) (Trie, error) { + // try cache first + if db.storageTrieCache != nil { + if tries, exist := db.storageTrieCache.Get(addrHash); exist { + for _, triePair := range tries { + if triePair != nil && triePair.root == root { + return triePair.trie.(*trie.SecureTrie).Copy(), nil + } + } + } + } + tr, err := trie.NewStateTrie(trie.StorageTrieID(stateRoot, addrHash, root), db.triedb) if err != nil { return nil, err } + return tr, nil }