Skip to content

Commit c924f0d

Browse files
committed
1
1 parent e2380e9 commit c924f0d

File tree

6 files changed

+60
-42
lines changed

6 files changed

+60
-42
lines changed

core/filtermaps/filtermaps.go

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -188,20 +188,15 @@ func (f *FilterMaps) GetLogByLvIndex(lvIndex uint64) (*types.Log, error) {
188188
if err != nil {
189189
return nil, err
190190
}
191-
if lvPointer <= lvIndex {
192-
return nil, errors.New("log value index not found")
193-
}
194-
for i := len(receipts) - 1; i >= 0; i-- {
195-
logs := receipts[i].Logs
196-
for j := len(logs) - 1; j >= 0; j-- {
197-
log := logs[j]
198-
lvPointer -= uint64(len(log.Topics) + 1)
191+
for _, receipt := range receipts {
192+
for _, log := range receipt.Logs {
193+
if lvPointer > lvIndex {
194+
return nil, errors.New("log value index not found")
195+
}
199196
if lvPointer == lvIndex {
200197
return log, nil
201198
}
202-
if lvPointer < lvIndex {
203-
return nil, nil
204-
}
199+
lvPointer += uint64(len(log.Topics) + 1)
205200
}
206201
}
207202
return nil, errors.New("log value index not found")
@@ -378,7 +373,7 @@ func (row FilterRow) potentialMatches(mapIndex uint32, logValue common.Hash) (re
378373
xor2 := binary.LittleEndian.Uint32(transformHash[24:28])
379374
mul4 := uint32ModInverse(binary.LittleEndian.Uint32(transformHash[28:32])*2 + 1)
380375
for _, columnIndex := range row {
381-
if potentialSubIndex := (((((((columnIndex - sub1) * mul1) ^ xor1) * mul2) - sub2) * mul3) ^ xor2) * mul4; potentialSubIndex < valuesPerMap {
376+
if potentialSubIndex := (((((((columnIndex * mul4) ^ xor2) * mul3) - sub2) * mul2) ^ xor1) * mul1) - sub1; potentialSubIndex < valuesPerMap {
382377
results = append(results, uint64(mapIndex)*valuesPerMap+uint64(potentialSubIndex))
383378
}
384379
}

core/filtermaps/indexer.go

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,12 @@ func (f *FilterMaps) updateLoop() {
5656
return
5757
}
5858
}
59-
if fmr := f.getRange(); fmr.initialized && fmr.headBlockHash == head.Hash() {
60-
select {
61-
case ev := <-headEventCh:
62-
head = ev.Block.Header()
63-
case ch := <-f.closeCh:
64-
close(ch)
65-
return
66-
}
59+
select {
60+
case ev := <-headEventCh:
61+
head = ev.Block.Header()
62+
case ch := <-f.closeCh:
63+
close(ch)
64+
return
6765
}
6866
}
6967
}
@@ -310,7 +308,9 @@ func (u *updateBatch) addBlockToHead(header *types.Header, receipts types.Receip
310308
number := header.Number.Uint64()
311309
u.blockLvPointer[number] = u.headLvPointer
312310
startMap := uint32((u.headLvPointer + valuesPerMap - 1) >> logValuesPerMap)
313-
iterateReceipts(receipts, u.addValueToHead)
311+
if err := iterateReceipts(receipts, u.addValueToHead); err != nil {
312+
return err
313+
}
314314
stopMap := uint32((u.headLvPointer + valuesPerMap - 1) >> logValuesPerMap)
315315
for m := startMap; m < stopMap; m++ {
316316
u.mapBlockPtr[m] = number
@@ -345,7 +345,9 @@ func (u *updateBatch) removeBlockFromHead(header *types.Header, receipts types.R
345345
number := header.Number.Uint64()
346346
u.blockLvPointer[number] = removedPointer
347347
stopMap := uint32(u.headLvPointer >> logValuesPerMap)
348-
iterateReceiptsReverse(receipts, u.removeValueFromHead)
348+
if err := iterateReceiptsReverse(receipts, u.removeValueFromHead); err != nil {
349+
return err
350+
}
349351
startMap := uint32(u.headLvPointer >> logValuesPerMap)
350352
for m := startMap; m < stopMap; m++ {
351353
u.mapBlockPtr[m] = removedPointer
@@ -380,7 +382,13 @@ func (u *updateBatch) addBlockToTail(header *types.Header, receipts types.Receip
380382
}
381383
number := header.Number.Uint64()
382384
stopMap := uint32((u.tailLvPointer + valuesPerMap - 1) >> logValuesPerMap)
383-
iterateReceiptsReverse(receipts, u.addValueToTail)
385+
var cnt int
386+
if err := iterateReceiptsReverse(receipts, func(lv common.Hash) error {
387+
cnt++
388+
return u.addValueToTail(lv)
389+
}); err != nil {
390+
return err
391+
}
384392
startMap := uint32(u.tailLvPointer >> logValuesPerMap)
385393
for m := startMap; m < stopMap; m++ {
386394
u.mapBlockPtr[m] = number
@@ -397,7 +405,9 @@ func iterateReceipts(receipts types.Receipts, valueCb func(common.Hash) error) e
397405
return err
398406
}
399407
for _, topic := range log.Topics {
400-
valueCb(topicValue(topic))
408+
if err := valueCb(topicValue(topic)); err != nil {
409+
return err
410+
}
401411
}
402412
}
403413
}

core/filtermaps/matcher.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func GetPotentialMatches(ctx context.Context, backend Backend, firstBlock, lastB
2323
if err != nil {
2424
return nil, err
2525
}
26-
firstMap, lastMap := uint32(firstIndex>>logMapsPerEpoch), uint32(lastIndex>>logMapsPerEpoch)
26+
firstMap, lastMap := uint32(firstIndex>>logValuesPerMap), uint32(lastIndex>>logValuesPerMap)
2727

2828
matcher := make(matchSequence, len(topics)+1)
2929
matchAddress := make(matchAny, len(addresses))
@@ -267,7 +267,7 @@ func (c *cachedMatcher) getMatches(ctx context.Context, mapIndex uint32) (potent
267267
}
268268
c.lock.Unlock()
269269
if existed {
270-
if cm.matches != nil {
270+
if cm.reqCh == nil {
271271
return cm.matches, nil
272272
}
273273
select {

core/rawdb/accessors_indexes.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,11 @@ func DeleteBloombits(db ethdb.Database, bit uint, from uint64, to uint64) {
183183
}
184184

185185
func ReadFilterMapRow(db ethdb.KeyValueReader, mapRowIndex uint64) ([]byte, error) {
186-
return db.Get(filterMapRowKey(mapRowIndex))
186+
key := filterMapRowKey(mapRowIndex)
187+
if has, err := db.Has(key); !has || err != nil {
188+
return nil, err
189+
}
190+
return db.Get(key)
187191
}
188192

189193
func WriteFilterMapRow(db ethdb.KeyValueWriter, mapRowIndex uint64, rowEnc []byte) {

core/rawdb/schema.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
"github.com/ethereum/go-ethereum/metrics"
2727
)
2828

29-
const testFmPrefix = "fT2-"
29+
const testFmPrefix = "fT4-"
3030

3131
// The fields below define the low level database schema prefixing.
3232
var (

eth/filters/filter.go

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@ package filters
1919
import (
2020
"context"
2121
"errors"
22+
"fmt"
2223
"math/big"
24+
"reflect"
2325
"slices"
26+
"time"
2427

2528
"github.com/ethereum/go-ethereum/common"
2629
"github.com/ethereum/go-ethereum/core/bloombits"
@@ -149,21 +152,27 @@ func (f *Filter) Logs(ctx context.Context) ([]*types.Log, error) {
149152
return nil, err
150153
}
151154

155+
start := time.Now()
152156
logs, err := filtermaps.GetPotentialMatches(ctx, f.sys.backend, uint64(f.begin), uint64(f.end), f.addresses, f.topics)
153-
logs = filterLogs(logs, nil, nil, f.addresses, f.topics)
154-
return logs, err
155-
156-
//TODO switch/compare
157-
/* logChan, errChan := f.rangeLogsAsync(ctx)
158-
var logs []*types.Log
159-
for {
160-
select {
161-
case log := <-logChan:
162-
logs = append(logs, log)
163-
case err := <-errChan:
164-
return logs, err
165-
}
166-
}*/
157+
fmLogs := filterLogs(logs, nil, nil, f.addresses, f.topics)
158+
fmt.Println("fm runtime", time.Since(start))
159+
160+
//TODO remove
161+
start = time.Now()
162+
logChan, errChan := f.rangeLogsAsync(ctx)
163+
var bbLogs []*types.Log
164+
loop:
165+
for {
166+
select {
167+
case log := <-logChan:
168+
bbLogs = append(bbLogs, log)
169+
case <-errChan:
170+
break loop
171+
}
172+
}
173+
fmt.Println("bb runtime", time.Since(start))
174+
fmt.Println("DeepEqual", reflect.DeepEqual(fmLogs, bbLogs))
175+
return fmLogs, err
167176
}
168177

169178
// rangeLogsAsync retrieves block-range logs that match the filter criteria asynchronously,

0 commit comments

Comments
 (0)