Skip to content

Commit 32c2d48

Browse files
committed
eth: Fix for eth_getLogs failing w/ finalized and safe tags.
1 parent 1913b50 commit 32c2d48

File tree

3 files changed

+69
-7
lines changed

3 files changed

+69
-7
lines changed

eth/filters/filter.go

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -119,20 +119,44 @@ func (f *Filter) Logs(ctx context.Context) ([]*types.Log, error) {
119119
return nil, nil
120120
}
121121
var (
122-
head = header.Number.Uint64()
123-
end = uint64(f.end)
122+
err error
123+
head = header.Number.Int64()
124124
pending = f.end == rpc.PendingBlockNumber.Int64()
125125
)
126-
if f.begin == rpc.LatestBlockNumber.Int64() {
127-
f.begin = int64(head)
126+
resolveSpecial := func(number int64) (int64, error) {
127+
var hdr *types.Header
128+
switch number {
129+
case rpc.LatestBlockNumber.Int64():
130+
return head, nil
131+
case rpc.PendingBlockNumber.Int64():
132+
// we should return head here since we've already captured
133+
// that we need to get the pending logs in the pending boolean above
134+
return head, nil
135+
case rpc.FinalizedBlockNumber.Int64():
136+
hdr, _ = f.sys.backend.HeaderByNumber(ctx, rpc.FinalizedBlockNumber)
137+
if hdr == nil {
138+
return 0, errors.New("finalized header not found")
139+
}
140+
case rpc.SafeBlockNumber.Int64():
141+
hdr, _ = f.sys.backend.HeaderByNumber(ctx, rpc.SafeBlockNumber)
142+
if hdr == nil {
143+
return 0, errors.New("safe header not found")
144+
}
145+
default:
146+
return number, nil
147+
}
148+
return hdr.Number.Int64(), nil
128149
}
129-
if f.end == rpc.LatestBlockNumber.Int64() || f.end == rpc.PendingBlockNumber.Int64() {
130-
end = head
150+
if f.begin, err = resolveSpecial(f.begin); err != nil {
151+
return nil, err
152+
}
153+
if f.end, err = resolveSpecial(f.end); err != nil {
154+
return nil, err
131155
}
132156
// Gather all indexed logs, and finish with non indexed ones
133157
var (
134158
logs []*types.Log
135-
err error
159+
end = uint64(f.end)
136160
size, sections = f.sys.backend.BloomStatus()
137161
)
138162
if indexed := sections * size; indexed > uint64(f.begin) {

eth/filters/filter_system_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ func (b *testBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumbe
6565
return nil, nil
6666
}
6767
num = *number
68+
} else if blockNr == rpc.FinalizedBlockNumber {
69+
hash = rawdb.ReadFinalizedBlockHash(b.db)
70+
number := rawdb.ReadHeaderNumber(b.db, hash)
71+
if number == nil {
72+
return nil, nil
73+
}
74+
num = *number
6875
} else {
6976
num = uint64(blockNr)
7077
hash = rawdb.ReadCanonicalHash(b.db, num)

eth/filters/filter_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@ func TestFilters(t *testing.T) {
170170
rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), receipts[i])
171171
}
172172

173+
// Set block 998 as Finalized (-3)
174+
rawdb.WriteFinalizedBlockHash(db, chain[998].Hash())
175+
173176
filter := sys.NewRangeFilter(0, -1, []common.Address{addr}, [][]common.Hash{{hash1, hash2, hash3, hash4}})
174177

175178
logs, _ := filter.Logs(context.Background())
@@ -224,4 +227,32 @@ func TestFilters(t *testing.T) {
224227
if len(logs) != 0 {
225228
t.Error("expected 0 log, got", len(logs))
226229
}
230+
231+
filter = sys.NewRangeFilter(-1, -1, nil, nil)
232+
233+
logs, _ = filter.Logs(context.Background())
234+
if len(logs) != 1 {
235+
t.Error("expected 1 log, got", len(logs))
236+
}
237+
238+
filter = sys.NewRangeFilter(-3, -1, nil, nil)
239+
240+
logs, _ = filter.Logs(context.Background())
241+
if len(logs) != 2 {
242+
t.Error("expected 2 log, got", len(logs))
243+
}
244+
245+
filter = sys.NewRangeFilter(-3, -3, nil, nil)
246+
247+
logs, _ = filter.Logs(context.Background())
248+
if len(logs) != 1 {
249+
t.Error("expected 1 log, got", len(logs))
250+
}
251+
252+
filter = sys.NewRangeFilter(-1, -3, nil, nil)
253+
254+
logs, _ = filter.Logs(context.Background())
255+
if len(logs) != 0 {
256+
t.Error("expected 0 log, got", len(logs))
257+
}
227258
}

0 commit comments

Comments
 (0)