This commit is contained in:
Zsolt Felfoldi 2025-04-22 12:53:58 +02:00
parent c5a8a1be2f
commit 27d8609ac8

View file

@ -78,28 +78,16 @@ func filterFuzzCmd(ctx *cli.Context) error {
return newPtr return newPtr
} }
mainLoop: fetchHead := func() (*types.Header, bool) {
for {
select {
case <-ctx.Done():
return nil
default:
}
currentHead, err := getLatestHeader(f.client) currentHead, err := getLatestHeader(f.client)
if err != nil { if err != nil {
fmt.Println("Could not fetch head block", err) fmt.Println("Could not fetch head block", err)
select { return nil, false
case <-ctx.Done():
return nil
case <-time.After(time.Second):
}
continue mainLoop
} }
headerCache.Add(currentHead.Hash(), currentHead) headerCache.Add(currentHead.Hash(), currentHead)
var query *filterQuery
if lastHead != nil && currentHead.Hash() == lastHead.Hash() { if lastHead != nil && currentHead.Hash() == lastHead.Hash() {
query = f.newQuery() return currentHead, false
} else { }
f.blockLimit = currentHead.Number.Int64() f.blockLimit = currentHead.Number.Int64()
ca := commonAncestor(lastHead, currentHead) ca := commonAncestor(lastHead, currentHead)
fmt.Print("*** New head ", f.blockLimit) fmt.Print("*** New head ", f.blockLimit)
@ -114,8 +102,77 @@ mainLoop:
} }
fmt.Println() fmt.Println()
} }
query = f.newHeadSeedQuery(f.blockLimit)
lastHead = currentHead lastHead = currentHead
return currentHead, true
}
tryExtendQuery := func(query *filterQuery) *filterQuery {
for {
extQuery := f.extendRange(query)
if extQuery == nil {
return query
}
extQuery.checkLastBlockHash(f.client)
extQuery.run(f.client, nil)
if extQuery.Err == nil && len(extQuery.results) == 0 {
// query is useless now due to major reorg; abandon and continue
fmt.Println("Zero length results")
return nil
}
if extQuery.Err != nil {
extQuery.printError()
return nil
}
if len(extQuery.results) > maxFilterResultSize {
return query
}
query = extQuery
}
}
var (
mmQuery *filterQuery
mmRetry, mmNextRetry int
)
mainLoop:
for {
select {
case <-ctx.Done():
return nil
default:
}
var query *filterQuery
if mmQuery != nil {
if mmRetry == 0 {
query = mmQuery
mmRetry = mmNextRetry
mmNextRetry *= 2
query.checkLastBlockHash(f.client)
query.run(f.client, nil)
if query.Err != nil {
query.printError()
continue
}
fmt.Println("Retrying query from:", query.FromBlock, "to:", query.ToBlock, "results:", len(query.results))
} else {
mmRetry--
}
}
if query == nil {
currentHead, isNewHead := fetchHead()
if currentHead == nil {
select {
case <-ctx.Done():
return nil
case <-time.After(time.Second):
}
continue mainLoop
}
if isNewHead {
query = f.newHeadSeedQuery(currentHead.Number.Int64())
} else {
query = f.newQuery()
} }
query.checkLastBlockHash(f.client) query.checkLastBlockHash(f.client)
query.run(f.client, nil) query.run(f.client, nil)
@ -124,27 +181,12 @@ mainLoop:
continue continue
} }
fmt.Println("New query from:", query.FromBlock, "to:", query.ToBlock, "results:", len(query.results)) fmt.Println("New query from:", query.FromBlock, "to:", query.ToBlock, "results:", len(query.results))
if len(query.results) > 0 && len(query.results) <= maxFilterResultSize { if len(query.results) == 0 || len(query.results) > maxFilterResultSize {
for {
extQuery := f.extendRange(query)
if extQuery == nil {
break
}
extQuery.checkLastBlockHash(f.client)
extQuery.run(f.client, nil)
if extQuery.Err == nil && len(extQuery.results) == 0 {
// query is useless now due to major reorg; abandon and continue
fmt.Println("Zero length results")
continue mainLoop continue mainLoop
} }
if extQuery.Err != nil { if query = tryExtendQuery(query); query == nil {
extQuery.printError()
continue mainLoop continue mainLoop
} }
if len(extQuery.results) > maxFilterResultSize {
break
}
query = extQuery
} }
if !query.checkLastBlockHash(f.client) { if !query.checkLastBlockHash(f.client) {
fmt.Println("Reorg during search") fmt.Println("Reorg during search")
@ -164,15 +206,19 @@ mainLoop:
fmt.Println("Results mismatch from:", query.FromBlock, "to:", query.ToBlock, "addresses:", query.Address, "topics:", query.Topics) fmt.Println("Results mismatch from:", query.FromBlock, "to:", query.ToBlock, "addresses:", query.Address, "topics:", query.Topics)
resShared, resGetLogs, resReceipts := compareResults(query.results, results) resShared, resGetLogs, resReceipts := compareResults(query.results, results)
fmt.Println(" shared:", len(resShared)) fmt.Println(" shared:", len(resShared))
fmt.Println(" only from getLogs:", resGetLogs) fmt.Println(" only from getLogs:", len(resGetLogs), resGetLogs)
fmt.Println(" only from receipts:", resReceipts) fmt.Println(" only from receipts:", len(resReceipts), resReceipts)
if mmQuery != query {
mmQuery = query
mmRetry = 0
mmNextRetry = 1
}
continue mainLoop continue mainLoop
} }
fmt.Println("Successful query from:", query.FromBlock, "to:", query.ToBlock, "results:", len(query.results)) fmt.Println("Successful query from:", query.FromBlock, "to:", query.ToBlock, "results:", len(query.results))
f.storeQuery(query) f.storeQuery(query)
} }
} }
}
func compareResults(a, b []types.Log) (shared, onlya, onlyb []types.Log) { func compareResults(a, b []types.Log) (shared, onlya, onlyb []types.Log) {
for len(a) > 0 && len(b) > 0 { for len(a) > 0 && len(b) > 0 {