Relaxing Transaction Signature Verification
- Idea
- Draft
- Review
- Accept
- Implement
- Active
Decision brief
Why this proposal matters
This proposal replaces the verify_strict semantics used in Solana, derived from Agave's usage of ed25519-dalek's verify_strict, with ZIP-215, Zebra's EdDSA variant. In practice, this removes the $R$ and $A$ torsion checks, multiplies the verification equation by the cofactor, and makes verification insensitive to torsion elements. This change enables batch verification of transaction signatures, improves validator efficiency, and standardizes consensus behaviour across implementations.
Proposal at a glance
What changes
- Strict Verification: Ed25519 verification that explicitly rejects both public keys and ephemeral points in the signature ($A$ and $R$) with torsion components.
- Cofactored Verification: A scheme where the entire verification equation is multiplied by the curve's cofactor (8), rendering torsion elements irrelevant while preserving security.
- Batch Verification: Verifying many signatures together via random linear combination and a multi-scalar multiplication.
Stakeholder map
Who is affected
Builders & client teams Medium impact
Dapp developers: No required changes, signatures already generated remain valid.
Action may be requiredValidators & operators Medium impact
This upgrade will require one feature gate. Once this feature gate is active, ZIP-215 will be the equation used for all EdDSA signature verifications, instead of verify_strict.
Action may be requiredUsers & stakers Impact unknown
No proposal-specific evidence was found for this group.
Action requirement unknownGovernance & ecosystem Medium impact
This proposal replaces the verify_strict semantics used in Solana, derived from Agave's usage of ed25519-dalek's verify_strict, with ZIP-215, Zebra's EdDSA variant. In practice, this removes the $R$ and $A$ torsion checks, multiplies the verification equation by the cofactor, and makes verification insensitive to torsion elements.…
Action requirement unknownExact source revision
Full proposal document
0616093b2952Summary
This proposal replaces the verify_strict semantics used in Solana, derived
from Agave's usage of ed25519-dalek's verify_strict, with
ZIP-215, Zebra's EdDSA variant. In practice,
this removes the $R$ and $A$ torsion checks, multiplies the verification
equation by the cofactor, and makes verification insensitive to torsion
elements. This change enables batch verification of transaction signatures,
improves validator efficiency, and standardizes consensus behaviour across
implementations.
Motivation
Two main factors motivate this proposed change.
Today, Solana validators must perfectly replicate the behaviour of
verify_strict, a function implemented in theed25519-daleklibrary. This forces validators written in other languages, or ones that do not wish to use this library for better diversity, to re-implement the exact semantics. While this will always be the case, due to transaction verification being part of consensus, this proposal suggests using a better proven verification equation, which is better described, rather than the implicit behaviour found in theed25519-daleklibrary.verify_strictrejects small-orderR, which makes batch verification impossible. Batched verification can reduce costs by ~40% for large signatures batches, which is significant at Solana's scale, where validators process hundreds of thousands of signatures every block.
New Terminology
- Strict Verification: Ed25519 verification that explicitly rejects both public keys and ephemeral points in the signature ($A$ and $R$) with torsion components.
- Cofactored Verification: A scheme where the entire verification equation is multiplied by the curve's cofactor (8), rendering torsion elements irrelevant while preserving security.
- Batch Verification: Verifying many signatures together via random linear combination and a multi-scalar multiplication.
Detailed Design
Switch to using the verification equation described in ZIP-215 for Ed25519 EdDSA signature verification.
Algorithm:
Given a message $M$, public key $A$, signature ephemeral point $R$, and scalar $S$.
- Reject the signature if $
S \notin \{0, ..., L - 1\}$. - Compute the hash $\text{SHA512}(R || A || M)$ and reduce it $\bmod L$ to get scalar $h$.
- Given that $B$ is the Ed25519 basepoint, accept the signature if:
8(S \cdot B) - 8R - 8(h \cdot A) = \mathcal{O}
Note that non-canonical $R$ and $A$ points are allowed. Honest parties
will generate their keys according to the protocol, which in this case
would be RFC-8032's
definition of sign. As this does not produce non-canonical encodings of
points, the honest parties will be unaffected, and it will only affect parties
that purposefully create special signatures.
Application:
This proposal specifically targets usages of verify_strict, replacing
them with the Algorithm described above. This includes replacing the equation
used for verification of transaction signatures, gossip packet signatures, shred
packet signatures, and the Ed25519 precompile program.
Section 3.2 of Taming the many EdDSAs explains the relationship between batched and single cofactored verifications, proving them to be compatible. As a result, they can be used interchangeably, in use cases such as optimizing transaction signature verification.
Alternatives Considered
ed25519-dalek'sverify: Another option would be to just downgrade the check fromverify_stricttoverify. This would also be backwards compatible, however there are a few issues with this approach. It is not possible to perform a compatible batched verification of a cofactorless verification equation with some sort of incompatibility, leading back to the original issue. Our only option would be to define the protocol in terms of the batched verification equation's behaviour which is not preferable.Taming the many EdDSAs equation: The paper describes a cofactored verification scheme very similar to ZIP-215, the only difference being that small-order $A$ points are rejected. This allows their scheme to achieve strongly binding signatures, a property that does not affect Solana. We prefer using ZIP-215 as it has a well-proven Rust library, ed25519-zebra, that would allow easier migration for Agave.
Impact
- Dapp developers: No required changes, signatures already generated remain valid.
- Validators: Lower CPU usage, faster verification pipelines.
- Core Contributors: A more clear, standardized implementation for new validator clients and other software potentially performing signature verification.
Security Considerations
There are two important qualities an EdDSA scheme can have.
- Strongly Binding Signatures (SBS): A signature scheme is strongly binding if each valid signature corresponds to exactly one valid message, i.e there is no "malleability" in the verification equation.
- Strong Unforgeability under Chosen Message Attack (SUF-CMA): A signature scheme is SUF-CMA secure if an attacker cannot create any new valid signature, even on a message that has been signed before. In other words, they can't "malleate" an existing signature into another distinct, valid one.
The only quality that Solana worries about is SUF-CMA (as opposed to EUF-CMA), which ZIP-215 achieves by rejecting $S$ scalars which do not fit into $l$.
Backwards Compatibility
- All signatures valid under
verify_strictremain valid under ZIP-215 verification. - A small class of signatures previously rejected may now be accepted.
This upgrade will require one feature gate. Once this feature gate is active,
ZIP-215 will be the equation used for all EdDSA signature verifications,
instead of verify_strict.
Here is a proof that any signature that verify_strict accepts would
be accepted by the new verification equation as well:
Lemma:
Consider the verify_strict equation (E) to be:
S \cdot B - h \cdot A = R
where $B$ is the base point, $A$ is the public key point, $R$ is the ephemeral point, $S$ is the signature scalar and $h = \text{SHA512}(R || A || M) \bmod L$.
Assume verify_strict accepts a signature, where
- The above equation (E) holds in the Edwards25519 group.
- $S$ is canonical and $
S \in \{0, ..., L - 1\}$. - $A$ is canonical and not a small-order point.
- $R$ is canonical and not a small-order point.
Then the new verification equation (C):
8(S \cdot B) - 8R - 8(h \cdot A) = \mathcal{O}
also holds; therefore a new verifier that enforces (2), and the equation (C), will accept the signature.
Proof:
Start from (E):
S \cdot B - h \cdot A = R
This can be rewritten as:
S \cdot B - R - h \cdot A = \mathcal{O}
Apply scalar multiplication by the cofactor (8). Since scalar multiplication is linear and the group law applies:
[8](S \cdot B - R - h \cdot A) = [8]\mathcal{O}
If you distribute $[8]$ across the sum:
8(S \cdot B) - 8R - 8(h \cdot A) = \mathcal{O}
which is exactly the equation (C). Therefore, assuming that $S$ is properly
checked, the new verification equation should never reject a signature accepted
by verify_strict.
Evidence graph
Related proposals and rollout
One or more sources are unavailable.
Upstream review record
Upstream discussion & review
One or more sources are unavailable.
Provenance
Evidence & technical details
Rollout or chain data, source revisions, freshness and integrity. 3
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 · stale · Sep 11, 2026
0616093b2952ed6de52c4a27d66aadd11d48d4f9
One or more sources are unavailable.
One or more sources are unavailable.
simd.watch community discussion · SIMD-0376
Powered by Giscus · Sign in with GitHub to comment
Community comments load when this section approaches the viewport.