You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Found by the hourly A/B differ (the strict onlyB class added in #13): on chain 1, 89 log rows + 18 block rows are present in the Portal-leg store but absent from the RPC-realtime-leg store, inside the finalized overlap. Per-block sampling over [25455000, 25456100] shows 10 affected heights with clusters of 3–6 logs each.
the on-chain receipt carries logs at indices 989/990/992 from 0x61129032f2309d0bb73e00cc3ae411e4cbd9d95f (topic0s match the Portal-leg rows byte-for-byte)
the RPC-realtime store has the SAME transaction's logs at indices 997–1006 (other addresses) but not 989/990/992 — the loss is (block, address)-scoped and cuts through the middle of a single receipt.
This is not new-child discovery lag. Every affected address is long-established in BOTH stores — e.g. 0x611290… first seen at block 24,986,184 with 745 logs stored (739 in the lossy leg); two others first seen at 22,681,265 with ~6.2–6.4k logs each. At another affected height (25455045) the RPC-realtime leg has ZERO rows while the chain carries 6 relevant logs from two of these established addresses.
A client-side realtime handling defect (refetch/reorg path dropping part of a block's logs).
The Portal leg is chain-true at every sampled point (its rows match the on-chain receipt exactly). Notably, the same-block-child log-loss class that #26 just fixed in the fork's stream path shows that per-address realtime log loss is an easy defect class to have; whatever the mechanism here, the RPC-realtime path has no integrity check that would catch it — it trusts the provider's response completeness. Cross-validation is currently the only detector.
Repro (against two independently-synced stores):
-- per-block log-count diff over a recent window, chain 1select block_number, count(*) fromponder_sync.logswhere chain_id=1and block_number between 25455000and25456100group by1;
-- run on both stores and diff; then eth_getTransactionReceipt any missing row's tx hash
Found by the hourly A/B differ (the strict
onlyBclass added in #13): on chain 1, 89 log rows + 18 block rows are present in the Portal-leg store but absent from the RPC-realtime-leg store, inside the finalized overlap. Per-block sampling over [25455000, 25456100] shows 10 affected heights with clusters of 3–6 logs each.Decisive third-party-confirmed sample (publicnode
eth_getTransactionReceipt):0xea181850e9fcd5c0ad7ae89ca92c10472ffd2d58918342f003183f9f7dc009fe, block 254559460x61129032f2309d0bb73e00cc3ae411e4cbd9d95f(topic0s match the Portal-leg rows byte-for-byte)(block, address)-scoped and cuts through the middle of a single receipt.This is not new-child discovery lag. Every affected address is long-established in BOTH stores — e.g.
0x611290…first seen at block 24,986,184 with 745 logs stored (739 in the lossy leg); two others first seen at 22,681,265 with ~6.2–6.4k logs each. At another affected height (25455045) the RPC-realtime leg has ZERO rows while the chain carries 6 relevant logs from two of these established addresses.Mechanism open, two candidates:
eth_getLogsbodies) and realtime (RPC mode): access_list stored as NULL for realtime-ingested txs — including txs with real access lists; Portal /stream preserves them #27 (accessList stripped from full-tx blocks, provider-confirmed), so response-integrity issues on this path have precedent.The Portal leg is chain-true at every sampled point (its rows match the on-chain receipt exactly). Notably, the same-block-child log-loss class that #26 just fixed in the fork's stream path shows that per-address realtime log loss is an easy defect class to have; whatever the mechanism here, the RPC-realtime path has no integrity check that would catch it — it trusts the provider's response completeness. Cross-validation is currently the only detector.
Repro (against two independently-synced stores):
Follow-ups: