-
Notifications
You must be signed in to change notification settings - Fork 0
feat(cold): add eth_getLogs support with block-level log indexing #24
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
prestwich
wants to merge
7
commits into
main
Choose a base branch
from
feat/cold-get-logs
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
6 tasks
Adds the index of a receipt's first log among all logs in its block, enabling callers to compute per-log logIndex for RPC responses without refetching prior receipts. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…text Add log filtering to cold storage following eth_getLogs semantics, and include block-level log indexing for RPC response construction. - Add `LogFilter` type with block range, address, and topic filters - Add `RichLog` type with full block/tx context and block_log_index - Add `ColdStorage::get_logs` with implementations for in-memory, SQLite, and PostgreSQL backends - Add `first_log_index` to `ReceiptContext` (cherry-picked from #23) - Replace `idx_logs_address` with composite `idx_logs_address_block` - Factor out `row_to_log_row` helper in SQL backend - Wire through task channel plumbing (request, handle, runner) - Comprehensive conformance tests covering all filter combinations Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
bcad481 to
4d640b4
Compare
…ackend iter_k2 had two bugs: (1) next_dual_above positioned the cursor at the first entry and returned it, but the iterator discarded that result and called next_k2() which advanced past it — so the first entry was never yielded. Fix: capture the first entry in the iterator struct and yield it before advancing. (2) The in-memory backend's next_k2 used next_dual_above(current_k1, current_k2) which is "at or above", returning the same entry forever. Fix: use read_next() (strictly above) and verify k1 still matches. Adds iter_k2 regression tests to the conformance suite. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…tches_log Move log-matching logic from a private function in mem.rs to a public LogFilter::matches_log method for cross-backend reuse. Implement get_logs on MdbxColdBackend using per-index exact_dual lookups. Remove unused SQL helper methods left over from a prior refactor. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…aits The default iter() and iter_from() implementations on KvTraverse and DualKeyTraverse discarded the entry returned by the initial positioning call (first()/lower_bound()/next_dual_above()), causing the first entry to be skipped. The typed iter_from() on TableTraverse and DualTableTraverse had a second bug: they positioned the cursor then called iter() which reset it via first(). Fix by capturing the first entry as owned data in the iterator structs (RawKvIter, RawDualKeyIter) and yielding it before calling read_next(). Also override iter()/iter_from() on the MDBX cursor to use native libmdbx iterators which handle first-entry capture natively. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
prestwich
commented
Feb 13, 2026
Replace manual exact_dual index probing with iter_k2 in MdbxColdBackend::get_logs_inner, matching the convention used by all other dual-table iterations in this file. Replace inner for/if/push loops with filter/map/extend in both MDBX and in-memory backends. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
ColdStorage::get_logs(LogFilter)witheth_getLogssemantics — filter by block range, address, and topics (OR within position, AND between positions)RichLogreturn type withblock_log_index(absolute position in block) andtx_log_indexfor RPC response constructionfirst_log_indextoReceiptContext(subsumes feat(cold): add first_log_index to ReceiptContext #23) for computing per-loglogIndexwithout refetching prior receiptsidx_logs_addresswith compositeidx_logs_address_block(address, block_number)for efficient filtered range scansrow_to_log_rowhelper in the SQL backendblock_log_indexTest plan
cargo t -p signet-cold)cargo t -p signet-cold-sql --features test-utils)./scripts/test-postgres.sh)--all-featuresand--no-default-featuresfor both cratesblock_log_indexcorrectness, metadata correctnessCloses #23
🤖 Generated with Claude Code