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
}
mainLoop:
for {
select {
case <-ctx.Done():
return nil
default:
}
fetchHead := func() (*types.Header, bool) {
currentHead, err := getLatestHeader(f.client)
if err != nil {
fmt.Println("Could not fetch head block", err)
select {
case <-ctx.Done():
return nil
case <-time.After(time.Second):
}
continue mainLoop
return nil, false
}
headerCache.Add(currentHead.Hash(), currentHead)
var query *filterQuery
if lastHead != nil && currentHead.Hash() == lastHead.Hash() {
query = f.newQuery()
} else {
return currentHead, false
}
f.blockLimit = currentHead.Number.Int64()
ca := commonAncestor(lastHead, currentHead)
fmt.Print("*** New head ", f.blockLimit)
@ -114,8 +102,77 @@ mainLoop:
}
fmt.Println()
}
query = f.newHeadSeedQuery(f.blockLimit)
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.run(f.client, nil)
@ -124,27 +181,12 @@ mainLoop:
continue
}
fmt.Println("New query from:", query.FromBlock, "to:", query.ToBlock, "results:", len(query.results))
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")
if len(query.results) == 0 || len(query.results) > maxFilterResultSize {
continue mainLoop
}
if extQuery.Err != nil {
extQuery.printError()
if query = tryExtendQuery(query); query == nil {
continue mainLoop
}
if len(extQuery.results) > maxFilterResultSize {
break
}
query = extQuery
}
if !query.checkLastBlockHash(f.client) {
fmt.Println("Reorg during search")
@ -164,14 +206,18 @@ mainLoop:
fmt.Println("Results mismatch from:", query.FromBlock, "to:", query.ToBlock, "addresses:", query.Address, "topics:", query.Topics)
resShared, resGetLogs, resReceipts := compareResults(query.results, results)
fmt.Println(" shared:", len(resShared))
fmt.Println(" only from getLogs:", resGetLogs)
fmt.Println(" only from receipts:", resReceipts)
fmt.Println(" only from getLogs:", len(resGetLogs), resGetLogs)
fmt.Println(" only from receipts:", len(resReceipts), resReceipts)
if mmQuery != query {
mmQuery = query
mmRetry = 0
mmNextRetry = 1
}
continue mainLoop
}
fmt.Println("Successful query from:", query.FromBlock, "to:", query.ToBlock, "results:", len(query.results))
f.storeQuery(query)
}
}
}
func compareResults(a, b []types.Log) (shared, onlya, onlyb []types.Log) {