@@ -22,6 +22,7 @@ package builder
2222import (
2323 "github.com/ethereum/go-ethereum/common"
2424 "github.com/ethereum/go-ethereum/common/hexutil"
25+ "github.com/ethereum/go-ethereum/core"
2526 "github.com/ethereum/go-ethereum/core/state"
2627 "github.com/ethereum/go-ethereum/ethdb"
2728 "github.com/ethereum/go-ethereum/log"
@@ -35,25 +36,27 @@ type Builder interface {
3536
3637type builder struct {
3738 chainDB ethdb.Database
38- trieDB * trie.Database
39- cachedTrie * trie.Trie
39+ blockChain * core.BlockChain
4040}
4141
42- func NewBuilder (db ethdb.Database ) * builder {
42+ type AccountsMap map [common.Hash ]* state.Account
43+
44+ func NewBuilder (db ethdb.Database , blockChain * core.BlockChain ) * builder {
4345 return & builder {
44- chainDB : db ,
45- trieDB : trie . NewDatabase ( db ) ,
46+ chainDB : db ,
47+ blockChain : blockChain ,
4648 }
4749}
4850
4951func (sdb * builder ) BuildStateDiff (oldStateRoot , newStateRoot common.Hash , blockNumber int64 , blockHash common.Hash ) (* StateDiff , error ) {
5052 // Generate tries for old and new states
51- oldTrie , err := trie .New (oldStateRoot , sdb .trieDB )
53+ stateCache := sdb .blockChain .StateCache ()
54+ oldTrie , err := stateCache .OpenTrie (oldStateRoot )
5255 if err != nil {
5356 log .Error ("Error creating trie for oldStateRoot" , "error" , err )
5457 return nil , err
5558 }
56- newTrie , err := trie . New (newStateRoot , sdb . trieDB )
59+ newTrie , err := stateCache . OpenTrie (newStateRoot )
5760 if err != nil {
5861 log .Error ("Error creating trie for newStateRoot" , "error" , err )
5962 return nil , err
@@ -108,33 +111,27 @@ func (sdb *builder) BuildStateDiff(oldStateRoot, newStateRoot common.Hash, block
108111 }, nil
109112}
110113
111- func (sdb * builder ) collectDiffNodes (a , b trie.NodeIterator ) (map [common. Address ] * state. Account , error ) {
112- var diffAccounts = make (map [common. Address ] * state. Account )
114+ func (sdb * builder ) collectDiffNodes (a , b trie.NodeIterator ) (AccountsMap , error ) {
115+ var diffAccounts = make (AccountsMap )
113116 it , _ := trie .NewDifferenceIterator (a , b )
114117
115118 for {
116119 log .Debug ("Current Path and Hash" , "path" , pathToStr (it ), "hashold" , it .Hash ())
117120 if it .Leaf () {
118-
119- // lookup address
120- path := make ([]byte , len (it .Path ())- 1 )
121- copy (path , it .Path ())
122- addr , err := sdb .addressByPath (path )
123- if err != nil {
124- log .Error ("Error looking up address via path" , "path" , path , "error" , err )
125- return nil , err
126- }
121+ leafKey := make ([]byte , len (it .LeafKey ()))
122+ copy (leafKey , it .LeafKey ())
123+ leafKeyHash := common .BytesToHash (leafKey )
127124
128125 // lookup account state
129126 var account state.Account
130127 if err := rlp .DecodeBytes (it .LeafBlob (), & account ); err != nil {
131- log .Error ("Error looking up account via address" , "address" , addr , "error" , err )
128+ log .Error ("Error looking up account via address" , "address" , leafKeyHash , "error" , err )
132129 return nil , err
133130 }
134131
135132 // record account to diffs (creation if we are looking at new - old; deletion if old - new)
136- log .Debug ("Account lookup successful" , "address" , addr , "account" , account )
137- diffAccounts [* addr ] = & account
133+ log .Debug ("Account lookup successful" , "address" , leafKeyHash , "account" , account )
134+ diffAccounts [leafKeyHash ] = & account
138135 }
139136 cont := it .Next (true )
140137 if ! cont {
@@ -145,8 +142,8 @@ func (sdb *builder) collectDiffNodes(a, b trie.NodeIterator) (map[common.Address
145142 return diffAccounts , nil
146143}
147144
148- func (sdb * builder ) buildDiffEventual (accounts map [common. Address ] * state. Account ) (map [common. Address ] AccountDiff , error ) {
149- accountDiffs := make (map [common. Address ] AccountDiff )
145+ func (sdb * builder ) buildDiffEventual (accounts AccountsMap ) (AccountDiffsMap , error ) {
146+ accountDiffs := make (AccountDiffsMap )
150147 for addr , val := range accounts {
151148 sr := val .Root
152149 storageDiffs , err := sdb .buildStorageDiffsEventual (sr )
@@ -172,11 +169,11 @@ func (sdb *builder) buildDiffEventual(accounts map[common.Address]*state.Account
172169 return accountDiffs , nil
173170}
174171
175- func (sdb * builder ) buildDiffIncremental (creations map [common. Address ] * state. Account , deletions map [common. Address ] * state. Account , updatedKeys []string ) (map [common. Address ] AccountDiff , error ) {
176- updatedAccounts := make (map [common. Address ] AccountDiff )
172+ func (sdb * builder ) buildDiffIncremental (creations AccountsMap , deletions AccountsMap , updatedKeys []string ) (AccountDiffsMap , error ) {
173+ updatedAccounts := make (AccountDiffsMap )
177174 for _ , val := range updatedKeys {
178- createdAcc := creations [common .HexToAddress (val )]
179- deletedAcc := deletions [common .HexToAddress (val )]
175+ createdAcc := creations [common .HexToHash (val )]
176+ deletedAcc := deletions [common .HexToHash (val )]
180177 oldSR := deletedAcc .Root
181178 newSR := createdAcc .Root
182179 if storageDiffs , err := sdb .buildStorageDiffsIncremental (oldSR , newSR ); err != nil {
@@ -190,23 +187,24 @@ func (sdb *builder) buildDiffIncremental(creations map[common.Address]*state.Acc
190187 nHexRoot := createdAcc .Root .Hex ()
191188 contractRoot := DiffString {Value : & nHexRoot }
192189
193- updatedAccounts [common .HexToAddress (val )] = AccountDiff {
190+ updatedAccounts [common .HexToHash (val )] = AccountDiff {
194191 Nonce : nonce ,
195192 Balance : balance ,
196193 CodeHash : codeHash ,
197194 ContractRoot : contractRoot ,
198195 Storage : storageDiffs ,
199196 }
200- delete (creations , common .HexToAddress (val ))
201- delete (deletions , common .HexToAddress (val ))
197+ delete (creations , common .HexToHash (val ))
198+ delete (deletions , common .HexToHash (val ))
202199 }
203200 }
204201 return updatedAccounts , nil
205202}
206203
207204func (sdb * builder ) buildStorageDiffsEventual (sr common.Hash ) (map [string ]DiffStorage , error ) {
208205 log .Debug ("Storage Root For Eventual Diff" , "root" , sr .Hex ())
209- sTrie , err := trie .New (sr , sdb .trieDB )
206+ stateCache := sdb .blockChain .StateCache ()
207+ sTrie , err := stateCache .OpenTrie (sr )
210208 if err != nil {
211209 log .Info ("error in build storage diff eventual" , "error" , err )
212210 return nil , err
@@ -218,11 +216,13 @@ func (sdb *builder) buildStorageDiffsEventual(sr common.Hash) (map[string]DiffSt
218216
219217func (sdb * builder ) buildStorageDiffsIncremental (oldSR common.Hash , newSR common.Hash ) (map [string ]DiffStorage , error ) {
220218 log .Debug ("Storage Roots for Incremental Diff" , "old" , oldSR .Hex (), "new" , newSR .Hex ())
221- oldTrie , err := trie .New (oldSR , sdb .trieDB )
219+ stateCache := sdb .blockChain .StateCache ()
220+
221+ oldTrie , err := stateCache .OpenTrie (oldSR )
222222 if err != nil {
223223 return nil , err
224224 }
225- newTrie , err := trie . New (newSR , sdb . trieDB )
225+ newTrie , err := stateCache . OpenTrie (newSR )
226226 if err != nil {
227227 return nil , err
228228 }
0 commit comments