Skip to content

study: add Base, Arbitrum, tip blocks and log ranges - #17

Merged
macjayz merged 2 commits into
mainfrom
study/harder-cases
Nov 1, 2026
Merged

macjayz merged 2 commits into
mainfrom
study/harder-cases

Conversation

@macjayz

@macjayz macjayz commented Nov 1, 2026

Copy link
Copy Markdown
Owner

Stacked on #16. The diff below only shows this change.

The study used to ask Ethereum mainnet for a balance, one USDC call and the head, which is where providers almost never disagree. It now also covers the harder cases:

  • Base and Arbitrum: four public endpoints each (official, publicnode, dRPC, BlastAPI). Each is verified only against endpoints on its own chain.
  • eth_getBlockByNumber at the tip, where reorgs and lagging nodes show.
  • eth_getLogs over the last 10 blocks of USDC transfers, every 4th tick, where providers truncate. Ranges stay short and recent because free tiers cap them (BlastAPI: 10 blocks) and treat older ranges as archive requests.

Report changes:

  • Disagreements are grouped by chain.
  • Head lag is measured in seconds, so chains with different block times compare.
  • A null answer (a node not yet at that height) is no longer counted as a differing answer. Before this fix, it turned the official Arbitrum node's tip lag into a fake 27% block disagreement.

Found already: a two-minute smoke run caught the official Arbitrum RPC (arb1.arbitrum.io/rpc) returning blockTimestamp: "0x0" on every log, while dRPC, BlastAPI and publicnode return the block's real time. Confirmed with direct curls against each endpoint.

Tested: two smoke runs of the collector (13 endpoints) against a local stack, plus the report against both. Linted and typechecked.

🤖 Generated with Claude Code

The study only asked Ethereum mainnet for a balance, a USDC call and the
head, which is where providers almost never differ. It now also covers:

- Base and Arbitrum, four public endpoints each, verified only against
  endpoints on the same chain.
- eth_getBlockByNumber at the tip, where reorgs and lagging nodes show.
- eth_getLogs over the last 10 blocks of USDC transfers (every 4th tick),
  where providers truncate. Ranges stay short and recent because free
  tiers cap them and treat older ranges as archive requests.

The report groups disagreements by chain, measures head lag in seconds so
chains with different block times compare, and stops counting a null
answer (a node not yet at that height) as a differing one.

A two-minute smoke run already found one real difference: the official
Arbitrum RPC returns blockTimestamp "0x0" on every log, where the other
three providers return the block's time.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@macjayz
macjayz changed the base branch from study/local-outages to main November 1, 2026 10:26
@macjayz
macjayz enabled auto-merge November 1, 2026 10:26
@macjayz
macjayz merged commit 9c538cf into main Nov 1, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant