@@ -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