Skip to content

Commit

Permalink
fix: use cache first when get StorageTrie/Trie
Browse files Browse the repository at this point in the history
  • Loading branch information
krish-nr committed Sep 22, 2023
1 parent 0b3e557 commit de4694e
Showing 1 changed file with 38 additions and 0 deletions.
38 changes: 38 additions & 0 deletions core/state/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -238,19 +238,57 @@ 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
}

//update LRU
if db.accountTrieCache != nil {
db.accountTrieCache.Add(root, tr.ResetCopy())
}
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.root == root {
return triePair.trie, nil
}
}
}
}

tr, err := trie.NewStateTrie(trie.StorageTrieID(stateRoot, addrHash, root), db.triedb)
if err != nil {
return nil, err
}

if db.storageTrieCache != nil {
tries, exist := db.storageTrieCache.Get(addrHash)
var newTriesArray [3]*triePair
if exist {
newTriesArray = [3]*triePair{
{root: root, trie: tr.ResetCopy()},
tries[0],
tries[1],
}
} else {
newTriesArray = [3]*triePair{{root: root, trie: tr.ResetCopy()}, nil, nil}
}
db.storageTrieCache.Add(addrHash, newTriesArray)
}
return tr, nil
}

Expand Down

0 comments on commit de4694e

Please sign in to comment.