mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-26 14:46:42 +00:00
1
This commit is contained in:
parent
c5a8a1be2f
commit
27d8609ac8
1 changed files with 128 additions and 82 deletions
|
|
@ -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,14 +206,18 @@ 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) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue