github onflow/flow-go v0.43.3
๐ŸŽบ Forte (Mainnet 27)

14 hours ago

The Forte network upgrade will unlock the next era of Flow. This upgrade will empower developers and AI agents building on Flow, unlocking protocol composability and native automation directly on the network. Forte upgrades Flow with the tools and performance to make it a best-in-class option for building with AI, tapping into Cadenceโ€™s developer friendliness, launching new features, and introducing a reusable component library alongside core protocol improvements.

Forte advances the roadmap across all three pillars - developer experience, efficiency and scalability, and protocol autonomy.

๐Ÿง‘โ€๐Ÿ’ปโœจ Revolutionizing Developer Experience

๐Ÿ•ฆ ๐Ÿค– Build Autonomous Apps with Scheduled Transactions

Flow adds Scheduled Transactions, the first native time scheduler that lets on-chain apps run tasks automatically, like cron job for blockchains. So applications are no longer restricted to being reactive only to user transactions.
Scheduled Transactions enable autonomous apps, for example DeFi protocols and AI-driven agents that proactively rebalance, settle, sweep on a schedule, all without external keepers. They run natively on the network, which simplifies operations, reduces off-chain dependencies, and makes behavior auditable and predictable in code. For builders, this means fewer moving parts to deploy, fewer operational scripts to maintain, and a cleaner path to automation-heavy use cases that feel instant and reliable to end users. This work implements FLIP 330: Scheduled Transaction.

๐Ÿ”ข๐Ÿ”ข๐Ÿ”ข๐Ÿ”ข High-precision DeFi with 128-bit fixed-point types in Cadence

Cadence now supports Fix128 and UFix128, 128-bit fixed-point types enabling precision up to 24 decimal places for advanced DeFi, risk engines, interest accrual, and other finance-heavy workloads. These types expand numeric range while preserving fine fractional precision, and all existing Fix64 and UFix64 values convert losslessly to their 128-bit counterparts. In contrast, most Ethereum contracts rely on integer math with token โ€œdecimalsโ€ rather than a native fixed-point type, which means Cadenceโ€™s built-in 128-bit fixed-point support removes much of the bespoke arithmetic scaffolding and reduces rounding-related errors in application code. This work implements FLIP 341: Add 128-bit Fixed-point Types to Cadence.

๐Ÿ“ฑ ๐Ÿ”‘ Native WebAuthn and Passkey Support

Flow adds native WebAuthn support to the protocol: you can now authorize transactions with passkeys and other WebAuthn credentials. The Access API and Cadence FVM have been extended to accept and validate WebAuthn signatures, enabling device-backed credentials from iOS, Android, browsers, and password managers to sign transactions. This work implements FLIP 264: WebAuthn Credential Support, bringing standard WebAuthn authentication to Flow accounts without breaking existing flows.

For users, passkeys eliminate the need for seed phrases while preserving self-custody and secure cross-device portability. Wallets and applications can take advantage of widely adopted WebAuthn implementations in browsers and operating systems, which makes integration simple. For example, with Flowโ€™s native account abstraction model and on-chain passkey support, developers can build smart wallets on Flow without relying on additional smart contract layers like ERC-4337. Flow Wallet will soon be integrating WebAuthn in the near future.

๐Ÿค– โค๏ธ ๐Ÿค— Descriptive, AI- and human-friendly Cadence errors

Cadence compiler and linter errors are now designed for AI assistance, making it easier for agents and IDE copilots to fix issues automatically. Messages for common problems, including pre-1.0 keyword changes like pub, have been rewritten to explain the cause, suggest concrete fixes, and link directly to reference docs and migration notes. These enriched primary and secondary messages are also surfaced through the Cadence language server, so tools like Cursor and other agent-based editors can follow the link, apply the recommended change, and validate the result. The outcome is faster feedback, fewer round trips to documentation, and a smoother path for AI agents that refactor or migrate Cadence code, all of which advances Flowโ€™s goal of first-class developer experience for agent-powered workflows.

โš™๏ธ Boosting Efficiency and Scalability

๐Ÿฆก โžก๏ธ ๐Ÿชจ Switching node database from BadgerDB to PebbleDB for more scalability

This release upgrades node storage to PebbleDB to deliver better uptime, smoother operations, and lower total cost for operators. PebbleDB offers higher stability under load for our workloads, eliminating memory spikes, effective automated pruning of historical data, a modest performance edge in typical node operations, and broad ecosystem adoption that supports rapid improvements and long-term runtime reliability. In practice, these strengths translate into more scalable nodes, simpler database management, and improved ROI for operators. Following the migration, measured outcomes show significant gains: depending on node type memory usage improves by up to 80%, CPU usage drops by up to 60%, and annual disk usage is reduced by up to 30%.
As a result, the recommended hardware specifications for all node roles except Execution have been revised and lowered to reflect the improved resource efficiency. Updated hardware recommendations can be found here.

๐Ÿ—๏ธ๐Ÿ—๏ธ๐Ÿ—๏ธ โžก๏ธ ๐Ÿ‘‰ ๐Ÿ‘‰ ๐Ÿ—๏ธ Make state storage more efficient with account key de-duplication

Public key de-duplication streamlines Flowโ€™s state while preserving the flexibility of multi-key accounts. Many apps intentionally reuse the same key to manage multiple in-flight transactions, since each key maintains its own sequence number. With de-duplication, when a previously added key is added again the state now references a single canonical entry instead of storing another copy, and existing accounts have been de-duplicated transparently. The duplication problem is significant: over half of all keys (53%) are duplicates, and one in ten accounts (10%) contain duplicate keys. Removing duplicates cuts a large chunk of redundant data, shrinking Flowโ€™s execution state by about 6% (21 GB out of 349 GB). Specifically, we trimmed 0.29 billion of the current 1.82 billion entries in Flowโ€™s low-level storage trie, making state access leaner and faster. This translates to an estimated 6โ€“18% reduction in memory used by Execution Nodes, and benefits any node or service that touches payloads by moving less data and finishing work sooner.

๐Ÿ“ˆ ๐ŸŽš๏ธ Overload resilience with adaptive collection rate limiting

Flowโ€™s architecture functions like an assembly line - transactions are first batched into blocks, then executed, and finally committed (โ€œsealedโ€) only after the results have passed verification . This pipelined design enables massive scalability. However, if the collection nodes, the first stage of the pipeline, accept more transactions than subsequent stages can process, a backlog may accumulate inside the pipeline. Forte introduces adaptive rate limiting for collections so that when execution or sealing lags, collection nodes automatically ease off. The result is a steadier pipeline flow, even at transaction rates of several hundred per second.
This resilience feature is increasingly important as transaction volume continues to grow. With Flow Actions, AI agents are expected to drive additional traffic. The limiter activates only above a configurable threshold and disengages automatically once sealing catches up. Load testing at upwards of 300 TPS shows that inserting one or two blocks with empty collections is often sufficient to clear accumulated sealing lag. Consequently, the limiter engages only for a small minority of blocks. Governance and protocol transactions are prioritized, ensuring that critical operations continue even while rate limiting is active. Sealing lag is tracked continuously and exposed as a metric for observability and tuning. In this way, Flow strengthens its resilience under challenging operational conditions, remaining highly responsive even during periods of network overload.

๐Ÿšง ๐Ÿงฑ Unlocking (near) real-time transaction results

Flowโ€™s long-term vision for data availability is to enable clients and developers to trustlessly access Flowโ€™s state with minimal latency. In practice, this is achieved through Access Nodes (ANs), which replicate block state and transaction results, serving them directly without relying on third-party services.
The Crescendo upgrade marked a major milestone towards this vision: ANs began locally replicating account data along with the transaction results and events for each sealed block. This allowed ANs to serve state queries directly from their own data, reducing latency and easing load on the Execution Nodes through local instead of remote data lookups. Shortly after, the next upgrade introduced streaming endpoints, further improving developer experience when building dApps that consume chain data. Today, ANs replicate account data and results for sealed blocks only, avoiding the complexity of handling forks.
With Forteโ€™s groundwork, ANs will soon be able to ingest account data and transaction results for both Cadence and EVM prior to finalization and sealing, with the ability to replicate and serve data across potential forks before they are subsequently resolved. Such low-latency access will enable high-frequency DeFi apps to read state early (soft finality) and to gracefully handle rare rollbacks by simply retrying or revalidating once blocks are sealed.

๐Ÿ” Advancing Protocol Autonomy with Data Integrity

A major milestone on the protocol autonomy roadmap has now been completed by hardening data integrity across the network. For every data structure exchanged between nodes, a canonical, verifiable identity can be computed locally (via a collision-resistant hash) and checked against the value prescribed by protocol rules. This ensures that if a message arrives, any modification to any field is immediately detected by the recipient. In other words, an honest sender can be assured that its message, once delivered, is received by other honest nodes exactly as it was sent, regardless of potentially Byzantine intermediaries relaying it.
The update closes gaps where earlier commitments did not cover every field and left room for tampering. All data types that travel over the wire were thoroughly audited and their identities were redefined to be derived from complete content. At the same time, we reinforced the validation logic to detect message corruption whenever the reconstructed data fails to match the expected hash commitment.
Beyond Byzantine threats, accidental storage bugs could corrupt committed data and cause honest nodes to be slashed. To prevent such cases, we developed a custom linter that flags illegal mutations of protected data structures already during development.
This also gives developers and AI agents a simpler mental model: network messages can be treated as immutable objects with stable identities. Read more about this here.

Breaking Change

Event field values in dictionaries may now appear in a different iteration order. This can affect execution results, since event ordering contributes to per-chunk event hashes. Please ensure your code does not depend on the order of fields within an event.


Commit list

Scheduled Transactions

Add WebAuthn Commits

Cadence

Badger to PebbleDB

Account Key Deduplication

  • Remove unused migration flags in execution-state-extract by @fxamacker in #7641
  • Add empty-migration flag to execution-state-extract to measure minimum spork migration time by @fxamacker in #7643
  • Rename publicKey related variables and functions in FVM by @fxamacker in #7693
  • Add account public key deduplication migration by @fxamacker in #7738
  • Sync feature/account-public-key-deduplication with master by @fxamacker in #7778
  • Sync master branch into feature/account-public-key-deduplication by @fxamacker in #7820
  • Add runtime public key duplicate detection and storage with support for account status v4 format by @fxamacker in #7829
  • Fix the RegisterSize() function by @fxamacker in #7834
  • Change report format for storage used migration from JSON to CSV by @fxamacker in #7835
  • Reduce register reads by using Accounts.GetRuntimeAccountPublicKey by @fxamacker in #7841
  • Merge feature account public key deduplication to master by @fxamacker in #7869
  • Create diff-keys utility to compare account public keys before and after migration by @fxamacker in #7875
  • Add option to validate account public key migration by @fxamacker in #7878

Overload Resilience

Data Integrity - Hash Commitment Coverage

Data Integrity - Immutability

  • Removed non-constructor mutations for EpochRecover, EpochSetup and EpochCommit by @UlyanaAndrukhiv in #7407
  • Removed non-constructor mutations for MissingCollection, Vote and IncorporatedResult structs by @AndriiDiachuk in #7412
  • Removed non-constructor mutations for Attestation, ResultApprovalBody and ResultApproval structs by @AndriiDiachuk in #7417
  • Removed non-constructor mutations for MinEpochStateEntry, EpochStateEntry and RichEpochStateEntry by @UlyanaAndrukhiv in #7418
  • Removed non-constructor mutations for EpochProtocolStateAdapter and EpochStateContainer by @UlyanaAndrukhiv in #7427
  • Removed non-constructor mutations for TimeoutObject and TimeoutCertificate by @UlyanaAndrukhiv in #7433
  • Removed non-constructor mutations for ChunkDataPackRequest and ChunkDataPackResponse by @UlyanaAndrukhiv in #7437
  • Removed non-constructor mutations for Locator by @UlyanaAndrukhiv in #7478
  • Removed non-constructor mutations for Collection and CollectionGuarantee structs by @AndriiDiachuk in #7486
  • ComputationResult refactoring by @UlyanaAndrukhiv in #7511
  • Removed non-constructor mutations for Event by @UlyanaAndrukhiv in #7512
  • Removed non-constructor mutations for Seal by @UlyanaAndrukhiv in #7516
  • Removed non-constructor mutations for Chunk, ChunkDataPack and ExecutionResult structs. by @AndriiDiachuk in #7525
  • Removed non-constructor mutations for ExecutionReceipt, UnsignedExecutionReceipt by @UlyanaAndrukhiv in #7527
  • Removed non-constructor mutations for ExecutionReceiptStub, UnsignedExecutionReceiptStub by @UlyanaAndrukhiv in #7535
  • Removed non-constructor mutations for QuorumCertificate struct. by @AndriiDiachuk in #7542
  • Add ExecutionResult validation to UnsignedExecutionReceipt constructor by @UlyanaAndrukhiv in #7548
  • Enforce immutability for Block (cluster) by @UlyanaAndrukhiv in #7553
  • Removed non-constructor mutations for Header struct. by @AndriiDiachuk in #7557
  • Enforce immutability for Block (flow) by @UlyanaAndrukhiv in #7560
  • Removed non-constructor mutations for Transaction and TransactionBody structs. by @AndriiDiachuk in #7583
  • Avoid unittest.BlockFixture to create invalid blocks when option WithParent is given by @UlyanaAndrukhiv in #7845
  • InstanceParams no longer reads anything from the database; hence remove database field by @UlyanaAndrukhiv in #7849
  • Consolidate InstanceParams into one storage object by @UlyanaAndrukhiv in #7857
  • Extend InterfaceFromMessageCode, define UntrustedMessage interface. by @AndriiDiachuk in #7739
  • messages.Proposal, messages.ClusterProposal: message/internal split + validation by @UlyanaAndrukhiv in #7731
  • messages.CollectionGuarantee: message/internal split + validation by @UlyanaAndrukhiv in #7761
  • messages.BlockResponse, messages.ClusterBlockResponse: message/internal split + validation by @UlyanaAndrukhiv in #7740
  • messages.SyncRequest, messages.SyncResponse and messages.BatchRequest: message/internal split + validation by @UlyanaAndrukhiv in #7776
  • messages.EntityRequest and messages.EntityResponse: message/internal split + validation by @AndriiDiachuk in #7790
  • messages.ChunkDataRequest, messages.ChunkDataResponse and messages.RangeRequest: message/internal split + validation by @UlyanaAndrukhiv in #7798
  • messages.ApprovalRequest and messages.ApprovalResponse : message/internal split + validation by @AndriiDiachuk in #7760
  • messages.BlockVote, messages.ClusterBlockVote, messages.TransactionBody and messages.Transaction: message/internal split + validation by @AndriiDiachuk in #7801
  • messages.TimeoutObject and messages.ClusterTimeoutObject: message/internal split + validation by @UlyanaAndrukhiv in #7818
  • flow.ExecutionReceipt and messages.DKGMessage: message/internal split + validation by @UlyanaAndrukhiv in #7823
  • messages.ResultApproval and messages.TestMessage: message/internal split + validation by @AndriiDiachuk in #7824
  • Sync feature/networking-layer-immutability with Master by @AndriiDiachuk in #7900
  • Network Layer by @AndriiDiachuk in #7887

Data Availability

Flow Core Contract Update

Execution

FVM

EVM

  • Fix high CPU usage related to EVM DeltaView.AddressInAccessList by @m-Peter in #7405
  • Improve organization, comments, and error messages in the EVM contract by @joshuahannan in #7458
  • Handle non-existing accounts in all of state overrides methods by @m-Peter in #7737
  • Add a test case utilizing a read-write heavy EVM tx by @m-Peter in #7745
  • Add the MaxGasConsumed field in EVM Result type by @m-Peter in #7951
  • Fix bug on ChainRules() as we are already on Merge by @m-Peter in #8047

Collection Node

Networking

AI Tooling

BFT

  • Add Staking Key PoP to bootstrapping tools by @tarakby in #2803

General improvements

Testing Tools

Utils

Documentation

CI

New Contributors

Full Changelog: v0.42.3...v0.43.3

Don't miss a new flow-go release

NewReleases is sending notifications on new releases.