Skip to content

Ironwood ZIPs and protocol spec followup#1336

Draft
daira wants to merge 7 commits into
zcash:mainfrom
daira:ironwood-zips-and-spec-followup
Draft

Ironwood ZIPs and protocol spec followup#1336
daira wants to merge 7 commits into
zcash:mainfrom
daira:ironwood-zips-and-spec-followup

Conversation

@daira

@daira daira commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

Follow-up to #1319, adding the NU6.3 / Ironwood transaction-format and consensus-rule changes to the protocol specification and the corresponding ZIPs. Opening as a draft for review; the commits are factored so each is a self-contained, reviewable change.

Protocol specification (protocol.tex)

  • Parameterize the Orchard/Ironwood transaction-field macros — replace the flat per-pool field macros (\nActionsOrchard, \flagsOrchard, \enableSpendsOrchard, \sizeProofsOrchard, \proofsOrchard, \vActionsOrchard, and the Ironwood equivalents) with pool-parameterized \nActionsField{…}, \flagsField{…}, etc.; add \OrchardLike; give \ProofAction a pool argument; and rename SpendDescriptionV5/OutputDescriptionV5 to …V5Onward. Mechanical only — no change to the rendered consensus rules.
  • NU6.3 transaction-version, sighash, and pool prose — the version-for-pool macros and the prose using them (Orchard-pool Action transfers require a version 5 or 6 transaction, Ironwood-pool ones a version 6); the per-transaction-version sighash-algorithm rules and the ZIP 229 citations for the version 6 sighash and transaction ID; and the note that zcashd will not support NU6.3.
  • Action Description — enableCrossAddress flag and NU6.3 verifying key — the enableCrossAddress flag in the Action Description, the disableCrossAddress = 1 − enableCrossAddress primary input, the OrchardCircuitVersion::PostNU6_3 verifying key, and the pool-superscripted Action proof. (The cross-address restriction itself is specified in ZIP 2006.)
  • Version 6 transaction format with the Ironwood bundle — the Ironwood bundle in the v6 format table (nActionsIronwoodbindingSigIronwood) with its field-presence footnote, the version 6 header and transaction ID (defined in ZIP 229), and the added-fields list.
  • § 7.1.2 consensus rules for version 6 and the Ironwood pool — version group ID 0xD884B698; nActionsIronwood < 2^16; the split of the at-least-one-input / at-least-one-output conditions into a version-5 form and a version-6-onward form that accounts for the Ironwood flags; the Ironwood enable-flag and binding-signature rules; the coinbase rules (no Orchard-pool Actions, enableSpendsIronwood = 0) and the reserved-bit rules; and the proofsIronwood canonical-length rule.

ZIPs

  • ZIP 229, ZIP 213 — rewrite ZIP 229's Consensus Rules section as full-detail before/after changes to protocol § 7.1.2, and cross-reference from ZIP 213 that a coinbase transaction must not contain any Orchard-pool component.

Other

  • Regenerate README.rst.

Scope

The ZIP 2005 security-analysis refinements were merged separately (#1338) and do not affect the Specification-section changes here.

@daira
daira force-pushed the ironwood-zips-and-spec-followup branch from 01614c5 to e4b788a Compare July 21, 2026 20:48
daira and others added 6 commits July 22, 2026 20:17
Replace the flat per-pool field macros (`\nActionsOrchard`, `\flagsOrchard`,
`\enableSpendsOrchard`, `\sizeProofsOrchard`, `\proofsOrchard`, `\vActionsOrchard`,
and the Ironwood equivalents) with pool-parameterized `\nActionsField{...}`,
`\flagsField{...}`, `\enableSpendsField{...}`, etc.; add `\OrchardLike`; give
`\ProofAction` a pool argument; and rename `SpendDescriptionV5`/`OutputDescriptionV5`
to `...V5Onward`. Mechanical only -- no change to the rendered consensus rules --
including the corresponding uses in the spend/output/action encoding sections and
the history entries, plus the `\SaplingLikePoolIds` conditional fix.

Co-authored-by: Claude Opus 4.8/Fable 5 <noreply@anthropic.com>
Signed-off-by: Daira-Emma Hopwood <daira@jacaranda.org>
Add the version-for-pool macros (`\versionsForOrchardPool`, `\versionsForIronwoodPool`,
`\versionsForSaplingPool`, and friends) and the prose using them: state that Orchard-pool
Action transfers require a version 5 or 6 transaction and Ironwood-pool ones a version 6;
add the per-transaction-version sighash-algorithm consensus rules and the ZIP 229 citations
for the version 6 sighash and transaction ID; note that zcashd will not support NU6.3 (so
Zebra is the only long-term-supported validator from activation); and randomize action order
per pool.

Co-authored-by: Claude Opus 4.8/Fable 5 <noreply@anthropic.com>
Signed-off-by: Daira-Emma Hopwood <daira@jacaranda.org>
…ifying key

Add `\expandedReceiver` and the `\enableCrossAddress`/`\disableCrossAddress` macros;
introduce the `enableCrossAddress` flag in the Action Description, the
`disableCrossAddress = 1 - enableCrossAddress` primary input, and the
`OrchardCircuitVersion::PostNU6_3` verifying key; and superscript the Action proof by
pool. The cross-address restriction itself is specified in ZIP 2006.

Co-authored-by: Claude Opus 4.8/Fable 5 <noreply@anthropic.com>
Signed-off-by: Daira-Emma Hopwood <daira@jacaranda.org>
Extend the transaction format section for version 6: add the Ironwood bundle to the
format table (nActionsIronwood, vActionsIronwood, flagsIronwood, valueBalanceIronwood,
anchorIronwood, sizeProofsIronwood, proofsIronwood, vSpendAuthSigsIronwood, bindingSigIronwood)
with its field-presence footnote; add the version 6 format header and transaction ID
(defined in ZIP 229); and record the added Ironwood fields in the "changes relative to
Bitcoin" list. The Sapling spend/output description types are the shared V5Onward encodings.

Co-authored-by: Claude Opus 4.8/Fable 5 <noreply@anthropic.com>
Signed-off-by: Daira-Emma Hopwood <daira@jacaranda.org>
…d pool

Add the version 6 / Ironwood-pool transaction consensus rules: the version group ID
0xD884B698; nActionsIronwood < 2^16; the split of the at-least-one-input and
at-least-one-output conditions into a version-5 form and a version-6-onward form that
accounts for the Ironwood flags; the Ironwood enable-flag rule; the coinbase rules
(no Orchard-pool Actions, enableSpendsIronwood = 0) and the flagsIronwood reserved-bit
rule; the flags rationale; and the proofsIronwood canonical-length rule.

Co-authored-by: Claude Opus 4.8/Fable 5 <noreply@anthropic.com>
Signed-off-by: Daira-Emma Hopwood <daira@jacaranda.org>
Rewrite ZIP 229's Consensus Rules section as full-detail before/after changes to
protocol section 7.1.2 (transaction version, version group ID, action counts, the
enable-flag conditions, the Ironwood binding-signature rule, and the coinbase and
reserved-bit rules), matching the specification changes; and cross-reference from ZIP
213 that a coinbase transaction must not contain any Orchard-pool component.

Co-authored-by: Claude Opus 4.8/Fable 5 <noreply@anthropic.com>
Signed-off-by: Daira-Emma Hopwood <daira@jacaranda.org>
@daira
daira force-pushed the ironwood-zips-and-spec-followup branch from e4b788a to eab59af Compare July 22, 2026 19:54
Signed-off-by: Daira-Emma Hopwood <daira@jacaranda.org>
Comment thread protocol/protocol.tex
same for all \actionTransfers in a \transaction, and are encoded once in the \transaction body
(\crossref{txnencoding}), not the $\type{ActionDescription}$ structure.
$\Proof{}$ is aggregated with other Action proofs and encoded in the $\proofsOrchard$ field.}
\pnote{The $\rt{\OrchardLikePoolId}$, $\enableSpendsField{\OrchardLike}$, and $\enableOutputsField{\OrchardLike}$

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

and enableCrossAddressOrchard/Ironwood for v6

Comment thread protocol/protocol.tex
& \Longunderstack{$820 \mult$ \\$\!\nActionsField{Ironwood}\!$} & $\vActionsField{Ironwood}$ & \type{ActionDescription} \type{[$\nActionsField{Ironwood}$]} &
A sequence of \actionDescriptions{}, encoded per \crossref{actionencodingandconsensus}.\! \\ \hline

$\mathsection$ & $1$ & $\flagsField{Ironwood}$ & \type{byte} &

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wrong marker.

Comment thread zips/zip-0229.md
Comment on lines +327 to +330
The `enableCrossAddress` bit is specified in [^zip-2006]. Note that the reserved-bit rules above
leave bit 2 of `flagsOrchard` reserved as 0 (bits 2..7), while bit 2 of `flagsIronwood` is the
`enableCrossAddress` bit (reserved bits 3..7); the *Orchard pool*'s cross-address restriction is
enforced for its Actions from NU6.3 onward as specified in [^zip-2006].

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is inconsistent with the TODO resolution: bit 2 is never reserved after NU6.3.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant