@@ -24,7 +24,8 @@ import (
24
24
)
25
25
26
26
var accountsDone atomic.Uint64
27
- var trieCheckers chan struct {}
27
+ var numLoaders int
28
+ var trieLoaders chan struct {}
28
29
29
30
type dbs struct {
30
31
zkDb * leveldb.Database
@@ -54,33 +55,19 @@ func main() {
54
55
zkRootHash := common .HexToHash (* zkRoot )
55
56
mptRootHash := common .HexToHash (* mptRoot )
56
57
57
- numTrieCheckers : = runtime .GOMAXPROCS (0 ) * (* parallelismMultipler )
58
- trieCheckers = make (chan struct {}, numTrieCheckers )
59
- for i := 0 ; i < numTrieCheckers ; i ++ {
60
- trieCheckers <- struct {}{}
58
+ numLoaders = runtime .GOMAXPROCS (0 ) * (* parallelismMultipler )
59
+ trieLoaders = make (chan struct {}, numLoaders )
60
+ for i := 0 ; i < numLoaders ; i ++ {
61
+ trieLoaders <- struct {}{}
61
62
}
62
63
63
- done := make (chan struct {})
64
- totalCheckers := len (trieCheckers )
65
- go func () {
66
- for {
67
- select {
68
- case <- done :
69
- return
70
- case <- time .After (time .Minute ):
71
- fmt .Println ("Active checkers:" , totalCheckers - len (trieCheckers ))
72
- }
73
- }
74
- }()
75
- defer close (done )
76
-
77
64
checkTrieEquality (& dbs {
78
65
zkDb : zkDb ,
79
66
mptDb : mptDb ,
80
67
}, zkRootHash , mptRootHash , "" , checkAccountEquality , true , * paranoid )
81
68
82
- for i := 0 ; i < numTrieCheckers ; i ++ {
83
- <- trieCheckers
69
+ for i := 0 ; i < numLoaders ; i ++ {
70
+ <- trieLoaders
84
71
}
85
72
}
86
73
@@ -177,8 +164,9 @@ func checkAccountEquality(label string, dbs *dbs, zkAccountBytes, mptAccountByte
177
164
} else if zkAccount .Root != (common.Hash {}) {
178
165
zkRoot := common .BytesToHash (zkAccount .Root [:])
179
166
mptRoot := common .BytesToHash (mptAccount .Root [:])
180
- <- trieCheckers
167
+ <- trieLoaders
181
168
go func () {
169
+ trieLoaders <- struct {}{}
182
170
defer func () {
183
171
if p := recover (); p != nil {
184
172
fmt .Println (p )
@@ -189,7 +177,6 @@ func checkAccountEquality(label string, dbs *dbs, zkAccountBytes, mptAccountByte
189
177
checkTrieEquality (dbs , zkRoot , mptRoot , label , checkStorageEquality , false , paranoid )
190
178
accountsDone .Add (1 )
191
179
fmt .Println ("Accounts done:" , accountsDone .Load ())
192
- trieCheckers <- struct {}{}
193
180
}()
194
181
} else {
195
182
accountsDone .Add (1 )
@@ -207,42 +194,33 @@ func checkStorageEquality(label string, _ *dbs, zkStorageBytes, mptStorageBytes
207
194
}
208
195
}
209
196
210
- func loadMPT (mptTrie * trie.SecureTrie , parallel bool ) chan map [string ][]byte {
197
+ func loadMPT (mptTrie * trie.SecureTrie , top bool ) chan map [string ][]byte {
211
198
startKey := make ([]byte , 32 )
212
- workers := 1 << 5
213
- if ! parallel {
214
- workers = 1
215
- }
216
- step := byte (0xFF ) / byte (workers )
217
-
218
199
mptLeafMap := make (map [string ][]byte , 1000 )
219
200
var mptLeafMutex sync.Mutex
220
201
221
202
var mptWg sync.WaitGroup
222
- for i := 0 ; i < workers ; i ++ {
223
- startKey [0 ] = byte (i ) * step
203
+ for i := 0 ; i < 255 ; i ++ {
204
+ startKey [0 ] = byte (i )
224
205
trieIt := trie .NewIterator (mptTrie .NodeIterator (startKey ))
225
206
226
207
mptWg .Add (1 )
208
+ <- trieLoaders
227
209
go func () {
228
- defer mptWg .Done ()
210
+ defer func () {
211
+ mptWg .Done ()
212
+ trieLoaders <- struct {}{}
213
+ }()
229
214
for trieIt .Next () {
230
- if parallel {
231
- mptLeafMutex .Lock ()
232
- }
233
-
215
+ mptLeafMutex .Lock ()
234
216
if _ , ok := mptLeafMap [string (trieIt .Key )]; ok {
235
217
mptLeafMutex .Unlock ()
236
218
break
237
219
}
238
-
239
220
mptLeafMap [string (dup (trieIt .Key ))] = dup (trieIt .Value )
221
+ mptLeafMutex .Unlock ()
240
222
241
- if parallel {
242
- mptLeafMutex .Unlock ()
243
- }
244
-
245
- if parallel && len (mptLeafMap )% 10000 == 0 {
223
+ if top && len (mptLeafMap )% 10000 == 0 {
246
224
fmt .Println ("MPT Accounts Loaded:" , len (mptLeafMap ))
247
225
}
248
226
}
@@ -257,7 +235,8 @@ func loadMPT(mptTrie *trie.SecureTrie, parallel bool) chan map[string][]byte {
257
235
return respChan
258
236
}
259
237
260
- func loadZkTrie (zkTrie * trie.ZkTrie , parallel , paranoid bool ) chan map [string ][]byte {
238
+ func loadZkTrie (zkTrie * trie.ZkTrie , top , paranoid bool ) chan map [string ][]byte {
239
+ parallelismCutoffDepth := 8
261
240
zkLeafMap := make (map [string ][]byte , 1000 )
262
241
var zkLeafMutex sync.Mutex
263
242
zkDone := make (chan map [string ][]byte )
@@ -268,20 +247,20 @@ func loadZkTrie(zkTrie *trie.ZkTrie, parallel, paranoid bool) chan map[string][]
268
247
panic (fmt .Sprintf ("preimage not found zk trie %s" , hex .EncodeToString (key )))
269
248
}
270
249
271
- if parallel {
272
- zkLeafMutex .Lock ()
273
- }
274
-
250
+ zkLeafMutex .Lock ()
275
251
zkLeafMap [string (dup (preimageKey ))] = value
252
+ zkLeafMutex .Unlock ()
276
253
277
- if parallel {
278
- zkLeafMutex .Unlock ()
279
- }
280
-
281
- if parallel && len (zkLeafMap )% 10000 == 0 {
254
+ if top && len (zkLeafMap )% 10000 == 0 {
282
255
fmt .Println ("ZK Accounts Loaded:" , len (zkLeafMap ))
283
256
}
284
- }, parallel , paranoid )
257
+ }, func (f func ()) {
258
+ <- trieLoaders
259
+ go func () {
260
+ f ()
261
+ trieLoaders <- struct {}{}
262
+ }()
263
+ }, parallelismCutoffDepth , paranoid )
285
264
zkDone <- zkLeafMap
286
265
}()
287
266
return zkDone
0 commit comments