Syscall Parameter Address Restrictions
- Idea
- Draft
- Review
- Accept
- Implement
- Active
Decision brief
Why this proposal matters
Syscall parameter related changes split off from SIMD-0219: Removing pitfalls and foot-guns from the ABI (including syscalls) and runtime.
Proposal at a glance
What changes
- The following pointers must be on the stack or heap, meaning their virtual address is inside 0x200000000..0x400000000, otherwise SyscallError::InvalidPointer must be thrown:
- The destination address of all sysvar related syscalls
- The pointer in the array of &[AccountInfo] / SolAccountInfo
Stakeholder map
Who is affected
Builders & client teams Medium impact
Splitting SIMD-0219 should have no impact on dApp developers or validators. The additional changes are continuously tested (over a month) and monitored on mainnet-beta to not cause any existing dApps to behave differently.
Action may be requiredValidators & operators Medium impact
Splitting SIMD-0219 should have no impact on dApp developers or validators. The additional changes are continuously tested (over a month) and monitored on mainnet-beta to not cause any existing dApps to behave differently.
Action may be requiredUsers & stakers Impact unknown
No proposal-specific evidence was found for this group.
Action requirement unknownGovernance & ecosystem Impact unknown
No proposal-specific evidence was found for this group.
Action requirement unknownExact source revision
Full proposal document
0616093b2952Summary
Syscall parameter related changes split off from SIMD-0219: Removing pitfalls and foot-guns from the ABI (including syscalls) and runtime.
Motivation
In a recent meeting between the Agave and Firedancer core developers it was decided that SIMD-0219 should be split into two feature gates. This SIMD covers the first half which is focused on reducing the attack surface and fix long standing issues with CPI in general.
The reasoning for splitting SIMD-0219 is to de-risk its deployment and to be able to make progress on shipping earlier parts even if later parts have to be delayed further. The reason for cutting SIMD-0219 at this specific boundary is that this first half is not expected to have any impact on performance, while the second half on the other hand will.
Additionally, some consensus relevant code reordering is added to reduce the attack surface of around CU metering and make the CPI logic more comprehensible after this SIMDs feature gates are cleaned up.
New Terminology
None.
Detailed Design
Changes inherited from SIMD-0219
- The following pointers must be on the stack or heap,
meaning their virtual address is inside
0x200000000..0x400000000, otherwiseSyscallError::InvalidPointermust be thrown:- The destination address of all sysvar related syscalls
- The pointer in the array of
&[AccountInfo]/SolAccountInfo* - The
AccountInfo::datafield, which is aRefCell<&[u8]>insol_invoke_signed_rust - The
AccountInfo::lamportsfield, which is aRefCell<&u64>insol_invoke_signed_rust
- The following pointers must point to what was originally serialized in the
input regions by the program runtime,
otherwise
SyscallError::InvalidPointermust be thrown:AccountInfo::key/SolAccountInfo::keyAccountInfo::owner/SolAccountInfo::ownerAccountInfo::lamports/SolAccountInfo::lamportsAccountInfo::data::ptr/SolAccountInfo::data
Additional changes
InstructionError::InvalidRealloc must be thrown on the CPI call edge if the
caller requested an account length which does not fit the payload address space
of the account in the caller. This check must occur after the address of the
account length is translated but before the address of the account payload is
translated.
InstructionError::InvalidRealloc must be thrown on the CPI return edge if the
callee requested an account length which does not fit the payload address space
of the account in the caller. This check currently allows for +10 KiB even in
ABIv0 which is incorrect and must be reduced to 0 growth allowed in ABIv0.
All sites in the CPI code which perform guest to host address translation first and then perform pointer arithmetic on the host must be swapped such that they perform pointer arithmetic in the virtual address space first followed by the address translation second. This specifically affects the account length field.
As a consequence of the changes to the address translation of the account length field, the CU charging for the account length in CPI must be moved to occur after the address translation of the account length field.
Modifications of the callee accounts on the CPI call edge must all happen together after every account info and account meta is translated, instead of being interleaved with these.
Alternatives Considered
Leaving SIMD-0219 as is.
Impact
Splitting SIMD-0219 should have no impact on dApp developers or validators. The additional changes are continuously tested (over a month) and monitored on mainnet-beta to not cause any existing dApps to behave differently.
Security Considerations
None.
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 #459 · merged SIMD-0459: Syscall Parameter Address Restrictions 19 comments and reviews · May 4, 2026The changes added in this SIMD over SIMD-0219 are covered in https://github.com/anza-xyz/agave/pull/9995 and have been tested since then (a month ago).
GitHub ↗I'm also not entirely clear which charge is being moved around: the charge for address translation? Or the entire translation+access operation? We never charged for the address translation, we charge for the length of the accounts as their data needs to be copied and compared.
GitHub ↗Thanks, ripatel-fd(https://github.com/ripatel-fd)! ⚠️ Status: Cannot merge yet - Missing approval from: Anza (t-nelson(https://github.com/t-nelson), sakridge(https://github.com/sakridge), or bw-solana(https://github.com/bw-solana))
GitHub ↗Thanks, topointon-jump(https://github.com/topointon-jump)! ⚠️ Status: Cannot merge yet - Missing approval from: Anza (t-nelson(https://github.com/t-nelson), sakridge(https://github.com/sakridge), or bw-solana(https://github.com/bw-solana))
GitHub ↗✅ All approvals received! @Lichtso, you can now merge this by commenting /merge. ✅ Status: Ready to merge
GitHub ↗/merge
GitHub ↗✅ Merge successful! Lichtso(https://github.com/Lichtso)'s PR has been merged.
GitHub ↗would have been ideal had this been written as a standalone document with only ref to 0219 being the supersedes field
GitHub ↗Provenance
Evidence & technical details
Rollout or chain data, source revisions, freshness and integrity. 1
Provenance
Evidence & technical details
Rollout or chain data, source revisions, freshness and integrity.SIMD
Deployment Status
Feature Gate not yet created
Exact source revision
Sources & integrity
- Proposal document pinned_commit_blob
0616093b2952ed6de52c4a27d66aadd11d48d4f9 - simd-document document · current · Sep 11, 2026
0616093b2952ed6de52c4a27d66aadd11d48d4f9
One or more sources are unavailable.
simd.watch community discussion · SIMD-0459
Powered by Giscus · Sign in with GitHub to comment
Community comments load when this section approaches the viewport.