The Zcash ArboretumThe Complete Arboretum PDF

9 The Action statement and its proof

This section states the relation that is proved for every Action. It fixes the bundle flags that enter the relation as public inputs, states the Action statement over the objects constructed in §2 to §8, pairs each condition with the requirement it serves and with the check outside the proof that completes it, and states the proof system together with the two assumptions on the Action proof that “Security” (§12) uses.

9.1 Bundle flags

Each bundle carries one flags byte, present exactly when the bundle has at least one Action: 𝖿𝗅𝖺𝗀𝗌𝖮𝗋𝖼𝗁𝖺𝗋𝖽 for the Orchard-pool bundle of a version 5 or version 6 transaction, and 𝖿𝗅𝖺𝗀𝗌𝖨𝗋𝗈𝗇𝗐𝗈𝗈𝖽 for the Ironwood-pool bundle of a version 6 transaction (ZIP 229, “Transaction Format”). Bits are numbered from the least significant, bit 0. In both bytes bit 0 is 𝖾𝗇𝖺𝖻𝗅𝖾𝖲𝗉𝖾𝗇𝖽𝗌 and bit 1 is 𝖾𝗇𝖺𝖻𝗅𝖾𝖮𝗎𝗍𝗉𝗎𝗍𝗌. The consensus rules of ZIP 229, “Consensus Rules”, fix the remaining bits:

  1. 1.

    in 𝖿𝗅𝖺𝗀𝗌𝖨𝗋𝗈𝗇𝗐𝗈𝗈𝖽, bit 2 is 𝖾𝗇𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌, and bits 3 to 7 are reserved and must be 0;

  2. 2.

    in 𝖿𝗅𝖺𝗀𝗌𝖮𝗋𝖼𝗁𝖺𝗋𝖽, bits 2 to 7 are reserved and must be 0, in version 5 and version 6 transactions alike.

The format table of ZIP 229, “Transaction Format”, lists 𝖾𝗇𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌 at bit 2 of 𝖿𝗅𝖺𝗀𝗌𝖮𝗋𝖼𝗁𝖺𝗋𝖽; this contradicts the consensus rules of the same ZIP, which reserve that bit, and the volume follows the consensus rules. The two texts differ in the role of the bit, not in its value in a valid transaction: ZIP 258, “Consensus rules from NU6.3 activation”, requires every Orchard-pool Action to be created with 𝖾𝗇𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌=0.

Definition 9.1 (Flag values and expanded receiver).

Let a bundle have flags byte f=∑i=07fi⁢ 2i with fi∈{0,1}. Its flag values, elements of {0,1}, are

𝖾𝗇𝖺𝖻𝗅𝖾𝖲𝗉𝖾𝗇𝖽𝗌:=f0,𝖾𝗇𝖺𝖻𝗅𝖾𝖮𝗎𝗍𝗉𝗎𝗍𝗌:=f1,
𝖾𝗇𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌:={f2for an Ironwood-pool bundle,0for an Orchard-pool bundle,

and 𝖽𝗂𝗌𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌:=1−𝖾𝗇𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌. For an Orchard-pool bundle bit 2 is reserved and 0, so every Orchard-pool Action has 𝖾𝗇𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌=0 by encoding. The expanded receiver of a payment address (d,𝗉𝗄𝖽) is the pair (𝗀𝖽,𝗉𝗄𝖽) with 𝗀𝖽=𝖣𝗂𝗏𝖾𝗋𝗌𝗂𝖿𝗒𝖧𝖺𝗌𝗁⁢(d), the diversified base of “Diversified addresses” (§3.3); the expanded receiver of a note is that of its address. The flags have the following meaning (protocol specification, §“Action Descriptions”):

  • •

    the value 𝖾𝗇𝖺𝖻𝗅𝖾𝖲𝗉𝖾𝗇𝖽𝗌=1 enables non-zero-valued spends in the bundle’s Actions;

  • •

    the value 𝖾𝗇𝖺𝖻𝗅𝖾𝖮𝗎𝗍𝗉𝗎𝗍𝗌=1 enables non-zero-valued outputs in the bundle’s Actions;

  • •

    the value 𝖾𝗇𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌=1 enables the expanded receiver of an Action’s created note to differ from that of the note the same Action consumes.

The Action statement takes 𝖽𝗂𝗌𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌 as its eighth primary input (same section). No normative text fixes the position of this input in the encoded instance, and none is asserted here.

ZIP 229 calls 𝖾𝗇𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌=1 the normal case for Ironwood-pool Actions (Rationale, “enableCrossAddress polarity”); the value is not required. No consensus rule requires bit 2 of 𝖿𝗅𝖺𝗀𝗌𝖨𝗋𝗈𝗇𝗐𝗈𝗈𝖽 to be 1. A bundle in which that bit is 0 is admitted, and each of its Actions is then restricted, by condition A10 of Definition 9.2, to create its note at the expanded receiver of the note it consumes.

The flags are properties of the bundle. Encoded once in its flags byte, they are the same for every Action of the bundle (protocol specification, §“Action Descriptions”, note on the encoding of these components once per pool). The verifier reads them from the bundle and supplies 𝖾𝗇𝖺𝖻𝗅𝖾𝖲𝗉𝖾𝗇𝖽𝗌, 𝖾𝗇𝖺𝖻𝗅𝖾𝖮𝗎𝗍𝗉𝗎𝗍𝗌 and 𝖽𝗂𝗌𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌 as public inputs of each Action; they are not computed inside the proof. They enter the relation only through conditions A8, A9 and A10 of Definition 9.2.

9.2 The Action statement

The Action statement is a relation in the sense of the Crypto Guide’s Definition “Language, relation, witness” (§“Languages, relations, and witnesses”), with the primary input as instance and the auxiliary input as witness, each a tuple of the typed objects below, encoded as bit strings by the encodings of §2.1. Every condition is an equation over objects constructed in §2 to §8.

Definition 9.2 (Orchard Action statement).

In this definition ℰ abbreviates the Pallas group ℰ⁢(𝔽p𝖯𝖺𝗅𝗅𝖺𝗌), with identity 𝒪, and ℰ∗:=ℰ∖{𝒪}. For P=(x,y)∈ℰ∗ let x⁢(P):=x and y⁢(P):=y, and let x⁢(𝒪):=y⁢(𝒪):=0, so that 𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ⁢(P)=x⁢(P) for every P∈ℰ (protocol specification, §“Coordinate Extractor for Pallas”). An integer that multiplies a point acts as its residue modulo p𝖵𝖾𝗌𝗍𝖺 (§2.1).

The relation ℛ𝖠𝖼𝗍𝗂𝗈𝗇 is the set of pairs (𝗉𝗎𝖻,𝖺𝗎𝗑) of a primary input

𝗉𝗎𝖻=(𝑟𝑡,𝖼𝗏𝗇𝖾𝗍,𝗇𝖿𝗈𝗅𝖽,𝗋𝗄,𝖼𝗆𝗑,𝖾𝗇𝖺𝖻𝗅𝖾𝖲𝗉𝖾𝗇𝖽𝗌,𝖾𝗇𝖺𝖻𝗅𝖾𝖮𝗎𝗍𝗉𝗎𝗍𝗌,𝖽𝗂𝗌𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌)

and an auxiliary input

𝖺𝗎𝗑=( 𝗉𝖺𝗍𝗁,𝗉𝗈𝗌,𝗀𝖽𝗈𝗅𝖽,𝗉𝗄𝖽𝗈𝗅𝖽,v𝗈𝗅𝖽,ρ𝗈𝗅𝖽,ψ𝗈𝗅𝖽,𝗋𝖼𝗆𝗈𝗅𝖽,𝖼𝗆𝗈𝗅𝖽,α,𝖺𝗄ℙ,𝗇𝗄,𝗋𝗂𝗏𝗄,
𝗀𝖽𝗇𝖾𝗐,𝗉𝗄𝖽𝗇𝖾𝗐,v𝗇𝖾𝗐,ψ𝗇𝖾𝗐,𝗋𝖼𝗆𝗇𝖾𝗐,𝗋𝖼𝗏,𝖼)

that have the following types and satisfy conditions A1 to A10 below.

  • •

    Primary input: 𝑟𝑡,𝗇𝖿𝗈𝗅𝖽,𝖼𝗆𝗑∈{0,…,p𝖯𝖺𝗅𝗅𝖺𝗌−1}, read as elements of 𝔽p𝖯𝖺𝗅𝗅𝖺𝗌; 𝖼𝗏𝗇𝖾𝗍,𝗋𝗄∈ℰ; and 𝖾𝗇𝖺𝖻𝗅𝖾𝖲𝗉𝖾𝗇𝖽𝗌,𝖾𝗇𝖺𝖻𝗅𝖾𝖮𝗎𝗍𝗉𝗎𝗍𝗌,𝖽𝗂𝗌𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌∈{0,1}.

  • •

    Auxiliary input: 𝗉𝖺𝗍𝗁=(s0,…,s31) with every st∈{0,…,p𝖯𝖺𝗅𝗅𝖺𝗌−1}; 𝗉𝗈𝗌∈{0,…,232−1}; 𝗀𝖽𝗈𝗅𝖽,𝗉𝗄𝖽𝗈𝗅𝖽,𝗀𝖽𝗇𝖾𝗐,𝗉𝗄𝖽𝗇𝖾𝗐,𝖺𝗄ℙ∈ℰ∗; v𝗈𝗅𝖽,v𝗇𝖾𝗐∈{0,…,264−1}; ρ𝗈𝗅𝖽,ψ𝗈𝗅𝖽,ψ𝗇𝖾𝗐,𝗇𝗄∈𝔽p𝖯𝖺𝗅𝗅𝖺𝗌; 𝖼𝗆𝗈𝗅𝖽∈ℰ; 𝗋𝖼𝗆𝗈𝗅𝖽,𝗋𝖼𝗆𝗇𝖾𝗐,𝗋𝗂𝗏𝗄,𝗋𝖼𝗏,α∈{0,…,2255−1}; and 𝖼=(c0,…,c63)∈{0,1}64.

Let ρ𝗇𝖾𝗐:=𝗇𝖿𝗈𝗅𝖽∈𝔽p𝖯𝖺𝗅𝗅𝖺𝗌, let δ:=𝖽𝗂𝗌𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌, and let

M𝗈𝗅𝖽 :=(𝗀𝖽𝗈𝗅𝖽)⋆⁢‖(𝗉𝗄𝖽𝗈𝗅𝖽)⋆‖⁢LE64⁢(v𝗈𝗅𝖽)⁢‖LE255⁢(ρ𝗈𝗅𝖽)‖⁢LE255⁢(ψ𝗈𝗅𝖽),
M𝗇𝖾𝗐 :=(𝗀𝖽𝗇𝖾𝗐)⋆⁢‖(𝗉𝗄𝖽𝗇𝖾𝗐)⋆‖⁢LE64⁢(v𝗇𝖾𝗐)⁢‖LE255⁢(ρ𝗇𝖾𝗐)‖⁢LE255⁢(ψ𝗇𝖾𝗐),

the 1086-bit messages of Definition 4.4, with the diversified bases witnessed. The conditions, all equations in 𝔽p𝖯𝖺𝗅𝗅𝖺𝗌 or in ℰ, are:

  1. A1.

    Old note commitment integrity: 𝖭𝗈𝗍𝖾𝖢𝗈𝗆𝗆𝗂𝗍𝗋𝖼𝗆𝗈𝗅𝖽⁢(M𝗈𝗅𝖽)∈{𝖼𝗆𝗈𝗅𝖽,⊥}.

  2. A2.

    New note commitment integrity: 𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ⊥⁢(𝖭𝗈𝗍𝖾𝖢𝗈𝗆𝗆𝗂𝗍𝗋𝖼𝗆𝗇𝖾𝗐⁢(M𝗇𝖾𝗐))∈{𝖼𝗆𝗑,⊥}.

  3. A3.

    Merkle path validity: v𝗈𝗅𝖽⋅(𝑟𝑜𝑜𝑡−𝑟𝑡)=0 or some evaluation of 𝖲𝗂𝗇𝗌𝖾𝗆𝗂𝗅𝗅𝖺𝖧𝖺𝗌𝗁 in the fold, the root included, returns ⊥. Here 𝑟𝑜𝑜𝑡:=a32 is the result of the fold (2) of Proposition 5.9 with a0:=𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ⁢(𝖼𝗆𝗈𝗅𝖽), siblings s0,…,s31 and the bits of 𝗉𝗈𝗌 as direction bits, in which the evaluation of 𝖬𝖾𝗋𝗄𝗅𝖾𝖢𝖱𝖧 at level t encodes its left argument x as LE255⁢(x~), where x~:=x+c2⁢t⁢p𝖯𝖺𝗅𝗅𝖺𝗌 if this integer is below 2255 and x~:=x otherwise, and its right argument likewise with c2⁢t+1.

  4. A4.

    Value commitment integrity:

    𝖼𝗏𝗇𝖾𝗍=𝖵𝖺𝗅𝗎𝖾𝖢𝗈𝗆𝗆𝗂𝗍𝗋𝖼𝗏𝖮𝗋𝖼𝗁𝖺𝗋𝖽⁢(v𝗈𝗅𝖽−v𝗇𝖾𝗐)=[v𝗈𝗅𝖽−v𝗇𝖾𝗐]⁢V𝖮𝗋𝖼𝗁𝖺𝗋𝖽+[𝗋𝖼𝗏]⁢R𝖮𝗋𝖼𝗁𝖺𝗋𝖽.
  5. A5.

    Nullifier integrity: 𝗇𝖿𝗈𝗅𝖽=𝖣𝖾𝗋𝗂𝗏𝖾𝖭𝗎𝗅𝗅𝗂𝖿𝗂𝖾𝗋𝗇𝗄⁢(ρ𝗈𝗅𝖽,ψ𝗈𝗅𝖽,𝖼𝗆𝗈𝗅𝖽), that is,

    𝗇𝖿𝗈𝗅𝖽=𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ⁢([(𝖯𝖱𝖥𝗇𝗄𝗇𝖿𝖮𝗋𝖼𝗁𝖺𝗋𝖽⁢(ρ𝗈𝗅𝖽)+ψ𝗈𝗅𝖽)modp𝖯𝖺𝗅𝗅𝖺𝗌]⁢K𝖮𝗋𝖼𝗁𝖺𝗋𝖽+𝖼𝗆𝗈𝗅𝖽).
  6. A6.

    Spend authority: 𝗋𝗄=𝖺𝗄ℙ+[α]⁢G𝖲𝗉𝖾𝗇𝖽𝖠𝗎𝗍𝗁.

  7. A7.

    Diversified address integrity: with 𝗂𝗏𝗄:=𝖢𝗈𝗆𝗆𝗂𝗍𝗋𝗂𝗏𝗄𝗂𝗏𝗄⁢(𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ⁢(𝖺𝗄ℙ),𝗇𝗄), either 𝗂𝗏𝗄=⊥ or 𝗉𝗄𝖽𝗈𝗅𝖽=[𝗂𝗏𝗄]⁢𝗀𝖽𝗈𝗅𝖽.

  8. A8.

    Enable spend flag: v𝗈𝗅𝖽⋅(1−𝖾𝗇𝖺𝖻𝗅𝖾𝖲𝗉𝖾𝗇𝖽𝗌)=0.

  9. A9.

    Enable output flag: v𝗇𝖾𝗐⋅(1−𝖾𝗇𝖺𝖻𝗅𝖾𝖮𝗎𝗍𝗉𝗎𝗍𝗌)=0.

  10. A10.

    Cross-address restriction: the four equations

    δ⋅(x⁢(𝗀𝖽𝗈𝗅𝖽)−x⁢(𝗀𝖽𝗇𝖾𝗐)) =0, δ⋅(y⁢(𝗀𝖽𝗈𝗅𝖽)−y⁢(𝗀𝖽𝗇𝖾𝗐)) =0,
    δ⋅(x⁢(𝗉𝗄𝖽𝗈𝗅𝖽)−x⁢(𝗉𝗄𝖽𝗇𝖾𝗐)) =0, δ⋅(y⁢(𝗉𝗄𝖽𝗈𝗅𝖽)−y⁢(𝗉𝗄𝖽𝗇𝖾𝗐)) =0.

(Protocol specification, §“Action Statement (Orchard)”, for the typed inputs and conditions A1 to A9; §“Action Descriptions” for the eighth primary input and the meaning of 𝖾𝗇𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌 that A10 formalises.)

The anchor 𝑟𝑡 is the bundle’s anchor (“Anchors”, §5.2). The rule 𝗋𝗄≠𝒪 of “Randomised validating keys” (§7.2) is checked outside the statement. The typing is part of the relation: the spend validating key 𝖺𝗄ℙ, both diversified bases and both transmission keys are non-identity points (protocol specification, §“Action Statement (Orchard)”, note on types). The trapdoors 𝗋𝖼𝗆𝗈𝗅𝖽, 𝗋𝖼𝗆𝗇𝖾𝗐, 𝗋𝗂𝗏𝗄 and 𝗋𝖼𝗏 and the randomiser α act only as scalars on points of order p𝖵𝖾𝗌𝗍𝖺, and the statement does not require them to be below p𝖵𝖾𝗌𝗍𝖺 (same note). The created note’s element ρ is not an auxiliary input; condition A2 fixes it. The relation is an NP-relation in the sense of the cited definition: its instances and witnesses have fixed length, and membership is decided by evaluating the typing and the ten conditions.

Points of the primary input enter the proof by their coordinates. The specification’s encoding note fixes the first seven primary inputs as the nine elements

𝑟𝑡,x⁢(𝖼𝗏𝗇𝖾𝗍),y⁢(𝖼𝗏𝗇𝖾𝗍),𝗇𝖿𝗈𝗅𝖽,x⁢(𝗋𝗄),y⁢(𝗋𝗄),𝖼𝗆𝗑,𝖾𝗇𝖺𝖻𝗅𝖾𝖲𝗉𝖾𝗇𝖽𝗌,𝖾𝗇𝖺𝖻𝗅𝖾𝖮𝗎𝗍𝗉𝗎𝗍𝗌

of 𝔽p𝖯𝖺𝗅𝗅𝖺𝗌, in this order (protocol specification, §“Action Statement (Orchard)”, note on the encoding of primary inputs); the convention x⁢(𝒪)=y⁢(𝒪)=0 encodes 𝖼𝗏𝗇𝖾𝗍=𝒪. The eighth input, 𝖽𝗂𝗌𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌, is one further element of 𝔽p𝖯𝖺𝗅𝗅𝖺𝗌 (§“Action Descriptions”); no normative text fixes its position, and the volume asserts none.

Conditions and the checks that complete them. Each condition is paired below with the requirement of “Requirements on a shielded payment” (§1.4) that it serves and, where one exists, with the check outside the proof that completes it; Table 5 collects the pairing and Figure 3 draws it.

Conditions A1 and A2 bind the consumed and the created note to the commitments 𝖼𝗆𝗈𝗅𝖽 and 𝖼𝗆𝗑 under 𝖭𝗈𝗍𝖾𝖢𝗈𝗆𝗆𝗂𝗍, the Sinsemilla commitment with domain z.cash:Orchard-NoteCommit (Definition 4.4), whose binding is Proposition 4.5; they serve R1. Condition A2 fixes the created note’s ρ to the nullifier that the same Action publishes for the note it consumes, the chaining rule of “Nullifier chaining” (§6.3). Its consequences for the uniqueness of ρ and for the Faerie Gold attack are proved in “Double-spend resistance” (Corollary 12.7).

Condition A3 serves R2. Since 0≤v𝗈𝗅𝖽<264<p𝖯𝖺𝗅𝗅𝖺𝗌 (§2.1), the value v𝗈𝗅𝖽 is zero in 𝔽p𝖯𝖺𝗅𝗅𝖺𝗌 only if it is the integer 0, and a field has no zero divisors. Hence, outside its ⊥ case and with canonical encodings (𝖼=0), A3 holds if and only if v𝗈𝗅𝖽=0 or 𝑟𝑜𝑜𝑡=𝑟𝑡, the specification’s form: either v𝗈𝗅𝖽=0, or (𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ⁢(𝖼𝗆𝗈𝗅𝖽),𝗉𝗈𝗌,𝗉𝖺𝗍𝗁) is a valid path to 𝑟𝑡 in the sense of Proposition 5.9, with the layer-tagged hash of “The Merkle hash and the tree” (§5.1) and the paths of depth 32 of “Authentication paths” (§5.3). A consumed note of value zero is therefore exempt from membership. The exemption lets an Action whose consumed side is a dummy note (“Actions, bundles, and dummy notes”, §4.4) create a real note without consuming a committed one. For v𝗈𝗅𝖽≠0 the condition is membership of 𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ⁢(𝖼𝗆𝗈𝗅𝖽) under 𝑟𝑡, up to the two relaxations below; Proposition 5.9 gives its soundness together with the anchor rule of “Anchors”, the check outside the proof that completes A3.

The two relaxations are the circuit’s: it does not check that the encoding of each layer’s input is canonical, and its path check may pass when a hash on the path, the root included, is 0, which occurs only when 𝖲𝗂𝗇𝗌𝖾𝗆𝗂𝗅𝗅𝖺𝖧𝖺𝗌𝗁 returns ⊥ (protocol specification, §“Merkle Path Validity”, notes on Orchard; §“Action Statement (Orchard)”, notes on the Merkle path validity check). Remark “⊥-weakened conditions” below treats the ⊥ case. The bits 𝖼, absent from the specification’s auxiliary input, record the encodings that the circuit witnesses. Since p𝖯𝖺𝗅𝗅𝖺𝗌 is odd and has bit length 255 (§2.1), 2⁢p𝖯𝖺𝗅𝗅𝖺𝗌>2255, so the integers below 2255 congruent to an argument x∈{0,…,p𝖯𝖺𝗅𝗅𝖺𝗌−1} are x and, when it is below 2255, x+p𝖯𝖺𝗅𝗅𝖺𝗌: the bits range over every encoding the circuit admits, and 𝖼=0 gives the canonical ones. Non-canonical encodings leave the extraction in the proof of Proposition 5.9(i) valid. At the least t∗≥1 at which the fold agrees with the genuine chain of that proof, the running values at level t∗−1 differ as elements of 𝔽p𝖯𝖺𝗅𝗅𝖺𝗌, so no representative of the one equals a representative of the other, and the two 520-bit messages hashed there remain distinct with a common prefix. Parts (ii) and (iii) of the proposition therefore hold for the fold of A3.

Condition A4 serves R4. It is Definition 8.2: the integer v𝗈𝗅𝖽−v𝗇𝖾𝗐∈{−264+1,…,264−1}, written as 𝑠𝑖𝑔𝑛⋅𝑚𝑎𝑔𝑛𝑖𝑡𝑢𝑑𝑒 with 𝑚𝑎𝑔𝑛𝑖𝑡𝑢𝑑𝑒∈{0,…,264−1} and 𝑠𝑖𝑔𝑛∈{−1,+1}, acts as a scalar modulo p𝖵𝖾𝗌𝗍𝖺. The specification requires the scalar multiplication to be correct on this whole signed range, which differs from the range of the balancing value (protocol specification, §“Action Statement (Orchard)”, note on the signed range). The binding signature of “The binding signature” (§8.3) is the check outside the proof that completes value conservation.

Condition A5 serves R3. It is Definition 6.3; the multiplier of K𝖮𝗋𝖼𝗁𝖺𝗋𝖽 is the integer in {0,…,p𝖯𝖺𝗅𝗅𝖺𝗌−1} obtained by reducing the sum modulo p𝖯𝖺𝗅𝗅𝖺𝗌. The nullifier-set rule of “Nullifier sets” (§6.2) is the check outside the proof that completes it.

Conditions A6 and A7 serve R5. Condition A6 is the re-randomisation of “Randomised validating keys” (§7.2), with G𝖲𝗉𝖾𝗇𝖽𝖠𝗎𝗍𝗁=𝖦𝗋𝗈𝗎𝗉𝖧𝖺𝗌𝗁⁢(z.cash:Orchard,G). Condition A7 recomputes the incoming viewing key as the 𝖢𝗈𝗆𝗆𝗂𝗍𝗂𝗏𝗄 instance of “Viewing keys” (§3.2), under the domain z.cash:Orchard-CommitIvk, from the field element 𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ⁢(𝖺𝗄ℙ), not from the point; it ties the witnessed key components 𝖺𝗄ℙ, 𝗇𝗄 and 𝗋𝗂𝗏𝗄 to the expanded receiver (𝗀𝖽𝗈𝗅𝖽,𝗉𝗄𝖽𝗈𝗅𝖽) of the consumed note. Outside its ⊥ case it forces 𝗂𝗏𝗄≠0, since 𝗉𝗄𝖽𝗈𝗅𝖽≠𝒪, and the receiver determines 𝗂𝗏𝗄, an integer below p𝖯𝖺𝗅𝗅𝖺𝗌<p𝖵𝖾𝗌𝗍𝖺, since 𝗀𝖽𝗈𝗅𝖽 is a non-identity point of a group of prime order p𝖵𝖾𝗌𝗍𝖺. The tie is the binding of 𝗂𝗏𝗄 to (𝖺𝗄,𝗇𝗄) (Proposition “Binding of 𝗂𝗏𝗄 to (𝖺𝗄,𝗇𝗄)”, §3.2): under Assumptions 2.22 and 2.8, an efficient algorithm outputs two witnesses that satisfy A7 outside its ⊥ case for one receiver, with distinct triples (𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ⁢(𝖺𝗄ℙ),𝗇𝗄,𝗋𝗂𝗏𝗄modp𝖵𝖾𝗌𝗍𝖺), only with negligible probability. The tie fixes the point 𝖺𝗄ℙ only up to sign (Lemma 2.4); Lemma 12.5 and Theorem 12.9 use it. The spend-authorisation signature under 𝗋𝗄, verified outside the proof (§7.2), completes both conditions.

Conditions A8 and A9 have the product form of A3. The values are below 264<p𝖯𝖺𝗅𝗅𝖺𝗌 and the flags are bits, so A8 holds if and only if v𝗈𝗅𝖽=0 or 𝖾𝗇𝖺𝖻𝗅𝖾𝖲𝗉𝖾𝗇𝖽𝗌=1, and A9 if and only if v𝗇𝖾𝗐=0 or 𝖾𝗇𝖺𝖻𝗅𝖾𝖮𝗎𝗍𝗉𝗎𝗍𝗌=1, the specification’s forms. They tie the hidden values to the public flags of “Bundle flags” (§9.1).

Condition A10 also has the product form of A3: each of its equations is a public field element times a difference of witnessed values. The four points lie in ℰ∗, where the affine coordinates determine the point. For δ=1, A10 therefore holds if and only if (𝗀𝖽𝗇𝖾𝗐,𝗉𝗄𝖽𝗇𝖾𝗐)=(𝗀𝖽𝗈𝗅𝖽,𝗉𝗄𝖽𝗈𝗅𝖽), equality of the expanded receivers as points and not only of their x-coordinates; for δ=0 it is vacuous. Condition A10 formalises the meaning of 𝖾𝗇𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌 stated in the protocol specification, §“Action Descriptions”. Every Orchard-pool Action has δ=1; an Ironwood-pool Action has δ=1−𝖾𝗇𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌, normally 0 (ZIP 229, Rationale, “enableCrossAddress polarity”). Conditions A8 to A10 serve no requirement of their own.

Remark 9.3 (Meaning of A10).

Condition A10 constrains each Action separately: when 𝖽𝗂𝗌𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌=1, the note an Action creates is at the expanded receiver of the note that same Action consumes. The consumed note may be a dummy of value 0, which A3 exempts from membership. Hence a bundle with 𝖽𝗂𝗌𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌=1 can still create a note at any expanded receiver (𝗀𝖽,𝗉𝗄𝖽) for which the transaction creator produces a dummy-spend Action in the same bundle. Such an Action has a witness: let its consumed note be a dummy of value 0 at (𝗀𝖽,𝗉𝗄𝖽) and its created note, of any value v, be at the same receiver, and let (𝖺𝗄ℙ,𝗇𝗄,𝗋𝗂𝗏𝗄) be the key components of that receiver. Condition A3 holds because v𝗈𝗅𝖽=0, A8 for either value of 𝖾𝗇𝖺𝖻𝗅𝖾𝖲𝗉𝖾𝗇𝖽𝗌, A10 with δ=1 because the two receivers agree, and A9 with 𝖾𝗇𝖺𝖻𝗅𝖾𝖮𝗎𝗍𝗉𝗎𝗍𝗌=1 when v≠0. Conditions A1, A2, A4 and A5 hold when 𝖼𝗆𝗈𝗅𝖽, 𝖼𝗆𝗑, 𝖼𝗏𝗇𝖾𝗍 and 𝗇𝖿𝗈𝗅𝖽 are computed from the witness by their definitions, and A6 and A7 hold for the key components of the receiver, whose address satisfies 𝗉𝗄𝖽=[𝗂𝗏𝗄]⁢𝗀𝖽 (§3.3). The Action also carries a valid spend-authorisation signature under its 𝗋𝗄. By Theorem 12.9, in “Authorisation of spends”, for an honestly generated address with 𝗎𝗌𝖾⁢_⁢𝗊𝗌𝗄=𝖿𝖺𝗅𝗌𝖾 this requires that address’s spend authorising key 𝖺𝗌𝗄, except with negligible probability. Consensus enforces no more than this per-Action restriction (ZIP 326, “Rationale for key-generation restrictions”).

Remark 9.4 (Effect on the Orchard pool).

For the Orchard pool, whose flag encoding forces 𝖽𝗂𝗌𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌=1, the pool-level effect is the one that ZIP 229, Abstract, states: outputs to the Orchard pool go to an address for which the transaction creator can authorise spends, which discourages economic activity between users within that pool. By the dummy-spend construction of the preceding remark, consensus does not prevent transfers between users within the Orchard pool (ZIP 326, “Rationale for key-generation restrictions”; ZIP 258, “Consensus rules from NU6.3 activation”, for the rule on Orchard-pool Actions).

Remark 9.5 (Status).

The expanded receiver (𝗀𝖽,𝗉𝗄𝖽), the meaning of 𝖾𝗇𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌 that A10 formalises, and the eight-input primary input with 𝖽𝗂𝗌𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌=1−𝖾𝗇𝖺𝖻𝗅𝖾𝖢𝗋𝗈𝗌𝗌𝖠𝖽𝖽𝗋𝖾𝗌𝗌 are specified in the protocol specification, §“Action Descriptions”; the flag encoding in ZIP 229; the Orchard-pool rule and the selection of the verifying key by upgrade in ZIP 258. The specification’s §“Action Statement (Orchard)” and the proof-validity rule of §“Action Descriptions” list the first seven primary inputs and conditions A1 to A9 only; Definition 9.2 follows §“Action Descriptions” for the rest. The specification names the conditions; the numbering A1 to A10 is this volume’s. ZIP 2006, to which the specification refers for the restriction, is a reserved number without content and is not cited for content.

Remark 9.6 (Sign of 𝖺𝗄ℙ).

The statement does not constrain the sign of the witnessed point 𝖺𝗄ℙ. Condition A7 reads only 𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ⁢(𝖺𝗄ℙ), which is the same for 𝖺𝗄ℙ and −𝖺𝗄ℙ (Lemma 2.4), so the even-y normalisation of key generation (“The spending key and the spend-side secrets”, §3.1) is not enforced by the proof (protocol specification, §“Action Statement (Orchard)”, note on the sign of the spend validating key). Theorem 12.9, in “Authorisation of spends”, treats both signs.

Remark 9.7 (⊥-weakened conditions).

Conditions A1, A2, A3 and A7 are the specification’s ⊥-weakened forms: each holds when the Sinsemilla instance it evaluates, 𝖭𝗈𝗍𝖾𝖢𝗈𝗆𝗆𝗂𝗍, the hash of 𝖬𝖾𝗋𝗄𝗅𝖾𝖢𝖱𝖧 or 𝖢𝗈𝗆𝗆𝗂𝗍𝗂𝗏𝗄, returns ⊥ on the witnessed input, for A3 on some input of the fold, because the circuit evaluates Sinsemilla with incomplete addition and cannot exclude its exceptional cases (protocol specification, §“Action Statement (Orchard)”, note on ⊥ outputs and note on the Merkle path validity check; §“Merkle Path Validity”, notes on Orchard). The relation is therefore the disjunction, not the plain conjunction. The weakening costs a negligible term. A witness that satisfies A1 or A2 only through ⊥ contains a 1086-bit message, M𝗈𝗅𝖽 or M𝗇𝖾𝗐, on which 𝖲𝗂𝗇𝗌𝖾𝗆𝗂𝗅𝗅𝖺𝖧𝖺𝗌𝗁𝖳𝗈𝖯𝗈𝗂𝗇𝗍⁢(z.cash:Orchard-NoteCommit-M,⋅) returns ⊥; one that satisfies A3 only through ⊥ contains a 520-bit message on which 𝖲𝗂𝗇𝗌𝖾𝗆𝗂𝗅𝗅𝖺𝖧𝖺𝗌𝗁⁢(z.cash:Orchard-MerkleCRH,⋅) returns ⊥; one that satisfies A7 only through ⊥ contains the 510-bit message LE255⁢(𝖤𝗑𝗍𝗋𝖺𝖼𝗍ℙ⁢(𝖺𝗄ℙ))∥LE255⁢(𝗇𝗄) with the same property for the domain z.cash:Orchard-CommitIvk-M (§2.4). An efficient algorithm that runs an adversary together with the extractor of Assumption 9.11 and outputs such a message succeeds with negligible probability by Proposition 2.24(iii), which turns the message into a non-trivial discrete-logarithm relation among the 𝖦𝗋𝗈𝗎𝗉𝖧𝖺𝗌𝗁 generators, under Assumptions 2.22 and 2.8. For the witnesses extracted from accepted proofs, A1, A2, A3 and A7 therefore hold in their unweakened forms, without the ⊥ case, except with negligible probability.

Remark 9.8 (What the statement does not check).
  1. (i)

    No condition involves 𝖺𝗌𝗄. The point 𝖺𝗄ℙ=[𝖺𝗌𝗄]⁢G𝖲𝗉𝖾𝗇𝖽𝖠𝗎𝗍𝗁 is computed at key generation, outside the statement, and 𝖺𝗌𝗄 is not a witness. Conditions A6 and A7 relate 𝗋𝗄 and the address to the witnessed 𝖺𝗄ℙ, and the spend-authorisation signature under 𝗋𝗄 supplies knowledge of the signing key; Theorem 12.9 combines the two.

  2. (ii)

    The trapdoors 𝗋𝖼𝗆𝗈𝗅𝖽 and 𝗋𝖼𝗆𝗇𝖾𝗐 and the elements ψ𝗈𝗅𝖽 and ψ𝗇𝖾𝗐 are free witnesses: no condition checks that 𝗋𝖼𝗆 and ψ were derived from 𝗋𝗌𝖾𝖾𝖽 as in “The note seed” (§4.3). The sender computes that derivation; the recipient checks it, in “Trial decryption and note acceptance” (§10.4), and consensus checks it only for coinbase outputs (“Chain state and pool rules”, §11.4). Hence, in the deployed protocol, the hashed 𝗋𝖼𝗆 adds no binding: against an adversary able to compute discrete logarithms among the bases of 𝖭𝗈𝗍𝖾𝖢𝗈𝗆𝗆𝗂𝗍, 𝖭𝗈𝗍𝖾𝖢𝗈𝗆𝗆𝗂𝗍 is not binding, and such an adversary can open one commitment to two distinct notes (ZIP 2005, Rationale, “Attacks against binding of note commitments”). The volume claims nothing further in that setting.

  3. (iii)

    The statement reads none of the Action’s note-encryption fields, which “Note encryption” (§10) constructs; the specification records that the absence of a check on the ephemeral key is intentional (§“Action Statement (Orchard)”, note).

Remark 9.9 (Key source).

The statement takes the key components (𝖺𝗄ℙ,𝗇𝗄,𝗋𝗂𝗏𝗄) as witnesses and checks them only through A5, A6 and A7. It therefore applies equally to key components whose 𝖺𝗄ℙ and 𝗋𝗂𝗏𝗄 come from the alternative source of ZIP 2005 (“Changes to the Protocol Specification”, §4.2.3 “Orchard Key Components”) cited in “The spending key and the spend-side secrets” (§3.1). The key-derived results of the volume, namely Proposition 3.18, Assumption 3.13, Propositions 3.17, 6.10 and 10.6, and the hypotheses on honest key generation of Theorems 12.9 and 12.12, remain restricted to keys with 𝗎𝗌𝖾⁢_⁢𝗊𝗌𝗄=𝖿𝖺𝗅𝗌𝖾.

Table 5 is the requirement map of the volume. For each requirement of “Requirements on a shielded payment” (§1.4) it lists the soundness content, with the conditions, the checks outside the proof and the results that discharge it, and the hiding content, with the results that discharge it.

Requirement Soundness Hiding
R1, hidden representation of value A1 and A2 bind the consumed and the created note to their commitments (Proposition 4.5) commitment hiding (Propositions 4.5 and 4.8); value-commitment hiding (§8.1); indistinguishability of real and dummy Actions (Theorem 12.12)
R2, membership without identification A3 with the anchor rule of “Anchors” (Proposition 5.9) zero knowledge of the proof (Assumption 9.14) with a locally computed authentication path (Lemma 5.15), composed in Theorem 12.12
R3, no second consumption A5 with the nullifier-set rule (Theorem 12.6) nullifier unlinkability (Proposition 6.10)
R4, conservation A4 with the binding signature (Theorem 12.4) value-commitment hiding (Theorem 12.12)
R5, spend authority A6 and A7 with the spend-authorisation signature (Theorem 12.9) and bundle binding (Proposition 11.10) none: R5 has a soundness part only
Flags A8 to A10 serve no requirement of their own: they tie the hidden values and receivers to the public flags of §9.1 —
Table 5: The requirement map: for each requirement of §1.4, the conditions of Definition 9.2, the checks outside the proof and the results that discharge its soundness part, and the results that discharge its hiding part. It is the only requirement map of the volume.
Refer to caption
Figure 3: The Action statement of Definition 9.2. The auxiliary input is on the left, coloured by group as in the legend; the primary input is on the right; conditions A1 to A10 are in the centre, ordered by the side of the Action they constrain rather than by number. Each condition has an edge to every variable it reads; the edge from 𝗇𝖿𝗈𝗅𝖽 to A2 carries ρ𝗇𝖾𝗐:=𝗇𝖿𝗈𝗅𝖽. Each condition is tagged with the requirement of §1.4 that it serves, or with “flags” for A8 to A10, and, where one exists, with the check outside the proof that completes it: the anchor rule for A3, the nullifier-set rule for A5, the binding signature for A4, and the spend-authorisation signature for A6 and A7.

9.3 The Action circuit and the Halo 2 proof

The Action statement of Definition 9.2 is a relation and prescribes no computation. The post-NU6.3 Action circuit is one fixed PLONKish circuit (Halo 2 Guide, §“PLONKish arithmetisation”) whose constraints are designed to encode the typing and conditions A1 to A10; that every satisfying assignment yields a witness of ℛ𝖠𝖼𝗍𝗂𝗈𝗇 is part of Assumption 9.11 below. The same circuit serves every Action. Its instance is the encoding of the eight primary inputs of Definition 9.2, bound to the proof as in the Halo 2 Guide, §“Instance columns and binding the public statement”; this instance is the only Orchard-specific part of the proof system constructed in this volume. Proofs are Halo 2 proofs (Halo 2 Guide, §“The Halo 2 proof system” and §“The complete Halo 2 protocol”; protocol specification, §“Zero-Knowledge Proving System”; ZIP 229, Abstract): a PLONKish polynomial interactive oracle proof compiled with the inner-product polynomial commitment and made non-interactive by the Fiat–Shamir transform, with no trusted setup.

The circuit’s native field is 𝔽p𝖯𝖺𝗅𝗅𝖺𝗌, the base field of the Pallas group, so the Pallas point operations of A1 to A10 are arithmetic in the native field. The proof’s polynomial commitments lie in the Vesta group 𝔾𝖵𝖾𝗌𝗍𝖺, the group of points of the curve y2=x3+5 over 𝔽p𝖵𝖾𝗌𝗍𝖺, which has prime order p𝖯𝖺𝗅𝗅𝖺𝗌 (§2.1; Math Guide, §“Base fields, scalar fields, and the Pasta cycle”); the committed polynomials therefore have coefficients in 𝔽p𝖯𝖺𝗅𝗅𝖺𝗌. The Pallas group carries the protocol’s keys, commitments, signatures and note encryption; the Vesta group carries only the proof’s commitments.

The circuit has 211 rows and a constraint-degree bound of 9 across its gates and its permutation and lookup identities (Halo 2 Guide, §“From statement to circuit: arithmetisation in practice”). Both are cited constants; in this volume they enter only the Schwartz–Zippel term of the first supporting analysis below.

Every Action of either pool, whatever it consumes or creates, dummy sides included, is an instance of the same relation and circuit. The proofs of a bundle’s Actions are aggregated into one proof, encoded once per bundle, which the verifier checks against the primary inputs of all the bundle’s Actions and the verifying key; each Action carries its own spend-authorisation signature (protocol specification, §“Action Transfers and their Descriptions” and §“Action Descriptions”, note on proof aggregation; ZIP 229, “Transaction Format”). The verification procedure is stated in “Verification of a transaction” (§11.6).

Both pools use the post-NU6.3 circuit and its proving and verifying keys; the pools are distinguished by their note commitment trees, nullifier sets, value pool balances and component position in the transaction, not by circuits (ZIP 229, Abstract, and Rationale, “Reuse of the Orchard protocol with minimal changes”). Consensus selects the Action verifying key by network upgrade (protocol specification, §“Action Descriptions”, consensus rules). The key in force for every Action, in either pool and in version 5 and version 6 transactions alike, is the post-NU6.3 verifying key, named by upgrade and not by pool (ZIP 258, “Consensus rules from NU6.3 activation”).

Assumption 9.10 (Discrete logarithms on Vesta).

For every classical probabilistic polynomial-time algorithm, given a generator G of 𝔾𝖵𝖾𝗌𝗍𝖺 and [s]⁢G for s uniform in 𝔽p𝖯𝖺𝗅𝗅𝖺𝗌, the probability of outputting s is negligible (Crypto Guide, §“Standing assumptions”, Remark “Standing assumptions for the sequel”, item 1, for the Vesta curve). Concretely, the best known classical attack costs about 2126 group operations (Crypto Guide, §“Instantiation on elliptic curves; the Pasta curves”, Proposition “The Pasta curves against the criteria”); the level is cited, not recomputed. The volume uses this assumption only in the extraction analysis of the inner-product commitment that supports Assumption 9.11 (the second supporting analysis below).

Assumption 9.11 (Knowledge soundness of the Action proof).

Let the hash of the Fiat–Shamir transform of the proof system be modelled as a random oracle. For every efficient adversary 𝒜 that outputs primary inputs 𝗉𝗎𝖻1,…,𝗉𝗎𝖻n and an aggregate proof π, there is an efficient extractor ℰ, with access to 𝒜 and to its random-oracle queries, that outputs auxiliary inputs 𝖺𝗎𝗑1,…,𝖺𝗎𝗑n such that the probability of the event

π is accepted for (𝗉𝗎𝖻1,…,𝗉𝗎𝖻n) under the post-NU6.3 verifying key
and ⁢(𝗉𝗎𝖻i,𝖺𝗎𝗑i)∉ℛ𝖠𝖼𝗍𝗂𝗈𝗇⁢ for some ⁢i

is negligible. This is the knowledge-soundness clause of the Crypto Guide’s Definition “SNARK” (§“SNARKs: succinct non-interactive arguments of knowledge”) for the relation ℛ𝖠𝖼𝗍𝗂𝗈𝗇 of Definition 9.2. It includes that every satisfying assignment of the post-NU6.3 circuit yields a witness of ℛ𝖠𝖼𝗍𝗂𝗈𝗇, for which the specification requires canonical decompositions of the scalar of A5 and of the scalar 𝗂𝗏𝗄 in [𝗂𝗏𝗄]⁢𝗀𝖽𝗈𝗅𝖽 (protocol specification, §“Action Statement (Orchard)”, note on canonical scalar decompositions).

Assumption 9.11 is an assumption, not a proved result. Its status is designed but unspecified: bounds exist for the analysed protocol, and no theorem carries them to the deployed Fiat–Shamir-compiled protocol (Halo 2 Guide, §“The algebraic group model”). The volume assumes the property, proves no bound and asserts no loss factor. The two supporting analyses that follow are cited, not re-proved, and not combined into a bound.

Remark 9.12 (Supporting analysis (i): a Schwartz–Zippel term).

A non-zero gap polynomial D over 𝔽p𝖯𝖺𝗅𝗅𝖺𝗌, fixed by the prover’s commitments before the challenge is drawn, vanishes at a uniform challenge with probability at most deg⁡D/p𝖯𝖺𝗅𝗅𝖺𝗌 (Halo 2 Guide, §“Why checking one random point is a proof”). At the Orchard parameters, 211 rows and constraint-degree bound 9, the constraint expression has degree below 9⋅211, and so does the committed quotient, of 8 chunks of degree below 211, times the vanishing polynomial of degree 211 (Halo 2 Guide, §“The complete Halo 2 protocol”, Phase 4). Hence deg⁡D<9⋅211=18432, and the term is below 18432/p𝖯𝖺𝗅𝗅𝖺𝗌<2−239. The term bounds one check at one challenge and is not a security level of the proof: the complete protocol has further randomised checks, and under the Fiat–Shamir transform an adversary may retry challenges, one hash query per retry (Halo 2 Guide, §“Removing the verifier: the Fiat–Shamir transform”).

Remark 9.13 (Supporting analysis (ii): extraction for the inner-product commitment).

The inner-product polynomial commitment, whose commitments lie in 𝔾𝖵𝖾𝗌𝗍𝖺, has an interactive opening protocol that is knowledge-sound under the discrete-logarithm assumption in that group, Assumption 9.10, with an expected-polynomial-time tree extractor (Halo 2 Guide, §“The inner-product polynomial commitment”, Theorem “Knowledge soundness of the opening protocol”). The Fiat–Shamir-compiled argument inherits the interactive extraction bound only up to a loss in the adversary’s random-oracle query count (§“From the interactive extractor to the non-interactive argument”), and the tighter analyses in the algebraic group model are proved for the analysed protocol, not for the deployed transcript (§“The algebraic group model”). No loss factor is asserted.

Assumption 9.14 (Zero knowledge of the Action proof).

Let the hash of the Fiat–Shamir transform be modelled as a programmable random oracle. There is an efficient simulator that, given only the primary inputs 𝗉𝗎𝖻1,…,𝗉𝗎𝖻n of a bundle and programming the random oracle, outputs an aggregate proof whose distribution is statistically indistinguishable from that of an honestly generated proof for any 𝖺𝗎𝗑1,…,𝖺𝗎𝗑n with (𝗉𝗎𝖻i,𝖺𝗎𝗑i)∈ℛ𝖠𝖼𝗍𝗂𝗈𝗇 for every i: every distinguisher that makes polynomially many random-oracle queries, whatever its running time, has negligible advantage. This is zero knowledge of statistical grade in the non-interactive, random-oracle form of the Crypto Guide’s Definition “Zero knowledge” (§“The simulation paradigm and zero knowledge”).

Assumption 9.14 is an assumption, not a proved result. The Halo 2 Guide, §“Zero knowledge: hiding the witness in Halo 2”, records honest-verifier zero knowledge of the interactive protocol and zero knowledge of its Fiat–Shamir compilation in the programmable random-oracle model, subject to its composition and Fiat–Shamir hypotheses, without reproving it. Assumptions 9.11 and 9.14 are the two assumptions on the Action proof that “Security” (§12) composes with the propositions of the preceding sections.