ZIP 2005 — Ironwood Quantum Recoverability

Final

Contents

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 (kn) denotes the binomial coefficient — the number of ways of choosing n items from a set of k, which is equal to k!n!(k−n)! for 0≤n≤k.

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 𝖢𝗈𝗇𝗌𝗍𝗋𝗎𝖼𝗍𝗈𝗋1(T1)|𝖢𝗈𝗇𝗌𝗍𝗋𝗎𝖼𝗍𝗈𝗋2(T2) for a tagged union type with tags 𝖢𝗈𝗇𝗌𝗍𝗋𝗎𝖼𝗍𝗈𝗋1 and 𝖢𝗈𝗇𝗌𝗍𝗋𝗎𝖼𝗍𝗈𝗋2. Such types can be destructured using a match construct:

match e with{𝖢𝗈𝗇𝗌𝗍𝗋𝗎𝖼𝗍𝗈𝗋1(t1)⇒f(t1)𝖢𝗈𝗇𝗌𝗍𝗋𝗎𝖼𝗍𝗈𝗋2(t2)⇒g(t2).

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>&nbsp;]:::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 t-of-n 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 𝖼𝗅𝗂𝗇𝗄=𝖫𝗂𝗇𝗄𝖢𝗈𝗆𝗆𝗂𝗍r(𝗊𝗄,𝗌𝗂𝗀𝗁𝖺𝗌𝗁) the hardware wallet could prove knowledge of (𝗊𝗌𝗄,r) such that 𝖼𝗅𝗂𝗇𝗄=𝖫𝗂𝗇𝗄𝖢𝗈𝗆𝗆𝗂𝗍r(𝖧𝗊𝗄(𝗊𝗌𝗄),𝗌𝗂𝗀𝗁𝖺𝗌𝗁). 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 t-of-n 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:

  1. 𝗊𝗌𝗄 possession + finding discrete logarithms on the Pallas curve. The variants differ only in how 𝗊𝗌𝗄 is obtained:

    1. the adversary is an authorized FROST signer — they hold a copy of 𝗊𝗌𝗄 by construction;
    2. 𝗊𝗌𝗄 is extracted from a hardware wallet, defeating Option A by a physical-device or side-channel attack;
    3. 𝗊𝗌𝗄 is obtained after export to the host wallet, by compromising the host wallet or intercepting it during export.
  2. 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 [t]||ρ with t∈{𝟶𝚡𝟶𝟻,𝟶𝚡𝟶𝟺,𝟶𝚡𝟶𝟿};

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 𝖺𝗌𝗄⦂𝔽rℙ∗ 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:

  • 𝖧𝖺𝗌𝗄(𝗌𝗄)=𝖳𝗈𝖲𝖼𝖺𝗅𝖺𝗋𝖮𝗋𝖼𝗁𝖺𝗋𝖽(𝖯𝖱𝖥𝗌𝗄𝖾𝗑𝗉𝖺𝗇𝖽([𝟶𝚡𝟶𝟼]))
  • 𝖧𝗇𝗄(𝗌𝗄)=𝖳𝗈𝖡𝖺𝗌𝖾𝖮𝗋𝖼𝗁𝖺𝗋𝖽(𝖯𝖱𝖥𝗌𝗄𝖾𝗑𝗉𝖺𝗇𝖽([𝟶𝚡𝟶𝟽]))
  • 𝖧𝗋𝗂𝗏𝗄(𝗌𝗄)=𝖳𝗈𝖲𝖼𝖺𝗅𝖺𝗋𝖮𝗋𝖼𝗁𝖺𝗋𝖽(𝖯𝖱𝖥𝗌𝗄𝖾𝗑𝗉𝖺𝗇𝖽([𝟶𝚡𝟶𝟾]))
  • 𝖧𝗊𝗌𝗄(𝗌𝗄)=𝗍𝗋𝗎𝗇𝖼𝖺𝗍𝖾32(𝖯𝖱𝖥𝗌𝗄𝖾𝗑𝗉𝖺𝗇𝖽([𝟶𝚡𝟶𝙲]))
  • 𝖧𝗊𝗄(𝗊𝗌𝗄)=𝖡𝖫𝖠𝖪𝖤𝟥.𝖽𝖾𝗋𝗂𝗏𝖾_𝗄𝖾𝗒(“𝚉𝚌𝚊𝚜𝚑 𝚉𝙸𝙿 𝟸𝟶𝟶𝟻 𝚚𝚔-𝚍𝚎𝚛𝚒𝚟𝚊𝚝𝚒𝚘𝚗 𝚟𝟷”,𝗊𝗌𝗄,32) 26
  • 𝖧𝗊𝗄𝗋𝗂𝗏𝗄_𝖾𝗑𝗍(𝖺𝗄,𝗇𝗄)=𝖳𝗈𝖲𝖼𝖺𝗅𝖺𝗋𝖮𝗋𝖼𝗁𝖺𝗋𝖽(𝖯𝖱𝖥𝗊𝗄𝖾𝗑𝗉𝖺𝗇𝖽([𝟶𝚡𝟶𝙳]||𝖨𝟤𝖫𝖤𝖮𝖲𝖯256(𝖺𝗄)||𝖨𝟤𝖫𝖤𝖮𝖲𝖯256(𝗇𝗄))).

𝖺𝗌𝗄⦂𝔽rℙ∗, the Spend validating key 𝖺𝗄⦂{1..qℙ−1}, the nullifier deriving key 𝗇𝗄⦂𝔽qℙ, the optional quantum spending key 𝗊𝗌𝗄⦂𝔹𝕐[ℓ𝗊𝗌𝗄/8]∪{⊥} and quantum intermediate key 𝗊𝗄⦂𝔹𝕐[ℓ𝗊𝗄/8]∪{⊥} the 𝖢𝗈𝗆𝗆𝗂𝗍𝗂𝗏𝗄 randomness 𝗋𝗂𝗏𝗄⦂𝔽rℙ, the diversifier key 𝖽𝗄⦂𝔹𝕐[ℓ𝖽𝗄/8], the 𝖪𝖠𝖮𝗋𝖼𝗁𝖺𝗋𝖽 private key 𝗂𝗏𝗄⦂{1..qℙ−1}, the outgoing viewing key 𝗈𝗏𝗄⦂𝔹𝕐[ℓ𝗈𝗏𝗄/8], 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 0 (see below).
let 𝖺𝗄=𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ(𝖺𝗄ℙ)
let 𝗊𝗌𝗄=𝖧𝗊𝗌𝗄(𝗌𝗄)
let 𝗊𝗄=𝖧𝗊𝗄(𝗊𝗌𝗄)
let 𝗋𝗂𝗏𝗄=𝖧𝗊𝗄𝗋𝗂𝗏𝗄_𝖾𝗑𝗍(𝖺𝗄,𝗇𝗄)
else:
let mutable 𝖺𝗌𝗄←𝖧𝖺𝗌𝗄(𝗌𝗄)
if 𝖺𝗌𝗄=0, discard this key and repeat with a new 𝗌𝗄.
let 𝖺𝗄ℙ=𝖲𝗉𝖾𝗇𝖽𝖠𝗎𝗍𝗁𝖲𝗂𝗀𝖮𝗋𝖼𝗁𝖺𝗋𝖽.𝖣𝖾𝗋𝗂𝗏𝖾𝖯𝗎𝖻𝗅𝗂𝖼(𝖺𝗌𝗄)
if the last bit (that is, the y~ bit) of 𝗋𝖾𝗉𝗋ℙ(𝖺𝗄ℙ) is 1:
set 𝖺𝗌𝗄←−𝖺𝗌𝗄

let 𝖺𝗄=𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ(𝖺𝗄ℙ)
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 𝖺𝗌𝗄⦂𝔽rℙ∗ followed by 𝖺𝗄ℙ=𝖲𝗉𝖾𝗇𝖽𝖠𝗎𝗍𝗁𝖲𝗂𝗀𝖮𝗋𝖼𝗁𝖺𝗋𝖽.𝖣𝖾𝗋𝗂𝗏𝖾𝖯𝗎𝖻𝗅𝗂𝖼(𝖺𝗌𝗄), or FROST distributed key generation 25 in which the corresponding spend-authorization material is t-of-n 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 𝖣𝖾𝗋𝗂𝗏𝖾_𝗋𝖼𝗆𝗋𝗌𝖾𝖾𝖽𝖲𝖺𝗉𝗅𝗂𝗇𝗀(𝗅𝖾𝖺𝖽𝖡𝗒𝗍𝖾)={𝖫𝖤𝖮𝖲𝟤𝖨𝖯256(𝗋𝗌𝖾𝖾𝖽),𝗂𝖿 𝗅𝖾𝖺𝖽𝖡𝗒𝗍𝖾=𝟶𝚡𝟶𝟷𝖳𝗈𝖲𝖼𝖺𝗅𝖺𝗋𝖲𝖺𝗉𝗅𝗂𝗇𝗀(𝖯𝖱𝖥𝗋𝗌𝖾𝖾𝖽𝖾𝗑𝗉𝖺𝗇𝖽([𝟶𝚡𝟶𝟺])),𝗂𝖿 𝗅𝖾𝖺𝖽𝖡𝗒𝗍𝖾=𝟶𝚡𝟶𝟸

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 𝗉𝗋𝖾_𝗋𝖼𝗆=[𝟶𝚡𝟶𝙱]||𝖫𝖤𝖡𝖲𝟤𝖮𝖲𝖯256(𝗀⋆𝖽)||𝖫𝖤𝖡𝖲𝟤𝖮𝖲𝖯256(𝗉𝗄⋆𝖽)||𝖨𝟤𝖫𝖤𝖮𝖲𝖯64(𝗏)||ρ||𝖨𝟤𝖫𝖤𝖮𝖲𝖯256(ψ).

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 𝖾𝗌𝗄≥r𝔾 or 𝗉𝗄𝖽=⊥, return ⊥

with

if 𝖾𝗌𝗄≥r𝔾 or 𝗉𝗄𝖽=⊥ or (for Sapling) 𝗉𝗄𝖽∉𝕁(r)∗ (see note below), return ⊥

and in the note containing "However, this is technically redundant with the later check that returns ⊥ if 𝗉𝗄𝖽∉𝕁(r)∗", delete the word "later".

For both § 4.20.2 and § 4.20.3, replace

for Sapling, let 𝗉𝗋𝖾_𝗋𝖼𝗆=[4] and 𝗉𝗋𝖾_𝖾𝗌𝗄=[5]
for Orchard, let ρ=𝖨𝟤𝖫𝖤𝖮𝖲𝖯256(𝗇𝖿𝗈𝗅𝖽 from the same Action description ), 𝗉𝗋𝖾_𝗋𝖼𝗆=[5]||ρ, and 𝗉𝗋𝖾_𝖾𝗌𝗄=[4]||ρ

with

let ρ=𝖨𝟤𝖫𝖤𝖮𝖲𝖯256(𝗇𝖿𝗈𝗅𝖽 𝖿𝗋𝗈𝗆 𝗍𝗁𝖾 𝗌𝖺𝗆𝖾 𝖠𝖼𝗍𝗂𝗈𝗇 𝖽𝖾𝗌𝖼𝗋𝗂𝗉𝗍𝗂𝗈𝗇) if 𝗉𝗋𝗈𝗍𝗈𝖼𝗈𝗅=𝖮𝗋𝖼𝗁𝖺𝗋𝖽, or ⊥ otherwise

For § 4.20.2, replace

let 𝗋𝖼𝗆={𝖫𝖤𝖮𝖲𝟤𝖨𝖯256(𝗋𝗌𝖾𝖾𝖽),𝗂𝖿 𝗅𝖾𝖺𝖽𝖡𝗒𝗍𝖾=𝟶𝚡𝟶𝟷𝖳𝗈𝖲𝖼𝖺𝗅𝖺𝗋(𝖯𝖱𝖥𝗋𝗌𝖾𝖾𝖽𝖾𝗑𝗉𝖺𝗇𝖽(𝗉𝗋𝖾_𝗋𝖼𝗆)),𝗈𝗍𝗁𝖾𝗋𝗐𝗂𝗌𝖾
if 𝗋𝖼𝗆≥r𝔾, return ⊥
let 𝗀𝖽=𝖣𝗂𝗏𝖾𝗋𝗌𝗂𝖿𝗒𝖧𝖺𝗌𝗁(𝖽). if (for Sapling) 𝗀𝖽=⊥, return ⊥
[Canopy onward] if 𝗅𝖾𝖺𝖽𝖡𝗒𝗍𝖾≠𝟶𝚡𝟶𝟷:
𝖾𝗌𝗄=𝖳𝗈𝖲𝖼𝖺𝗅𝖺𝗋𝗉𝗋𝗈𝗍𝗈𝖼𝗈𝗅(𝖯𝖱𝖥𝗋𝗌𝖾𝖾𝖽𝖾𝗑𝗉𝖺𝗇𝖽(𝗉𝗋𝖾_𝖾𝗌𝗄))
if 𝗋𝖾𝗉𝗋𝔾(𝖪𝖠.𝖣𝖾𝗋𝗂𝗏𝖾𝖯𝗎𝖻𝗅𝗂𝖼(𝖾𝗌𝗄,𝗀𝖽))≠𝚎𝚙𝚑𝚎𝚖𝚎𝚛𝚊𝚕𝙺𝚎𝚢, return ⊥

let 𝗉𝗄𝖽=𝖪𝖠.𝖣𝖾𝗋𝗂𝗏𝖾𝖯𝗎𝖻𝗅𝗂𝖼(𝗂𝗏𝗄,𝗀𝖽)

with

let 𝗀𝖽=𝖣𝗂𝗏𝖾𝗋𝗌𝗂𝖿𝗒𝖧𝖺𝗌𝗁(𝖽). if (for 𝗉𝗋𝗈𝗍𝗈𝖼𝗈𝗅=𝖲𝖺𝗉𝗅𝗂𝗇𝗀) 𝗀𝖽=⊥, return ⊥
[Canopy onward] if 𝗅𝖾𝖺𝖽𝖡𝗒𝗍𝖾≠𝟶𝚡𝟶𝟷:
let 𝖾𝗌𝗄=𝖧𝗋𝗌𝖾𝖾𝖽𝖾𝗌𝗄,𝗉𝗋𝗈𝗍𝗈𝖼𝗈𝗅(ρ)
if 𝗋𝖾𝗉𝗋𝔾(𝖪𝖠.𝖣𝖾𝗋𝗂𝗏𝖾𝖯𝗎𝖻𝗅𝗂𝖼(𝖾𝗌𝗄,𝗀𝖽))≠𝚎𝚙𝚑𝚎𝚖𝚎𝚛𝚊𝚕𝙺𝚎𝚢, return ⊥

let 𝗉𝗄𝖽=𝖪𝖠.𝖣𝖾𝗋𝗂𝗏𝖾𝖯𝗎𝖻𝗅𝗂𝖼(𝗂𝗏𝗄,𝗀𝖽)
if 𝗉𝗋𝗈𝗍𝗈𝖼𝗈𝗅=𝖮𝗋𝖼𝗁𝖺𝗋𝖽, let 𝗀⋆𝖽=𝗋𝖾𝗉𝗋ℙ(𝗀𝖽), 𝗉𝗄⋆𝖽=𝗋𝖾𝗉𝗋ℙ(𝗉𝗄𝖽)
let ψ=𝖧𝗋𝗌𝖾𝖾𝖽ψ,𝖮𝗋𝖼𝗁𝖺𝗋𝖽(ρ) if 𝗉𝗋𝗈𝗍𝗈𝖼𝗈𝗅=𝖮𝗋𝖼𝗁𝖺𝗋𝖽, or ⊥ otherwise
let 𝗋𝖼𝗆={𝖣𝖾𝗋𝗂𝗏𝖾_𝗋𝖼𝗆𝗋𝗌𝖾𝖾𝖽𝖲𝖺𝗉𝗅𝗂𝗇𝗀(𝗅𝖾𝖺𝖽𝖡𝗒𝗍𝖾),𝗂𝖿 𝗉𝗋𝗈𝗍𝗈𝖼𝗈𝗅=𝖲𝖺𝗉𝗅𝗂𝗇𝗀𝖣𝖾𝗋𝗂𝗏𝖾_𝗋𝖼𝗆𝗋𝗌𝖾𝖾𝖽𝖮𝗋𝖼𝗁𝖺𝗋𝖽(𝗅𝖾𝖺𝖽𝖡𝗒𝗍𝖾,𝗀⋆𝖽,𝗉𝗄⋆𝖽,𝗏,ρ,ψ),𝗂𝖿 𝗉𝗋𝗈𝗍𝗈𝖼𝗈𝗅=𝖮𝗋𝖼𝗁𝖺𝗋𝖽
if 𝗋𝖼𝗆≥r𝔾, return ⊥

For § 4.20.2, also delete "where ψ=𝖳𝗈𝖡𝖺𝗌𝖾𝖮𝗋𝖼𝗁𝖺𝗋𝖽(𝖯𝖱𝖥𝗋𝗌𝖾𝖾𝖽𝖾𝗑𝗉𝖺𝗇𝖽([9]||ρ))" 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 𝗋𝖼𝗆={𝖫𝖤𝖮𝖲𝟤𝖨𝖯256(𝗋𝗌𝖾𝖾𝖽),𝗂𝖿 𝗅𝖾𝖺𝖽𝖡𝗒𝗍𝖾=𝟶𝚡𝟶𝟷𝖳𝗈𝖲𝖼𝖺𝗅𝖺𝗋(𝖯𝖱𝖥𝗋𝗌𝖾𝖾𝖽𝖾𝗑𝗉𝖺𝗇𝖽(𝗉𝗋𝖾_𝗋𝖼𝗆)),𝗈𝗍𝗁𝖾𝗋𝗐𝗂𝗌𝖾
if 𝗋𝖼𝗆≥r𝔾, return ⊥
let 𝗀𝖽=𝖣𝗂𝗏𝖾𝗋𝗌𝗂𝖿𝗒𝖧𝖺𝗌𝗁(𝖽). if (for Sapling) 𝗀𝖽=⊥ or 𝗉𝗄𝖽∉𝕁(r)∗ (see note below), return ⊥

with

let 𝗀𝖽=𝖣𝗂𝗏𝖾𝗋𝗌𝗂𝖿𝗒𝖧𝖺𝗌𝗁(𝖽). if (for Sapling) 𝗀𝖽=⊥, return ⊥
if 𝗉𝗋𝗈𝗍𝗈𝖼𝗈𝗅=𝖮𝗋𝖼𝗁𝖺𝗋𝖽, let 𝗀⋆𝖽=𝗋𝖾𝗉𝗋ℙ(𝗀𝖽), 𝗉𝗄⋆𝖽=𝗋𝖾𝗉𝗋ℙ(𝗉𝗄𝖽)
let ψ=𝖧𝗋𝗌𝖾𝖾𝖽ψ,𝖮𝗋𝖼𝗁𝖺𝗋𝖽(ρ) if 𝗉𝗋𝗈𝗍𝗈𝖼𝗈𝗅=𝖮𝗋𝖼𝗁𝖺𝗋𝖽, or ⊥ otherwise
let 𝗋𝖼𝗆={𝖣𝖾𝗋𝗂𝗏𝖾_𝗋𝖼𝗆𝗋𝗌𝖾𝖾𝖽𝖲𝖺𝗉𝗅𝗂𝗇𝗀(𝗅𝖾𝖺𝖽𝖡𝗒𝗍𝖾),𝗂𝖿 𝗉𝗋𝗈𝗍𝗈𝖼𝗈𝗅=𝖲𝖺𝗉𝗅𝗂𝗇𝗀𝖣𝖾𝗋𝗂𝗏𝖾_𝗋𝖼𝗆𝗋𝗌𝖾𝖾𝖽𝖮𝗋𝖼𝗁𝖺𝗋𝖽(𝗅𝖾𝖺𝖽𝖡𝗒𝗍𝖾,𝗀⋆𝖽,𝗉𝗄⋆𝖽,𝗏,ρ,ψ),𝗂𝖿 𝗉𝗋𝗈𝗍𝗈𝖼𝗈𝗅=𝖮𝗋𝖼𝗁𝖺𝗋𝖽
if 𝗋𝖼𝗆≥r𝔾, return ⊥

and delete "where ψ=𝖳𝗈𝖡𝖺𝗌𝖾𝖮𝗋𝖼𝗁𝖺𝗋𝖽(𝖯𝖱𝖥𝗋𝗌𝖾𝖾𝖽𝖾𝗑𝗉𝖺𝗇𝖽([9]||ρ))".

§ 5.3 ‘Constants’

Add the definitions, immediately after that of ℓ𝖽𝗄:

ℓ𝗊𝗌𝗄⦂ℕ:=256
ℓ𝗊𝗄⦂ℕ:=256

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:

  • Understanding Zcash Security at Zcon3 27
  • Post-Quantum Zcash at ZconVI 8

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 𝖧𝗊𝗄𝗋𝗂𝗏𝗄_𝖾𝗑𝗍(𝖺𝗄,𝗇𝗄)=𝖳𝗈𝖲𝖼𝖺𝗅𝖺𝗋𝖮𝗋𝖼𝗁𝖺𝗋𝖽(𝖯𝖱𝖥𝗊𝗄𝖾𝗑𝗉𝖺𝗇𝖽([𝟶𝚡𝟶𝙳]||𝖨𝟤𝖫𝖤𝖮𝖲𝖯256(𝖺𝗄)||𝖨𝟤𝖫𝖤𝖮𝖲𝖯256(𝗇𝗄))).

Import this definition from ZIP 32 12:

𝖧𝗋𝗂𝗏𝗄_𝖾𝗑𝗍𝗋𝗂𝗏𝗄_𝗂𝗇𝗍(𝖺𝗄,𝗇𝗄)=𝖳𝗈𝖲𝖼𝖺𝗅𝖺𝗋𝖮𝗋𝖼𝗁𝖺𝗋𝖽(𝖯𝖱𝖥𝗋𝗂𝗏𝗄_𝖾𝗑𝗍𝖾𝗑𝗉𝖺𝗇𝖽([𝟶𝚡𝟾𝟹]||𝖨𝟤𝖫𝖤𝖮𝖲𝖯256(𝖺𝗄)||𝖨𝟤𝖫𝖤𝖮𝖲𝖯256(𝗇𝗄)))

Import these definitions from § 4.7.3 ‘Sending Notes (Orchard)’ 30:

Define 𝖧𝗋𝗌𝖾𝖾𝖽𝗋𝖼𝗆,𝖮𝗋𝖼𝗁𝖺𝗋𝖽(𝗀⋆𝖽,𝗉𝗄⋆𝖽,𝗏,ρ,ψ)= 𝖳𝗈𝖲𝖼𝖺𝗅𝖺𝗋𝖮𝗋𝖼𝗁𝖺𝗋𝖽(𝖯𝖱𝖥𝗋𝗌𝖾𝖾𝖽𝖾𝗑𝗉𝖺𝗇𝖽(𝗉𝗋𝖾_𝗋𝖼𝗆))

where 𝗉𝗋𝖾_𝗋𝖼𝗆=[𝟶𝚡𝟶𝙱]||𝖫𝖤𝖡𝖲𝟤𝖮𝖲𝖯256(𝗀⋆𝖽)||𝖫𝖤𝖡𝖲𝟤𝖮𝖲𝖯256(𝗉𝗄⋆𝖽)||𝖨𝟤𝖫𝖤𝖮𝖲𝖯64(𝗏)||ρ||𝖨𝟤𝖫𝖤𝖮𝖲𝖯256(ψ).

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:

(𝗋𝗍𝖮𝗋𝖼𝗁𝖺𝗋𝖽⦂{0..qℙ−1},𝗋𝗄⦂𝖲𝗉𝖾𝗇𝖽𝖠𝗎𝗍𝗁𝖲𝗂𝗀𝖮𝗋𝖼𝗁𝖺𝗋𝖽.𝖯𝗎𝖻𝗅𝗂𝖼),𝗇𝖿⦂𝔽qℙ,𝖲𝗂𝗀𝖧𝖺𝗌𝗁⦂𝖬𝖾𝗌𝗌𝖺𝗀𝖾𝖧𝖺𝗌𝗁)

the prover knows an auxiliary input:

(𝗉𝖺𝗍𝗁⦂{0..qℙ−1}[𝖬𝖾𝗋𝗄𝗅𝖾𝖣𝖾𝗉𝗍𝗁𝖮𝗋𝖼𝗁𝖺𝗋𝖽],𝗉𝗈𝗌⦂{0..2𝖬𝖾𝗋𝗄𝗅𝖾𝖣𝖾𝗉𝗍𝗁𝖮𝗋𝖼𝗁𝖺𝗋𝖽−1},𝝰⦂𝔽rℙ,𝖺𝗄ℙ⦂ℙ∗,𝗇𝗄⦂𝔽qℙ,𝗋𝗂𝗏𝗄_𝖾𝗑𝗍⦂𝔽rℙ,𝗋𝗂𝗏𝗄⦂𝔽rℙ,(𝗊𝗄,σ𝗊𝗌𝗄)⦂(𝔹𝕐[ℓ𝗊𝗄/8]×𝖲𝗈𝖪𝗊𝗌𝗄((𝗊𝗄),𝖲𝗂𝗀𝖧𝖺𝗌𝗁))∪{(⊥,⊥)},σ𝗌𝗄⦂𝖲𝗈𝖪𝗌𝗄((𝖺𝗄ℙ,𝗇𝗄,𝗋𝗂𝗏𝗄_𝖾𝗑𝗍),𝖲𝗂𝗀𝖧𝖺𝗌𝗁)∪{⊥},𝗋𝗌𝖾𝖾𝖽⦂𝔹𝕐[32],𝗀𝖽⦂ℙ∗,𝗏⦂{0..2ℓ𝗏𝖺𝗅𝗎𝖾−1},ρ⦂𝔽qℙ)

where

𝖡𝗂𝗇𝖽𝖪𝖾𝗒𝗌𝗌𝗄(𝗌𝗄,𝖺𝗄ℙ,𝗇𝗄,𝗋𝗂𝗏𝗄_𝖾𝗑𝗍)=(𝖺𝗄ℙ=[𝖧𝖺𝗌𝗄(𝗌𝗄)]𝒢𝖮𝗋𝖼𝗁𝖺𝗋𝖽∧𝗇𝗄=𝖧𝗇𝗄(𝗌𝗄)∧𝗋𝗂𝗏𝗄_𝖾𝗑𝗍=𝖧𝗋𝗂𝗏𝗄_𝗅𝖾𝗀𝖺𝖼𝗒(𝗌𝗄))

and

𝖲𝗈𝖪𝗊𝗌𝗄.𝖲𝗍𝖺𝗍𝖾𝗆𝖾𝗇𝗍={𝗊𝗌𝗄⦂𝔹𝕐[ℓ𝗊𝗌𝗄/8]|𝗊𝗄=𝖧𝗊𝗄(𝗊𝗌𝗄)}𝖲𝗈𝖪𝗌𝗄.𝖲𝗍𝖺𝗍𝖾𝗆𝖾𝗇𝗍={𝗌𝗄⦂𝔹[ℓ𝗌𝗄]|𝖡𝗂𝗇𝖽𝖪𝖾𝗒𝗌𝗌𝗄(𝗌𝗄,𝖺𝗄ℙ,𝗇𝗄,𝗋𝗂𝗏𝗄_𝖾𝗑𝗍)}

such that the following conditions hold:

{𝗋𝗄=𝖲𝗉𝖾𝗇𝖽𝖠𝗎𝗍𝗁𝖲𝗂𝗀𝖮𝗋𝖼𝗁𝖺𝗋𝖽.𝖱𝖺𝗇𝖽𝗈𝗆𝗂𝗓𝖾𝖯𝗎𝖻𝗅𝗂𝖼(α,𝖺𝗄ℙ)(∧𝖺𝗄=𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ(𝖺𝗄ℙ)(∧((𝗊𝗄,σ𝗊𝗌𝗄)=(⊥,⊥))≠(σ𝗌𝗄=⊥)(∧(𝗊𝗄,σ𝗊𝗌𝗄)≠(⊥,⊥)⇒(𝖲𝗈𝖪𝗊𝗌𝗄.𝖵𝖺𝗅𝗂𝖽𝖺𝗍𝖾((𝗊𝗄),𝖲𝗂𝗀𝖧𝖺𝗌𝗁,σ𝗊𝗌𝗄)∧𝗋𝗂𝗏𝗄_𝖾𝗑𝗍=𝖧𝗊𝗄𝗋𝗂𝗏𝗄_𝖾𝗑𝗍(𝖺𝗄,𝗇𝗄))(∧σ𝗌𝗄≠⊥⇒𝖲𝗈𝖪𝗌𝗄.𝖵𝖺𝗅𝗂𝖽𝖺𝗍𝖾((𝖺𝗄ℙ,𝗇𝗄,𝗋𝗂𝗏𝗄_𝖾𝗑𝗍),𝖲𝗂𝗀𝖧𝖺𝗌𝗁,σ𝗌𝗄)(∧𝗋𝗂𝗏𝗄∈{𝗋𝗂𝗏𝗄_𝖾𝗑𝗍,𝖧𝗋𝗂𝗏𝗄_𝖾𝗑𝗍𝗋𝗂𝗏𝗄_𝗂𝗇𝗍(𝖺𝗄,𝗇𝗄)}(∧let 𝗂𝗏𝗄=𝖢𝗈𝗆𝗆𝗂𝗍𝗋𝗂𝗏𝗄𝗂𝗏𝗄(𝖺𝗄,𝗇𝗄)(∧𝗂𝗏𝗄∉{0,⊥}(∧let 𝗉𝗄𝖽=[𝗂𝗏𝗄]𝗀𝖽(∧let ψ=𝖧𝗋𝗌𝖾𝖾𝖽ψ,𝖮𝗋𝖼𝗁𝖺𝗋𝖽(ρ)(∧let 𝗇𝗈𝗍𝖾𝗋𝖾𝗉𝗋=(𝗋𝖾𝗉𝗋ℙ(𝗀𝖽),𝗋𝖾𝗉𝗋ℙ(𝗉𝗄𝖽),𝗏,ρ,ψ)(∧let 𝗋𝖼𝗆=𝖧𝗋𝗌𝖾𝖾𝖽𝗋𝖼𝗆,𝖮𝗋𝖼𝗁𝖺𝗋𝖽(𝟶𝚡𝟶𝟹,𝗇𝗈𝗍𝖾𝗋𝖾𝗉𝗋)(∧let 𝖼𝗆=𝖭𝗈𝗍𝖾𝖢𝗈𝗆𝗆𝗂𝗍𝗋𝖼𝗆𝖮𝗋𝖼𝗁𝖺𝗋𝖽(𝗇𝗈𝗍𝖾𝗋𝖾𝗉𝗋)(∧𝖼𝗆≠⊥(∧let 𝖼𝗆x=𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ(𝖼𝗆)(∧let 𝗅𝖾𝖺𝖿=𝖬𝖾𝗋𝗄𝗅𝖾𝖢𝖱𝖧(𝖼𝗆x,ρ)(∧𝗉𝖺𝗍𝗁 𝗂𝗌 𝖺 𝗉𝖺𝗍𝗁 𝗍𝗈 𝗅𝖾𝖺𝖿 𝗂𝗇 𝗍𝗁𝖾 𝗋𝖾𝗁𝖺𝗌𝗁𝖾𝖽 𝖼𝗈𝗆𝗆𝗂𝗍𝗆𝖾𝗇𝗍 𝗍𝗋𝖾𝖾(∧𝗇𝖿=𝖣𝖾𝗋𝗂𝗏𝖾𝖭𝗎𝗅𝗅𝗂𝖿𝗂𝖾𝗋𝗇𝗄(ρ,ψ,𝖼𝗆)(}

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 ℓ𝗊𝗄≤504 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 𝖼𝗆x for each note (i.e. what is currently the leaf layer becomes 𝖬𝖾𝗋𝗄𝗅𝖾𝖢𝖱𝖧(ρ,𝖼𝗆x) 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:

𝗋𝖼𝗆=𝖧𝗋𝗌𝖾𝖾𝖽𝗋𝖼𝗆(𝗇𝗈𝗍𝖾𝗋𝖾𝗉𝗋)=𝖳𝗈𝖲𝖼𝖺𝗅𝖺𝗋(𝖯𝖱𝖥𝗋𝗌𝖾𝖾𝖽𝖾𝗑𝗉𝖺𝗇𝖽(𝗉𝗋𝖾_𝗋𝖼𝗆))

where 𝗉𝗋𝖾_𝗋𝖼𝗆=[𝟶𝚡𝟶𝙱]||𝖾𝗇𝖼𝗈𝖽𝖾(𝗇𝗈𝗍𝖾𝗋𝖾𝗉𝗋)

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 𝒞j=𝒬(D) 𝗈𝗋 𝒮(j) used by 𝖧𝖺𝗌𝗁𝖳𝗈𝖲𝗂𝗇𝗌𝗂𝗆𝗂𝗅𝗅𝖺𝖯𝗈𝗂𝗇𝗍 as 𝒞j=[cj]ℛ for some cj. That is, the note commitment for 𝗇𝗈𝗍𝖾𝗍𝗎𝗉𝗅𝖾 is [𝖧𝗋𝗌𝖾𝖾𝖽𝗋𝖼𝗆(𝗇𝗈𝗍𝖾𝗋𝖾𝗉𝗋)+𝖿(𝗇𝗈𝗍𝖾𝗍𝗎𝗉𝗅𝖾)]ℛ.

We will model 𝖧𝗋𝖼𝗆 as a random oracle independent of 𝖿 with uniform output on 𝔽rℙ. This is reasonable because 𝖧𝗋𝖼𝗆 cannot depend on any of the cj, 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 rℙ≈2254 cannot introduce a problem.

For each 𝖧𝗋𝖼𝗆 oracle query the adversary chooses 𝗇𝗈𝗍𝖾𝗍𝗎𝗉𝗅𝖾=(𝗋𝗌𝖾𝖾𝖽,𝗇𝗈𝗍𝖾𝗋𝖾𝗉𝗋) and obtains a "random" 𝗋𝖼𝗆=𝖧𝗋𝗌𝖾𝖾𝖽𝗋𝖼𝗆(𝗇𝗈𝗍𝖾𝗋𝖾𝗉𝗋).

We have 𝖼𝗆x=𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ([𝖧𝗋𝗌𝖾𝖾𝖽𝗋𝖼𝗆(𝗇𝗈𝗍𝖾𝗋𝖾𝗉𝗋)+𝖿(𝗇𝗈𝗍𝖾𝗍𝗎𝗉𝗅𝖾)]ℛ).

Over all Pallas curve points P, the number of outputs of 𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ(P) is (𝔽rℙ+1)/2≈2253 — one for each possible x-coordinate of Pallas curve points, plus one for the zero point 𝒪ℙ which is mapped to 0.

Only one point maps to 0, as opposed to two points mapping to every other possible output of 𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ, but that has negligible effect.

There are two values of 𝖼𝗆 that match 𝖼𝗆x in their x-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 N 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 𝔽rℙ. The success probability for each attempt in a classical search is therefore 2N/rℙ where rℙ is the order of the Pallas curve, and that is negligible because N≤232≪rℙ.

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 x-coordinate of a Pallas curve point (see the note at the end of § 4.2.3 Orchard Key Components), it can take on (rℙ−1)/2 values. So if there are T targets the success probability for each attempt in a classical search is 2T/(rℙ−1), which is negligible provided that T≪rℙ.

  • Case 𝗊𝗄≠⊥: This case is almost the same except that 𝗂𝗏𝗄 is now an essentially random function of (𝗇𝗄,𝖺𝗄,𝗊𝗄). The success probability in terms of T 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 y-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 𝗊𝗄_𝗈𝗋_𝗌𝗄⦂𝖰𝖪(𝔹𝕐[ℓ𝗊𝗄/8])|𝖲𝖪(𝔹[ℓ𝗌𝗄]) —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 w=(𝗂𝗏𝗄,𝖺𝗄ℙ,𝗇𝗄,𝗋𝗂𝗏𝗄_𝖾𝗑𝗍,𝗋𝗂𝗏𝗄,𝗊𝗄_𝗈𝗋_𝗌𝗄) be:

match 𝗊𝗄_𝗈𝗋_𝗌𝗄 with {𝖰𝖪(𝗊𝗄)⇒𝗋𝗂𝗏𝗄_𝖾𝗑𝗍=𝖧𝗊𝗄𝗋𝗂𝗏𝗄_𝖾𝗑𝗍(𝖺𝗄,𝗇𝗄)𝖲𝖪(𝗌𝗄)⇒𝖡𝗂𝗇𝖽𝖪𝖾𝗒𝗌𝗌𝗄(𝗌𝗄,𝖺𝗄ℙ,𝗇𝗄,𝗋𝗂𝗏𝗄_𝖾𝗑𝗍)(∧𝗋𝗂𝗏𝗄∈{𝗋𝗂𝗏𝗄_𝖾𝗑𝗍,𝖧𝗋𝗂𝗏𝗄_𝖾𝗑𝗍𝗋𝗂𝗏𝗄_𝗂𝗇𝗍(𝖺𝗄,𝗇𝗄)}∧𝗂𝗏𝗄=𝖢𝗈𝗆𝗆𝗂𝗍𝗋𝗂𝗏𝗄𝗂𝗏𝗄(𝖺𝗄,𝗇𝗄)∧𝗂𝗏𝗄∉{0,⊥}

where 𝖺𝗄=𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ(𝖺𝗄ℙ).

The predicate intentionally does not constrain the y-sign of 𝖺𝗄ℙ. This is consistent with the Orchard protocol's design choice to use 𝖺𝗄 as a single 𝔽qℙ element (the x-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 y-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 w1 and w2 in different branches across either flag (e.g., w1 in the 𝖰𝖪 branch and w2 in the 𝖲𝖪 branch, or w1 with external 𝗋𝗂𝗏𝗄 and w2 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 (w1,w2) with shared 𝗂𝗏𝗄 satisfying the key-binding condition, whose (𝖺𝗄,𝗇𝗄,𝗋𝗂𝗏𝗄,𝗊𝗄_𝗈𝗋_𝗌𝗄) projections differ — i.e., w1 and w2 differ in some component other than the y-sign of 𝖺𝗄ℙ.

The random oracles used in the key-binding condition are 𝖧𝗋𝗂𝗏𝗄_𝖾𝗑𝗍, 𝖧𝗋𝗂𝗏𝗄_𝗅𝖾𝗀𝖺𝖼𝗒, 𝖧𝗋𝗂𝗏𝗄_𝗂𝗇𝗍, 𝖧𝖺𝗌𝗄, and 𝖧𝗇𝗄.

Let ε𝗄𝖻(𝒜,q𝗄𝖻) be the probability, over 𝒜's randomness and at most q𝗄𝖻 queries in total to these random oracles, that 𝒜 outputs a key-binding break. Here q𝗄𝖻 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 q𝗄𝖻 total queries to the random oracles used in the key-binding condition. Then ε𝗄𝖻(𝒜,q𝗄𝖻)≤q𝗄𝖻(q𝗄𝖻−1)rℙ.

Proof sketch.

Algebraic setup. By § 5.4.1.10 “Sinsemilla commitments”,

𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ(M′+[𝗋𝗂𝗏𝗄]𝒮),

where 𝒮 is the rivk-randomization base 𝒮:=𝖦𝗋𝗈𝗎𝗉𝖧𝖺𝗌𝗁ℙ(“𝚣.𝚌𝚊𝚜𝚑:𝙾𝚛𝚌𝚑𝚊𝚛𝚍-𝙲𝚘𝚖𝚖𝚒𝚝𝙸𝚟𝚔-𝚛”,“”), and

𝖨𝟤𝖫𝖤𝖡𝖲𝖯ℓ𝖻𝖺𝗌𝖾𝖮𝗋𝖼𝗁𝖺𝗋𝖽(𝖺𝗄)‖𝖨𝟤𝖫𝖤𝖡𝖲𝖯ℓ𝖻𝖺𝗌𝖾𝖮𝗋𝖼𝗁𝖺𝗋𝖽(𝗇𝗄)).

By expanding the Sinsemilla bases used inside 𝖲𝗂𝗇𝗌𝖾𝗆𝗂𝗅𝗅𝖺𝖧𝖺𝗌𝗁𝖳𝗈𝖯𝗈𝗂𝗇𝗍 as scalar multiples of 𝒮, without loss of generality we have M′=[h(𝖺𝗄,𝗇𝗄)]𝒮 for a Pedersen-like deterministic scalar hash h, so

𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ([h(𝖺𝗄,𝗇𝗄)+𝗋𝗂𝗏𝗄]𝒮).

Domain separation in the protocol's BLAKE2b instantiations ensures h does not query 𝖧𝗋𝗂𝗏𝗄_𝖾𝗑𝗍, 𝖧𝗋𝗂𝗏𝗄_𝗅𝖾𝗀𝖺𝖼𝗒, 𝖧𝗋𝗂𝗏𝗄_𝗂𝗇𝗍, 𝖧𝖺𝗌𝗄, or 𝖧𝗇𝗄: h depends only on fixed Sinsemilla bases and on (𝖺𝗄,𝗇𝗄).

By the same y2=Y(x) argument used in the Spendability proof (using § 5.4.9.7 for the 𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ-style x-coordinate convention), a key-binding break implies h(𝖺𝗄,𝗇𝗄)+𝗋𝗂𝗏𝗄≡±(h(𝖺𝗄′,𝗇𝗄′)+𝗋𝗂𝗏𝗄′)(modrℙ). Define 𝖦(w):=h(𝖺𝗄,𝗇𝗄)+𝗋𝗂𝗏𝗄(modrℙ) for a witness w, and let Gi:=𝖦(wi) for i∈{1,2}. The break condition is G1≡±G2(modrℙ).

Final-random-oracle structure. For each witness wi satisfying the key-binding condition, 𝗋𝗂𝗏𝗄i is the output of a final random oracle Oi∈{𝖧𝗋𝗂𝗏𝗄_𝖾𝗑𝗍,𝖧𝗋𝗂𝗏𝗄_𝗅𝖾𝗀𝖺𝖼𝗒,𝖧𝗋𝗂𝗏𝗄_𝗂𝗇𝗍} at a final input xi, determined by the witness's branch and IVK choice:

  • qk-branch, external IVK: Oi=𝖧𝗋𝗂𝗏𝗄_𝖾𝗑𝗍, xi=(𝗊𝗄i,𝖺𝗄i,𝗇𝗄i).
  • sk-branch, external IVK: Oi=𝖧𝗋𝗂𝗏𝗄_𝗅𝖾𝗀𝖺𝖼𝗒, xi=𝗌𝗄i.
  • qk-branch, internal IVK: Oi=𝖧𝗋𝗂𝗏𝗄_𝗂𝗇𝗍, xi=(𝗋𝗂𝗏𝗄_𝖾𝗑𝗍i,𝖺𝗄i,𝗇𝗄i) where 𝗋𝗂𝗏𝗄_𝖾𝗑𝗍i=𝖧𝗊𝗄𝗂𝗋𝗂𝗏𝗄_𝖾𝗑𝗍(𝖺𝗄i,𝗇𝗄i).
  • sk-branch, internal IVK: Oi=𝖧𝗋𝗂𝗏𝗄_𝗂𝗇𝗍, xi=(𝗋𝗂𝗏𝗄_𝖾𝗑𝗍i,𝖺𝗄i,𝗇𝗄i) where 𝗋𝗂𝗏𝗄_𝖾𝗑𝗍i=𝖧𝗋𝗂𝗏𝗄_𝗅𝖾𝗀𝖺𝖼𝗒(𝗌𝗄i).

In each case Gi=h(𝖺𝗄i,𝗇𝗄i)+Oi(xi)(modrℙ), with the deterministic shift h independent of Oi'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 𝔽rℙ, 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 x, define the shift s(x):=h(𝖺𝗄,𝗇𝗄), with (𝖺𝗄,𝗇𝗄) read off the input: directly for 𝖧𝗋𝗂𝗏𝗄_𝖾𝗑𝗍 and 𝖧𝗋𝗂𝗏𝗄_𝗂𝗇𝗍 inputs, and via 𝖺𝗄=𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ([𝖧𝖺𝗌𝗄(𝗌𝗄)]𝒢𝖮𝗋𝖼𝗁𝖺𝗋𝖽), 𝗇𝗄=𝖧𝗇𝗄(𝗌𝗄) for an 𝖧𝗋𝗂𝗏𝗄_𝗅𝖾𝗀𝖺𝖼𝗒 input 𝗌𝗄. So s is a function of the input and of the 𝖧𝖺𝗌𝗄/𝖧𝗇𝗄 oracles only; since h is non-querying, s never depends on the rivk-derivation responses. Define the shifted combined oracle 𝖧s(x):=s(x)+𝖧∗(x)(modrℙ). For every witness satisfying the key-binding condition the derivation constraints give Gi=𝖧s(xi), so the break condition is a ±-collision of 𝖧s at the pair (x1,x2).

Distinct final inputs. The final inputs x1,x2 of a break need not be distinct, but the case x1=x2 is fully deterministic. If the witnesses decode differently —one external, one internal— their final inputs lie in disjoint summands of the combined domain, so x1=x2 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 𝗋𝗂𝗏𝗄_𝖾𝗑𝗍1=𝗋𝗂𝗏𝗄_𝖾𝗑𝗍2 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 h(𝖺𝗄,𝗇𝗄), using the derivation constraints on the 𝗌𝗄 side. So this is again a ±-collision of 𝖧s, at distinct inputs. In every case: a key-binding break yields a ±-collision of 𝖧s at two distinct inputs among the adversary's queries, under the convention that q𝗄𝖻 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 q𝗄𝖻.

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 j-th query xj to 𝖧∗, condition on the transcript so far: the 𝖧𝖺𝗌𝗄/𝖧𝗇𝗄 responses (which fix the shifts s(⋅)) and the j−1 recorded 𝖧∗ responses. Under every such conditioning the fresh response 𝖧∗(xj) is uniform on 𝔽rℙ, and for each recorded input xi and each sign there is exactly one value of 𝖧∗(xj) with 𝖧s(xj)≡±𝖧s(xi)(modrℙ); so the fresh response completes a shifted ±-collision with probability at most 2(j−1)/rℙ. Because the conditioning is on the transcript itself, this holds however xj was chosen from the transcript. Summing over the queries, ε𝗄𝖻(𝒜,q𝗄𝖻)≤∑j=1q𝗄𝖻2(j−1)rℙ=q𝗄𝖻(q𝗄𝖻−1)rℙ. (Queries to 𝖧𝖺𝗌𝗄 or 𝖧𝗇𝗄 are not 𝖧∗ inputs and cannot complete a collision, so counting them in q𝗄𝖻 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:

𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ([(𝖯𝖱𝖥𝗇𝗄𝗇𝖿(ρ)+ψ)modqℙ]𝒦+𝖼𝗆)

Also recall from [Repairing note commitments] that we have

+𝖿(𝗋𝗌𝖾𝖾𝖽,𝗇𝗈𝗍𝖾𝗋𝖾𝗉𝗋)]ℛ.

Let Kℛ 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

[((𝖯𝖱𝖥𝗇𝗄𝗇𝖿(ρ)+ψ)modqℙ)⋅Kℛ+𝖧𝗋𝗌𝖾𝖾𝖽𝗋𝖼𝗆(𝗇𝗈𝗍𝖾𝗋𝖾𝗉𝗋)+𝖿(𝗋𝗌𝖾𝖾𝖽,𝗇𝗈𝗍𝖾𝗋𝖾𝗉𝗋)]ℛ).

We model 𝖧𝗋𝖼𝗆 as a random oracle with output uniform on 𝔽rℙ. 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 ε𝗄𝖻(𝒜,q𝗄𝖻) be the probability, over 𝒜's randomness and at most q𝗄𝖻 queries to the random oracles used in the key-binding argument, that 𝒜 outputs a key-binding break (with q𝗄𝖻 counting the derivation inputs of the output witnesses among the queries, as in the accounting normalization). ε𝗄𝖻(𝒜,q𝗄𝖻) is bounded separately by that argument; the bound below is unconditional, but is only useful to the extent that ε𝗄𝖻(𝒜,q𝗄𝖻) 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 q𝗋𝖼𝗆(q𝗋𝖼𝗆−1)rℙ+ε𝗄𝖻(𝒜,q𝗄𝖻), where q𝗋𝖼𝗆 is the number of queries 𝒜 makes to 𝖧𝗋𝖼𝗆, and q𝗄𝖻 is as defined above. The bound depends only on q𝗋𝖼𝗆 and on ε𝗄𝖻(𝒜,q𝗄𝖻), 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 w with 𝗇𝗈𝗍𝖾𝗍𝗎𝗉𝗅𝖾=(𝗋𝗌𝖾𝖾𝖽,𝗇𝗈𝗍𝖾𝗋𝖾𝗉𝗋), the value 𝗂𝗏𝗄=log𝗀𝖽⁡(𝗉𝗄𝖽) is well-defined, since 𝗀𝖽≠𝒪ℙ on the prime-order Pallas curve and 𝗂𝗏𝗄∈[0,qℙ)⊆[0,rℙ); 𝗂𝗏𝗄 is therefore uniquely determined by 𝗇𝗈𝗍𝖾𝗍𝗎𝗉𝗅𝖾.

𝗇𝖿-pinning lemma. Suppose 𝒜's output (w1,w2) does not contain a key-binding break. Then for each i∈{1,2}, 𝗇𝖿i is uniquely determined by 𝗇𝗈𝗍𝖾𝗍𝗎𝗉𝗅𝖾i: by the conditioning, (𝖺𝗄i,𝗇𝗄i,𝗋𝗂𝗏𝗄i) is the only opening of 𝗂𝗏𝗄i appearing in 𝒜's output, so 𝗇𝗄i is a function of 𝗂𝗏𝗄i, which is in turn a function of 𝗇𝗈𝗍𝖾𝗍𝗎𝗉𝗅𝖾i by the 𝗂𝗏𝗄-pinning lemma; ρi is a field of 𝗇𝗈𝗍𝖾𝗍𝗎𝗉𝗅𝖾i; and the remaining 𝖣𝖾𝗋𝗂𝗏𝖾𝖭𝗎𝗅𝗅𝗂𝖿𝗂𝖾𝗋 inputs ψi and 𝖼𝗆i are determined by 𝗇𝗈𝗍𝖾𝗍𝗎𝗉𝗅𝖾i 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 𝔽rℙ, making at most q𝗋𝖼𝗆 oracle queries. The Spendability-collision game has 𝒜 output two Recovery Statement witnesses w1,w2 satisfying:

Validity of witnesses
both witnesses satisfy the Proposed Recovery Statement.
Distinct note tuples
the 𝖧𝗋𝖼𝗆-input tuples 𝗇𝗈𝗍𝖾𝗍𝗎𝗉𝗅𝖾i:=(𝗋𝗌𝖾𝖾𝖽i,𝗇𝗈𝗍𝖾𝗋𝖾𝗉𝗋i) satisfy 𝗇𝗈𝗍𝖾𝗍𝗎𝗉𝗅𝖾1≠𝗇𝗈𝗍𝖾𝗍𝗎𝗉𝗅𝖾2.

Colliding nullifiers : 𝗇𝖿1=𝗇𝖿2.

Then 𝒜 wins this game with probability at most

+ε𝗄𝖻(𝒜,q𝗄𝖻)=q𝗋𝖼𝗆(q𝗋𝖼𝗆−1)rℙ+ε𝗄𝖻(𝒜,q𝗄𝖻),

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 (k2)/N on the success probability of any classical algorithm in finding a collision against a random oracle with an N-element output space using k queries. Maurer's bound applies to the equality event Fi=Fj; our win condition allows Fi=±Fj (two winning configurations per pair instead of one). Applying Maurer with N=rℙ (the 𝖧𝗋𝖼𝗆 output space) gives (q𝗋𝖼𝗆2)/rℙ for the equality event; doubling for the sign relaxation gives our q𝗋𝖼𝗆(q𝗋𝖼𝗆−1)rℙ 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 q𝗋𝖼𝗆 queries to 𝖧𝗋𝖼𝗆 before outputting (w1,w2) satisfying Validity of witnesses, Distinct note tuples, and Colliding nullifiers. The probability that (w1,w2) contains a key-binding break is at most ε𝗄𝖻(𝒜,q𝗄𝖻); 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 Pr⁡[win]≤Pr⁡[win|¬break]+Pr⁡[break]: Pr⁡[win]≤q𝗋𝖼𝗆(q𝗋𝖼𝗆−1)rℙ+ε𝗄𝖻(𝒜,q𝗄𝖻). This completes the classical-ROM proof.

The key-binding theorem bounds ε𝗄𝖻(𝒜,q𝗄𝖻)≤q𝗄𝖻(q𝗄𝖻−1)rℙ. Substituting, an adversary 𝒜 that makes at most q𝗋𝖼𝗆 queries to 𝖧𝗋𝖼𝗆 and at most q𝗄𝖻 queries to the key-binding random oracles wins the Spendability-collision game with probability at most q𝗋𝖼𝗆(q𝗋𝖼𝗆−1)rℙ+q𝗄𝖻(q𝗄𝖻−1)rℙ.

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 292.3-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 P and −P to the same x-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 𝖼𝗆x 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 {P,−P} of 𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ forming a uniform partition of the non-identity points of ℙ — the free ℤ/2 negation action gives every fibre for non-identity points exactly size 2 — which is what lets birthday-style bounds substitute rℙ→rℙ/2 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 q2/N collision probability transfers to O(q3/N) in QROM: an adversary making at most q quantum queries to a random oracle with output space of size N finds a collision with probability O(q3/N). Applied to our reductions:

  • ε𝖲𝗉𝖾𝗇𝖽𝖺𝖻𝗂𝗅𝗂𝗍𝗒𝖰𝖱𝖮𝖬≤O(q𝗋𝖼𝗆3/rℙ)+ε𝗄𝖻𝖰𝖱𝖮𝖬.
  • ε𝗄𝖻𝖰𝖱𝖮𝖬≤O(q𝗄𝖻3/rℙ).

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 292.3-bit quantum memory). In practice the achievable bound remains close to the classical q2/rℙ, 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 (q𝗋𝖼𝗆,q𝗄𝖻≪260 and rℙ≈2254), the O(q3/rℙ) worst-case bound is at most ∼2−74, while the practically achievable O(q2/rℙ) bound stays closer to ∼2−134.

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:

  1. 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.
  2. 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

  1. 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" ↩

  2. ZIP 200: Network Upgrade Mechanism ↩

  3. Zcash Protocol Specification, Version 2026.8.0 [NU6.3] ↩ ↩2

  4. Zcash Protocol Specification, Version 2026.8.0 [NU6.3]. Section 3.12: Mainnet and Testnet ↩

  5. ZIP 229: Version 6 Transaction Format ↩ ↩2 ↩3 ↩4 ↩5

  6. ZIP 226: Transfer and Burn of Zcash Shielded Assets ↩ ↩2 ↩3 ↩4

  7. ZIP 227: Issuance of Zcash Shielded Assets ↩ ↩2 ↩3

  8. Post-Quantum Zcash (video, slides). Presentation by Daira-Emma Hopwood at ZconVI. ↩ ↩2

  9. ZIP 32: Shielded Hierarchical Deterministic Wallets — Sapling child key derivation ↩

  10. ZIP 32: Shielded Hierarchical Deterministic Wallets — Sapling internal key derivation ↩

  11. ZIP 32: Shielded Hierarchical Deterministic Wallets — Orchard child key derivation ↩

  12. ZIP 32: Shielded Hierarchical Deterministic Wallets — Orchard internal key derivation ↩ ↩2 ↩3

  13. ZIP 231: Memo Bundles ↩ ↩2

  14. ZIP 312: FROST for Spend Authorization Multisignatures ↩

  15. Zcash Protocol Specification, Version 2026.8.0 [NU6.3]. Section 4.2.3: Orchard Key Components ↩ ↩2 ↩3

  16. ZIP 312: FROST for Spend Authorization Multisignatures — Threat Model ↩

  17. SLIP-0039: Shamir's Secret-Sharing for Mnemonic Codes ↩

  18. Zcash Protocol Specification, Version 2026.7.0 [NU6.2] ↩

  19. Zcash Protocol Specification, Version 2026.7.0 [NU6.2]. Section 4.2.3: Orchard Key Components ↩ ↩2

  20. Zcash Protocol Specification, Version 2026.7.0 [NU6.2]. Section 4.7.2: Sending Notes (Sapling) ↩ ↩2

  21. Zcash Protocol Specification, Version 2026.7.0 [NU6.2]. Section 4.7.3: Sending Notes (Orchard) ↩ ↩2

  22. Zcash Protocol Specification, Version 2026.7.0 [NU6.2]. Section 4.20: In-band secret distribution (Sapling and Orchard) ↩ ↩2

  23. ZIP 226: Transfer and Burn of Zcash Shielded Assets — Split Notes ↩ ↩2

  24. Zcash Protocol Specification, Version 2026.7.0 [NU6.2]. Section 5.3: Constants ↩

  25. ZIP 312: FROST for Spend Authorization Multisignatures — Key Generation ↩ ↩2

  26. BLAKE3: One Function, Fast Everywhere. Jack O'Connor, Jean-Philippe Aumasson, Samuel Neves, and Zooko Wilcox, 2020. See § 2.1.2 for the derive_key mode. ↩

  27. Understanding Zcash Security (video, slides). Presentation by Daira-Emma Hopwood at Zcon3. ↩ ↩2

  28. Computationally binding quantum commitments. Dominique Unruh. Also published in EUROCRYPT 2016, LNCS vol. 9666. ↩ ↩2

  29. Collapse-binding quantum commitments without random oracles. Dominique Unruh. Also published in ASIACRYPT 2016, LNCS vol. 10032. ↩ ↩2 ↩3

  30. Zcash Protocol Specification, Version 2026.8.0 [NU6.3]. Section 4.7.3: Sending Notes (Orchard) ↩

  31. Zcash Protocol Specification, Version 2026.8.0 [NU6.3]. Section 5.4.7.1: Spend Authorization Signature (Sapling and Orchard) ↩

  32. Zcash Protocol Specification, Version 2026.8.0 [NU6.3]. Section 5.4.1.9: Sinsemilla Hash Function ↩

  33. Zcash Protocol Specification, Version 2026.8.0 [NU6.3]. Section 5.4.1.9: Sinsemilla Hash Function — Security argument ↩

  34. Post-Quantum Succinct Arguments: Breaking the Quantum Rewinding Barrier. Alessandro Chiesa, Fermi Ma, Nicholas Spooner, and Mark Zhandr. Also published in FOCS 2021. ↩ ↩2

  35. Collapseability of Tree Hashes. Aldo Gunsing and Bart Mennink. Also published in PQCrypto 2020, LNCS vol. 12100, pp. 524–544. ↩ ↩2

  36. Quantum Rewinding for IOP-Based Succinct Arguments. Alessandro Chiesa, Marcel Dall'Agnol, Zijing Di, Ziyi Guan, and Nicholas Spooner. ↩ ↩2

  37. The Sponge is Quantum Indifferentiable. Gorjan Alagic, Joseph Carolan, Christian Majenz, and Saliha Tokat. ↩ ↩2

  38. 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). ↩

  39. Indistinguishability of Random Systems. Ueli Maurer. Also published in Advances in Cryptology — EUROCRYPT 2002, LNCS vol. 2332, pp. 110–132. ↩

  40. Cost analysis of hash collisions: Will quantum computers make SHARCS obsolete? Daniel J. Bernstein. Presented at SHARCS 2009. ↩ ↩2 ↩3

  41. 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. ↩

  42. Classical Proofs for the Quantum Collapsing Property of Classical Hash Functions. Serge Fehr. Also published in TCC 2018, LNCS vol. 11240, pp. 315–338. ↩

  43. Parallel collision search with cryptanalytic applications. Paul C. van Oorschot and Michael Wiener. ↩ ↩2

  44. 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. ↩

  45. How to Record Quantum Queries, and Applications to Quantum Indifferentiability. Mark Zhandry. Also published in CRYPTO 2019, LNCS vol. 11693. ↩

  46. 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. ↩

  47. ZIP 209: Prohibit Out-of-Range Chain Value Pool Balances ↩

  48. 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

  49. zcash/zips issue 1302: [ZIP 2007] Quantum recoverability of a subset of the transparent protocol ↩

  50. ZIP 2003: Disallow version 4 transactions ↩

  51. Deployment of the NU6.3 Network Upgrade) ↩