This Month in Forest - July 2026 #7436
LesnyRumcajs
announced in
Announcements 📢
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
This Month in Forest 🌲
Welcome to the July edition of This Month in Forest! Good news first: our ProPGF application was accepted. Beyond that, after June's performance push, this month leaned towards correctness and stability: we started checking Forest's Ethereum API against an independent third-party dataset, made the chain index a first-class citizen, and fixed a handful of bugs in projects Forest depends on.
Highlights
New releases
Four releases since the last edition — all non-mandatory, but worth upgrading to:
Both v0.34.0 and v0.35.0 contain breaking changes — please read the CHANGELOG before upgrading.
A third opinion: validating Forest against
chain.data.riba.plusComparing Forest against Lotus catches divergence, but it cannot catch a bug both clients share — and those exist. So this month we started checking Forest's responses against
chain.data.riba.plus, a dataset of Filecoin chain data built by @ribasushi independently of both Forest and Lotus. That independence is the entire point: a mismatch means either Forest is wrong, Lotus is wrong or everyone is wrong. All three happened.We ran
eth_getBlockByNumber,eth_getBlockReceipts,eth_getLogs,eth_getTransactionByBlockNumberAndIndexandFilecoin.ChainGetTipSetByHeightover thousands of epochs on both mainnet and calibnet (#7293), and packaged the checker as a reusable image (forest-iac#523, #525). Most of the Ethereum correctness fixes below came straight out of it, including one that Lotus shares (and another one here) and is being reported upstream. Wiring the checks into CI is next.Huge thanks to @ribasushi for building and maintaining the dataset — an independent source of truth is a genuinely rare and valuable thing for client implementers, and Filecoin is better off for having one. ❤️
The chain index, no longer optional
Receipts, event queries, and log lookups all depend on Forest's chain index. It is now enabled by default, so those methods work out of the box. And for nodes that need to build or rebuild it,
forest-cli index backfillnow does so through the running daemon — with progress polling, cancellation, and resumable runs, no downtime required. That one landed onmainand ships in the next release.ProPGF Round 3: we're in 🎉
Forest's ProPGF Round 3 application was approved — as were ChainSafe's infrastructure services. Thank you to everyone who endorsed us; this keeps the work described above funded and sustainable. You can see the approved applications here.
Development
Random improvements and fixes
Ethereum RPC: correctness
The bulk of the month. Empty epochs (null rounds) are now handled correctly across the affected methods (#7277, #7292) instead of one range query giving up entirely on hitting one. Transactions report their recipient correctly for contract creation (#7294) and for accounts created in the same block (#7301 — the Lotus-shared one). Block log blooms are now actually computed rather than returning all-ones, so indexers can skip irrelevant blocks; empty lists serialize as
[], notnull; reverted log entries are marked as such; and abandoned event filters expire after an hour like they do in Lotus, instead of accumulating until restart. Subscriptions for pending transactions now report the ones actually pending.Message waiting also got a parity pass:
StateWaitMsghonors confidence properly and rejects values beyond chain finality instead of waiting forever (#7352, #7353, #7387). RPC authentication now returns a proper unauthorized response for a bad token (#7255, #7256), and Forest-owned methods use consistent field casing, checked in tests from now on.Performance
Filecoin.StateReplayhandles bursts of traffic far better — it now serves from the shared tipset trace cache and bounds concurrent replays, so a flood of calls against the same block executes the tipset once instead of once per call. Ethereum transaction receipts are cached, hex encoding across the node moved to a SIMD implementation, and several blocking operations were moved off the async runtime so they stop stalling everything else (#7236, #7289, #7334).Snapshots and storage
Snapshot exports no longer hang indefinitely (#7348), can be cancelled (#7350), and report what they're actually doing. Snapshots can now carry the epoch-to-tipset lookup table (#7315, #7376, #7426), so a freshly imported node gets fast height lookups without rebuilding them. Two bugs that could leave a node stuck were fixed in that same table (#7288, #7362), and address caching is now gated on finality.
Stability and hardening
A deadlock in
parity-dbthat wedged Forest's snapshot exports was tracked down and fixed upstream, then pulled in with a regression test. A crash reachable through the QUIC networking stack was fixed upstream too. Property and fuzz tests over the code that reads untrusted bytes caught several latent crashes and an unbounded allocation (#7343); expensiveStateComputerequests are now bounded; and long-running background tasks got cancellation and timeouts so they can no longer run forever when something goes wrong.Operator-facing improvements
The sync log now says what the node is doing — validating, fetching, or waiting — instead of a countdown that made a stuck node look nearly done.
--remove-existing-chainwipes and re-imports in one step, andforest-wallet send --wait-confidencewaits for the depth you ask for before returning.Community contributions
Thanks to @0xDevNinja for applying the FRC-0102 envelope to wallet signing and verification by default, and to @parkan for a CoreOS + k3s deployment example. ❤️
See the CHANGELOG for the full list of client-facing changes; the commit history has the rest. 🤓
Upcoming work
Outside of Forest
parity-dbA deadlock between the commit and cleanup workers under sustained write load, found while debugging stuck Forest snapshot exports — fixed upstream and released in 0.5.6, so every parity-db user benefits.
quinnA congestion-control overflow that crashes long-lived QUIC connections, fixed on both the current and maintenance branches: #2749, #2751.
lotusChainSafe bootstrap nodes moved to a DNS-based entry, with a dead one removed: lotus#13715.
builtin-actorsEarly review of "Solstice" (FIP-0118), the proposed change to how Filecoin rewards stored data, flagging cases the proposal text doesn't yet cover: builtin-actors#1760.
faster-hexKeeping an embedded-only dependency out of regular builds: faster-hex#71.
Individual reports
Disclaimer: this is for reporting purposes only.
@akaladarshi
Highlights
Operators can now tell when a syncing node is stuck instead of being told it is nearly finished. Forest's sync log counted how many blocks were left to download, so a node that had stopped making progress still looked close to done. Reworked the message to report what the node is actually doing: validating, fetching, or waiting for data (#7382).
A slowdown on a production Filecoin node now has a known cause. Investigated why the node was answering requests slowly, traced it to unnecessary repeated background work, and shared a written fix plan with the team.
Forest now cleans up watch requests that apps stop using. Apps can ask Forest to watch the chain for new activity, and abandoned requests used to pile up until the node restarted. Filed the gap (#7265) and added an automatic cleanup that removes any request left unused for an hour, matching Lotus (#7360, #7386).
Apps watching for newly submitted transactions now get the ones that are actually waiting. Forest was reporting transactions that had already been written into a block. Fixed it to report transactions as they arrive in the queue of unconfirmed ones (#7250).
Apps reading Filecoin smart-contract activity got two accuracy fixes. Each block's activity summary is now filled in correctly, letting indexing tools skip blocks with nothing relevant (#7156), and log results now clearly mark entries from blocks the chain later replaced (#7172).
Operators can clear a node's chain data and start again from a snapshot in one step. Added a flag that deletes the existing chain data as part of a snapshot import (#7275).
A test that failed at random no longer holds up the team's changes. Forest's automated check for the block-watching feature failed intermittently when the chain switched branches. Filed it (#7385) and rewrote the check to wait on the chain's reported head instead (#7392).
Forest users got two releases, and outside contributors got clearer instructions for a first change. Prepared and shipped v0.34.1 and v0.35.0 (#7372, #7406), and wrote contribution guidelines for external contributors along with a versioning note in the release checklist (#7371, #7407).
Wider ecosystem
"Solstice", a proposed upgrade that changes how Filecoin rewards stored data, got an early review. Studied the proposal (FIP-0118) and its draft implementation, and shared review feedback, flagging cases the proposal text does not yet cover (builtin-actors#1760).
Full list of authored pull requests and filed issues, July 2026.
@hanabi1224
Highlights
Bug fixes
StateComputeRPC calls (#7374), preventing excessively large requests from overloading the node.ChainGetTipSetFinalityStatus(#7338) and re-enabled theStateSearchMsggateway test on CI (#7285).Performance improvements
Tooling & maintenance
forest-tool db import-tipset-lookupcommand (#7426) and new snapshot export flags for the tipset lookup table (#7315, #7376).tipset_by_height*functions for consistency (#7345).crossbeam-epochcrate up to date (#7388, #7307).Full list of authored pull requests, July 2026.
@LesnyRumcajs
Highlights
Forest's Ethereum API is now checked against an independent third-party dataset. Set up verification of Forest's responses against
chain.data.riba.plus— built independently of both Forest and Lotus, so it catches bugs client-to-client comparison cannot (#7293) — and packaged the checker as a reusable image that autodetects the network (forest-iac#523, #525), validated over 5760 epochs each on mainnet and calibnet. This is what surfaced most of the correctness bugs this month; wiring it into CI is the follow-up (#7270).Fixed how Forest answers Ethereum queries for empty blocks. Several methods returned wrong or misleading results for epochs with no blocks instead of the expected error (#7277, #7292), and one range query gave up entirely on hitting one (#7316).
Transactions now report their recipient correctly. Contract-creation transactions no longer drop the recipient field (#7294), and transactions sent to accounts created in the same block no longer report a nonsense recipient (#7301) — the latter is a bug Lotus shares.
Removed a large source of failures when running Forest behind Lotus Gateway. Found and fixed a response-shape discrepancy in a commonly-called method that showed up in failed-call metrics (#7331), then standardized naming conventions across the whole RPC surface with a test that keeps them that way (#7411).
Rejecting a bad API token now behaves the way clients expect. An invalid token returns a proper unauthorized response with a machine-readable code instead of a generic error (#7251, #7255), and token verification matches Lotus exactly (#7256).
Snapshot exports no longer hang or ignore Ctrl-C. An export can no longer stall indefinitely (#7348), it can be cancelled (#7350), and the progress output says what it's actually doing (#7383).
Tracked down a database deadlock that wedged Forest's snapshot exports and fixed it upstream in
parity-db(parity-db#252), then pulled the fix into Forest with a regression test (#7389, #7390).StateReplaycopes with bursts of traffic. Improved the caching around transaction replay and bounded how many replays run at once, so a flood of calls against the same block no longer re-executes it per request (#7405). Hex encoding across the node also moved to a much faster implementation (#7395).Three ways a node could quietly misbehave, closed. A caching bug that could push a node out of sync (#7362), address lookups cached before they were final (#7355), and a crash reachable through the networking stack (#7404).
Hardened Forest against malformed input. Added property and fuzz tests over the parts of Forest that read untrusted bytes, catching several latent crashes and an unbounded memory allocation (#7343, #7349), and started fixing the poor test coverage in the peer-to-peer layer (#7373).
Coordination
StateReplaywork.Wider ecosystem contributions
parity-db— fixed a deadlock between the commit and cleanup workers under sustained write load (#252); every parity-db user benefits.quinn— fixed a congestion-control overflow that crashes long-lived connections, on both the current and maintenance branches (#2749, #2751).lotus— switched the ChainSafe bootstrap nodes to a DNS-based entry and removed a dead one (lotus#13715), mirroring the Forest change (#7375) so bootstrapper changes no longer require client releases.faster-hex— kept an embedded-only dependency out of regular builds (faster-hex#71).Full list of authored pull requests and filed issues, June 25 – August 3, 2026.
@sudo-shashank
Highlights
allow_replacedandconfidencehandling inwait_for_message, and madeStateWaitMsgreject confidence beyond chain finality instead of waiting indefinitely, keeping message-wait results correct and predictable (#7352, #7353, #7387).forest-cli index backfillcommands and matching RPC methods to rebuild the chain index (Ethereum mappings, events, and block blooms) through the running daemon, with progress polling, cancellation, and resumable runs, so operators no longer need to shut down and restart the node (#7408).[]. Fixed Ethereum RPC responses to serialize empty lists as[]instead ofnull, matching Lotus and keeping clients compatible (#7214).cargo denyadvisory failures blocking Forest CI (#7260, #7434) and investigated and unblocked several failing forest-explorer dependabot updates, keeping dependencies patched and CI green (forest-explorer#469, #472, #473).Full list of authored pull requests, July 2026.
All reactions