ZIP 2005 — Ironwood Quantum Recoverability
Terminology
The key words "MUST", "SHOULD", and "MAY" in this document are to be interpreted as described in BCP 14 1 when, and only when, they appear in all capitals.
The term "network upgrade" in this document is to be interpreted as described in ZIP 200. 2
The character § is used when referring to sections of the Zcash Protocol Specification. 3
The terms "Mainnet" and "Testnet" are to be interpreted as described in § 3.12 ‘Mainnet and Testnet’. 4
We use the convention followed in the protocol specification that an variable indicates a byte sequence, and a variable suffixed with indicates a bit-sequence encoding of an elliptic curve point.
The notation denotes the binomial coefficient — the number of ways of choosing items from a set of , which is equal to for .
For brevity, in the discussion sections of this ZIP we abbreviate as , as , as , and similarly for other Orchard-protocol-specific hash function names. The changes to the protocol specification and to other ZIPs use the full forms.
We will use the syntax for a tagged union type with tags and . Such types can be destructured using a construct:
The terms "Ironwood pool" and "Orchard pool" are to be interpreted as described in 5. Following the convention in the protocol specification, we use slanted text to refer to pool names, in order to more clearly distinguish them from shielded protocols.
The terms "recoverable note" and "recoverable note plaintext" refer to a note or note plaintext that was created according to this proposal. As initially deployed, these are necessarily Ironwood-pool notes or note plaintexts.
The term "Recovery Protocol" refers to a potential new shielded protocol that would allow recovery of funds held in recoverable Ironwood-pool notes. This ZIP describes the Recovery Protocol in outline but not in detail: many of its design decisions are intentionally left open. The Recovery Protocol would also allow recovering notes created according to the ZSA extension to the Orchard protocol 6 7 if that were deployed.
Abstract
This ZIP proposes a change to the construction of notes, to be deployed for the Ironwood pool 5, designed to improve Zcash's long-term resilience against a significant potential threat to its security from quantum computers. It does not by itself make the protocol secure against quantum adversaries, but is intended to support a smoother transition to future versions of Zcash designed to be so.
The existing Zcash shielded protocols are dependent on the hardness of finding discrete logarithms; an adversary who can do so (via quantum computers or otherwise) would be able to steal or forge funds. In the event of needing to disable these protocols in order to prevent such attacks, it will be possible to use a Recovery Protocol to recover funds from the Ironwood pool. This Recovery Protocol is expected to remain secure against discrete-logarithm-breaking and quantum adversaries. This change does not by itself make Zcash secure against attacks using quantum computers, but is a necessary and substantial step toward that goal.
Recovery would not be possible for funds still in the Sprout, Sapling, or Orchard pools; all such funds would be inaccessible after their respective protocols are disabled. They should be migrated to the Ironwood pool in order to take advantage of this change.
Motivation
If quantum computers —or any other attack that allows finding discrete logarithms on the elliptic curves used in Zcash— were to become practical, it would raise difficult issues for the Zcash community. An adversary able to compute discrete logarithms (in fact, a single discrete logarithm is sufficient) could cause arbitrary inflation or steal users' funds.
Critically, the note commitment algorithms used by the Sapling and Orchard shielded protocols are not post-quantum binding. This means that even if the proof system were upgraded to one that is believed to be secure against quantum computers, and even if the note commitment tree were to be reconstructed (from public information) to use a suitable hash function, it would still be possible for a quantum or discrete-logarithm-breaking adversary to forge and spend notes that are not actually in the commitment tree — thus breaking the Balance property.
This ZIP proposes a small change to the way Orchard-protocol notes are derived, that would apply to all notes in the new Ironwood pool. If this change is made well in advance of quantum computers becoming viable, it would provide time for users to move their funds to the Ironwood pool, keeping them safe and recoverable after a subsequent post-quantum transition. This would not require any change to the Orchard-protocol (or proposed OrchardZSA-protocol) circuits for the time being, and would not require deciding on the particular proof system or note commitment tree hash used in the future protocol.
Recovering these funds after the post-quantum transition would involve checking a more expensive and complicated statement in zero knowledge, but it is expected that this will be entirely practical for the intended usage of recovering funds into another shielded pool. The current privacy properties of the Orchard protocol would be retained against pre-quantum adversaries, and also against post-quantum adversaries without knowledge of the notes' addresses. 8
To reduce overall protocol complexity and analysis effort, we do not propose a similar change for Sapling. Instead, Sapling funds can be migrated to the Ironwood pool in order to make them quantum-recoverable. (Note that this analysis effort needs to include the child and internal key derivations defined in ZIP 32, which differ significantly between the Sapling 9 10 and Orchard 11 12 protocols.)
This proposal is implementable at low risk, and required changes to existing libraries and wallets are small. It is compatible with Memo Bundles 13 and/or ZSAs 6.
Requirements
- Ironwood-pool notes constructed according to this proposal should be spendable via a Recovery Protocol (to be introduced, potentially, in a future upgrade) that is expected to be secure against discrete-logarithm-breaking and quantum adversaries.
- No particular choice of post-quantum proving system or commitment tree hash should be assumed for that alternate protocol.
- The proposed scheme should be fully compatible with FROST threshold multisignatures 14, hardware wallets, and the combination of both.
- The proposed scheme should not require regeneration of existing non-multisignature keys or addresses.
- It should be possible for wallets to identify what subset of a user's funds have been made recoverable.
- The changes made to the pre-quantum protocol should not cause a significant regression in performance, applicability, or security against any given adversary class, or require significant re-analysis of that protocol's pre-quantum security.
- The Recovery Protocol should ensure no loss of security against pre-quantum adversaries — including when FROST threshold multisignatures and/or hardware wallets are used.
- Recovery of funds from hardware wallets that support this protocol should not require exposing the pre-quantum spend authorizing key to theft.
- The proposal should be compatible with Zcash Shielded Assets with minimal additional complexity 6 7.
Non-requirements
- It is not required to address discrete-logarithm-breaking or quantum attacks on privacy with this proposal, as long as it does not cause any regression in privacy properties.
- It is not required to add support for the Recovery Protocol to consensus rules now.
- It is not required for spends using the Recovery Protocol to be as efficient as spends using the Orchard or Sapling protocols.
- It is not anticipated that spends using the Recovery Protocol will need to be indistinguishable from non-Recovery spends.
High-level summary of changes
This subsection and the flow diagram below are non-normative.
This proposal defines a new note plaintext format to be used for recoverable notes (that is, those in the Ironwood pool), with lead byte . The value is computed differently for this new format, by including all of the note fields in . This means that an adversary constrained to treat the PRF used to derive from as a random oracle, could not vary any note field without producing a different . This lets us argue that the overall commitment scheme is post-quantum binding, as long as the new derivation of is checked in the Recovery Protocol.
Essentially the same technique also needs to be applied to the function that is used to derive Orchard-protocol incoming viewing keys. The randomness in is derived directly or indirectly from , which is in turn derived from one of two random oracles, depending on which key material the user holds:
- For existing Orchard-protocol keys, is derived from the secret key via , with and also derived from . The Recovery Protocol checks all three derivations.
- For keys generated via FROST distributed key generation, or for hardware wallets where exporting is undesirable, an alternative "quantum spending key" and "quantum intermediate key" are used, with . The Recovery Protocol checks this derivation together with a proof of knowledge of such that .
Both branches (and both cases ) are covered uniformly by the Security argument for key binding: each binds the keys —and , including whether it is in use— to the incoming-viewing key post-quantumly, up to a small advantage against collision-finding in the random oracles used for derivation. The FROST and hardware-wallet use cases are described in Usage with FROST and Usage with hardware wallets.
Flow diagram for the Orchard protocol
This diagram shows, approximately, the derivation of Orchard-protocol keys, addresses, notes, note commitments, and nullifiers. All of the flow diagrams in this ZIP omit type conversions between curve points, field elements, byte sequences, and bit sequences, and so are not sufficiently precise to be used directly as a guide for implementation.
---
title: "Key to flow diagrams"
---
graph BT
classDef default stroke:#111111;
classDef func fill:#d0ffb8;
classDef cefunc fill:#a0e0a0;
classDef sensitive fill:#ffb0b0;
classDef semi_sensitive fill:#ffb0ff;
classDef keybox stroke:#808080, fill:#ffffff;
classDef spacer opacity:0;
key([sensitive key]):::sensitive ~~~ function:::func
value([value]) ~~~ cond{{conditional value}}
dummyA( ) -->|existing| dummyB( )
dummyC( ) ==>|new| dummyD( )
dummyE( ) -.->|optional| dummyF( )
The bold lines are changes introduced by this ZIP, which all take the form of additional inputs to derivation functions or alternative derivations. The derivations shown in the box labelled Proposed Recovery Statement are, roughly speaking, those enforced by the section of that name. The diagram shows the recoverable-note case (); for the existing Orchard-protocol derivation applies, and the additional fields feeding into are absent.
graph BT
classDef default stroke:#111111;
classDef func fill:#d0ffb8;
classDef cefunc fill:#a0e0a0;
classDef sensitive fill:#ffb0b0;
classDef semi_sensitive fill:#ffb0ff;
classDef circuit stroke:#000000, fill:#fffff0;
classDef spacer opacity:0;
PostQC:::circuit
subgraph PostQC[<div style="margin:1.1em;font-size:20px"><b>Proposed Recovery Statement</b></div>]
direction BT
rivk_ext([rivk_ext]) --> Hrivk_int[H<sup>rivk_int</sup>]:::func
ak([ak]) --> Hrivk_int[H<sup>rivk_int</sup>]:::func
nk --> Hrivk_int
rivk_ext -->|¬is_internal_rivk| rivk
Hrivk_int -->|is_internal_rivk| rivk{{rivk}}
rivk --> Commitivk[Commit<sup>ivk</sup>]:::func
ak([ak]) ----> Commitivk
nk([nk]) ----> Commitivk
Commitivk ---> ivk([ivk])
gd ---> ivkmul[[ivk]g<sub>d</sub> ]:::func
ivk --> ivkmul
rseed --> Hpsi[H<sup>ψ</sup>]:::func
rho --> Hpsi
v([#8239;v#8239;]) ==> pre_rcm([pre_rcm])
pkd ====> pre_rcm
gd ==> pre_rcm
psi ===> pre_rcm
rho([#8239;ρ#8239;]) --> pre_rcm
v ~~~~ rcm
ivkmul --> pkd([pk<sub>d</sub>])
pre_rcm --> Hrcm[H<sup>rcm</sup>]:::func
rseed([rseed]) --> Hrcm
Hrcm --> rcm([rcm])
Hpsi --> psi([#8239;ψ#8239;])
gd --> NoteCommit:::func
pkd --> NoteCommit
psi --> NoteCommit
v --> NoteCommit
rcm --> NoteCommit
rho --> NoteCommit
cm --> DeriveNullifier:::func
psi --> DeriveNullifier
rho --> DeriveNullifier
nk --> DeriveNullifier
NoteCommit --> cm([cm])
DeriveNullifier --> nf([nf])
cm --> cmx([cm<sub><i>x</i></sub>])
end
d([#8239;d#8239;]) --> HashToCurve:::func ------> gd([g<sub>d</sub>])
Specification
Proactive movement of funds to recoverable notes
Once this proposal is deployed, wallets SHOULD move all of the funds they control (including transparent, Sprout, and Sapling funds) into recoverable Ironwood-pool notes as soon as practically possible. Other wallets are REQUIRED, as part of supporting the NU6.3 upgrade, to be able to receive these notes.
Non-recoverable funds may be received after existing funds have been made recoverable. Wallets SHOULD therefore treat the movement of funds to recoverable notes as an ongoing process.
Usage with FROST
When generating Orchard-protocol keys for FROST, will be derived jointly from the participants' shares of according to the FROST Distributed Key Generation (DKG) protocol.
This ZIP further constrains FROST key generation for the Orchard procotol as follows: participants MUST privately agree on a value , and then use it with to derive , , , and (using the output by the DKG protocol) , as specified in § 4.2.3 ‘Orchard Key Components’ 15.
graph BT
classDef default stroke:#111111;
classDef func fill:#d0ffb8;
classDef cefunc fill:#a0e0a0;
classDef sensitive fill:#ffb0b0;
classDef semi_sensitive fill:#ffb0ff;
classDef circuit stroke:#000000, fill:#fffff0;
classDef spacer opacity:0;
sk([sk]):::sensitive --> Hnk[H<sup>nk</sup>]:::func ----> nk([nk])
sk --> Hqsk[H<sup>qsk</sup>]:::func --> qsk([qsk]):::sensitive
qk ==> Hrivk_ext
nk ==> Hrivk_ext
FROST_DKG --> ak([ak]) --> FROST_Sign
FROST_DKG ~~~ s( ):::spacer ~~~ FROST_Sign
FROST_DKG --> ask([ask<sub>i</sub>]):::sensitive --> FROST_Sign
ak ==> Hrivk_ext[H<sup>rivk_ext</sup>]:::func
Hrivk_ext ==>|use_qsk| rivk_ext([rivk_ext])
HWW1:::circuit
subgraph HWW1[<div style="margin:1.6em;font-size:20px"><br><br><br><br><br><br><br><br><br><b>SoK<sup>qsk</sup></b></div>]
qsk([qsk]):::sensitive ==> Hqk[H<sup>qk</sup>]:::cefunc
Hqk ==> qk([qk]):::semi_sensitive
end
The protocol MUST ensure that all participants obtain the same values for , , and . (Provided that the participants have followed § 4.2.3, this implies that they have the same and , by collision resistance of and .)
Each participant MUST treat as a secret held at least as securely and reliably as . Note that will not be needed to sign unless and until the Recovery Protocol is needed, but it is essential that it be retained, otherwise funds could be lost if and when the current Orchard protocol is disabled.
The Recovery Protocol will still require a RedDSA signature verifiable by the Spend validating key , in addition to knowledge of . RedDSA is not secure in the long term against a quantum or discrete-logarithm-breaking adversary. However, during any period in which the adversary cannot find discrete logarithms on the Pallas curve, checking this RedDSA signature will ensure that spend authorization continues to require a -of- threshold of participants. An important advantage of FROST —that the parties can sign using their shares without reconstructing , the Spend authorizing key— is retained.
Note that a quantum adversary may be able to steal the funds with only access to , which is held by every participant (see below for more detail on Key storage options). Therefore, it is RECOMMENDED that as soon as a fully post-quantum protocol that supports threshold multisignatures is available, all funds held under FROST keys be transferred into that protocol's shielded pool.
Usage with hardware wallets
The same option can help to improve the efficiency of using the Recovery Protocol with hardware wallets. If the keys , , and are generated from , then the circuit for the Recovery Protocol will need to prove their correct derivation using , , , and as shown in the box of the diagram below.
graph BT
classDef default stroke:#111111;
classDef func fill:#d0ffb8;
classDef cefunc fill:#a0e0a0;
classDef sensitive fill:#ffb0b0;
classDef semi_sensitive fill:#ffb0ff;
classDef circuit stroke:#000000, fill:#fffff0;
classDef spacer opacity:0;
HWW1:::circuit
subgraph HWW1[<div style="margin:1.1em;font-size:20px"><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><b>SoK<sup>sk</sup></b></div>]
sk --> Hrivk_legacy[H<sup>rivk_legacy</sup>]:::func ----> rivk_legacy
DerivePublic --> ak([ak])
sk([sk]):::sensitive --> Hnk[H<sup>nk</sup>]:::func ----> nk([nk])
sk --> Hask[H<sup>ask</sup>]:::func --> ask([ask]):::sensitive
ask --> DerivePublic:::func
end
HWW2:::circuit
subgraph HWW2[<div style="margin:1.6em;font-size:20px"><br><br><br><br><br><br><br><br><br><b>SoK<sup>qsk</sup></b></div>]
qsk([qsk]):::sensitive ==> Hqk[H<sup>qk</sup>]:::cefunc
Hqk ==> qk([qk]):::semi_sensitive
end
sk -.-> Hqsk[H<sup>qsk</sup>]:::func -.-> qsk
qk ==> Hrivk_ext[H<sup>rivk_ext</sup>]:::func
nk([nk]) ==> Hrivk_ext
ak ==> Hrivk_ext
Hrivk_ext ==>|use_qsk| rivk_ext{{rivk_ext}}
rivk_legacy([rivk_legacy]) -->|¬use_qsk| rivk_ext
When is used, on the other hand, it is possible for the Recovery Protocol to support spend authorization using a simpler statement that only uses and a commitment scheme. For example, for some hiding and collapse-binding commitment the hardware wallet could prove knowledge of such that This statement, labelled as in the diagram, can be implemented in a much smaller circuit, so it might be feasible to do the proof in quite constrained hardware.
The commitment would be a public input opened to in the Recovery Statement, ensuring that the hardware wallet has authorized the spend for the correct key. Because is hiding and the proofs are zero knowledge, no information is leaked about which is being used.
Key storage options and analysis
By host wallet, we mean the device that builds the spend transaction and produces the rest of the Recovery Statement proof. In a multi-signer FROST setup, this would be the Coordinator 16. The host wallet is given , , and (assuming is true) , for use in the Recovery Statement. Then two options are possible for storage of :
Option A — The proof is produced inside the hardware wallet, and is retained there.
Option B — Alternatively, if the hardware wallet is unable to support proving , it could be updated to permit exporting to the host wallet, and the proof would be produced there.
In either option, would remain on the hardware wallet which would continue to produce RedDSA spend authorization signatures (or perform its part of the FROST multi-signing protocol).
Threat model
The Recovery Statement is assumed below to require both of:
- an proof verifying knowledge of such that for the spent note's ; and
- a RedDSA signature on , which under FROST is constructed by cooperation of -of- hardware-wallet signers, each contributing using its share of .
Under this assumed structure, with FROST + hardware-wallet deployment, spend authorization is broken only by either:
-
possession + finding discrete logarithms on the Pallas curve. The variants differ only in how is obtained:
- the adversary is an authorized FROST signer — they hold a copy of by construction;
- is extracted from a hardware wallet, defeating Option A by a physical-device or side-channel attack;
- is obtained after export to the host wallet, by compromising the host wallet or intercepting it during export.
-
Breaking a primitive or scheme. RedDSA, FROST, the DKG, or the proving system has a cryptographic weakness or implementation flaw.
Choosing between Options A and B
Option A is preferred where the target hardware wallet is capable of proving on-device. Option B is a fallback for cases where it cannot — for instance, due to memory or secure-element constraints, uncertainty about the proof system that will be chosen and what will be tractable on small devices, or the device having been obsoleted before firmware support could be added.
Under Option A, the host wallet holds only the full viewing key (, ) —which the pre-Quantum-Recoverability protocol already entrusted to it— plus . The attack surface is then 1.a. or 1.b. only.
Option B additionally places on the host wallet, admitting case 1.c. as well. This has the disadvantage that host-wallet compromise is a substantially larger attack surface than hardware-wallet extraction. However, even with in hand, an adversary would still need to break RedDSA or find discrete logarithms on the Pallas curve to steal funds.
Note: with ZIP 32 hierarchical derivation, need not be backed up separately from the seed phrase. When is true, where is the HD-derived spending key, and so can be re-derived from the seed phrase (with or without SLIP 39 Shamir backup 17). A deployment that does not use ZIP 32 is responsible for the security of its own backup arrangements.
Usage with other proposals requiring note plaintext format changes
This proposal was originally designed to be deployed alongside ZSAs 6 7 and memo bundles 13, which also defined a new note plaintext format. Since this proposal now defines lead byte , those proposals will need to use a new lead byte value or values.
Specification Updates
This is written as a set of changes relative to version 2026.7.0 of the protocol specification 18, and to the contents of ZIPs as of July 2026. The protocol specification changes will be applied in version 2026.8.0 3.
Changes to the Protocol Specification
§ 2 ‘Notation’
In the list of integer constants that will be instantiated in § 5.3 ‘Constants’, add and immediately after .
§ 3.2.1 ‘Note Plaintexts and Memo Fields’
Replace the paragraph
Define
with
Let be the chain value pool of the note.
Define
In the non-normative note:
Since was introduced after the end of the , note plaintexts for Orchard-pool notes MUST have .
replace "" with "".
Add the non-normative notes:
- Note plaintexts for Ironwood-pool notes MUST have .
- It is important that and remain disjoint for any and .
Replace the non-normative note:
- It is intentional that the definition of does not currently depend on or . It might do so in future.
with
- It is intentional that the definition of does not currently depend on . It might do so in future.
§ 4.1.2 ‘Pseudo Random Functions’
In the list of places where is used:
Replace
- [NU5 onward] in § 4.2.3 ‘Orchard Key Components’ 19, with inputs , , , and with first byte ;
- in the processes of sending (§ 4.7.2 ‘Sending Notes (Sapling)’ 20 and § 4.7.3 ‘Sending Notes (Orchard)’ 21) and of receiving (§ 4.20 ‘In-band secret distribution (Sapling and Orchard)’ 22) notes, for Sapling with inputs and , and for Orchard with ;
with
- [NU5 onward] in § 4.2.3 ‘Orchard Key Components’ 19, with inputs , , , and with first byte in ( and are also specified in [ZIP 2005]);
- in the processes of sending (§ 4.7.2 ‘Sending Notes (Sapling)’ 20 and § 4.7.3 ‘Sending Notes (Orchard)’ 21) and of receiving (§ 4.20 ‘In-band secret distribution (Sapling and Orchard)’ 22) notes, for Sapling with inputs and , and for Orchard with first byte in ( is also specified in [ZIP 2005]);
Add
- in [ZIP 2005], with first byte in ( is reserved by this ZIP for use by split notes 23).
§ 4.2.3 ‘Orchard Key Components’
Add and to the constants obtained from § 5.3 ‘Constants’ 24.
Replace from "From this spending key" up to and including the line "let " in the algorithm with:
Under normal circumstances, the Spend authorizing key is derived directly from . However, this might not be the case for protocols that require distributed generation of shares of , such as FROST's Distributed Key Generation 25 (see [ZIP 2005, Usage with Frost] for further discussion). To support this we define an alternative derivation method using an additional "quantum spending key", , and "quantum intermediate key", .
There can also be advantages to not deriving directly from for hardware wallets, in order to separate the authority to make proofs for the Recovery Protocol from the spend authorization key that is kept on the device (see [ZIP 2005, Usage with hardware wallets]). The derivation from can also be used in that case.
Let be a flag indicating whether and are generated and used in the derivation of . (In cases where it is desired for the generation of key components to match versions of this specification prior to 2026.8.0, needs to be set to false.)
Define:
- 26
- .
, the Spend validating key , the nullifier deriving key , the optional quantum spending key and quantum intermediate key the randomness , the diversifier key , the private key , the outgoing viewing key , and corresponding “internal” keys MUST be derived as follows:
let
if :
obtain a public key by any suitably secure
method that ensures the last bit of is (see below).
let
let
let
let
else:
let mutable
if , discard this key and repeat with a new .
let
if the last bit (that is, the bit) of is :
setlet
let (there are no quantum spending/intermediate keys in this case)
let
Add before "As explained in § 3.1":
When is true, possible methods of generating include direct generation of an Orchard-protocol Spend authorizing key followed by , or FROST distributed key generation 25 in which the corresponding spend-authorization material is -of- shared among the participants.
Add the following notes:
If , , , , and are not generated as specified in this section, then it may not be possible to recover the resulting notes as specified in [ZIP 2005] in the event that attacks using quantum computers become practical. In addition, to recover notes it is necessary to retain, or be able to rederive , and also to know whether was used to derive the and addresses. When FROST is being used, it is also necessary to retain the group verifying key and (collectively among the signers) the key material needed to make spend authorization signatures that can be verified using .
See [ZIP 2005, Key storage options and analysis] for further discussion of storage requirements for and .
§ 4.7.2 ‘Sending Notes (Sapling)’
Add after the definition of :
Define
Define .
( intentionally takes an argument that is unused.)
Replace the lines deriving and with
Derive
Derive
§ 4.7.3 ‘Sending Notes (Orchard)’
Add before "For each Action description":
Define
where .
Define
Define .
Define .
The first-byte domain separator for is reserved by this ZIP for use by split notes in ZIP 226 23.
Insert before the derivation of :
Let , and .
and use these in the inputs to .
Replace the lines deriving , , and with
Derive
Derive
Derive
(The order of derivation has to be changed because the inputs to include .)
§ 4.8.2 ‘Dummy Notes (Sapling)’
Add
Let be as defined in § 4.7.2 ‘Sending Notes (Sapling)’.
Replace the line deriving with
Derive
§ 4.8.3 ‘Dummy Notes (Orchard)’
Insert before "The spend-related fields ...":
Let and be as defined in § 4.7.3 ‘Sending Notes (Orchard)’.
Replace the lines deriving and with
Let , and .
Derive
Derive
and use , , in the inputs to .
(The order of derivation has to be changed because the inputs to include .)
The choice of , as specified in § 3.2.1, is identical between dummy and non-dummy notes.
§ 4.20.2 and § 4.20.3 ‘Decryption using an Incoming/Full Viewing Key (Sapling and Orchard)’
For both § 4.20.2 and § 4.20.3, add before the decryption procedure:
Let be for a Sapling-pool note, or for an Orchard-pool or Ironwood-pool note.
Let and be as defined in § 4.7.2 ‘Sending Notes (Sapling)’.
Let , , and be as defined in § 4.7.3 ‘Sending Notes (Orchard)’.
For § 4.20.3, replace
if or , return
with
if or or (for Sapling) (see note below), return
and in the note containing "However, this is technically redundant with the later check that returns if ", delete the word "later".
For both § 4.20.2 and § 4.20.3, replace
for Sapling, let and
for Orchard, let from the same Action description , , and
with
let if , or otherwise
For § 4.20.2, replace
let
if , return
let . if (for Sapling) , return
[Canopy onward] if :
if , returnlet
with
let . if (for ) , return
[Canopy onward] if :
let
if , returnlet
if , let ,
let if , or otherwise
let
if , return
For § 4.20.2, also delete "where " from the line constructing the Orchard note tuple, since is now derived above.
The order of operations has to be altered because the derivation of can depend on and . The definitions of and are moved or inlined into § 4.7.2 ‘Sending Notes (Sapling)’ and § 4.7.3 ‘Sending Notes (Orchard)’ which define and .
For § 4.20.3, replace
[Canopy onward] if and , return
with
[Canopy onward] if and , return
(This check is why takes an argument at all.)
For § 4.20.3, replace
let
if , return
let . if (for Sapling) or (see note below), return
with
let . if (for Sapling) , return
if , let ,
let if , or otherwise
let
if , return
and delete "where ".
§ 5.3 ‘Constants’
Add the definitions, immediately after that of :
Changes to ZIPs
ZIP 32
Add a to the arrows leading to and in the diagram in section ‘Orchard internal key derivation’ 12, with the following note:
The derivations of and shown in the diagram are not the only possibility. For further detail see § 4.2.3 ‘Orchard Key Components’ in the protocol specification. However, if , , , , and are not generated as in the diagram, then it may not be possible to recover the resulting notes as specified in [ZIP 2005] in the event that attacks using quantum computers become practical.
ZIP 212
Add a note just after the Abstract heading:
This ZIP reflects the changes made to note encryption for the Canopy upgrade. It does not include subsequent changes in [ZIP 2005].
Rationale
Cryptographic background
This rationale is written primarily for cryptologists and protocol designers familiar with the Zcash shielded protocols. It is recommended to first read the slides of, and/or watch the following presentations:
To understand the modelling of hash function and commitment security against a quantum adversary we also recommend 28 and 29.
Proposed Recovery Protocol
The details of the protocol in this section are subject to change. This description is meant to facilitate analysis of whether the specification changes to be adopted now are likely to be sufficient to securely support a Recovery Protocol.
The proposed Recovery Protocol works, roughly speaking, by enforcing the derivations given in the [Flow diagram for the Orchard protocol], and we suggest having that diagram open in another window to refer to it.
Proposed Recovery Statement
Import this definition from § 4.2.3 ‘Orchard Key Components’ 15:
Define .
Import this definition from ZIP 32 12:
Import these definitions from § 4.7.3 ‘Sending Notes (Orchard)’ 30:
Define
where .
Define .
Import this definition from § 5.4.7.1 ‘Spend Authorization Signature (Sapling and Orchard)’ 31:
Define .
A valid instance of a Recovery Statement assures that given a primary input:
the prover knows an auxiliary input:
where
and
such that the following conditions hold:
and is the revealed nullifier.
(We don't need to check the derivation of from .)
Cost
Note that in the "" case, one BLAKE2b compression is required to compute (provided bits, so that the input fits in a single 128-byte BLAKE2b block), and in the "not " case, three BLAKE2b compressions in total are required to compute , , and . Since these cases are mutually exclusive, it is possible to multiplex the same three compression function instances. So, supporting "" in addition to "not " costs very little extra.
All of the operations below need to be implemented with complete additions, even if they are incomplete in the current Orchard[ZSA] statement/circuit.
In and the main circuit:
- 7 BLAKE2b-512 compressions:
- 3 multiplexed between when is true (1 compression), and + + when is false (3 compressions)
- 1 to compute
- 1 to compute
- 2 to compute
- 1 use of ()
- 1 use of ()
- 1 full-width fixed-base Pallas scalar multiplication,
- 1 full-width variable-base Pallas scalar multiplication,
- 1 Merkle tree path check
- 1 additional use of to compute .
In :
- 1 BLAKE3 compression for (with the context key precomputed as a constant)
plus, potentially, linking commitments between the circuits.
The expensive parts of this are the 7 BLAKE2b compressions.
Security analysis
Let us consider the security of the Orchard protocol against a discrete-logarithm-breaking adversary — which by definition includes quantum adversaries. Similar attacks apply to the Sapling protocol.
Suppose that the proof system has been replaced by one that is post-quantum knowledge-sound.
Repairing the note commitment Merkle tree
is instantiated using 32. Its collision resistance depends on the Discrete Logarithm Relation Problem on the Pallas curve 33, and so it is not post-quantum collision-resistant or collapsing. However, because the note commitment tree is public, it is possible to re-hash all of its leaves to construct a new Merkle tree using a collapsing hash function. Suppose this has been done.
The post-quantum security of Merkle trees —considered as position-binding vector commitments which is the property required by Zcash 27— is proven under reasonable assumptions in 34, 35, and 36.
Note: when we rehash the commitment tree, we could include both and for each note (i.e. what is currently the leaf layer becomes where is collapsing). This change might not be necessary; it just removes potential complications due to duplicate commitments for the same note.
Attacks against binding of note commitments
We still face the problem that is not binding against a discrete-logarithm-breaking adversary: given the discrete logarithm relations between bases, we can easily write a linear equation in the scalar field with multiple solutions of the inputs for a given commitment.
This allows an adversary to find two distinct notes corresponding to openings of on the same commitment. They create one note as an output and spend the other note — which may have a greater value, or a value in a different ZSA asset, breaking the Balance property.
Repairing note commitments
We prefer to fix this without changing itself. Instead we change how is computed to be a hash of and , as detailed in the [Specification] section. Specifically, when we have:
Informal security argument for binding of note commitments
For the formal versions of these arguments and their adaptation to the post-quantum setting, see the key-binding and Spendability theorems below, and the Adaptation to the quantum setting section.
We can view the output of for as the point addition of a randomization term , and some other function of .
Without loss of generality, we can write that function as , by expanding each of the Sinemilla bases used by as for some . That is, the note commitment for is
We will model as a random oracle independent of with uniform output on . This is reasonable because cannot depend on any of the , and in any case it is instantiated using BLAKE2b, a conventional hash function not related to the Pallas curve.
The fact that has as an input does not affect the analysis provided that and can be treated as independent. In practice both are defined in terms of , but with strict domain separation, and so the assumption of independence is reasonable as long as BLAKE2b-512 can be modelled as a random oracle. Note that since the input to needs more than one BLAKE2b input block, we require that a HAIFA sponge can be modelled as a random oracle which is justified by 37. It is possible that there could be better-than-generic quantum attacks against BLAKE2b-512, but none have been published to our knowledge. In practice, we consider it reasonable to assume that BLAKE2b-512 has the properties needed for to be collapsing. Taking the 512-bit BLAKE2b output modulo cannot introduce a problem.
For each oracle query the adversary chooses and obtains a "random" .
We have .
Over all Pallas curve points , the number of outputs of is — one for each possible -coordinate of Pallas curve points, plus one for the zero point which is mapped to .
Only one point maps to , as opposed to two points mapping to every other possible output of , but that has negligible effect.
There are two values of that match in their -coordinate. Because the output of for is of the form , for any given note we have exactly two values of that will pass the commitment check.
Suppose there are legitimate notes in the tree. The adversary is trying to find a note that will pass the commitment check without actually being a note in the tree. As argued above, the distribution of is indistinguishable from uniform-random on . The success probability for each attempt in a classical search is therefore where is the order of the Pallas curve, and that is negligible because .
We're not finished yet because we also have to prove that the nullifier is computed deterministically for a given note.
All of the inputs to are things we committed to in the protocol so far except . By the same argument used pre-quantumly, there is only one for a given . So in order to just use the existing protocol for this part, we would need to prove that there is only one (that is feasible to find) such that . Unfortunately that's not true; is instantiated by which is not post-quantum binding.
There are two cases depending on which witness branch the adversary uses (they can choose to attack either, or both simultaneously):
-
Case : The spender must prove knowledge of , and that , , and are derived correctly from . This works because the derivations use post-quantum hashes (and is deterministic).
In particular, is an essentially random function of , and so we expect that an adversary has no better attack than to search for values of to find one that reproduces a given . Since must be an -coordinate of a Pallas curve point (see the note at the end of § 4.2.3 Orchard Key Components), it can take on values. So if there are targets the success probability for each attempt in a classical search is , which is negligible provided that . -
Case : This case is almost the same except that is now an essentially random function of . The success probability in terms of is also the same as for the case.
The above security argument means that provided we also check the uses of and in the post-quantum Recovery Statement, Orchard-protocol note commitments can be considered binding on the note tuple .
Note that the argument associated with Theorem 5.4.4 in the protocol specification (" yields a nontrivial discrete logarithm relation." and "Since by assumption it is hard to find a nontrivial discrete logarithm relation, we can argue that it is safe to use incomplete additions when computing Sinsemilla inside a circuit.") is not applicable when it is necessary to defend against a discrete-logarithm-breaking or quantum adversary. Therefore, the post-quantum Recovery Statement will need to use complete curve additions to implement Sinsemilla.
Security argument for key binding
The security of the Orchard shielded protocol against several attacks depends on cryptographic keys being bound to a recoverable note's . Different Orchard-protocol properties need different components of the key witness pinned:
- Nullifier-binding (used by the Balance argument and by the Spendability argument below — the latter via the -pinning lemma): uniquely determined by .
- Spend Authorization: (up to -sign of ) and uniquely determined by . This includes uniquely determining the tag of , i.e. which of the and branches produced the .
The determination of must fix the branch itself, not merely the value of within the branch. Suppose an address generated with —whose owner authorizes recovery by proving knowledge of via — shared its with an -branch witness. An adversary holding a suitable could then recover the note through the -branch of the Recovery Statement, authorizing the spend with and never demonstrating knowledge of . Against a discrete-logarithm-breaking adversary —for which the accompanying RedDSA signature over gives no protection— this breaks Spend Authorization for such addresses. Ruling out these cross-branch collisions (both -values pinned, included) is therefore a requirement of the argument, not incidental strength.
The formal key-binding condition stated below covers all of these uniformly: a key-binding break is a pair of distinct witnesses sharing the same , where each witness carries the full key tuple — plus whichever of or is in use. If key binding fails, the Balance, Spendability, and Spend Authorization arguments each lose their corresponding pinning step.
Relative to the situation with note commitments where it was reasonable to only obtain quantum recoverability for newly output Ironwood-pool notes, there is a complication. Addresses may be used over the long term and it may not be desirable to switch to new addresses, or to avoid funds being sent to old ones. Fortunately, the Orchard protocol specified each of , , and to be derived from via , which is assumed collapsing. ( is derived differently for an "internal IVK", but that is also via .)
Classically, the binding of —instantiated via Sinsemilla— fails against a discrete-logarithm-breaking adversary, similarly to . We use essentially the same fix as for , with the -derivation hashes playing the role of . The Recovery Statement checks the derivation of :
The witness carries the branch as a tagged union —following the formalization's sum type— so exactly one branch is present per witness, by construction. This is equivalent to case-splitting by .
- In the branch, .
- In the branch, , with and also derived from via and .
In either case, is then either directly (external IVK) or (internal IVK). All of these hashes are modelled as independent random oracles for the key-binding argument.
As in the Recovery Statement, we have:
Let the key-binding condition on a witness be:
where .
The predicate intentionally does not constrain the -sign of . This is consistent with the Orchard protocol's design choice to use as a single element (the -coordinate ), which avoids point-decompression in places that consume , in exchange for a factor-of-2 reduction in concrete binding security. Accordingly, the break event below identifies witnesses up to the -sign of .
The flags and that appear in the protocol diagram do not appear in this witness — nor in the formal Recovery Statement above. Their roles are absorbed into the witness's structural form:
- is encoded in the tag of : the witness carries exactly one of the two branches by construction (enforced by the tagged form, not by a -exclusion constraint), and the branch-specific constraint applies to whichever is present.
- is encoded in : both derivations are admitted simultaneously.
This formulation is strictly stronger than a flag-conditioned one: a key-binding break can have and in different branches across either flag (e.g., in the branch and in the branch, or with external and with internal ), provided both produce the same . A flag-based formulation would forbid only same-branch breaks. For the flag this extra strength is required by Spend Authorization —forbidding the -versus- cross-branch collision described above— and not merely incidental; for it is additional robustness.
A key-binding break is a pair of witnesses with shared satisfying the key-binding condition, whose projections differ — i.e., and differ in some component other than the -sign of .
The random oracles used in the key-binding condition are , , , , and .
Let be the probability, over 's randomness and at most queries in total to these random oracles, that outputs a key-binding break. Here counts the derivation inputs of 's output witnesses among its queries — a convention that is without loss of generality, by the accounting normalization in the proof.
Theorem (key-binding, classical ROM). Let be a classical adversary making at most total queries to the random oracles used in the key-binding condition. Then .
Proof sketch.
Algebraic setup. By § 5.4.1.10 “Sinsemilla commitments”,
where is the rivk-randomization base and
By expanding the Sinsemilla bases used inside as scalar multiples of , without loss of generality we have for a Pedersen-like deterministic scalar hash , so
Domain separation in the protocol's BLAKE2b instantiations ensures does not query , , , , or : depends only on fixed Sinsemilla bases and on .
By the same argument used in the Spendability proof (using § 5.4.9.7 for the -style -coordinate convention), a key-binding break implies Define for a witness , and let for . The break condition is .
Final-random-oracle structure. For each witness satisfying the key-binding condition, is the output of a final random oracle at a final input , determined by the witness's branch and IVK choice:
- qk-branch, external IVK: , .
- sk-branch, external IVK: , .
- qk-branch, internal IVK: , where .
- sk-branch, internal IVK: , where .
In each case , with the deterministic shift independent of 's responses (by non-querying).
The shifted combined oracle. Treat the three rivk-derivation oracles (, , ) as a single combined oracle on the disjoint union of their input domains. Each instance contributes outputs uniform on , independently of the others, by domain separation. and are not part of : they enter only through the shifts below, and their output types differ.
For a combined input , define the shift , with read off the input: directly for and inputs, and via , for an input . So is a function of the input and of the / oracles only; since is non-querying, never depends on the rivk-derivation responses. Define the shifted combined oracle For every witness satisfying the key-binding condition the derivation constraints give , so the break condition is a ±-collision of at the pair .
Distinct final inputs. The final inputs of a break need not be distinct, but the case is fully deterministic. If the witnesses decode differently —one external, one internal— their final inputs lie in disjoint summands of the combined domain, so is impossible outright. If both witnesses are externally decoded, equal final inputs force the witnesses to coincide on all fields constrained by the key-binding condition, contradicting distinctness. (Equal inputs determine and thence ; equal inputs determine and thence everything, via and .) So both witnesses are internally decoded, sharing and differing only in their branch data. Then is an equality of outputs at the two upstream (rivk_ext-derivation) inputs, which the differing branch data make distinct. The shifts at those inputs agree: both equal , using the derivation constraints on the side. So this is again a ±-collision of , at distinct inputs. In every case: a key-binding break yields a ±-collision of at two distinct inputs among the adversary's queries, under the convention that counts the derivation inputs of the adversary's output witnesses among its queries. This convention is without loss of generality: replace by the adversary that runs , queries the (at most 4) derivation inputs of its output witnesses —each witness's final input and its rivk_ext-derivation input— and returns the output unchanged. This "reasonable adversary" normalization38 leaves the output distribution —and therefore the break probability— unchanged, puts the collision inputs among the queries by construction, and adds at most 4 to .
Note that the external/internal decode is by value (), not by how the witness was derived: at a fixpoint an internally-derived witness decodes as external. Both readings give the same , and the accounting partitions pairs by the decode.
Sequential collision bound. The adversary chooses each query adaptively, so we reveal the oracle responses in query order rather than fixing a pair in advance. Before the -th query to , condition on the transcript so far: the / responses (which fix the shifts ) and the recorded responses. Under every such conditioning the fresh response is uniform on , and for each recorded input and each sign there is exactly one value of with ; so the fresh response completes a shifted ±-collision with probability at most . Because the conditioning is on the transcript itself, this holds however was chosen from the transcript. Summing over the queries, (Queries to or are not inputs and cannot complete a collision, so counting them in is conservative.)
Security argument for Spendability
DeriveNullifier is based on a Pedersen hash. In the current Orchard protocol, the property that it is infeasible to find two distinct Orchard-protocol notes with the same nullifier depends on the collision resistance of that hash, which would not hold against a discrete-logarithm-breaking adversary.
Does this mean it is possible to break Spendability for the given Recovery Statement? As it turns out, no, but the argument is somewhat involved.
Since each function in the Recovery Statement is deterministic, the free variables that the adversary can control are the sources of the derivation digraph within that statement and either or . That is, the adversary can control all of subject to exactly one of and being present, per the tagged union. The choice between external and internal IVK is encoded in 's value (either or ).
We analyze as a function of these controllable inputs. Recall that is defined in § 4.16 ‘Computing ρ values and Nullifiers’ as:
Also recall from [Repairing note commitments] that we have
Let denote the discrete logarithm of with respect to . This is well-defined and nonzero: generates the prime-order Pallas group, so any non-identity Pallas point has a unique nonzero discrete logarithm with respect to it; and is non-identity by construction.
Recall that is determined by via . The nullifier corresponding to is then
We model as a random oracle with output uniform on . The functions , , and are deterministic functions of that do not query : is the Sinsemilla-base lift; and are conventional hash functions.
The non-querying constraint rules out trivializing instantiations such as . In the concrete protocol, it reflects that depends only on fixed Sinsemilla bases; and that the hashes , , and use distinct domain separators, so can be considered unrelated to each other.
A key-binding break is as defined above in the Security argument for key binding.
Let be the probability, over 's randomness and at most queries to the random oracles used in the key-binding argument, that outputs a key-binding break (with counting the derivation inputs of the output witnesses among the queries, as in the accounting normalization). is bounded separately by that argument; the bound below is unconditional, but is only useful to the extent that is small.
We give a reduction-based argument that any classical adversary in the Random Oracle Model attempting to find two valid Recovery Statement witnesses with distinct note tuples that have colliding nullifiers, succeeds with probability at most , where is the number of queries makes to , and is as defined above. The bound depends only on and on , not on running time.
The components are fields of by definition; and , , , and are fields of , hence of .
-pinning lemma. For any valid Recovery Statement witness with , the value is well-defined, since on the prime-order Pallas curve and ; is therefore uniquely determined by .
-pinning lemma. Suppose 's output does not contain a key-binding break. Then for each , is uniquely determined by : by the conditioning, is the only opening of appearing in 's output, so is a function of , which is in turn a function of by the -pinning lemma; is a field of ; and the remaining inputs and are determined by through the Recovery Statement's deterministic derivations.
The argument here covers nullifier-binding — it argues that binds the note tuple under modelled as a random oracle and the key-binding theorem.
Theorem (distinct-notetuple Spendability, classical ROM). Let be a classical adversary with oracle access to having output uniform on , making at most oracle queries. The Spendability-collision game has output two Recovery Statement witnesses satisfying:
- Validity of witnesses
- both witnesses satisfy the Proposed Recovery Statement.
- Distinct note tuples
- the -input tuples satisfy .
Then wins this game with probability at most
taken over the random oracle's responses and any internal randomness of .
This bound is essentially tight against classical generic adversaries. Maurer 39 (Section 2, p. 5) establishes a matching upper bound of on the success probability of any classical algorithm in finding a collision against a random oracle with an -element output space using queries. Maurer's bound applies to the equality event ; our win condition allows (two winning configurations per pair instead of one). Applying Maurer with (the output space) gives for the equality event; doubling for the sign relaxation gives our bound. Classical parallel collision search 40 (top of p. 8) achieves the equality-event regime up to a constant factor; the same adversaries achieve a constant fraction of the doubled bound for the -equivalence event.
Proof sketch. makes at most queries to before outputting satisfying Validity of witnesses, Distinct note tuples, and Colliding nullifiers. The probability that contains a key-binding break is at most ; condition on the complement.
Algebraic setup. Under this conditioning, define
\mathsf{f}(\mathsf{notetuple}) + \big((\mathsf{PRF^{nf}_{nk}}(\text{ρ}) + \text{ψ}) \bmod q_{\mathbb{P}}\big) \cdot K_{\kern-.08em\mathcal{R}} \pmod{r_{\mathbb{P}}}$$, where$\mathsf{rseed}, \text{ρ}, \text{ψ}$ are fields of
$\mathsf{notetuple}$ and $\mathsf{nk}$ is determined by
$\mathsf{notetuple}$ via the key-binding leg of the
[$\mathsf{nf}$-pinning lemma](#lemma-nf-pinning), and let
$F_i := \mathsf{F}(\mathsf{notetuple}_i)$ for $i \in \{1, 2\}$.
$\mathsf{Extract}_{\mathbb{P}}$ (§ 5.4.9.7 'Coordinate Extractor for
Pallas' [^protocol-updated-concreteextractorpallas]) is the $x$-coordinate of
its argument for non-identity points, with the identity mapping to $0$.
Since Pallas has the form $y^2 = Y(x)$ and no Pallas point has
$x$-coordinate $0$, the collision $\mathsf{nf}_1 = \mathsf{nf}_2$
holds iff $F_1 \equiv \pm F_2 \pmod{r_{\mathbb{P}}}$.
*Independence claim per pair.*
By [**Distinct note tuples**](#thm-spendability-distinct),
$\mathsf{notetuple}_1 \neq \mathsf{notetuple}_2$, so the
$\mathsf{H^{rcm}}$ outputs at $\mathsf{notetuple}_1, \mathsf{notetuple}_2$
are independent uniform on $\mathbb{F}_{r_{\mathbb{P}}}$. The
deterministic shifts ($\mathsf{f}$ and the $\mathsf{PRF^{nf}}$
contribution scaled by $K_{\kern-.08em\mathcal{R}}$) do not query
$\mathsf{H^{rcm}}$, so they are independent of its responses. Hence
$F_1$ and $F_2$ are independent uniform on $\mathbb{F}_{r_{\mathbb{P}}}$.
*Bounding the win probability.*
The win condition $F_1 \equiv \pm F_2$ is a linear constraint on a
pair of independent uniform variables, satisfied with probability at
most $2/r_{\mathbb{P}}$ (one per sign). Union-bounding over the at
most ${q_{\mathsf{rcm}} \choose 2}$ pairs of distinct
$\mathsf{H^{rcm}}$ queries:
$$\Pr[\text{win} \mid \neg\,\text{break}] \leq \frac{q_{\mathsf{rcm}}(q_{\mathsf{rcm}}-1)}{r_{\mathbb{P}}}\textsf{.}
ParseError: Can't use function '$' in math mode at position 165:
…r_{\mathbb{P}}}$̲$,
where $\math…
Decomposing on whether a key-binding break occurs and applying : This completes the classical-ROM proof.
The key-binding theorem bounds . Substituting, an adversary that makes at most queries to and at most queries to the key-binding random oracles wins the Spendability-collision game with probability at most .
For the post-quantum lift of this bound and of the key-binding bound above, see the next section.
Adaptation to the quantum setting
The classical-ROM proofs above (for key binding and Spendability) rely on and the various -derivation hashes being collision-resistant. The natural quantum analog is called the collapsing property, introduced by Unruh 28 29. It says that even a quantum adversary holding a superposition over several preimages of a fixed output cannot tell —by any subsequent measurement— which preimage it now has. This is the right property for our reductions. Each proof above splits cases based on which oracle query produced the colliding output; that case analysis works the same classically and quantumly only if the underlying hash "collapses" the adversary's superposition to a single classical preimage.
Subsequent work has analyzed whether standard hash-function constructions inherit collapsing from their compression function. Unruh 29 proved this for Merkle–Damgård (with a padding restriction); Czajkowski et al. 41 for the sponge construction (the absorb-then-squeeze paradigm used by SHA-3 / Keccak), with 37 strengthening the sponge result via the related notion of quantum indifferentiability. Fehr 42 gave a unified algebraic framework that recovers these results and proves the collapsing property of HAIFA, a Merkle–Damgård variant with a per-iteration salt and counter. Gunsing and Mennink 35 extended this kind of analysis to tree-hash constructions, relevant for the Recovery Protocol's note-commitment tree.
BLAKE2b uses HAIFA, so by Fehr's theorem modelling as collapsing reduces to modelling BLAKE2b's compression function as collapsing. The "iv-preimage resistance" side condition Fehr's theorem requires for arbitrary-length inputs is automatically satisfied if the compression function is modelled as a random oracle — which is also the modelling assumption underlying the classical-ROM analyses above.
By the argument in 40, the best known generic quantum attack on a hash function is simply the classical attack of 43. (In particular, the Brassard–Høyer–Tapp algorithm 44 is entirely unimplementable for a 253-bit output size: to achieve the claimed speed-up, it would require running Grover's algorithm with a quantum circuit that does random accesses to a -bit quantum memory.) Therefore, an output size of 253 bits does not exclude a hash function from being collapsing.
does not interfere with the QROM lift: it is a deterministic 2-to-1 map on non-identity Pallas points (sending and to the same -coordinate) and does not query or any other random oracle, so it composes with the underlying random oracle the same way classically and quantumly. The factor of 2 from the 2-to-1 reduction is already absorbed into the break-probability bound (each has exactly two valid values, hence exactly two valid values, as stated in the Spendability proof above).
This factor-of-2 absorption relies on the fibres of forming a uniform partition of the non-identity points of — the free negation action gives every fibre for non-identity points exactly size 2 — which is what lets birthday-style bounds substitute cleanly. A non-uniform mapping would not admit such a substitution.
QROM lift of the security arguments
The classical-ROM reductions for both Spendability and key binding satisfy the standard conditions for a "clean" lift to the quantum random-oracle model:
- Straight-line. Neither reduction rewinds the adversary or measures intermediate state; both inspect the adversary's classical output and bound the probability over the random oracles' randomness. Rewinding-based QROM techniques 34 36 are therefore not needed.
- No adaptive reprogramming. Both reductions treat their random oracles as fixed random functions throughout; neither reprograms responses to adversary-queried inputs.
Concrete QROM bounds. By Zhandry's compressed-oracle technique 45 (see also 46 for a classical-style derivation), the classical collision probability transfers to in QROM: an adversary making at most quantum queries to a random oracle with output space of size finds a collision with probability . Applied to our reductions:
- .
- .
These are worst-case theoretical bounds. An adversary that saturates them would need to mount a BHT-style attack, which is unimplementable for a 253-bit output (as discussed above, the BHT algorithm would require a quantum circuit randomly accessing a -bit quantum memory). In practice the achievable bound remains close to the classical , since the best known generic quantum attack is the classical attack of 43 — Bernstein 40 is careful to flag this as best-known rather than provably best.
For the parameters relevant to Zcash ( and ), the worst-case bound is at most , while the practically achievable bound stays closer to .
Effects of discrete-logarithm-breaking attacks before the switch to the Recovery Protocol
A practical discrete-logarithm-breaking attack —either by a sufficiently large quantum computer running Shor's algorithm, or a major advance in classical cryptanalysis of the discrete logarithm or Diffie–Hellman problems— would compromise the cryptographic primitives underlying Zcash's shielded protocols.
Note and value commitments in the Orchard[ZSA] and Sapling protocols are Pedersen-style and lose binding; the proof systems used in the shielded protocols (Halo 2 over Vesta in Orchard[ZSA], Groth16 over BLS12-381 in Sapling or Sprout) lose soundness; and the RedDSA binding and spend authorization signatures in Orchard[ZSA] and Sapling can be forged. Sprout's note commitments are SHA-256-based and survive a discrete logarithm break, but the broken proof system is sufficient to forge JoinSplit statements, and the Ed25519 spend authorization and JoinSplit signatures can be forged. In addition, the ECDSA signatures used for transparent spend authentication can be forged.
The combined effect is severe. An adversary can:
- break Balance for any current shielded pool by forging Groth16 or Halo 2 proofs of balanced transactions;
- break Balance (alternatively) for the Sapling, Orchard, or Ironwood pools by forging value-commitment openings or binding signatures;
- break Spend authentication (i.e. steal funds, independently of a Balance break) for any current shielded pool by forging alternative note witnesses for any commitment on chain, or by forging Groth16 or Halo 2 proofs of valid spends;
- break Spend authentication (alternatively) for the Sapling, Orchard, or Ironwood pools by forging RedJubjub or RedPallas spend authorization signatures;
- break Spend authentication for the transparent pool by forging ECDSA-over-secp256k1 signatures used in scripts, provided that the public key has been revealed (i.e. if the address has been spent from previously, or if an attack is possible in the period between a transaction being exposed and it being confirmed);
- break Spendability for any current shielded pool via roadblock attacks or Faerie Gold attacks, preventing users from spending their own funds;
- break Privacy of note plaintexts for any current shielded pool by finding the or for any known shielded receiver address, or by breaking the Diffie–Hellman-based note encryption (again only for a known shielded receiver address).
Attacks against Balance for any current shielded pool, and against Spend authentication and Spendability for any (potentially unknown) shielded address, can be performed after finding only a single discrete logarithm. (More precisely, one logarithm on BLS12-381 suffices for attacks against Sprout and Sapling, and one on Pallas/Vesta for attacks against Orchard and Ironwood.)
Note that any current shielded pool includes the Ironwood pool. The Quantum Recoverability feature of the Ironwood pool does not make the Orchard protocol secure against quantum attacks. It is still imperative that Zcash switches off the Orchard, Sapling, and Sprout protocols, before attacks using quantum computers become feasible.
If a balance violation occurred in any pool before its protocol was switched off, it would not necessarily be detected. The only constraint on such attacks is the ZIP 209 turnstile mechanism 47. If there were evidence of balance violation having occurred, confidence in Zcash as a whole could potentially be undermined despite the turnstile constraints (especially if the violation was in the largest pool, currently the Orchard pool). Therefore, it will be essential to ensure that the pre-quantum protocols are switched off well in advance of the potential availability of cryptographically relevant quantum computers.
Attacks on transparent spend authentication are not addressed by this proposal. 48 discusses these attacks in the context of Bitcoin. For Zcash, we should note that P2PK and legacy P2MS (non-P2SH) scripts have never been supported by Zcash wallets, but Zcash is vulnerable to "on-spend" attacks in a similar way to Bitcoin, with the additional consideration that some Zcash wallets might be more likely to reuse transparent addresses. The discussion of Segwit in 48 is not relevant to Zcash. The possibility of Quantum Recoverability support for a subset of transparent addresses is discussed in 49.
Effects of discrete-logarithm-breaking attacks after the switch to the Recovery Protocol
We assume for this section that the legacy Orchard, OrchardZSA (if deployed), Sapling, and Sprout protocols will be switched off. Any remaining funds in the Orchard, Sapling, and Sprout pools would be rendered permanently unspendable.
It is anticipated that from the Ironwood pool onward, any future pools would be quantum-recoverable.
It is possible to enable the Recovery Protocol in advance of switching off the legacy protocols, but the benefit is only obtained for the protocol as a whole after the latter has happened.
The Balance, Spend authentication, and Spendability attacks affecting the Sprout (if ZIP 2003 is not deployed first 50), Sapling, Orchard, and Ironwood pools, or any future pool using discrete-logarithm-based cryptography, are possible only while spends using the corresponding legacy protocols remain enabled.
If the transparent protocol is not switched off, then the situation with respect to transparent spend authentication is unchanged. Balance for the transparent protocol cannot be violated directly by a discrete-logarithm break (but funds created by a balance violation in a shielded pool can be moved into the transparent pool up to that shielded pool's turnstile limit).
The changes made by ZIP 2005 are only intended to address Balance preservation, Spend authentication, and Spendability for Ironwood-pool notes. The situation with respect to Privacy is unchanged for any pool.
In particular, the note encryption for Ironwood, Orchard, Sapling, and Sprout pools is subject to "Harvest Now, Decrypt Later" attacks: that is, a discrete-logarithm-breaking attack can be attempted as long as an adversary has both the ciphertext (which is published on the block chain) and the receiver address. Other protocol changes are under consideration to mitigate this risk for future transfers.
Due to the zero-knowledge property, Groth16 and Halo 2 proofs do not leak further information relevant to Privacy when addresses are unknown. The same is true of Sapling or Orchard[ZSA] spend authentication signatures, due to key rerandomization.
Attacks addressed by the Recovery Protocol
The Recovery Statement's constraint pins the key witness via (modelled as collapsing), not via discrete-logarithm hardness. So (if no mistakes are made in the design or instantiation), fresh Balance, Spend authentication, or Spendability attacks against the Recovery Protocol should require breaking post-quantum binding rather than just discrete logarithms. Funds in Ironwood-pool notes can therefore be spent through the Recovery Protocol after the switch. However, if the adversary attacked either Spendability (e.g. via a roadblock attack) or Spend authorization before the switch to the Recovery Protocol, then it could affect the legitimate holder's ability to spend the funds afterward. The window between the activation height of this ZIP and the switch is the critical exposure period for recoverable Ironwood-pool funds.
Note that we can precisely identify the set of note commitments for recoverable notes, even though we cannot decrypt them: the recoverable notes are exactly the Ironwood-pool notes, so their commitments are exactly those in the Ironwood pool's note commitment tree 5.
We can likewise identify the precise set of nullifiers for recoverable notes: they are exactly the Ironwood-pool nullifiers, which form a nullifier set separate from that of the Orchard pool 5.
Within the Recovery Statement we also know that the note being spent is recoverable.
Deployment
The activation height of this ZIP is the NU6.3 ACTIVATION_HEIGHT 51.
As far as the author of this ZIP is aware, all existing Zcash wallets already derive from a spending key in the way specified for the case in § 4.2.3 ‘Orchard Key Components’ 15.
FROST distributed key generation requires the case. There is no significant existing deployment of FROST, so we can write this into ZIP 312 from the start.
The part of the protocol that is new is the different input for . It would have been possible to use a separate pq-binding commitment, but is already pq-binding and so doing it this way involves fewer components. This also allows us to avoid any security compromise and use 256-bit cryptovalues for both integrity and randomization, which would otherwise have been difficult.
Two options were considered for deployment:
- Deploy this change prior to the next network upgrade. This would optimize the time to deployment if there were a significant time before the next upgrade. An activation height is still needed, in order to identify a height from which wallets must re-scan if they are missing recoverable notes due to late deployment.
- Deploy this change at the same time as the next network upgrade (NU6.3), at the same time as v6 transactions.
The second option has been chosen. (The first had been the plan, until the Orchard circuit soundness vulnerability was discovered.) Deploying at an upgrade makes the set of recoverable notes easy to identify (they are exactly the Ironwood-pool notes), and it strengthens the case for migrating funds out of the Orchard pool: a migrating user gains both quantum recoverability and the improvement in supply-integrity confidence that NU6.3 provides.
This change is enforced from NU6.3: every Ironwood-pool output note is a recoverable note, and no Sapling or Orchard-pool output note is 5. When a compliant wallet receives a Sapling or Orchard-pool note, the associated funds need to be sent to the Ironwood pool in order to make them recoverable.
Note: if we prioritize spending non-recoverable notes, it is conceivable that an adversary could exploit this to improve arity leakage attacks. On the other hand, adversaries can already choose note values to manipulate the note selection algorithm to some extent.
References
Footnotes
-
Information on BCP 14 — "RFC 2119: Key words for use in RFCs to Indicate Requirement Levels" and "RFC 8174: Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words" ↩
-
Zcash Protocol Specification, Version 2026.8.0 [NU6.3]. Section 3.12: Mainnet and Testnet ↩
-
ZIP 226: Transfer and Burn of Zcash Shielded Assets ↩ ↩2 ↩3 ↩4
-
Post-Quantum Zcash (video, slides). Presentation by Daira-Emma Hopwood at ZconVI. ↩ ↩2
-
ZIP 32: Shielded Hierarchical Deterministic Wallets — Sapling child key derivation ↩
-
ZIP 32: Shielded Hierarchical Deterministic Wallets — Sapling internal key derivation ↩
-
ZIP 32: Shielded Hierarchical Deterministic Wallets — Orchard child key derivation ↩
-
ZIP 32: Shielded Hierarchical Deterministic Wallets — Orchard internal key derivation ↩ ↩2 ↩3
-
Zcash Protocol Specification, Version 2026.8.0 [NU6.3]. Section 4.2.3: Orchard Key Components ↩ ↩2 ↩3
-
ZIP 312: FROST for Spend Authorization Multisignatures — Threat Model ↩
-
Zcash Protocol Specification, Version 2026.7.0 [NU6.2]. Section 4.2.3: Orchard Key Components ↩ ↩2
-
Zcash Protocol Specification, Version 2026.7.0 [NU6.2]. Section 4.7.2: Sending Notes (Sapling) ↩ ↩2
-
Zcash Protocol Specification, Version 2026.7.0 [NU6.2]. Section 4.7.3: Sending Notes (Orchard) ↩ ↩2
-
Zcash Protocol Specification, Version 2026.7.0 [NU6.2]. Section 4.20: In-band secret distribution (Sapling and Orchard) ↩ ↩2
-
ZIP 226: Transfer and Burn of Zcash Shielded Assets — Split Notes ↩ ↩2
-
Zcash Protocol Specification, Version 2026.7.0 [NU6.2]. Section 5.3: Constants ↩
-
ZIP 312: FROST for Spend Authorization Multisignatures — Key Generation ↩ ↩2
-
BLAKE3: One Function, Fast Everywhere. Jack O'Connor, Jean-Philippe Aumasson, Samuel Neves, and Zooko Wilcox, 2020. See § 2.1.2 for the
derive_keymode. ↩ -
Understanding Zcash Security (video, slides). Presentation by Daira-Emma Hopwood at Zcon3. ↩ ↩2
-
Computationally binding quantum commitments. Dominique Unruh. Also published in EUROCRYPT 2016, LNCS vol. 9666. ↩ ↩2
-
Collapse-binding quantum commitments without random oracles. Dominique Unruh. Also published in ASIACRYPT 2016, LNCS vol. 10032. ↩ ↩2 ↩3
-
Zcash Protocol Specification, Version 2026.8.0 [NU6.3]. Section 4.7.3: Sending Notes (Orchard) ↩
-
Zcash Protocol Specification, Version 2026.8.0 [NU6.3]. Section 5.4.7.1: Spend Authorization Signature (Sapling and Orchard) ↩
-
Zcash Protocol Specification, Version 2026.8.0 [NU6.3]. Section 5.4.1.9: Sinsemilla Hash Function ↩
-
Zcash Protocol Specification, Version 2026.8.0 [NU6.3]. Section 5.4.1.9: Sinsemilla Hash Function — Security argument ↩
-
Post-Quantum Succinct Arguments: Breaking the Quantum Rewinding Barrier. Alessandro Chiesa, Fermi Ma, Nicholas Spooner, and Mark Zhandr. Also published in FOCS 2021. ↩ ↩2
-
Collapseability of Tree Hashes. Aldo Gunsing and Bart Mennink. Also published in PQCrypto 2020, LNCS vol. 12100, pp. 524–544. ↩ ↩2
-
Quantum Rewinding for IOP-Based Succinct Arguments. Alessandro Chiesa, Marcel Dall'Agnol, Zijing Di, Ziyi Guan, and Nicholas Spooner. ↩ ↩2
-
The Sponge is Quantum Indifferentiable. Gorjan Alagic, Joseph Carolan, Christian Majenz, and Saliha Tokat. ↩ ↩2
-
A Graduate Course in Applied Cryptography (Version 0.6). Dan Boneh and Victor Shoup. See the "reasonable adversary" step in the proof of Theorem 8.4 (Davies–Meyer). ↩
-
Indistinguishability of Random Systems. Ueli Maurer. Also published in Advances in Cryptology — EUROCRYPT 2002, LNCS vol. 2332, pp. 110–132. ↩
-
Cost analysis of hash collisions: Will quantum computers make SHARCS obsolete? Daniel J. Bernstein. Presented at SHARCS 2009. ↩ ↩2 ↩3
-
Post-quantum security of the sponge construction. Jan Czajkowski, Leon Groot Bruinderink, Andreas Hülsing, Christian Schaffner, and Dominique Unruh. Also published in PQCrypto 2018, LNCS vol. 10786. ↩
-
Classical Proofs for the Quantum Collapsing Property of Classical Hash Functions. Serge Fehr. Also published in TCC 2018, LNCS vol. 11240, pp. 315–338. ↩
-
Parallel collision search with cryptanalytic applications. Paul C. van Oorschot and Michael Wiener. ↩ ↩2
-
Quantum Algorithm for the Collision Problem. Gilles Brassard, Peter Høyer, and Alain Tapp. Also published in LATIN 1998, LNCS vol. 1380, pp. 163–169. ↩
-
How to Record Quantum Queries, and Applications to Quantum Indifferentiability. Mark Zhandry. Also published in CRYPTO 2019, LNCS vol. 11693. ↩
-
On the Compressed-Oracle Technique, and Post-Quantum Security of Proofs of Sequential Work. Kai-Min Chung, Serge Fehr, Yu-Hsuan Huang, and Tai-Ning Liao.. Also published in EUROCRYPT 2021, LNCS vol. 12826. ↩
-
Securing Elliptic Curve Cryptocurrencies against Quantum Vulnerabilities: Resource Estimates and Mitigations. Ryan Babbush, Adam Zalcman, Craig Gidney, Michael Broughton, Tanuj Khattar, Hartmut Neven, Thiago Bergamaschi, Justin Drake, and Dan Boneh ↩ ↩2
-
zcash/zips issue 1302: [ZIP 2007] Quantum recoverability of a subset of the transparent protocol ↩