Skip to content

Commit aa224a6

Browse files
committed
eth/protocols/snap: use trie to serve trie healing requests if snapshot is unavailable
1 parent b60dec9 commit aa224a6

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

eth/protocols/snap/handler.go

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ import (
2323

2424
"github.com/ethereum/go-ethereum/common"
2525
"github.com/ethereum/go-ethereum/core"
26+
"github.com/ethereum/go-ethereum/core/types"
2627
"github.com/ethereum/go-ethereum/light"
2728
"github.com/ethereum/go-ethereum/log"
2829
"github.com/ethereum/go-ethereum/metrics"
2930
"github.com/ethereum/go-ethereum/p2p"
3031
"github.com/ethereum/go-ethereum/p2p/enode"
3132
"github.com/ethereum/go-ethereum/p2p/enr"
33+
"github.com/ethereum/go-ethereum/rlp"
3234
"github.com/ethereum/go-ethereum/trie"
3335
)
3436

@@ -518,17 +520,30 @@ func ServiceGetTrieNodesQuery(chain *core.BlockChain, req *GetTrieNodesPacket, s
518520
bytes += uint64(len(blob))
519521

520522
default:
523+
var stRoot common.Hash
521524
// Storage slots requested, open the storage trie and retrieve from there
522525
if snap == nil {
523-
// We don't have the requested state snapshotted yet (or it is stale), bail out.
524-
break
525-
}
526-
account, err := snap.Account(common.BytesToHash(pathset[0]))
527-
loads++ // always account database reads, even for failures
528-
if err != nil || account == nil {
529-
break
526+
var account types.StateAccount
527+
// We don't have the requested state snapshotted yet (or it is stale).
528+
// We can look up the account from the account trie instead.
529+
blob, resolved, err := accTrie.TryGetNode(pathset[0])
530+
loads += resolved // always account database reads, even for failures
531+
if err != nil {
532+
break
533+
}
534+
if err = rlp.DecodeBytes(blob, &account); err != nil {
535+
break
536+
}
537+
stRoot = account.Root
538+
} else {
539+
account, err := snap.Account(common.BytesToHash(pathset[0]))
540+
loads++ // always account database reads, even for failures
541+
if err != nil || account == nil {
542+
break
543+
}
544+
stRoot = common.BytesToHash(account.Root)
530545
}
531-
id := trie.StorageTrieID(req.Root, common.BytesToHash(pathset[0]), common.BytesToHash(account.Root))
546+
id := trie.StorageTrieID(req.Root, common.BytesToHash(pathset[0]), stRoot)
532547
stTrie, err := trie.NewStateTrie(id, triedb)
533548
loads++ // always account database reads, even for failures
534549
if err != nil {

0 commit comments

Comments
 (0)