24th Sep 2026
7 min read

Mainsail Hardens Up: Consensus Safety, EVM Performance and an Upcoming Testnet Reset

Since our last update, the focus has shifted from adding features to making Mainsail harder to break. This cycle makes consensus safe across crashes and restarts, replaces a manipulable validator-ordering seed with RANDAO, makes the EVM faster under concurrent load and aligns it with the latest Ethereum spec, and removes a large amount of legacy code. We also expanded unit test coverage across more than two dozen packages, about half the monorepo. Several of these changes break protocol compatibility, so we’ll be launching a fresh public testnet. More on that below.

Missed the previous update? You can catch up on it here: Mainsail Levels Up: Tokens, Performance and Reliability.

Consensus Safety and Crash Resilience

Consensus got the most work this cycle. Nodes now write every proposal, consensus message, and piece of round state to disk as it happens, instead of only on a clean shutdown. A validator that crashes or gets killed mid-round comes back with its lock and valid value intact and cannot sign conflicting messages. If the consensus store can’t be written, the node now stops instead of carrying on without its safety data.

We also tightened the core Tendermint rules. Lock-proof and valid-round checks are stricter, malformed proposals are now rejected as soon as they are decoded, and a proposal with a timestamp from the future gets a nil prevote instead of failing block verification. Blocks committed concurrently and leftover state from already-committed blocks are handled cleanly, and a node that is still catching up no longer tries to propose.

Node operators now get clear log lines when their validator proposes, commits, or misses a block. New multi-node functional tests cover locking, restarts, and double-sign scenarios.

Fairer Validator Selection with RANDAO

The seed that shuffles validator order each round used to come from the block timestamp, which the proposer could influence. It’s now based on RANDAO: each block carries a BLS reveal from its proposer, and those reveals are mixed into an unpredictable prevrandao value. That value decides the order and is also exposed to smart contracts.

Other validator-related changes:

  • Registering a BLS key now requires a proof of possession, which blocks rogue-key attacks on aggregated signatures.
  • Consensus messages now include the genesis and previous block hash in what gets signed, so they can’t be replayed on another network or fork.
  • Consensus contract fixes: unvoting the head of a voter list now works correctly, and a round with too few active validators is now rejected instead of padded.

EVM: Faster, Sturdier, Up to Date

The EVM now supports only the Osaka spec, and support for the older Shanghai spec was removed. Osaka is the execution-layer part of Ethereum’s latest (Fusaka) upgrade, so contracts get the latest opcodes and behavior, and Mainsail matches what current Ethereum tooling expects.

Under the hood, the EVM can now serve many state reads at once, read commits in batches, and limit how many calls run at the same time so it stays responsive under heavy load. The storage layer also handles database growth safely instead of failing.

On correctness, several code paths that used to crash the process (panics) now return errors. The state root is now correct when a transaction fails during block building, and the block.timestamp seen by contracts and JSON-RPC is now in Unix seconds. Transaction hashes now match standard Ethereum tooling, and non-canonical RLP is rejected.

Transaction Pool and Forger

Block building moved into its own @mainsail/forger package. The pool now hands transactions to the forger in batches, and the forger reuses data the pool has already validated instead of checking it again. Transaction hashing and sender recovery now run in worker threads.

We also fixed a case where a transaction could be returned twice at a batch boundary, and rebroadcast cooldowns are now cleaned up when transactions leave the pool. Pool events now include the transaction data as well.

P2P Reliability

The P2P downloaders now retry the correct block range, skip blocks that are already applied instead of banning the peer, and no longer stall when a peer returns an empty proposal. A throttled endpoint no longer blocks requests to other endpoints, round statistics use bounded memory, and the internal P2P loops handle errors more reliably.

API and Sync

On the API side, wallets can now filter their tokens more precisely through /wallets/{id}/tokens, including hiding specific tokens entirely. JSON-RPC batch requests are also processed in chunks now, so a large batch no longer has to be handled all at once.

Syncing from scratch got a lot smoother too. Restores now fetch receipts by block range instead of piece by piece, and validator rounds are no longer reset after every batch, which makes the whole process both faster and more reliable.

Alongside these improvements, we closed a few gaps that could cause trouble under unusual conditions. The default pagination limit can no longer exceed the configured maximum, attribute lookups now validate their keys before querying, and a race condition during database bootstrap has been fixed. The database layer itself was upgraded to TypeORM 1.0 as part of this work..

Faster Startup and Operator Tooling

Nodes start noticeably faster. The NTP check and worker startup no longer block boot; the CLI is loaded only when needed, and only a few crypto workers start right away while the rest start in the background.

The configuration generator can now take the genesis validators from an external file, either as mnemonics or as presigned registrations. The MAINSAIL_NETWORK_NAME, MAINSAIL_TOKEN and MAINSAIL_VERSION environment variables were removed, and BLS keys are no longer part of validator or snapshot import.

Cleanup and Quality

We removed a lot of legacy code this cycle, including BigNumber (replaced by native BigInt), lodash, and the logger-winston, networking-dns, and transactions packages. Fewer dependencies mean a smaller attack surface and a codebase that’s easier to maintain. The toolchain now uses TypeScript 7 and pnpm 12.

More than two dozen packages, about half of the monorepo, received a dedicated test-coverage pass, and many of those passes also fixed real bugs. CI now runs tests in parallel with shared build caches and produces more accurate branch-coverage reports. We also fixed a number of flaky timing-sensitive tests.

What’s Next?

  • Test coverage: add tests to the packages that haven’t had a coverage pass yet, and grow the multi-node functional suites.
  • Hardening, security and performance: keep hardening consensus, P2P and the transaction pool against faulty or malicious peers, and profile block processing, sync and the API under load.
  • Public testnet reset: several of these changes break protocol compatibility, including RANDAO, proof of possession, the new message signing, and the Osaka spec, so the current testnet can’t simply upgrade. We’re targeting mid-October to launch a fresh testnet from a new genesis block with all of these changes, so they can be tested together on a live network.
  • Production readiness: long-running soak and stress tests on multi-node networks, including validators that crash or restart and heavy transaction load. Then final steps toward a mainnet launch.

Help Us Test

While we prepare the testnet reset, planned for mid-October, the existing public testnet is still available. Once the new one is live, we invite developers and node operators to try it out. Run a node or a validator, deploy and interact with contracts, and use your usual Ethereum tooling against the JSON-RPC API.

Edge cases deserve special attention: validators restarting or crashing mid-round, nodes syncing from scratch, and failed or reverted transactions. Detailed feedback with clear reproduction steps helps us find and fix issues quickly.

Found an issue? Please report it on GitHub , whether it’s on the current testnet or the new one once it’s live.

Closing Thoughts

This cycle wasn’t about flashy new features. It was about making sure Mainsail behaves correctly when things go wrong: validators crash, peers misbehave, and the network is under heavy load. That kind of work is less visible, but it’s what a production-grade blockchain is built on, and it brings us meaningfully closer to mainnet.

We’re excited to get this into the hands of the community. When the new testnet goes live, come break it. That’s exactly what it’s for. Follow along on GitHub , chat with other community members on the independent, community-run Discord , and watch the blog for all the latest announcements.

Onward to production readiness. ⛵

Share:

Get in Touch!

Whether you want to learn more about ARK Ecosystem, want to apply for developer bounty, become our partner or just want to say Hello, get in touch and we will get back to you.



An Ecosystem of Developers

Join us on our journey to create the future of Web3.