Skip to main content
Technical proposal SIMD-0648 Review

Unbound LoaderV3 Instruction Data

  1. Idea
  2. Draft
  3. Review
  4. Accept
  5. Implement
  6. Active

Decision brief

Why this proposal matters

LoaderV3 currently bounds instruction deserialization at 1232 bytes, the traditional maximum transaction size. This prevents using most of the 4096 bytes made available by Transaction V1 when writing to LoaderV3 buffers. Removing this bound would allow program upgrades to use a fraction of the transactions now required. We remove this bound.

Source-backed reading aid · source language: EN

Proposal at a glance

What changes

  • PACKET_DATA_SIZE: 1232, the current LoaderV3 instruction bound and maximum size of a legacy or V0 transaction.
  • MAX_TRANSACTION_SIZE: 4096, the maximum size of a V1 transaction.
  • MAX_INSTRUCTION_DATA_LEN: 10240, the maximum size of CPI instruction data.

Stakeholder map

Who is affected

Builders & client teams Medium impact

Program deployment and upgrade tooling, including the Solana CLI, can use V1 transactions to deploy and upgrade programs much more efficiently. This should be an opt-in flag for now, since not all external wallet tooling may support Transaction V1.

Action may be required
Validators & operators Medium impact

Program deployment and upgrade tooling, including the Solana CLI, can use V1 transactions to deploy and upgrade programs much more efficiently. This should be an opt-in flag for now, since not all external wallet tooling may support Transaction V1.

Action may be required
Users & stakers Medium impact

Program deployment and upgrade tooling, including the Solana CLI, can use V1 transactions to deploy and upgrade programs much more efficiently. This should be an opt-in flag for now, since not all external wallet tooling may support Transaction V1.

Action may be required
Governance & ecosystem Impact unknown

No proposal-specific evidence was found for this group.

Action requirement unknown

Exact source revision

Full proposal document

Source-language document. Technical identifiers and evidence remain unchanged. eac20f2994dd

Summary

LoaderV3 currently bounds instruction deserialization at 1232 bytes, the traditional maximum transaction size. This prevents using most of the 4096 bytes made available by Transaction V1 when writing to LoaderV3 buffers. Removing this bound would allow program upgrades to use a fraction of the transactions now required.

We remove this bound.

Motivation

Transaction V1 allows up to 4KiB transactions, and is active on all clusters. However, the new larger transaction size cannot be fully utilized for writing LoaderV3 buffers for program deployment and upgrade because LoaderV3 aborts if instruction data exceeds 1232 bytes.

Due to LoaderV3 Write instruction metadata and necessary pubkeys, a legacy transaction delivers at best 1012 payload bytes, assuming the fee-payer is the buffer authority. This drops to 960 bytes per transaction when compute price and limit instructions are included. A V1 transaction can deliver 1216 payload bytes, a modest improvement over the prior status quo, but still severely limited compared to what it ought to be.

By removing the artificial bound in LoaderV3, a V1 transaction can deliver 3864 payload bytes per transaction, or 3856 bytes per transaction with a priority fee. This means program deployment and upgrade require ~75% fewer transactions.

This also admits LoaderV3 buffer writes up to almost 10KiB via CPI. It is possible this may be useful to some consumers such as multisigs, but not a central goal of this proposal.

New Terminology

No new terminology, but relevant Agave constants (mirrored in Firedancer):

  • PACKET_DATA_SIZE: 1232, the current LoaderV3 instruction bound and maximum size of a legacy or V0 transaction.
  • MAX_TRANSACTION_SIZE: 4096, the maximum size of a V1 transaction.
  • MAX_INSTRUCTION_DATA_LEN: 10240, the maximum size of CPI instruction data.

Detailed Design

When deserializing LoaderV3 instructions, instead of aborting on instruction data larger than 1232 bytes, deserialize all the data.

As an aside, System and Vote both enforce a 1232 byte limit on instruction deserialization as well. There is however no reason to change this, since neither program has any valid instruction longer than low hundreds of bytes.

Edge Cases

Care should be taken that an incorrect length on the write Vec does not over- allocate before failing validation.

Validator Components Affected

Which validator components are affected by this change?

Validator ComponentImpact
Transaction Execution (Runtime)LoaderV3 ixn deserialization changes.
Virtual Machine
Block Packing
Consensus
Gossip
Turbine
Snapshots
On-Chain Core BPF Programs
Other (please describe)

Alternatives Considered

We can always do nothing. However, we would fail to take advantage of larger transactions to improve program deployment and upgrade transaction efficiency.

We could bound the deserialize by MAX_TRANSACTION_SIZE to allow full use of V1 transactions. This would retain a consensus-relevant bound on CPI. Ultimately the difference between 4KiB and 10KiB is not enough to motivate keeping the restriction.

We could bound by MAX_INSTRUCTION_DATA_LEN to effect the same result as having no bound. In fact, this may be done as an implementation detail. But it is better to explicitly unbound it in case new transaction formats or other changes allow larger instruction data and reintroduce a LoaderV3 bound into consensus.

Impact

Program deployment and upgrade tooling, including the Solana CLI, can use V1 transactions to deploy and upgrade programs much more efficiently. This should be an opt-in flag for now, since not all external wallet tooling may support Transaction V1.

Security Considerations

As a built-in, LoaderV3 pays a fixed CU cost, so if a massive amount of instruction data was allowed through, it may cause performance concerns. We rely on the 10KiB CPI limit and the 4KiB transaction size limit to protect against this.

Conformance

Verify that LoaderV3 can successfully deserialize Write instructions of arbitrary length, including but not limited to longer than 1232 bytes.

Evidence graph

Related proposals and rollout

One or more sources are unavailable.

Upstream review record

Upstream discussion & review

GitHub review is editorial context, not evidence of on-chain support, voting, or outcome.

PR #648 · merged SIMD-0648: Unbound LoaderV3 Instruction Data 16 comments and reviews · Oct 21, 2026
@bw-solana

nit: I was sanity checking these and came up w/ slightly different byte numbers. Here's the overhead I'm subtracting out of 4096B: Component | Bytes -- | -- Transaction version | 1 Message header | 3 Configuration mask | 4 Recent blockhash | 32 Instruction count | 1 Account count | 1 Account keys | 332=96 (payer, buffer, loader) Instruction header | 4 Instruction account indices | 2 LoaderV3 Write header | 16 Signature | 64 Total overhead = 224B Max payload bytes = 4096 − 224 = 3872B But I believe this will fail immediately unless we include CU and data limits: Compute-unit limit | 4 Loaded-account-data limit | 4 So practical max is 3864B and if we include prio fee, it becomes 3856B

GitHub ↗
@bw-solana

could probably build this out more with edge cases around the different sizes. We're implicitly protecting against large sizes with the tx and CPI limits, but what happens if/when we increase these? Might be good to specify

GitHub ↗
@2501babe

i can reword this but the idea of removing, rather than changing, the limit is that there would be no edge cases in loaderv3 itself anymore. as i wrote under "alternatives considered": But it is better to explicitly unbound it in case new transaction formats or other changes allow larger instruction data and reintroduce a LoaderV3 bound into consensus. that is, instead of changing the consensus rule, we get rid of it and slightly shrink the consensus surface. so yea we are implicitly protected by tx and cpi limits but i think about it like, there just is no loaderv3 rule anymore we had talked about a followup to raise CU costs for loaderv3 but i dont have any firm ideas on what exactly we wo

GitHub ↗
@2501babe

acaecb5(https://github.com/solana-foundation/solana-improvement-documents/pull/648/commits/acaecb5bcd182e16329d427bcc0cb4057b4025b9)

GitHub ↗
@2501babe

acaecb5(https://github.com/solana-foundation/solana-improvement-documents/pull/648/commits/acaecb5bcd182e16329d427bcc0cb4057b4025b9)

GitHub ↗
@simd-botbot

✅ All approvals received! @2501babe, you can now merge this by commenting /merge. ✅ Status: Ready to merge

GitHub ↗
@simd-botbot

✅ Merge successful! 2501babe(https://github.com/2501babe)'s PR has been merged.

GitHub ↗

simd.watch community discussion · SIMD-0648

Powered by Giscus · Sign in with GitHub to comment

Community comments load when this section approaches the viewport.

Provenance

Evidence & technical details

Rollout or chain data, source revisions, freshness and integrity.
2

SIMD

Deployment Status

Document lifecycleReview
CategoryCore protocol
Devnetinactive
Testnetinactive
Mainnet-Betainactive
UPbPFtaUVoKZuMEJsDxLfvCNuKavoVapghnzepr1e26

Exact source revision

Sources & integrity

  • Proposal document pinned_commit_blob
    eac20f2994dd064482d96f178a4bbc0f4e358fd0
  • simd-document document · stale · Oct 27, 2026
    eac20f2994dd064482d96f178a4bbc0f4e358fd0

One or more sources are unavailable.