From 6627e0c4201ec313ed12bcf2b50e2f4e059aec06 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Wed, 17 Dec 2025 14:19:55 -0700 Subject: [PATCH 01/50] Add a ZIP template. It's inconvenient to have to manually delete big sections of the guide when starting a new ZIP. This template is intended to be a minimal skeleton that's easy to copy/paste for experienced ZIP authors. --- zips/zip-template.md | 80 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 zips/zip-template.md diff --git a/zips/zip-template.md b/zips/zip-template.md new file mode 100644 index 000000000..c3f8867a7 --- /dev/null +++ b/zips/zip-template.md @@ -0,0 +1,80 @@ + ZIP: Unassigned {numbers are assigned by ZIP editors} + Title: {Something Short and To the Point} + Owners: First Owner + ... + Credits: First Credited + ... + Status: Draft + Category: {Consensus | Standards Track | Network | RPC | Wallet | Informational | Process} + Created: yyyy-mm-dd + License: {usually MIT} + Pull-Request: + + +# Terminology + +{Edit this to reflect the key words that are actually used.} +The key words "MUST", "REQUIRED", "MUST NOT", "SHOULD", and "MAY" in this +document are to be interpreted as described in BCP 14 [^BCP14] when, and +only when, they appear in all capitals. + +The terms "Mainnet" and "Testnet" in this document are to be interpreted as +defined in the Zcash protocol specification [^protocol-networks]. + +The term "full validator" in this document is to be interpreted as defined in +the Zcash protocol specification [^protocol-blockchain]. + +The terms below are to be interpreted as follows: + +{Term to be defined} + +: {Definition.} + +{Another term} + +: {Definition.} + + +# Abstract + + +# Motivation + + +# Privacy Implications + + +# Requirements + + +# Non-requirements + + +# Specification + +
+ +{details heading} + + +{ details body } +
+
+ +# Rationale + + +# Deployment + + +# Reference implementation + + +# Open issues + + +# References + +[^BCP14]: [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"](https://www.rfc-editor.org/info/bcp14) + +[^protocol]: [Zcash Protocol Specification, Version 2025.6.2 [NU6.1] or later](protocol/protocol.pdf) From efd3a90db325a2ed6f3b879d72477c8488074767 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Sun, 11 Jan 2026 09:45:45 -0700 Subject: [PATCH 02/50] Apply suggestions from code review Co-authored-by: Daira-Emma Hopwood --- zips/zip-template.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/zips/zip-template.md b/zips/zip-template.md index c3f8867a7..487259eb2 100644 --- a/zips/zip-template.md +++ b/zips/zip-template.md @@ -18,11 +18,11 @@ The key words "MUST", "REQUIRED", "MUST NOT", "SHOULD", and "MAY" in this document are to be interpreted as described in BCP 14 [^BCP14] when, and only when, they appear in all capitals. -The terms "Mainnet" and "Testnet" in this document are to be interpreted as -defined in the Zcash protocol specification [^protocol-networks]. +The character § is used when referring to sections of the Zcash Protocol Specification. [^protocol] -The term "full validator" in this document is to be interpreted as defined in -the Zcash protocol specification [^protocol-blockchain]. +The terms "Mainnet" and "Testnet" are to be interpreted as described in § 3.12 ‘Mainnet and Testnet’. [^protocol-networks] + +The term "full validator" in this document is to be interpreted as defined in § 3.3 ‘The Block Chain’. [^protocol-blockchain]. The terms below are to be interpreted as follows: @@ -77,4 +77,8 @@ The terms below are to be interpreted as follows: [^BCP14]: [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"](https://www.rfc-editor.org/info/bcp14) -[^protocol]: [Zcash Protocol Specification, Version 2025.6.2 [NU6.1] or later](protocol/protocol.pdf) +[^protocol]: [Zcash Protocol Specification, Version 2025.6.3 [NU6.1] or later](protocol/protocol.pdf) + +[^protocol-blockchain]: [Zcash Protocol Specification, Version 2025.6.3 [NU6.1]. Section 3.3: The Block Chain](protocol/protocol.pdf#blockchain) + +[^protocol]: [Zcash Protocol Specification, Version 2025.6.3 [NU6.1]. Section 3.12: Mainnet and Testnet](protocol/protocol.pdf#networks) From 43e638e846742bf13d8f796f059f66e5fb4a6130 Mon Sep 17 00:00:00 2001 From: zancas Date: Tue, 20 Jan 2026 11:14:38 -0800 Subject: [PATCH 03/50] incorrect plural --- zips/zip-0307.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zips/zip-0307.rst b/zips/zip-0307.rst index eb91ba0a9..66314300d 100644 --- a/zips/zip-0307.rst +++ b/zips/zip-0307.rst @@ -79,7 +79,7 @@ Compact Stream Format A key observation in this protocol is that the current zcashd encrypted field is several hundred bytes long, due to the inclusion of a transaction “memo”. The need to download -this entire field imposes a substantial bandwidth cost on each light wallets, which may be +this entire field imposes a substantial bandwidth cost on each light wallet, which may be a limited mobile device on a restricted-bandwidth plan. While more efficient techniques can be developed in the future, for the moment we propose ignoring the memo field during payment detection. Futhermore, we can also ignore any information that is not directly From 274d2808ad06d57f566bbdb07175fc20c336c5c2 Mon Sep 17 00:00:00 2001 From: Vivek Arte <46618816+vivek-arte@users.noreply.github.com> Date: Thu, 22 Jan 2026 12:10:00 +0530 Subject: [PATCH 04/50] adding the description for flagsOrchard back, it got mistakenly removed --- zips/zip-0230.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/zips/zip-0230.rst b/zips/zip-0230.rst index 42898b064..d2c21b544 100644 --- a/zips/zip-0230.rst +++ b/zips/zip-0230.rst @@ -274,8 +274,11 @@ The OrchardZSA Action Group Description is encoded in a transaction as an instan +-----------------------------+------------------------------+------------------------------------------------+---------------------------------------------------------------------+ | 372 × ``nActionsOrchard`` |``vActionsOrchard`` |``OrchardZSAAction[nActionsOrchard]`` |A sequence of OrchardZSA Action descriptions in the Action Group. | +-----------------------------+------------------------------+------------------------------------------------+---------------------------------------------------------------------+ -| 1 |``flagsOrchard`` |``byte`` |As defined in §7.1 ‘Transaction Encoding and Consensus’ | -| | | |[#protocol-txnencoding]_. | +|``1`` |``flagsOrchard`` |``byte`` |An 8-bit value representing a set of flags. Ordered from LSB to MSB: | +| | | | * ``enableSpendsOrchard`` | +| | | | * ``enableOutputsOrchard`` | +| | | | * ``enableZSAs`` | +| | | | * The remaining bits are set to :math:`0\!`. | +-----------------------------+------------------------------+------------------------------------------------+---------------------------------------------------------------------+ | 32 |``anchorOrchard`` |``byte[32]`` |As defined in §7.1 ‘Transaction Encoding and Consensus’ | | | | |[#protocol-txnencoding]_. | From e830f37e678761fc28f7cdc583ed5d4a5d24c707 Mon Sep 17 00:00:00 2001 From: zancas Date: Thu, 22 Jan 2026 20:39:59 -0800 Subject: [PATCH 05/50] participanting --> participating --- zips/zip-0307.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zips/zip-0307.rst b/zips/zip-0307.rst index 66314300d..75913a9f2 100644 --- a/zips/zip-0307.rst +++ b/zips/zip-0307.rst @@ -34,7 +34,7 @@ Motivation ========== Currently a client that wishes to send or receive shielded payments must be a full node -participanting in the Zcash network. This requires an amount of available bandwidth, +participating in the Zcash network. This requires an amount of available bandwidth, space, and processing power that may be unsuitable for some classes of user. This light client protocol addresses that need, and is appropriate for low-power, bandwidth-conscious, or otherwise limited machines (such as mobile phones). From 6fe2a3a7de467379500d920987473b46cee15244 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Jan 2026 16:22:38 +0000 Subject: [PATCH 06/50] Bump actions/checkout from 5.0.1 to 6.0.2 Bumps [actions/checkout](https://github.com/actions/checkout) from 5.0.1 to 6.0.2. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5.0.1...v6.0.2) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 6.0.2 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/publish.yaml | 2 +- .github/workflows/render.yml | 4 ++-- .github/workflows/updatecheck.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 240ba0c25..8ca31dacb 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -26,7 +26,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5.0.1 + uses: actions/checkout@v6.0.2 with: ref: publish fetch-depth: 0 diff --git a/.github/workflows/render.yml b/.github/workflows/render.yml index 90e4b8e34..aef4f8b97 100644 --- a/.github/workflows/render.yml +++ b/.github/workflows/render.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v5.0.1 + uses: actions/checkout@v6.0.2 with: fetch-depth: 3 @@ -28,7 +28,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v5.0.1 + uses: actions/checkout@v6.0.2 with: fetch-depth: 100 diff --git a/.github/workflows/updatecheck.yml b/.github/workflows/updatecheck.yml index 6ad0c9df2..3acc03fc4 100644 --- a/.github/workflows/updatecheck.yml +++ b/.github/workflows/updatecheck.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v5.0.1 + uses: actions/checkout@v6.0.2 - name: Check dependencies shell: bash From 0c71bde61fcd53482b5078c6d6f2dc979a48bb83 Mon Sep 17 00:00:00 2001 From: Vivek Arte <46618816+vivek-arte@users.noreply.github.com> Date: Tue, 3 Feb 2026 16:30:29 +0530 Subject: [PATCH 07/50] defining the MAX_BURN_VALUE constant --- zips/zip-0226.rst | 9 ++++++++- zips/zip-0230.rst | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/zips/zip-0226.rst b/zips/zip-0226.rst index b2d3bf953..500567e3a 100644 --- a/zips/zip-0226.rst +++ b/zips/zip-0226.rst @@ -207,6 +207,7 @@ Note that the OrchardZSA Protocol does not allow for the burning of the Native A In the `OrchardZSA Transaction Structure`_, there is now an $\mathsf{assetBurn}$ set. For every Custom Asset (represented by its $\mathsf{AssetBase}$) that is burnt in the transaction, the sender adds to $\mathsf{assetBurn}$ the tuple $(\mathsf{AssetBase}, \mathsf{v})$, where $\mathsf{v}$ is the amount of the Custom Asset the sender wants to burn. +We define a constant $\mathsf{MAX\_BURN\_VALUE} := 2^{63} - 1$, which denotes the maximum amount of a given Custom Asset that can be burnt in a transaction. We denote by $L$ the cardinality of the $\mathsf{assetBurn}$ set in a transaction. As described in `Value Balance Verification`_, this provides the information for the validator of the transaction to compute the value commitment with the corresponding Asset Base. @@ -216,7 +217,7 @@ Additional Consensus Rules for the assetBurn set ```````````````````````````````````````````````` 1. It MUST be the case that for every $(\mathsf{AssetBase}, \mathsf{v}) \in \mathsf{assetBurn}, \mathsf{AssetBase} \neq \mathcal{V}^{\mathsf{Orchard}}$. That is, the Native Asset is not allowed to be burnt by this mechanism. -2. It MUST be that for every $(\mathsf{AssetBase}, \mathsf{v}) \in \mathsf{assetBurn}, \mathsf{v} \neq 0$. +2. It MUST be that for every $(\mathsf{AssetBase}, \mathsf{v}) \in \mathsf{assetBurn}, \mathsf{v} > 0$ and $\mathsf{v} \leq \mathsf{MAX\_BURN\_VALUE}$. 3. There MUST be no duplication of Custom Assets in the $\mathsf{assetBurn}$ set. That is, every $\mathsf{AssetBase}$ has at most one entry in $\mathsf{assetBurn}$. The other consensus rule changes for the OrchardZSA protocol are specified in ZIP 227 [#zip-0227-consensus]_. @@ -224,6 +225,12 @@ The other consensus rule changes for the OrchardZSA protocol are specified in ZI **Note:** The transparent protocol will not be changed with this ZIP to adapt to a multiple Asset structure. This means that unless future consensus rules changes do allow it, unshielding will not be possible for Custom Assets. +Rationale for MAX_BURN_VALUE +```````````````````````````` + +The maximum amount of any Custom Asset allowed to be burnt in a transaction is set to $2^{63} - 1$ in order to prevent it from being incompatible with other valueBalance fields, which are signed 64-bit integers. +It will also allow for compatibility with future asset-specific value balances in subsequent pools that support ZSAs via a turnstile. + Value Balance Verification -------------------------- diff --git a/zips/zip-0230.rst b/zips/zip-0230.rst index 42898b064..643716277 100644 --- a/zips/zip-0230.rst +++ b/zips/zip-0230.rst @@ -364,7 +364,7 @@ An OrchardZSA Asset Burn description is encoded in a transaction as an instance | | | |:math:`\mathsf{AssetBase^{Orchard}}\!`. | +-----------------------------+------------------------------+------------------------------------------------+---------------------------------------------------------------------+ | 8 |``valueBurn`` |``uint64`` |The amount being burnt. The value is checked by consensus to be | -| | | |non-zero. | +| | | |non-zero, and less than $\mathsf{MAX\_BURN\_VALUE}$. | +-----------------------------+------------------------------+------------------------------------------------+---------------------------------------------------------------------+ The encodings of each of these elements are defined in ZIP 226 [#zip-0226]_. From 7a6ee225f8fa3ae3308ef008efe251c5c3d86cd3 Mon Sep 17 00:00:00 2001 From: Vivek Arte <46618816+vivek-arte@users.noreply.github.com> Date: Tue, 3 Feb 2026 16:42:36 +0530 Subject: [PATCH 08/50] fixing table formatting issues --- zips/zip-0226.rst | 2 +- zips/zip-0230.rst | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/zips/zip-0226.rst b/zips/zip-0226.rst index 500567e3a..4c864fc4b 100644 --- a/zips/zip-0226.rst +++ b/zips/zip-0226.rst @@ -228,7 +228,7 @@ This means that unless future consensus rules changes do allow it, unshielding w Rationale for MAX_BURN_VALUE ```````````````````````````` -The maximum amount of any Custom Asset allowed to be burnt in a transaction is set to $2^{63} - 1$ in order to prevent it from being incompatible with other valueBalance fields, which are signed 64-bit integers. +The maximum amount of any Custom Asset allowed to be burnt in a transaction is set to $\mathsf{MAX\_BURN\_VALUE}$ in order to prevent it from being incompatible with other valueBalance fields, which are signed 64-bit integers. It will also allow for compatibility with future asset-specific value balances in subsequent pools that support ZSAs via a turnstile. Value Balance Verification diff --git a/zips/zip-0230.rst b/zips/zip-0230.rst index 643716277..66161d1aa 100644 --- a/zips/zip-0230.rst +++ b/zips/zip-0230.rst @@ -364,7 +364,8 @@ An OrchardZSA Asset Burn description is encoded in a transaction as an instance | | | |:math:`\mathsf{AssetBase^{Orchard}}\!`. | +-----------------------------+------------------------------+------------------------------------------------+---------------------------------------------------------------------+ | 8 |``valueBurn`` |``uint64`` |The amount being burnt. The value is checked by consensus to be | -| | | |non-zero, and less than $\mathsf{MAX\_BURN\_VALUE}$. | +| | | |non-zero, and less than :math:`\mathsf{MAX\_BURN\_VALUE}` | +| | | |[#zip-0226-burn-mechanism]_. | +-----------------------------+------------------------------+------------------------------------------------+---------------------------------------------------------------------+ The encodings of each of these elements are defined in ZIP 226 [#zip-0226]_. @@ -698,6 +699,7 @@ References .. [#zip-0225] `ZIP 225: Version 5 Transaction Format `_ .. [#zip-0225-transaction-format] `ZIP 225: Version 5 Transaction Format. Specification: Transaction Format `_ .. [#zip-0226] `ZIP 226: Transfer and Burn of Zcash Shielded Assets `_ +.. [#zip-0226-burn-mechanism] `ZIP 226: Transfer and Burn of Zcash Shielded Assets - Burn Mechanism `_ .. [#zip-0226-orchardzsa-transaction-structure] `ZIP 226: Transfer and Burn of Zcash Shielded Assets — OrchardZSA Transaction Structure `_ .. [#zip-0226-note-structure-and-commitment] `ZIP 226: Transfer and Burn of Zcash Shielded Assets — Note Structure and Commitment `_ .. [#zip-0227] `ZIP 227: Issuance of Zcash Shielded Assets `_ From 2c6381a73046dd96c5d1c1075e9b34ea33698af4 Mon Sep 17 00:00:00 2001 From: Vivek Arte <46618816+vivek-arte@users.noreply.github.com> Date: Tue, 3 Feb 2026 16:46:48 +0530 Subject: [PATCH 09/50] improving reference --- zips/zip-0230.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zips/zip-0230.rst b/zips/zip-0230.rst index 66161d1aa..6ded348d0 100644 --- a/zips/zip-0230.rst +++ b/zips/zip-0230.rst @@ -368,7 +368,7 @@ An OrchardZSA Asset Burn description is encoded in a transaction as an instance | | | |[#zip-0226-burn-mechanism]_. | +-----------------------------+------------------------------+------------------------------------------------+---------------------------------------------------------------------+ -The encodings of each of these elements are defined in ZIP 226 [#zip-0226]_. +The encodings of each of these elements are defined in ZIP 226 [#zip-0226-burn-mechanism]_. Transparent Sighash Information (``TransparentSighashInfo``) ------------------------------------------------------------ From 7dc4bd0e370bc770fe1fc4b822f8cc716bb473ac Mon Sep 17 00:00:00 2001 From: zancas Date: Wed, 4 Feb 2026 09:44:27 -0800 Subject: [PATCH 10/50] typo fix --- zips/zip-0307.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zips/zip-0307.rst b/zips/zip-0307.rst index eb91ba0a9..66314300d 100644 --- a/zips/zip-0307.rst +++ b/zips/zip-0307.rst @@ -79,7 +79,7 @@ Compact Stream Format A key observation in this protocol is that the current zcashd encrypted field is several hundred bytes long, due to the inclusion of a transaction “memo”. The need to download -this entire field imposes a substantial bandwidth cost on each light wallets, which may be +this entire field imposes a substantial bandwidth cost on each light wallet, which may be a limited mobile device on a restricted-bandwidth plan. While more efficient techniques can be developed in the future, for the moment we propose ignoring the memo field during payment detection. Futhermore, we can also ignore any information that is not directly From 7fd5cf270aee7deb4a6edc8471dcd1751d76cc90 Mon Sep 17 00:00:00 2001 From: Vivek Arte <46618816+vivek-arte@users.noreply.github.com> Date: Thu, 5 Feb 2026 00:11:22 +0530 Subject: [PATCH 11/50] Update zips/zip-0226.rst based on review Co-authored-by: Daira-Emma Hopwood --- zips/zip-0226.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zips/zip-0226.rst b/zips/zip-0226.rst index 4c864fc4b..eefc2b27f 100644 --- a/zips/zip-0226.rst +++ b/zips/zip-0226.rst @@ -229,7 +229,7 @@ Rationale for MAX_BURN_VALUE ```````````````````````````` The maximum amount of any Custom Asset allowed to be burnt in a transaction is set to $\mathsf{MAX\_BURN\_VALUE}$ in order to prevent it from being incompatible with other valueBalance fields, which are signed 64-bit integers. -It will also allow for compatibility with future asset-specific value balances in subsequent pools that support ZSAs via a turnstile. +It will also allow for compatibility with future Custom-asset-specific value balances in subsequent pools that support transferring ZSAs from the Orchard pool via a turnstile. Value Balance Verification -------------------------- From 56a90b9d00bd278260d7fe600f6d5bbdc0a066cd Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Wed, 4 Feb 2026 13:52:32 -0500 Subject: [PATCH 12/50] update Motivation section for ZIP-234 --- zips/zip-0234.md | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/zips/zip-0234.md b/zips/zip-0234.md index 8dbb4cdcf..cd33011ee 100644 --- a/zips/zip-0234.md +++ b/zips/zip-0234.md @@ -73,6 +73,11 @@ retains the overall supply cap of `MAX_MONEY`. # Motivation +The current block reward halving schedule is fixed and does not provide a way +to “recycle” funds removed from circulation via ZIP-233 into future issuance. +Once scheduled issuance ends, the network becomes reliant on transaction fees +for the security budget. + Key Objectives: 1. We want to introduce an automated mechanism that allows users of the network @@ -87,19 +92,30 @@ Key Objectives: the current issuance as possible. The current Zcash economic model, inherited from Bitcoin, includes a halving -mechanism that dictates the issuance of new coins. While this has been -foundational, halvings can lead to abrupt changes in the rate of new coins -being introduced to the market. Such sudden shifts can potentially disrupt the -network's economic model, potentially impacting its security and stability. -Furthermore, the halvings schedule is fixed and does not provide any way to -"recycle" funds into future issuance. - -This new NSM-based issuance scheme solves these problems by ensuring a more +mechanism that dictates the issuance of new coins via the mining block reward. +Halvings have since become culturally foundational, but abrupt reductions in +miner revenue can lead to short-term drops in mining participation, as evidenced +by hashrate/difficulty. + +In Zcash, difficulty declined materially after recent halving events: following the +2020-11-18 halving, weekly difficulty fell about 20.6% within roughly a week and was +still about 9.1% lower around 30 days later. Following the 2024-11-23 halving, +weekly difficulty fell about 17% within roughly a week and about 23% around 30 days +later. [^zechub-difficulty] As difficulty adjusts in response to hashrate, these short-term +drops are consistent with discrete subsidy cuts producing measurable reductions in mining +participation. + +While Bitcoin halvings are often accompanied by bullish narratives and have +sometimes been followed by strong price performance, Zcash has not consistently +followed the same pattern. Thus, by smoothing out the issuance curve, we +mitigate the risks associated with abrupt changes in issuance rates. + +This new NSM-based issuance scheme addresses these problems by ensuring a more consistent and predictable rate of coin issuance, while preserving the core aspects of Zcash's issuance policy and the 21-million-coin cap. At the same -time, it introduces the first mechanism to recreate and distribute ZEC that has -been removed from circulation, as well as unclaimed transaction fees, across -future block subsidies. +time, it introduces the first mechanism to reissue and distribute ZEC that has +been voluntarily removed from circulation, as well as transaction fees that are +deliberately redirected into the reserve, over future block subsidies. # Requirements @@ -280,3 +296,5 @@ Circulation" [^zip-0233]). [^zip-0233]: [ZIP 233: Network Sustainability Mechanism: Removing Funds From Circulation](zip-0233.md) [^draft-arya-deploy-nu7]: [draft-arya-deploy-nu7: Deployment of the NU7 Network Upgrade](draft-arya-deploy-nu7.md) + +[^zechub-difficulty]: [ZecHub weekly difficulty dataset](https://raw.githubusercontent.com/ZecHub/zechub-wiki/refs/heads/main/public/data/zcash/difficulty.json) From 42a218396baf7bd955faa4ef3b542f66a2928cea Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Wed, 4 Feb 2026 13:53:09 -0500 Subject: [PATCH 13/50] change 'should' to 'MUST' under ZIP-234 Issuance calculation --- zips/zip-0234.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zips/zip-0234.md b/zips/zip-0234.md index cd33011ee..02f276a18 100644 --- a/zips/zip-0234.md +++ b/zips/zip-0234.md @@ -156,7 +156,7 @@ The block height will be chosen by the following criteria: ## Issuance Calculation -At the $\mathsf{DEPLOYMENT\_BLOCK\_HEIGHT}$, nodes should switch from the current issuance +At the $\mathsf{DEPLOYMENT\_BLOCK\_HEIGHT}$, nodes MUST switch from the current issuance calculation, to the following: $\mathsf{BlockSubsidy}(\mathsf{height}) = \mathsf{ceiling}(\mathsf{BLOCK\_SUBSIDY\_FRACTION} \cdot \mathsf{MoneyReserveAfter}(\mathsf{height} - 1))$ From 913b729248c45235e4a7efefe79c54bcaf5635dd Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Wed, 4 Feb 2026 13:54:14 -0500 Subject: [PATCH 14/50] add simplicity rationale to ZIP-234 --- zips/zip-0234.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/zips/zip-0234.md b/zips/zip-0234.md index 02f276a18..2ba717898 100644 --- a/zips/zip-0234.md +++ b/zips/zip-0234.md @@ -170,6 +170,8 @@ All of these changes apply identically to Mainnet and Testnet. * Using an exponential decay function satisfies **Requirements 1** and **2** above. * We round up to the next zatoshi to satisfy **Requirement 3** above. +* The issuance formula depends only on `MoneyReserveAfter(height - 1)` and a + single constant fraction, making it simple to implement, explain, and verify. ## Parameters From 73528d77e43dd0780042d93dd47ad6737c761520 Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Wed, 4 Feb 2026 14:11:17 -0500 Subject: [PATCH 15/50] update ZIP-0234-block_subsidy.png Co-authored-by: Daira-Emma Hopwood --- .../assets/images/zip-0234-block_subsidy.png | Bin 112788 -> 26708 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/static/assets/images/zip-0234-block_subsidy.png b/static/assets/images/zip-0234-block_subsidy.png index 435d8fcd46df207865e645dee765afa47c9c2949..7dcb9b5c124a25a985b5ec98875a7505872a343a 100644 GIT binary patch literal 26708 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

#BDyl`ZtN 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 LeEq=er5pYae`U0l From d512039de788a1194cf33a36dc614087a4ec3a63 Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Wed, 4 Feb 2026 14:20:10 -0500 Subject: [PATCH 16/50] update zip-0234-balance.png Co-authored-by: Daira-Emma Hopwood --- static/assets/images/zip-0234-balance.png | Bin 102102 -> 71930 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/static/assets/images/zip-0234-balance.png b/static/assets/images/zip-0234-balance.png index 9f0e8e5a756e2ed3c6cfe0e0e40434906530ad7b..1f6f28169b5326d319d418d60d418123d0e475fc 100644 GIT binary patch literal 71930 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 literal 102102 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 From c355f2e5b0d3b87c43ac8144f6cce279cf7dd3d9 Mon Sep 17 00:00:00 2001 From: Daira-Emma Hopwood Date: Thu, 5 Feb 2026 01:57:30 +0000 Subject: [PATCH 17/50] Update to katex 0.16.28 and mermaid 11.12.2. Signed-off-by: Daira-Emma Hopwood --- render.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/render.sh b/render.sh index 2fee6649b..34f18b2a3 100755 --- a/render.sh +++ b/render.sh @@ -32,11 +32,11 @@ fi title="$(basename -s ${filetype} ${inputfile} | sed -E 's|zip-0{0,3}|ZIP |; s|draft-|Draft |')$(grep -E '^(\.\.)?\s*Title: ' ${inputfile} |sed -E 's|.*Title||')" echo " ${title}" -Math1='' -Math2='' -Math3='' +Math1='' +Math2='' +Math3='' -Mermaid='' +Mermaid='' ViewAndStyle='' From af71415b5ed9decdcda862315d97125b05978993 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Mon, 2 Feb 2026 15:45:23 -0700 Subject: [PATCH 18/50] [ZIP 0] Update to indicate that former ECC ZIP editors are now acting in their individual capacities as ecosystem participants. --- zips/zip-0000.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zips/zip-0000.rst b/zips/zip-0000.rst index 355df761b..3e3cdad6a 100644 --- a/zips/zip-0000.rst +++ b/zips/zip-0000.rst @@ -186,8 +186,8 @@ ZIP Editors The current ZIP Editors are: -* Jack Grigg, Daira-Emma Hopwood, and Kris Nuttycombe, associated with - the Electric Coin Company; +* Jack Grigg, Daira-Emma Hopwood, and Kris Nuttycombe in their individual + capacities. * Arya, associated with the Zcash Foundation. * Mark Henderson and Sam H. Smith, associated with Shielded Labs. From 7b9e678ff3eabf8514f9d0e32cfbf11b27e12696 Mon Sep 17 00:00:00 2001 From: Daira-Emma Hopwood Date: Tue, 3 Feb 2026 02:30:14 +0000 Subject: [PATCH 19/50] Change @str4d and @daira's email addresses to their personal addresses. Signed-off-by: Daira-Emma Hopwood --- ...emma-disable-addition-of-transparent-chain-value.md | 2 +- zips/draft-ecc-authenticated-reply-addrs.md | 6 +++--- zips/draft-ecc-onchain-accountable-voting.md | 2 +- zips/draft-str4d-orchard-balance-proof.md | 4 ++-- zips/zip-0000.rst | 8 ++++---- zips/zip-0032.rst | 4 ++-- zips/zip-0048.md | 6 +++--- zips/zip-0068.rst | 9 +++++---- zips/zip-0076.rst | 4 ++-- zips/zip-0112.rst | 8 ++++---- zips/zip-0113.rst | 6 +++--- zips/zip-0129.md | 4 ++-- zips/zip-0143.rst | 4 ++-- zips/zip-0155.rst | 2 +- zips/zip-0173.rst | 6 +++--- zips/zip-0200.rst | 2 +- zips/zip-0201.rst | 2 +- zips/zip-0202.rst | 2 +- zips/zip-0203.rst | 2 +- zips/zip-0204.rst | 2 +- zips/zip-0205.rst | 2 +- zips/zip-0206.rst | 2 +- zips/zip-0207.rst | 4 ++-- zips/zip-0208.rst | 5 ++--- zips/zip-0209.rst | 4 ++-- zips/zip-0210.rst | 2 +- zips/zip-0211.rst | 2 +- zips/zip-0212.rst | 3 ++- zips/zip-0214.rst | 2 +- zips/zip-0216.rst | 4 ++-- zips/zip-0217.rst | 2 +- zips/zip-0219.rst | 2 +- zips/zip-0220.rst | 4 ++-- zips/zip-0221.rst | 2 +- zips/zip-0222.rst | 4 ++-- zips/zip-0224.rst | 8 ++++---- zips/zip-0225.rst | 8 ++++---- zips/zip-0226.rst | 4 ++-- zips/zip-0227.rst | 4 ++-- zips/zip-0228.rst | 4 ++-- zips/zip-0230.rst | 8 ++++---- zips/zip-0231.md | 6 +++--- zips/zip-0236.rst | 2 +- zips/zip-0239.rst | 4 ++-- zips/zip-0243.rst | 4 ++-- zips/zip-0244.rst | 6 +++--- zips/zip-0245.rst | 4 ++-- zips/zip-0246.rst | 6 +++--- zips/zip-0250.rst | 2 +- zips/zip-0251.rst | 2 +- zips/zip-0252.rst | 4 ++-- zips/zip-0255.md | 2 +- zips/zip-0270.md | 6 +++--- zips/zip-0271.md | 2 +- zips/zip-0300.rst | 2 +- zips/zip-0301.rst | 2 +- zips/zip-0302.rst | 2 +- zips/zip-0304.rst | 6 +++--- zips/zip-0305.rst | 2 +- zips/zip-0306.rst | 2 +- zips/zip-0307.rst | 4 ++-- zips/zip-0308.rst | 5 ++--- zips/zip-0310.rst | 4 ++-- zips/zip-0311.rst | 2 +- zips/zip-0314.rst | 2 +- zips/zip-0315.rst | 6 +++--- zips/zip-0316.rst | 10 +++++----- zips/zip-0317.rst | 8 ++++---- zips/zip-0318.rst | 4 ++-- zips/zip-0319.rst | 4 ++-- zips/zip-0320.rst | 2 +- zips/zip-0321.rst | 4 ++-- zips/zip-0322.rst | 4 ++-- zips/zip-0323.rst | 4 ++-- zips/zip-0324.rst | 6 +++--- zips/zip-0325.md | 6 +++--- zips/zip-0332.rst | 4 ++-- zips/zip-0339.rst | 2 +- zips/zip-0401.rst | 2 +- zips/zip-0416.rst | 9 +++------ zips/zip-1014.rst | 2 +- zips/zip-2001.rst | 4 ++-- zips/zip-2002.rst | 6 +++--- zips/zip-2003.rst | 2 +- zips/zip-2004.rst | 2 +- zips/zip-2005.md | 4 ++-- 86 files changed, 170 insertions(+), 173 deletions(-) diff --git a/zips/draft-arya-dairaemma-disable-addition-of-transparent-chain-value.md b/zips/draft-arya-dairaemma-disable-addition-of-transparent-chain-value.md index 9492274d5..1028b81e7 100644 --- a/zips/draft-arya-dairaemma-disable-addition-of-transparent-chain-value.md +++ b/zips/draft-arya-dairaemma-disable-addition-of-transparent-chain-value.md @@ -2,7 +2,7 @@ ZIP: XXX Title: Disabling Addition of New Value to the Transparent Chain Value Pool Owners: Arya - Daira-Emma Hopwood + Daira-Emma Hopwood Status: Draft Category: Consensus Created: 2025-08-13 diff --git a/zips/draft-ecc-authenticated-reply-addrs.md b/zips/draft-ecc-authenticated-reply-addrs.md index 6a9a5acb5..46c5db6bf 100644 --- a/zips/draft-ecc-authenticated-reply-addrs.md +++ b/zips/draft-ecc-authenticated-reply-addrs.md @@ -1,8 +1,8 @@ ZIP: ??? Title: Authenticated Reply Addresses - Owners: Jack Grigg - Kris Nuttycombe - Daira Emma Hopwood + Owners: Jack Grigg + Kris Nuttycombe + Daira-Emma Hopwood Status: Draft Category: Standards / Wallet Created: 2023-11-12 diff --git a/zips/draft-ecc-onchain-accountable-voting.md b/zips/draft-ecc-onchain-accountable-voting.md index ec925b21a..5ee94d61a 100644 --- a/zips/draft-ecc-onchain-accountable-voting.md +++ b/zips/draft-ecc-onchain-accountable-voting.md @@ -1,6 +1,6 @@ ZIP: XXX Title: On-chain Accountable Voting - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Status: Draft Credits: Josh Swihart Kris Nuttycombe diff --git a/zips/draft-str4d-orchard-balance-proof.md b/zips/draft-str4d-orchard-balance-proof.md index 98988cd88..77647e0d8 100644 --- a/zips/draft-str4d-orchard-balance-proof.md +++ b/zips/draft-str4d-orchard-balance-proof.md @@ -1,7 +1,7 @@ ZIP: unassigned Title: Air drops, Proof-of-Balance, and Stake-weighted Polling - Owners: Daira-Emma Hopwood - Jack Grigg + Owners: Daira-Emma Hopwood + Jack Grigg Status: Draft Category: Informational Created: 2023-12-07 diff --git a/zips/zip-0000.rst b/zips/zip-0000.rst index 3e3cdad6a..9e98c0e6b 100644 --- a/zips/zip-0000.rst +++ b/zips/zip-0000.rst @@ -2,16 +2,16 @@ ZIP: 0 Title: ZIP Process - Owners: Jack Grigg + Owners: Jack Grigg Mark Henderson - Daira-Emma Hopwood + Daira-Emma Hopwood Arya Kris Nuttycombe Sam H. Smith Original-Authors: Josh Cincinnati George Tankersley Deirdre Connolly - teor + Teor Aditya Bharadwaj Conrado Gouvêa Credits: Luke Dashjr @@ -972,7 +972,7 @@ See Also Acknowledgements ================ -We thank George Tankersley, Deirdre Connolly, teor, Aditya Bharadwaj, and +We thank George Tankersley, Deirdre Connolly, Teor, Aditya Bharadwaj, and Conrado Gouvêa for their past contributions as ZIP Editors. diff --git a/zips/zip-0032.rst b/zips/zip-0032.rst index fe1d40bcf..5ced05e57 100644 --- a/zips/zip-0032.rst +++ b/zips/zip-0032.rst @@ -2,8 +2,8 @@ ZIP: 32 Title: Shielded Hierarchical Deterministic Wallets - Owners: Jack Grigg - Daira-Emma Hopwood + Owners: Jack Grigg + Daira-Emma Hopwood Credits: Sean Bowe Kris Nuttycombe Ying Tong Lai diff --git a/zips/zip-0048.md b/zips/zip-0048.md index d5572609c..a0c3a45d5 100644 --- a/zips/zip-0048.md +++ b/zips/zip-0048.md @@ -1,9 +1,9 @@ ZIP: 48 Title: Transparent Multisig Wallets - Owners: Kris Nuttycombe - Jack Grigg - Daira-Emma Hopwood + Owners: Kris Nuttycombe + Jack Grigg + Daira-Emma Hopwood Arya Credits: Fontaine Status: Draft diff --git a/zips/zip-0068.rst b/zips/zip-0068.rst index 1c22879e8..2f567313c 100644 --- a/zips/zip-0068.rst +++ b/zips/zip-0068.rst @@ -2,10 +2,11 @@ ZIP: 68 Title: Relative lock-time using consensus-enforced sequence numbers - Credits: Mark Friedenbach - BtcDrak - Nicolas Dorier - kinoshitajona + Owners: Daira-Emma Hopwood + Credits: Mark Friedenbach + BtcDrak + Nicolas Dorier + kinoshitajona Category: Consensus Status: Draft Created: 2016-06-06 diff --git a/zips/zip-0076.rst b/zips/zip-0076.rst index 35ba78a96..1da99476d 100644 --- a/zips/zip-0076.rst +++ b/zips/zip-0076.rst @@ -2,8 +2,8 @@ ZIP: 76 Title: Transaction Signature Validation before Overwinter - Owners: Jack Grigg - Daira-Emma Hopwood + Owners: Jack Grigg + Daira-Emma Hopwood Status: Reserved Category: Consensus Discussions-To: diff --git a/zips/zip-0112.rst b/zips/zip-0112.rst index a6c130c0b..7eba047a2 100644 --- a/zips/zip-0112.rst +++ b/zips/zip-0112.rst @@ -2,10 +2,10 @@ ZIP: 112 Title: CHECKSEQUENCEVERIFY - Author: Daira Hopwood - Credits: BtcDrak - Mark Friedenbach - Eric Lombrozo + Owners: Daira-Emma Hopwood + Credits: BtcDrak + Mark Friedenbach + Eric Lombrozo Category: Consensus Status: Draft Created: 2019-06-06 diff --git a/zips/zip-0113.rst b/zips/zip-0113.rst index d7d657a4c..e4d94d21b 100644 --- a/zips/zip-0113.rst +++ b/zips/zip-0113.rst @@ -2,9 +2,9 @@ ZIP: 113 Title: Median Time Past as endpoint for lock-time calculations - Author: Daira Hopwood - Credits: Thomas Kerin - Mark Friedenbach + Owners: Daira-Emma Hopwood + Credits: Thomas Kerin + Mark Friedenbach Gregory Maxwell Category: Consensus Status: Draft diff --git a/zips/zip-0129.md b/zips/zip-0129.md index b89315cf1..61148ce3f 100644 --- a/zips/zip-0129.md +++ b/zips/zip-0129.md @@ -1,8 +1,8 @@ ZIP: 129 Title: Zcash Transparent Multisig Setup - Owners: Kris Nuttycombe - Jack Grigg + Owners: Kris Nuttycombe + Jack Grigg Arya Credits: Hugo Nguyen Peter Gray diff --git a/zips/zip-0143.rst b/zips/zip-0143.rst index af07101d5..09b14306f 100644 --- a/zips/zip-0143.rst +++ b/zips/zip-0143.rst @@ -2,8 +2,8 @@ ZIP: 143 Title: Transaction Signature Validation for Overwinter - Owners: Jack Grigg - Daira-Emma Hopwood + Owners: Jack Grigg + Daira-Emma Hopwood Credits: Johnson Lau Pieter Wuille Bitcoin-ABC diff --git a/zips/zip-0155.rst b/zips/zip-0155.rst index 214091629..1a5088331 100644 --- a/zips/zip-0155.rst +++ b/zips/zip-0155.rst @@ -2,7 +2,7 @@ ZIP: 155 Title: addrv2 message - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Credits: Wladimir J. van der Laan Zancas Wilcox Status: Proposed diff --git a/zips/zip-0173.rst b/zips/zip-0173.rst index 70ca789f5..75ce013e7 100644 --- a/zips/zip-0173.rst +++ b/zips/zip-0173.rst @@ -2,9 +2,9 @@ ZIP: 173 Title: Bech32 Format - Owners: Daira-Emma Hopwood - Credits: Pieter Wuille - Greg Maxwell + Owners: Daira-Emma Hopwood + Credits: Pieter Wuille + Greg Maxwell Rusty Russell Mark Friedenbach Status: Final diff --git a/zips/zip-0200.rst b/zips/zip-0200.rst index 5b3733370..4db92a743 100644 --- a/zips/zip-0200.rst +++ b/zips/zip-0200.rst @@ -2,7 +2,7 @@ ZIP: 200 Title: Network Upgrade Mechanism - Owners: Jack Grigg + Owners: Jack Grigg Status: Final Category: Consensus Created: 2018-01-08 diff --git a/zips/zip-0201.rst b/zips/zip-0201.rst index 2aae78503..0ea061814 100644 --- a/zips/zip-0201.rst +++ b/zips/zip-0201.rst @@ -2,7 +2,7 @@ ZIP: 201 Title: Network Peer Management for Overwinter - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Original-Authors: Simon Liu Status: Final Category: Network diff --git a/zips/zip-0202.rst b/zips/zip-0202.rst index adc7728df..97b365642 100644 --- a/zips/zip-0202.rst +++ b/zips/zip-0202.rst @@ -2,7 +2,7 @@ ZIP: 202 Title: Version 3 Transaction Format for Overwinter - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Original-Authors: Simon Liu Status: Final Category: Consensus diff --git a/zips/zip-0203.rst b/zips/zip-0203.rst index a49f0b349..e9ed61950 100644 --- a/zips/zip-0203.rst +++ b/zips/zip-0203.rst @@ -2,7 +2,7 @@ ZIP: 203 Title: Transaction Expiry - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Original-Authors: Jay Graber Status: Final Category: Consensus diff --git a/zips/zip-0204.rst b/zips/zip-0204.rst index 77b5cdf52..80e976d33 100644 --- a/zips/zip-0204.rst +++ b/zips/zip-0204.rst @@ -2,7 +2,7 @@ ZIP: 204 Title: Zcash P2P Network Protocol - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Status: Reserved Category: Network Discussions-To: diff --git a/zips/zip-0205.rst b/zips/zip-0205.rst index 963959a8a..7fb1a22c7 100644 --- a/zips/zip-0205.rst +++ b/zips/zip-0205.rst @@ -2,7 +2,7 @@ ZIP: 205 Title: Deployment of the Sapling Network Upgrade - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Credits: Simon Liu Status: Final Category: Consensus / Network diff --git a/zips/zip-0206.rst b/zips/zip-0206.rst index 16d61138b..fb76fa93b 100644 --- a/zips/zip-0206.rst +++ b/zips/zip-0206.rst @@ -2,7 +2,7 @@ ZIP: 206 Title: Deployment of the Blossom Network Upgrade - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Credits: Simon Liu Status: Final Category: Consensus / Network diff --git a/zips/zip-0207.rst b/zips/zip-0207.rst index 0cd2d0ecb..4f8ec0539 100644 --- a/zips/zip-0207.rst +++ b/zips/zip-0207.rst @@ -2,8 +2,8 @@ ZIP: 207 Title: Funding Streams - Owners: Jack Grigg - Daira-Emma Hopwood + Owners: Jack Grigg + Daira-Emma Hopwood Status: [Revision 0: Canopy, Revision 1: NU6] Final Category: Consensus Created: 2019-01-04 diff --git a/zips/zip-0208.rst b/zips/zip-0208.rst index bfd02e4e9..c81865370 100644 --- a/zips/zip-0208.rst +++ b/zips/zip-0208.rst @@ -2,9 +2,8 @@ ZIP: 208 Title: Shorter Block Target Spacing - Owners: Daira-Emma Hopwood - Original-Authors: Daira-Emma Hopwood - Simon Liu + Owners: Daira-Emma Hopwood + Original-Authors: Simon Liu Status: Final Category: Consensus Created: 2019-01-10 diff --git a/zips/zip-0209.rst b/zips/zip-0209.rst index ffb35f6fd..17aa3ab5d 100644 --- a/zips/zip-0209.rst +++ b/zips/zip-0209.rst @@ -2,8 +2,8 @@ ZIP: 209 Title: Prohibit Negative Shielded Chain Value Pool Balances - Owners: Sean Bowe - Daira-Emma Hopwood + Owners: Sean Bowe + Daira-Emma Hopwood Status: Final Category: Consensus Created: 2019-02-25 diff --git a/zips/zip-0210.rst b/zips/zip-0210.rst index bee141a97..a069f4adf 100644 --- a/zips/zip-0210.rst +++ b/zips/zip-0210.rst @@ -2,7 +2,7 @@ ZIP: 210 Title: Sapling Anchor Deduplication within Transactions - Owners: Jack Grigg + Owners: Jack Grigg Status: Withdrawn Category: Consensus Created: 2019-03-27 diff --git a/zips/zip-0211.rst b/zips/zip-0211.rst index f857af188..ceef694fa 100644 --- a/zips/zip-0211.rst +++ b/zips/zip-0211.rst @@ -2,7 +2,7 @@ ZIP: 211 Title: Disabling Addition of New Value to the Sprout Chain Value Pool - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Credits: Sean Bowe Status: Final Category: Consensus diff --git a/zips/zip-0212.rst b/zips/zip-0212.rst index 271634e68..fb292d3a2 100644 --- a/zips/zip-0212.rst +++ b/zips/zip-0212.rst @@ -2,7 +2,8 @@ ZIP: 212 Title: Allow Recipient to Derive Ephemeral Secret from Note Plaintext - Owners: Sean Bowe + Owners: Sean Bowe + Daira-Emma Hopwood Status: Final Category: Consensus Created: 2019-03-31 diff --git a/zips/zip-0214.rst b/zips/zip-0214.rst index 201f72fb5..ebe89aa23 100644 --- a/zips/zip-0214.rst +++ b/zips/zip-0214.rst @@ -2,7 +2,7 @@ ZIP: 214 Title: Consensus rules for a Zcash Development Fund - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Kris Nuttycombe Status: [Revision 0: Canopy, Revision 1: NU6] Final, [Revision 2: NU6.1] Proposed Category: Consensus diff --git a/zips/zip-0216.rst b/zips/zip-0216.rst index f0c5b18c1..0f62bd065 100644 --- a/zips/zip-0216.rst +++ b/zips/zip-0216.rst @@ -2,8 +2,8 @@ ZIP: 216 Title: Require Canonical Jubjub Point Encodings - Owners: Jack Grigg - Daira-Emma Hopwood + Owners: Jack Grigg + Daira-Emma Hopwood Status: Final Category: Consensus Created: 2021-02-11 diff --git a/zips/zip-0217.rst b/zips/zip-0217.rst index 4562d86fc..69b1aaa36 100644 --- a/zips/zip-0217.rst +++ b/zips/zip-0217.rst @@ -2,7 +2,7 @@ ZIP: 217 Title: Aggregate Signatures - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Status: Reserved Category: Consensus Discussions-To: diff --git a/zips/zip-0219.rst b/zips/zip-0219.rst index 313032e95..931e90639 100644 --- a/zips/zip-0219.rst +++ b/zips/zip-0219.rst @@ -2,7 +2,7 @@ ZIP: 219 Title: Disabling Addition of New Value to the Sapling Chain Value Pool - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Status: Reserved Category: Consensus Discussions-To: diff --git a/zips/zip-0220.rst b/zips/zip-0220.rst index 5b9b8ee00..5ea14b140 100644 --- a/zips/zip-0220.rst +++ b/zips/zip-0220.rst @@ -2,8 +2,8 @@ ZIP: 220 Title: Zcash Shielded Assets - Owners: Jack Grigg - Daira-Emma Hopwood + Owners: Jack Grigg + Daira-Emma Hopwood Status: Withdrawn Category: Consensus Discussions-To: diff --git a/zips/zip-0221.rst b/zips/zip-0221.rst index ab8d61a38..4ee35acce 100644 --- a/zips/zip-0221.rst +++ b/zips/zip-0221.rst @@ -2,7 +2,7 @@ ZIP: 221 Title: FlyClient - Consensus-Layer Changes - Owners: Jack Grigg + Owners: Jack Grigg Original-Authors: Ying Tong Lai James Prestwich Georgios Konstantopoulos diff --git a/zips/zip-0222.rst b/zips/zip-0222.rst index 440ec86e0..54648716a 100644 --- a/zips/zip-0222.rst +++ b/zips/zip-0222.rst @@ -2,8 +2,8 @@ ZIP: 222 Title: Transparent Zcash Extensions - Owners: Jack Grigg - Kris Nuttycombe + Owners: Jack Grigg + Kris Nuttycombe Credits: Zaki Manian Daira-Emma Hopwood Sean Bowe diff --git a/zips/zip-0224.rst b/zips/zip-0224.rst index 450b8118a..cbede7687 100644 --- a/zips/zip-0224.rst +++ b/zips/zip-0224.rst @@ -2,10 +2,10 @@ ZIP: 224 Title: Orchard Shielded Protocol - Owners: Daira-Emma Hopwood - Jack Grigg - Sean Bowe - Kris Nuttycombe + Owners: Daira-Emma Hopwood + Jack Grigg + Sean Bowe + Kris Nuttycombe Original-Authors: Ying Tong Lai Status: Final Category: Consensus diff --git a/zips/zip-0225.rst b/zips/zip-0225.rst index 65f69bb42..e6b4cfb2a 100644 --- a/zips/zip-0225.rst +++ b/zips/zip-0225.rst @@ -2,10 +2,10 @@ ZIP: 225 Title: Version 5 Transaction Format - Owners: Daira-Emma Hopwood - Jack Grigg - Sean Bowe - Kris Nuttycombe + Owners: Daira-Emma Hopwood + Jack Grigg + Sean Bowe + Kris Nuttycombe Original-Authors: Ying Tong Lai Status: Final Category: Consensus diff --git a/zips/zip-0226.rst b/zips/zip-0226.rst index b2d3bf953..fdf232ea8 100644 --- a/zips/zip-0226.rst +++ b/zips/zip-0226.rst @@ -4,8 +4,8 @@ Title: Transfer and Burn of Zcash Shielded Assets Owners: Pablo Kogan Vivek Arte - Daira-Emma Hopwood - Jack Grigg + Daira-Emma Hopwood + Jack Grigg Credits: Daniel Benarroch Aurelien Nicolas Deirdre Connolly diff --git a/zips/zip-0227.rst b/zips/zip-0227.rst index 7a58b4e3f..51841ad6d 100644 --- a/zips/zip-0227.rst +++ b/zips/zip-0227.rst @@ -4,8 +4,8 @@ Title: Issuance of Zcash Shielded Assets Owners: Pablo Kogan Vivek Arte - Daira-Emma Hopwood - Jack Grigg + Daira-Emma Hopwood + Jack Grigg Credits: Daniel Benarroch Aurelien Nicolas Deirdre Connolly diff --git a/zips/zip-0228.rst b/zips/zip-0228.rst index c1c19c70e..b43648fe4 100644 --- a/zips/zip-0228.rst +++ b/zips/zip-0228.rst @@ -4,8 +4,8 @@ Title: Asset Swaps for Zcash Shielded Assets Owners: Pablo Kogan Vivek Arte - Daira-Emma Hopwood - Jack Grigg + Daira-Emma Hopwood + Jack Grigg Credits: Daniel Benarroch Aurelien Nicolas Status: Reserved diff --git a/zips/zip-0230.rst b/zips/zip-0230.rst index d2c21b544..7e7d816c3 100644 --- a/zips/zip-0230.rst +++ b/zips/zip-0230.rst @@ -2,10 +2,10 @@ ZIP: 230 Title: Version 6 Transaction Format - Owners: Daira-Emma Hopwood - Jack Grigg - Sean Bowe - Kris Nuttycombe + Owners: Daira-Emma Hopwood + Jack Grigg + Sean Bowe + Kris Nuttycombe Pablo Kogan Vivek Arte Original-Authors: Greg Pfeil diff --git a/zips/zip-0231.md b/zips/zip-0231.md index 909ce8a41..05e29ade5 100644 --- a/zips/zip-0231.md +++ b/zips/zip-0231.md @@ -1,8 +1,8 @@ ZIP: 231 Title: Memo Bundles - Owners: Jack Grigg - Kris Nuttycombe - Daira-Emma Hopwood + Owners: Jack Grigg + Kris Nuttycombe + Daira-Emma Hopwood Arya Solhi Credits: Sean Bowe Nate Wilcox diff --git a/zips/zip-0236.rst b/zips/zip-0236.rst index c872c457d..17c10d41c 100644 --- a/zips/zip-0236.rst +++ b/zips/zip-0236.rst @@ -2,7 +2,7 @@ ZIP: 236 Title: Blocks should balance exactly - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Credits: Jack Grigg Kris Nuttycombe Status: Final diff --git a/zips/zip-0239.rst b/zips/zip-0239.rst index 23f18ffa4..e9dd6ca79 100644 --- a/zips/zip-0239.rst +++ b/zips/zip-0239.rst @@ -2,8 +2,8 @@ ZIP: 239 Title: Relay of Version 5 Transactions - Owners: Daira-Emma Hopwood - Jack Grigg + Owners: Daira-Emma Hopwood + Jack Grigg Status: Final Category: Network Created: 2021-05-29 diff --git a/zips/zip-0243.rst b/zips/zip-0243.rst index 47c574b07..5074c58b8 100644 --- a/zips/zip-0243.rst +++ b/zips/zip-0243.rst @@ -2,8 +2,8 @@ ZIP: 243 Title: Transaction Signature Validation for Sapling - Owners: Jack Grigg - Daira-Emma Hopwood + Owners: Jack Grigg + Daira-Emma Hopwood Credits: Simon Liu Status: Final Category: Consensus diff --git a/zips/zip-0244.rst b/zips/zip-0244.rst index 19f5e10c3..a553f7045 100644 --- a/zips/zip-0244.rst +++ b/zips/zip-0244.rst @@ -2,9 +2,9 @@ ZIP: 244 Title: Transaction Identifier Non-Malleability - Owners: Kris Nuttycombe - Daira-Emma Hopwood - Jack Grigg + Owners: Kris Nuttycombe + Daira-Emma Hopwood + Jack Grigg Status: Final Category: Consensus Created: 2021-01-06 diff --git a/zips/zip-0245.rst b/zips/zip-0245.rst index fd55a7c90..b8f5aa390 100644 --- a/zips/zip-0245.rst +++ b/zips/zip-0245.rst @@ -2,8 +2,8 @@ ZIP: 245 Title: Transaction Identifier Digests & Signature Validation for Transparent Zcash Extensions - Owners: Kris Nuttycombe - Daira-Emma Hopwood + Owners: Kris Nuttycombe + Daira-Emma Hopwood Status: Draft Category: Consensus Created: 2021-01-13 diff --git a/zips/zip-0246.rst b/zips/zip-0246.rst index c50da7521..b53fc797d 100644 --- a/zips/zip-0246.rst +++ b/zips/zip-0246.rst @@ -4,9 +4,9 @@ Title: Digests for the Version 6 Transaction Format Owners: Arya Conrado Gouvea - Daira-Emma Hopwood - Jack Grigg - Kris Nuttycombe + Daira-Emma Hopwood + Jack Grigg + Kris Nuttycombe Status: Draft Category: Consensus Created: 2025-02-12 diff --git a/zips/zip-0250.rst b/zips/zip-0250.rst index 0c0757a8b..54d2785d3 100644 --- a/zips/zip-0250.rst +++ b/zips/zip-0250.rst @@ -2,7 +2,7 @@ ZIP: 250 Title: Deployment of the Heartwood Network Upgrade - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Status: Final Category: Consensus / Network Created: 2020-02-28 diff --git a/zips/zip-0251.rst b/zips/zip-0251.rst index c906e0b69..bd0584fde 100644 --- a/zips/zip-0251.rst +++ b/zips/zip-0251.rst @@ -2,7 +2,7 @@ ZIP: 251 Title: Deployment of the Canopy Network Upgrade - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Status: Final Category: Consensus / Network Created: 2020-02-28 diff --git a/zips/zip-0252.rst b/zips/zip-0252.rst index 93804a61b..6a007b2d1 100644 --- a/zips/zip-0252.rst +++ b/zips/zip-0252.rst @@ -2,8 +2,8 @@ ZIP: 252 Title: Deployment of the NU5 Network Upgrade - Owners: teor - Daira-Emma Hopwood + Owners: Daira-Emma Hopwood + Original-Authors: Teor Status: Final Category: Consensus / Network Created: 2021-02-23 diff --git a/zips/zip-0255.md b/zips/zip-0255.md index c3563e4ee..d838c3cd0 100644 --- a/zips/zip-0255.md +++ b/zips/zip-0255.md @@ -1,7 +1,7 @@ ZIP: 255 Title: Deployment of the NU6.1 Network Upgrade - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Credits: Arya Status: Proposed Category: Consensus / Network diff --git a/zips/zip-0270.md b/zips/zip-0270.md index 04a919af0..c632181ce 100644 --- a/zips/zip-0270.md +++ b/zips/zip-0270.md @@ -1,9 +1,9 @@ ZIP: 270 Title: Key Rotation for Tracked Signing Keys - Owners: Jack Grigg - Kris Nuttycombe - Daira-Emma Hopwood + Owners: Jack Grigg + Kris Nuttycombe + Daira-Emma Hopwood Arya Status: Reserved Category: Consensus diff --git a/zips/zip-0271.md b/zips/zip-0271.md index b31a20dbb..d8ed8edf6 100644 --- a/zips/zip-0271.md +++ b/zips/zip-0271.md @@ -2,7 +2,7 @@ Title: Dev Fund Extension and One-Time Disbursement Owners: Daira-Emma Hopwood Kris Nuttycombe - Jack Grigg + Jack Grigg Status: Proposed Category: Consensus / Process Created: 2025-02-19 diff --git a/zips/zip-0300.rst b/zips/zip-0300.rst index 17eb9b030..6c618f7e1 100644 --- a/zips/zip-0300.rst +++ b/zips/zip-0300.rst @@ -2,7 +2,7 @@ ZIP: 300 Title: Cross-chain Atomic Transactions - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Original-Authors: Jay Graber Status: Proposed Category: Informational diff --git a/zips/zip-0301.rst b/zips/zip-0301.rst index 6224149b3..b976a501a 100644 --- a/zips/zip-0301.rst +++ b/zips/zip-0301.rst @@ -2,7 +2,7 @@ ZIP: 301 Title: Zcash Stratum Protocol - Owners: Jack Grigg + Owners: Jack Grigg Credits: 5a1t Daira-Emma Hopwood Marek Palatinus (slush) and colleagues diff --git a/zips/zip-0302.rst b/zips/zip-0302.rst index a87ffac51..327f64bdd 100644 --- a/zips/zip-0302.rst +++ b/zips/zip-0302.rst @@ -2,7 +2,7 @@ ZIP: 302 Title: Standardized Memo Field Format - Owners: Jack Grigg + Owners: Jack Grigg Original-Authors: Jay Graber Status: Draft Category: Standards / RPC / Wallet diff --git a/zips/zip-0304.rst b/zips/zip-0304.rst index de65e29a6..107033e98 100644 --- a/zips/zip-0304.rst +++ b/zips/zip-0304.rst @@ -2,9 +2,9 @@ ZIP: 304 Title: Sapling Address Signatures - Owners: Jack Grigg - Credits: Daira-Emma Hopwood - Sean Bowe + Owners: Jack Grigg + Credits: Daira-Emma Hopwood + Sean Bowe Status: Draft Category: Standards / RPC / Wallet Created: 2020-06-01 diff --git a/zips/zip-0305.rst b/zips/zip-0305.rst index a7695fd06..75dabfd36 100644 --- a/zips/zip-0305.rst +++ b/zips/zip-0305.rst @@ -2,7 +2,7 @@ ZIP: 305 Title: Best Practices for Hardware Wallets supporting Sapling - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Status: Reserved Category: Wallet Discussions-To: diff --git a/zips/zip-0306.rst b/zips/zip-0306.rst index 76b95ead2..8cfd89f6c 100644 --- a/zips/zip-0306.rst +++ b/zips/zip-0306.rst @@ -2,7 +2,7 @@ ZIP: 306 Title: Security Considerations for Anchor Selection - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Status: Reserved Category: Informational Discussions-To: diff --git a/zips/zip-0307.rst b/zips/zip-0307.rst index 66314300d..f63fff152 100644 --- a/zips/zip-0307.rst +++ b/zips/zip-0307.rst @@ -2,8 +2,8 @@ ZIP: 307 Title: Light Client Protocol for Payment Detection - Owners: Jack Grigg - Daira-Emma Hopwood + Owners: Jack Grigg + Daira-Emma Hopwood Original-Authors: George Tankersley Credits: Matthew Green Category: Standards / Ecosystem diff --git a/zips/zip-0308.rst b/zips/zip-0308.rst index 95ee1351c..853d412c1 100644 --- a/zips/zip-0308.rst +++ b/zips/zip-0308.rst @@ -2,9 +2,8 @@ ZIP: 308 Title: Sprout to Sapling Migration - Owners: Daira-Emma Hopwood - Original-Authors: Daira-Emma Hopwood - Eirik Ogilvie-Wigley + Owners: Daira-Emma Hopwood + Original-Authors: Eirik Ogilvie-Wigley Status: Active Category: Standards / RPC / Wallet Created: 2018-11-27 diff --git a/zips/zip-0310.rst b/zips/zip-0310.rst index 843f6e3c9..c3d9271eb 100644 --- a/zips/zip-0310.rst +++ b/zips/zip-0310.rst @@ -2,8 +2,8 @@ ZIP: 310 Title: Security Properties of Sapling Viewing Keys - Owners: Daira-Emma Hopwood - Jack Grigg + Owners: Daira-Emma Hopwood + Jack Grigg Status: Draft Category: Informational Created: 2020-03-09 diff --git a/zips/zip-0311.rst b/zips/zip-0311.rst index 436e85dda..d31b3b7b3 100644 --- a/zips/zip-0311.rst +++ b/zips/zip-0311.rst @@ -2,7 +2,7 @@ ZIP: 311 Title: Zcash Payment Disclosures - Owners: Jack Grigg + Owners: Jack Grigg Status: Draft Category: Standards / RPC / Wallet Discussions-To: diff --git a/zips/zip-0314.rst b/zips/zip-0314.rst index 1ebb8a68a..340c2a777 100644 --- a/zips/zip-0314.rst +++ b/zips/zip-0314.rst @@ -2,7 +2,7 @@ ZIP: 314 Title: Privacy upgrades to the Zcash light client protocol - Owners: Taylor Hornby + Owners: Taylor Hornby Status: Reserved Category: Standards / Wallet Discussions-To: diff --git a/zips/zip-0315.rst b/zips/zip-0315.rst index 1390398f3..9a0d4a7a2 100644 --- a/zips/zip-0315.rst +++ b/zips/zip-0315.rst @@ -2,9 +2,9 @@ ZIP: 315 Title: Best Practices for Wallet Implementations - Owners: Daira-Emma Hopwood - Jack Grigg - Kris Nuttycombe + Owners: Daira-Emma Hopwood + Jack Grigg + Kris Nuttycombe Credits: Francisco Gindre Status: Draft Category: Wallet diff --git a/zips/zip-0316.rst b/zips/zip-0316.rst index 1ab37fba4..650b8e61d 100644 --- a/zips/zip-0316.rst +++ b/zips/zip-0316.rst @@ -2,11 +2,11 @@ ZIP: 316 Title: Unified Addresses and Unified Viewing Keys - Owners: Daira-Emma Hopwood - Nathan Wilcox - Jack Grigg - Sean Bowe - Kris Nuttycombe + Owners: Daira-Emma Hopwood + Nathan Wilcox + Jack Grigg + Sean Bowe + Kris Nuttycombe Original-Authors: Greg Pfeil Ying Tong Lai Credits: Taylor Hornby diff --git a/zips/zip-0317.rst b/zips/zip-0317.rst index fecc4a32d..5ca8b081f 100644 --- a/zips/zip-0317.rst +++ b/zips/zip-0317.rst @@ -2,11 +2,11 @@ ZIP: 317 Title: Proportional Transfer Fee Mechanism - Owners: Aditya Bharadwaj - Daira-Emma Hopwood + Owners: Daira-Emma Hopwood + Kris Nuttycombe + Jack Grigg + Original-Authors: Aditya Bharadwaj Credits: Madars Virza - Kris Nuttycombe - Jack Grigg Francisco Gindre Status: Active Category: Standards / Wallet diff --git a/zips/zip-0318.rst b/zips/zip-0318.rst index 02a3c3aba..1081e4d3e 100644 --- a/zips/zip-0318.rst +++ b/zips/zip-0318.rst @@ -2,8 +2,8 @@ ZIP: 318 Title: Associated Payload Encryption - Owners: Kris Nuttycombe - Daira-Emma Hopwood + Owners: Kris Nuttycombe + Daira-Emma Hopwood Status: Reserved Category: Standards Track Created: 2022-09-19 diff --git a/zips/zip-0319.rst b/zips/zip-0319.rst index da5134ecf..5359ee4c0 100644 --- a/zips/zip-0319.rst +++ b/zips/zip-0319.rst @@ -2,8 +2,8 @@ ZIP: 319 Title: Options for Shielded Pool Retirement - Owners: Nathan Wilcox - Daira-Emma Hopwood + Owners: Nathan Wilcox + Daira-Emma Hopwood Status: Reserved Category: Informational Created: 2022-09-20 diff --git a/zips/zip-0320.rst b/zips/zip-0320.rst index 7d833ac12..0d87206ce 100644 --- a/zips/zip-0320.rst +++ b/zips/zip-0320.rst @@ -2,7 +2,7 @@ ZIP: 320 Title: Defining an Address Type to which funds can only be sent from Transparent Addresses - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Kris Nuttycombe Credits: Hanh Status: Active diff --git a/zips/zip-0321.rst b/zips/zip-0321.rst index 3df402db7..9be1a94de 100644 --- a/zips/zip-0321.rst +++ b/zips/zip-0321.rst @@ -2,8 +2,8 @@ ZIP: 321 Title: Payment Request URIs - Owners: Kris Nuttycombe - Daira-Emma Hopwood + Owners: Kris Nuttycombe + Daira-Emma Hopwood Credits: Francisco Gindre Status: Active Category: Standards / Wallet diff --git a/zips/zip-0322.rst b/zips/zip-0322.rst index adc37295f..1431bf27b 100644 --- a/zips/zip-0322.rst +++ b/zips/zip-0322.rst @@ -2,8 +2,8 @@ ZIP: 322 Title: Generic Signed Message Format - Owners: Jack Grigg - Daira-Emma Hopwood + Owners: Jack Grigg + Daira-Emma Hopwood Status: Reserved Category: Standards / RPC / Wallet Discussions-To: diff --git a/zips/zip-0323.rst b/zips/zip-0323.rst index 5e5465e6f..9bad3cc1d 100644 --- a/zips/zip-0323.rst +++ b/zips/zip-0323.rst @@ -2,8 +2,8 @@ ZIP: 323 Title: Specification of getblocktemplate for Zcash - Owners: Daira-Emma Hopwood - Jack Grigg + Owners: Daira-Emma Hopwood + Jack Grigg Status: Reserved Category: RPC / Mining Discussions-To: diff --git a/zips/zip-0324.rst b/zips/zip-0324.rst index babc95416..b339b85a4 100644 --- a/zips/zip-0324.rst +++ b/zips/zip-0324.rst @@ -2,9 +2,9 @@ ZIP: 324 Title: URI-Encapsulated Payments - Owners: Jack Grigg - Daira-Emma Hopwood - Kris Nuttycombe + Owners: Jack Grigg + Daira-Emma Hopwood + Kris Nuttycombe Original-Authors: Ian Miers Eran Tromer Jack Grigg diff --git a/zips/zip-0325.md b/zips/zip-0325.md index eae92c657..55c2ab1d6 100644 --- a/zips/zip-0325.md +++ b/zips/zip-0325.md @@ -1,9 +1,9 @@ ZIP: 325 Title: Account Metadata Keys - Owners: Jack Grigg - Daira-Emma Hopwood - Kris Nuttycombe + Owners: Jack Grigg + Daira-Emma Hopwood + Kris Nuttycombe Status: Draft Category: Standards / Wallet Created: 2025-02-18 diff --git a/zips/zip-0332.rst b/zips/zip-0332.rst index 27ee7e630..af71ca03d 100644 --- a/zips/zip-0332.rst +++ b/zips/zip-0332.rst @@ -2,8 +2,8 @@ ZIP: 332 Title: Wallet Recovery from zcashd HD Seeds - Owners: Kris Nuttycombe - Daira-Emma Hopwood + Owners: Kris Nuttycombe + Daira-Emma Hopwood Status: Reserved Category: Wallet Discussions-To: diff --git a/zips/zip-0339.rst b/zips/zip-0339.rst index aa1cb8bc6..bc5dd37d0 100644 --- a/zips/zip-0339.rst +++ b/zips/zip-0339.rst @@ -2,7 +2,7 @@ ZIP: 339 Title: Wallet Recovery Words - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Status: Reserved Category: Wallet Discussions-To: diff --git a/zips/zip-0401.rst b/zips/zip-0401.rst index c47f18f8e..d86663304 100644 --- a/zips/zip-0401.rst +++ b/zips/zip-0401.rst @@ -2,7 +2,7 @@ ZIP: 401 Title: Addressing Mempool Denial-of-Service - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Status: Active Category: Network Created: 2019-09-09 diff --git a/zips/zip-0416.rst b/zips/zip-0416.rst index f8ccc6911..eb15749bc 100644 --- a/zips/zip-0416.rst +++ b/zips/zip-0416.rst @@ -2,12 +2,9 @@ ZIP: 416 Title: Support for Unified Addresses in zcashd - Owners: Daira-Emma Hopwood - Jack Grigg - Sean Bowe - Kris Nuttycombe - Ying Tong Lai - Steven Smith + Owners: Daira-Emma Hopwood + Jack Grigg + Kris Nuttycombe Status: Reserved Category: RPC / Wallet Discussions-To: diff --git a/zips/zip-1014.rst b/zips/zip-1014.rst index f6934e1f5..196af14f1 100644 --- a/zips/zip-1014.rst +++ b/zips/zip-1014.rst @@ -3,7 +3,7 @@ ZIP: 1014 Title: Establishing a Dev Fund for ECC, ZF, and Major Grants Owners: Andrew Miller - Zooko Wilcox + Zooko Wilcox Original-Authors: Eran Tromer Credits: Matt Luongo @aristarchus diff --git a/zips/zip-2001.rst b/zips/zip-2001.rst index 091017f00..8554c26e7 100644 --- a/zips/zip-2001.rst +++ b/zips/zip-2001.rst @@ -3,8 +3,8 @@ ZIP: 2001 Title: Lockbox Funding Streams Owners: Kris Nuttycombe - Credits: Daira-Emma Hopwood - Jack Grigg + Credits: Daira-Emma Hopwood + Jack Grigg Status: Final Category: Consensus Created: 2024-07-02 diff --git a/zips/zip-2002.rst b/zips/zip-2002.rst index 803454e5c..0abbda89e 100644 --- a/zips/zip-2002.rst +++ b/zips/zip-2002.rst @@ -2,9 +2,9 @@ ZIP: 2002 Title: Explicit Fees - Owners: Daira-Emma Hopwood - Kris Nuttycombe - Jack Grigg + Owners: Daira-Emma Hopwood + Kris Nuttycombe + Jack Grigg Credits: Simon Liu Status: Draft Category: Consensus diff --git a/zips/zip-2003.rst b/zips/zip-2003.rst index 29b3c97d1..1648d51ff 100644 --- a/zips/zip-2003.rst +++ b/zips/zip-2003.rst @@ -2,7 +2,7 @@ ZIP: 2003 Title: Disallow version 4 transactions - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Status: Draft Category: Consensus License: MIT diff --git a/zips/zip-2004.rst b/zips/zip-2004.rst index ac5d6fe7f..3e1e71925 100644 --- a/zips/zip-2004.rst +++ b/zips/zip-2004.rst @@ -2,7 +2,7 @@ ZIP: 2004 Title: Remove the dependency of consensus on note encryption - Owners: Daira-Emma Hopwood + Owners: Daira-Emma Hopwood Status: Draft Category: Consensus Created: 2024-10-22 diff --git a/zips/zip-2005.md b/zips/zip-2005.md index d9c0ffb9e..241e18af1 100644 --- a/zips/zip-2005.md +++ b/zips/zip-2005.md @@ -1,8 +1,8 @@ ZIP: 2005 Title: Quantum Recoverability - Owners: Daira-Emma Hopwood - Jack Grigg + Owners: Daira-Emma Hopwood + Jack Grigg Credits: Sean Bowe Status: Draft Category: Consensus From af1110ee7861c75a5e627c4148b6271491ceca3b Mon Sep 17 00:00:00 2001 From: Daira-Emma Hopwood Date: Tue, 3 Feb 2026 02:31:53 +0000 Subject: [PATCH 20/50] Wording changes to reflect @str4d, @daira, and @nuttycom's move from Electric Coin Company. Signed-off-by: Daira-Emma Hopwood --- zips/zip-0000.rst | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/zips/zip-0000.rst b/zips/zip-0000.rst index 9e98c0e6b..efbe05be1 100644 --- a/zips/zip-0000.rst +++ b/zips/zip-0000.rst @@ -192,26 +192,27 @@ The current ZIP Editors are: * Mark Henderson and Sam H. Smith, associated with Shielded Labs. All can be reached at zips@z.cash. The current design of the ZIP Process -dictates that there are always at least two ZIP Editors: at least one -from the Electric Coin Company and at least one from the Zcash Foundation. +dictates that there are always at least two ZIP Editors, including at least +one from the Zcash Foundation. ZIP Editors MUST declare any potential or perceived conflict of interest they have relating to their responsibilities as ZIP Editors. Daira-Emma Hopwood declares a conflict of interest in acting as a ZIP Editor -and as the R&D Engineering Manager of Electric Coin Company, and will -endeavour to minimize the downsides of that confluence of roles as far as -possible. In particular, ze commits to stepping down from the ZIP Editor -role after the deployment of Zcash Shielded Assets, assuming ze is still -in a management role at ECC at that point. +and as Head of Research and Assurance at Znewco, Inc., and will endeavour +to minimize the downsides of that confluence of roles as far as possible. +In particular, ze commits to stepping down from the ZIP Editor role after +the deployment of Zcash Shielded Assets, assuming ze is still in a +management role at a company primarily involved with the development of +Zcash at that point. ZIP Editors MUST be publicly transparent about any external influence or constraints that have been placed or attempted to be placed on their -actions as ZIP Editors (including from the Electric Coin Company, -Zcash Foundation, Shielded Labs, or other organizations with which the -Editors are associated), whether or not it affects those actions. This -should not be interpreted as requiring ZIP Editors to reveal knowledge -of undisclosed security vulnerabilities or mitigations. +actions as ZIP Editors (including from Zcash Foundation, Shielded Labs, +or other organizations with which the Editors are associated), whether +or not it affects those actions. This should not be interpreted as +requiring ZIP Editors to reveal knowledge of undisclosed security +vulnerabilities or mitigations. Additional Editors may be selected, with their consent, by consensus among the current Editors. From 837c5900da860b5373a02e8c61bd5dac979a8f74 Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Tue, 10 Feb 2026 16:22:15 -0600 Subject: [PATCH 21/50] update: most recent plots --- static/assets/images/zip-0234-balance.png | Bin 71930 -> 71829 bytes .../assets/images/zip-0234-block_subsidy.png | Bin 26708 -> 112321 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/static/assets/images/zip-0234-balance.png b/static/assets/images/zip-0234-balance.png index 1f6f28169b5326d319d418d60d418123d0e475fc..131600add5feb4b731d0181cd3b82f503b7bf345 100644 GIT binary patch literal 71829 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 diff --git a/static/assets/images/zip-0234-block_subsidy.png b/static/assets/images/zip-0234-block_subsidy.png index 7dcb9b5c124a25a985b5ec98875a7505872a343a..cfc26c66a9d556297c787db53e3425e3448aa3ac 100644 GIT binary patch literal 112321 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

#BDyl`ZtN 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 Date: Thu, 5 Feb 2026 18:45:23 -0700 Subject: [PATCH 22/50] ZIP 204: Draft specification of the Zcash P2P network protocol Replaces the Reserved stub with a comprehensive specification covering message framing, connection handshake, all 19 message types, block and transaction relay, peer discovery, misbehavior scoring, and network upgrade peer management. All constants derived from the zcashd reference implementation. Co-Authored-By: Claude Opus 4.6 --- README.rst | 4 +- zips/zip-0204.rst | 1379 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 1380 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 1a92f05b6..53f690b36 100644 --- a/README.rst +++ b/README.rst @@ -167,7 +167,7 @@ written. 76 Transaction Signature Validation before Overwinter Reserved zips#130 112 CHECKSEQUENCEVERIFY Draft 113 Median Time Past as endpoint for lock-time calculations Draft - 204 Zcash P2P Network Protocol Reserved zips#352 + 204 Zcash P2P Network Protocol Draft zips#352 217 Aggregate Signatures Reserved zcash#2914 219 Disabling Addition of New Value to the Sapling Chain Value Pool Reserved zips#428 222 Transparent Zcash Extensions Draft @@ -286,7 +286,7 @@ Index of ZIPs 201 Network Peer Management for Overwinter Final 202 Version 3 Transaction Format for Overwinter Final 203 Transaction Expiry Final - 204 Zcash P2P Network Protocol Reserved + 204 Zcash P2P Network Protocol Draft 205 Deployment of the Sapling Network Upgrade Final 206 Deployment of the Blossom Network Upgrade Final 207 Funding Streams [Revision 0: Canopy, Revision 1: NU6] Final diff --git a/zips/zip-0204.rst b/zips/zip-0204.rst index 80e976d33..fb56b4672 100644 --- a/zips/zip-0204.rst +++ b/zips/zip-0204.rst @@ -3,6 +3,1383 @@ ZIP: 204 Title: Zcash P2P Network Protocol Owners: Daira-Emma Hopwood - Status: Reserved + Kris Nuttycombe + Status: Draft Category: Network + Created: 2026-02-05 + License: MIT Discussions-To: + + +Terminology +=========== + +The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "RECOMMENDED" in this +document are to be interpreted as described in BCP 14 [#BCP14]_ when, and only when, +they appear in all capitals. + +The terms "Mainnet" and "Testnet" are to be interpreted as described in section 3.12 of +the Zcash Protocol Specification. [#protocol-networks]_ + +The term "network upgrade" is to be interpreted as described in ZIP 200. [#zip-0200]_ + +The term "block chain" in this document is to be interpreted as described in section 3.3 +of the Zcash Protocol Specification. [#protocol-blockchain]_ + +peer + A network node that participates in the Zcash P2P protocol by maintaining one or more + TCP connections to other peers and exchanging protocol messages. + +connection + A TCP session between two peers over which P2P messages are exchanged. + +inbound connection + A connection that was initiated by the remote peer. + +outbound connection + A connection that was initiated by the local node. + +protocol version + A 32-bit integer identifying the set of protocol features supported by a node. Higher + values indicate support for more recent features. + + +Abstract +======== + +This ZIP specifies the Zcash peer-to-peer network protocol, including connection setup, +message framing, message types, and relay behavior. It is intended to be sufficient for +an implementor to build a conformant Zcash network peer. + + +Motivation +========== + +There is currently no single document that specifies the full Zcash P2P network +protocol. While Bitcoin protocol documentation exists, the Zcash protocol has diverged +in several significant ways: network magic bytes differ, protocol version numbers follow +an independent numbering scheme, inventory types include ``MSG_WTX`` [#zip-0239]_, +and network upgrade activation drives protocol versioning and peer management +[#zip-0200]_ [#zip-0201]_. + +This ZIP consolidates the protocol specification into a single normative reference, +enabling independent implementations and protocol analysis. + +This ZIP does not specify the encoding of transactions and blocks; for those, refer to +the Zcash Protocol Specification [#protocol-txnencoding]_ [#protocol-blockencoding]_. + + +Specification +============= + +Network Parameters +------------------ + +Magic Bytes +``````````` + +Each Zcash network is identified by a 4-byte magic value that appears at the start of +every protocol message. A node MUST reject messages whose magic bytes do not match the +expected network. + ++-----------+---------------------+ +| Network | Magic Bytes (hex) | ++===========+=====================+ +| Mainnet | ``24 e9 27 64`` | ++-----------+---------------------+ +| Testnet | ``fa 1a f9 bf`` | ++-----------+---------------------+ +| Regtest | ``aa e8 3f 5f`` | ++-----------+---------------------+ + +Default Ports +````````````` + ++-----------+----------------+ +| Network | Default Port | ++===========+================+ +| Mainnet | 8233 | ++-----------+----------------+ +| Testnet | 18233 | ++-----------+----------------+ +| Regtest | 18344 | ++-----------+----------------+ + +DNS Seeds +````````` + +The following DNS seed hostnames are used for initial peer discovery. + +**Mainnet:** + +- ``dnsseed.z.cash`` +- ``dnsseed.str4d.xyz`` +- ``mainnet.seeder.zfnd.org`` +- ``mainnet.is.yolo.money`` + +**Testnet:** + +- ``dnsseed.testnet.z.cash`` +- ``testnet.seeder.zfnd.org`` +- ``testnet.is.yolo.money`` + +Regtest does not use DNS seeds or hardcoded seed nodes. + + +Peer Discovery +-------------- + +A node discovers peers through the following mechanisms, in order of preference: + +1. **DNS seeding.** On startup, if the node's address manager is empty or if fewer + than 2 outbound connections have been established within 11 seconds, the node + queries the DNS seed hostnames listed above for A and AAAA records. Addresses + obtained from DNS seeds are added to the address manager with a random age of + 3–7 days. + +2. **Hardcoded seed nodes.** If DNS seeding fails or is insufficient, the node + falls back to a compiled-in list of seed node addresses (``SeedSpec6`` entries). + +3. **Address relay.** Connected peers exchange address information using ``addr`` and + ``getaddr`` messages (see `addr`_ and `getaddr`_). + + +Connection Handling +------------------- + +Transport +````````` + +All connections use unencrypted TCP. The protocol does not provide transport-layer +encryption or authentication. + +Connection Limits +````````````````` + +The zcashd reference implementation defaults to a maximum of 125 peer connections +(``DEFAULT_MAX_PEER_CONNECTIONS``), of which a maximum of 8 are outbound connections +(``MAX_OUTBOUND_CONNECTIONS``). Implementations MAY use different limits. + +Timeouts +```````` + +A node SHOULD disconnect a peer if no message has been received from that peer within +a reasonable timeout period. The zcashd reference implementation uses 1200 seconds +(20 minutes, ``TIMEOUT_INTERVAL``) for this purpose. Automatic ``ping`` messages (see +`ping`_) are sent periodically to keep connections alive and measure latency. + +Additional timeout rules: + +- A node SHOULD close the connection if a peer has not sent a ``version`` message + within a reasonable time after connection establishment. The zcashd reference + implementation uses 60 seconds. +- A node SHOULD close the connection if a peer has not responded to a ``ping`` with + a ``pong`` within a reasonable time. The zcashd reference implementation uses + 1200 seconds (20 minutes). + +Implementations MAY use different timeout values. The specific values above are from +the zcashd reference implementation; other implementations (e.g. Zebra) use +significantly shorter timeouts. + + +Message Framing +--------------- + +Every protocol message consists of a 24-byte header followed by a variable-length +payload. + +Message Header +`````````````` + ++--------+------+----------------+----------------------------------------------------+ +| Offset | Size | Field | Description | ++========+======+================+====================================================+ +| 0 | 4 | ``magic`` | Network magic bytes (see `Magic Bytes`_). | ++--------+------+----------------+----------------------------------------------------+ +| 4 | 12 | ``command`` | ASCII command string, NUL-padded to 12 bytes. | ++--------+------+----------------+----------------------------------------------------+ +| 16 | 4 | ``length`` | Payload size in bytes (``uint32``, little-endian). | ++--------+------+----------------+----------------------------------------------------+ +| 20 | 4 | ``checksum`` | First 4 bytes of ``SHA-256d(payload)``. | ++--------+------+----------------+----------------------------------------------------+ + +The total header size is 24 bytes. + +Command String Validation +````````````````````````` + +The ``command`` field MUST contain only printable ASCII characters (bytes in the range +``0x20`` to ``0x7E`` inclusive) up to the first NUL byte (``0x00``). After the first NUL +byte, all remaining bytes MUST be ``0x00``. A message that violates these constraints +MUST be rejected. + +Maximum Message Size +```````````````````` + +The maximum payload size is 2,097,152 bytes (2 MiB). A node MUST reject any message +whose ``length`` field exceeds this limit. + +Checksum Verification +````````````````````` + +The ``checksum`` field contains the first 4 bytes of the double-SHA-256 hash of the +payload: + + ``checksum = SHA-256(SHA-256(payload))[0..4]`` + +A node MUST verify the checksum after receiving the full payload and MUST reject the +message if the checksum does not match. + + +Data Types and Encoding +----------------------- + +All multi-byte integer types are encoded in little-endian byte order unless otherwise +specified. + +Integers +```````` + ++------------+------+------------------------------------------+ +| Type | Size | Description | ++============+======+==========================================+ +| ``uint8`` | 1 | Unsigned 8-bit integer. | ++------------+------+------------------------------------------+ +| ``uint16`` | 2 | Unsigned 16-bit integer, little-endian. | ++------------+------+------------------------------------------+ +| ``int32`` | 4 | Signed 32-bit integer, little-endian. | ++------------+------+------------------------------------------+ +| ``uint32`` | 4 | Unsigned 32-bit integer, little-endian. | ++------------+------+------------------------------------------+ +| ``int64`` | 8 | Signed 64-bit integer, little-endian. | ++------------+------+------------------------------------------+ +| ``uint64`` | 8 | Unsigned 64-bit integer, little-endian. | ++------------+------+------------------------------------------+ + +CompactSize +``````````` + +A variable-length unsigned integer encoding used for lengths and counts: + ++------------------------------------------+---------------+---------------------------------------------------+ +| Value Range | Encoding Size | Format | ++==========================================+===============+===================================================+ +| 0 to 252 | 1 byte | Single byte with the value directly. | ++------------------------------------------+---------------+---------------------------------------------------+ +| 253 to 0xFFFF | 3 bytes | ``0xFD`` followed by the value as ``uint16``. | ++------------------------------------------+---------------+---------------------------------------------------+ +| 0x10000 to 0xFFFFFFFF | 5 bytes | ``0xFE`` followed by the value as ``uint32``. | ++------------------------------------------+---------------+---------------------------------------------------+ +| 0x100000000 to 0xFFFFFFFFFFFFFFFF | 9 bytes | ``0xFF`` followed by the value as ``uint64``. | ++------------------------------------------+---------------+---------------------------------------------------+ + +Encodings MUST be canonical: the shortest possible encoding MUST be used for any given +value. A node MUST reject messages containing non-canonical CompactSize encodings. + +Strings +``````` + +Character strings are encoded as a CompactSize length prefix followed by that many bytes +of string data. There is no NUL terminator. + +Network Address (``CService``) +`````````````````````````````` + +A network address without associated metadata, as inherited from the Bitcoin protocol: + ++------+----------+--------------------------------------------------------------+ +| Size | Field | Description | ++======+==========+==============================================================+ +| 16 | ``ip`` | IPv6 address (or IPv4-mapped IPv6 address for IPv4 peers). | ++------+----------+--------------------------------------------------------------+ +| 2 | ``port`` | TCP port number (big-endian, i.e. network byte order). | ++------+----------+--------------------------------------------------------------+ + +IPv4 addresses are represented as IPv4-mapped IPv6 addresses: the first 12 bytes are +``00 00 00 00 00 00 00 00 00 00 FF FF`` followed by the 4-byte IPv4 address. + +Peer Address (``CAddress``) +``````````````````````````` + +A network address with associated metadata, used in ``version``, ``addr``, and other +messages: + ++------+--------------+-----------------------------------------------------+ +| Size | Field | Description | ++======+==============+=====================================================+ +| 8 | ``services`` | Bitfield of service flags (``uint64``, LE). | ++------+--------------+-----------------------------------------------------+ +| 16 | ``ip`` | IPv6 address (or IPv4-mapped IPv6). | ++------+--------------+-----------------------------------------------------+ +| 2 | ``port`` | TCP port number (big-endian). | ++------+--------------+-----------------------------------------------------+ + +When the protocol version is ≥ 31402 (``CADDR_TIME_VERSION``) and the address appears +in a context other than a ``version`` message, the encoding is preceded by a ``uint32`` +timestamp field: + ++------+--------------+-----------------------------------------------------+ +| Size | Field | Description | ++======+==============+=====================================================+ +| 4 | ``time`` | Unix timestamp when the node was last seen | +| | | (``uint32``, little-endian). | ++------+--------------+-----------------------------------------------------+ +| 8 | ``services`` | Bitfield of service flags (``uint64``, LE). | ++------+--------------+-----------------------------------------------------+ +| 16 | ``ip`` | IPv6 address (or IPv4-mapped IPv6). | ++------+--------------+-----------------------------------------------------+ +| 2 | ``port`` | TCP port number (big-endian). | ++------+--------------+-----------------------------------------------------+ + + +Service Flags +------------- + +Service flags are advertised in the ``services`` field of ``version`` messages and +``CAddress`` structures. + ++------------------+-----+------------------------------------------------------+ +| Name | Bit | Description | ++==================+=====+======================================================+ +| ``NODE_NETWORK`` | 0 | The node is capable of serving the complete block | +| | | chain. | ++------------------+-----+------------------------------------------------------+ +| ``NODE_BLOOM`` | 2 | The node supports bloom-filtered connections | +| | | (BIP 37 [#bip-0037]_). Zcash nodes used to support | +| | | this by default without advertising the bit, but no | +| | | longer do as of protocol version 170004 | +| | | (``NO_BLOOM_VERSION``). | ++------------------+-----+------------------------------------------------------+ + +Bits 24–31 are reserved for temporary experiments. + + +Inventory Vectors +----------------- + +Inventory vectors identify objects (transactions and blocks) for relay. The format +depends on the type: + ++------------------------+------+------------+-------------------------------------------+ +| Type | Code | Entry Size | Description | ++========================+======+============+===========================================+ +| ``MSG_TX`` | 1 | 36 bytes | Transaction identified by txid. | +| | | | 4-byte type code + 32-byte txid. | ++------------------------+------+------------+-------------------------------------------+ +| ``MSG_BLOCK`` | 2 | 36 bytes | Block identified by block hash. | +| | | | 4-byte type code + 32-byte block hash. | ++------------------------+------+------------+-------------------------------------------+ +| ``MSG_FILTERED_BLOCK`` | 3 | 36 bytes | Filtered block (``getdata`` only). | +| | | | 4-byte type code + 32-byte block hash. | ++------------------------+------+------------+-------------------------------------------+ +| ``MSG_WTX`` | 5 | 68 bytes | Transaction identified by wtxid. | +| | | | 4-byte type code + 32-byte txid + | +| | | | 32-byte authorizing data commitment | +| | | | (``auth_digest``). Requires negotiated | +| | | | protocol version ≥ 170014 | +| | | | (``CINV_WTX_VERSION``). | +| | | | See ZIP 239 [#zip-0239]_. | ++------------------------+------+------------+-------------------------------------------+ + +Because ``MSG_TX`` and ``MSG_WTX`` entries have different sizes (36 and 68 bytes +respectively), they may be mixed in a single ``inv`` or ``getdata`` message. The total +message size is therefore not determined solely by the entry count and MUST be determined +by parsing each entry individually. + +A node MUST reject inventory vectors with unrecognized type codes. A node MUST reject +``MSG_WTX`` inventory vectors if the negotiated protocol version is less than 170014. + + +Connection Handshake +-------------------- + +Peers perform a version handshake immediately upon establishing a TCP connection. + +Handshake Sequence +`````````````````` + +1. The initiating (outbound) peer sends a ``version`` message. +2. The receiving (inbound) peer sends its own ``version`` message. +3. Each peer, upon receiving a valid ``version`` message, responds with a ``verack`` + message. +4. The negotiated protocol version is ``min(local_version, remote_version)``. + +A peer MUST NOT send any message other than ``version`` before receiving the remote +peer's ``version`` message. A peer MUST NOT send any message other than ``verack`` after +sending its ``version`` and before receiving the remote peer's ``verack``. + +Version Message +``````````````` + +The ``version`` message payload has the following format: + ++--------+---------+------------------+------------------------------------------------+ +| Offset | Size | Field | Description | ++========+=========+==================+================================================+ +| 0 | 4 | ``version`` | Protocol version (``int32``). | ++--------+---------+------------------+------------------------------------------------+ +| 4 | 8 | ``services`` | Bitfield of service flags (``uint64``). | ++--------+---------+------------------+------------------------------------------------+ +| 12 | 8 | ``timestamp`` | Unix epoch time (``int64``). | ++--------+---------+------------------+------------------------------------------------+ +| 20 | 26 | ``addr_recv`` | Address of the receiving node (``CAddress`` | +| | | | without ``time`` field). | ++--------+---------+------------------+------------------------------------------------+ +| 46 | 26 | ``addr_from`` | Address of the sending node (``CAddress`` | +| | | | without ``time`` field). | ++--------+---------+------------------+------------------------------------------------+ +| 72 | 8 | ``nonce`` | Random nonce for self-connection detection | +| | | | (``uint64``). | ++--------+---------+------------------+------------------------------------------------+ +| 80 | varies | ``user_agent`` | User agent string (CompactSize-prefixed, | +| | | | max 256 bytes). | ++--------+---------+------------------+------------------------------------------------+ +| varies | 4 | ``start_height`` | Best block height known to the sender | +| | | | (``int32``). | ++--------+---------+------------------+------------------------------------------------+ +| varies | 1 | ``relay`` | Whether the sender wants transaction relay | +| | | | (``bool``). | ++--------+---------+------------------+------------------------------------------------+ + +The ``addr_recv`` and ``addr_from`` fields use the ``CAddress`` encoding *without* +the ``time`` field, regardless of the protocol version being negotiated. + +The ``nonce`` field is used for self-connection detection. If a node receives a +``version`` message containing its own nonce, it MUST close the connection. + +The ``user_agent`` string MUST NOT exceed 256 bytes. A node SHOULD disconnect peers +that send a longer user agent. + +Version Validation +`````````````````` + +A receiving node MUST validate the ``version`` message as follows: + +- The ``version`` field MUST be at least 170002 (``MIN_PEER_PROTO_VERSION``). +- On Testnet, the ``version`` field MUST be at least 170040 + (``MIN_TESTNET_PEER_PROTO_VERSION``). +- The ``version`` field MUST be at least the protocol version associated with + the current network epoch (see `Network Upgrade Peer Management`_). +- The ``nonce`` MUST NOT match the local node's nonce (self-connection detection). +- A peer MUST NOT send more than one ``version`` message per connection. Duplicate + ``version`` messages incur a misbehavior penalty. + +If any of these checks fail, the node MUST disconnect the peer. A ``reject`` message +with code ``REJECT_OBSOLETE`` (``0x11``) SHOULD be sent before disconnecting for +version-related failures. + + +Protocol Versioning +------------------- + +Protocol versions are 32-bit integers. The following versions are significant: + ++---------+-------------------------------------+------------------------------------------+ +| Version | Constant | Significance | ++=========+=====================================+==========================================+ +| 209 | ``INIT_PROTO_VERSION`` | Initial protocol version. Used as the | +| | | serialization version before the | +| | | ``version``/``verack`` handshake | +| | | completes. | ++---------+-------------------------------------+------------------------------------------+ +| 31402 | ``CADDR_TIME_VERSION`` | Adds the ``time`` field to ``CAddress`` | +| | | in ``addr`` messages. Also affects | +| | | encoding of the ``addr_from`` field in | +| | | ``version`` messages. | ++---------+-------------------------------------+------------------------------------------+ +| 60000 | ``BIP0031_VERSION`` | ``ping`` messages include a ``uint64`` | +| | | nonce and expect a ``pong`` response. | +| | | For protocol versions ≤ 60000, ``ping`` | +| | | has an empty payload. | ++---------+-------------------------------------+------------------------------------------+ +| 170002 | ``MIN_PEER_PROTO_VERSION`` | Minimum protocol version for Mainnet | +| | | peers. | ++---------+-------------------------------------+------------------------------------------+ +| 170004 | ``NO_BLOOM_VERSION`` | Bloom filter commands (``filterload``, | +| | | ``filteradd``, ``filterclear``) are | +| | | disabled unless the node advertises | +| | | ``NODE_BLOOM``. | ++---------+-------------------------------------+------------------------------------------+ +| 170014 | ``CINV_WTX_VERSION`` | Adds ``MSG_WTX`` inventory type for v5 | +| | | transaction relay. See ZIP 239 | +| | | [#zip-0239]_. | ++---------+-------------------------------------+------------------------------------------+ +| 170040 | ``MIN_TESTNET_PEER_PROTO_VERSION`` | Minimum protocol version for Testnet | +| | | peers. | ++---------+-------------------------------------+------------------------------------------+ +| 170140 | ``PROTOCOL_VERSION`` | Current protocol version. | ++---------+-------------------------------------+------------------------------------------+ + +Network Upgrade Epoch Enforcement +````````````````````````````````` + +Each network upgrade defines a minimum protocol version. When a network upgrade activates +(as defined in ZIP 200 [#zip-0200]_), a node MUST disconnect any peer whose negotiated +protocol version is less than the protocol version associated with the current epoch. +The node SHOULD send a ``reject`` message with code ``REJECT_OBSOLETE`` (``0x11``) +before disconnecting. + +The following protocol versions are associated with network upgrades on Mainnet: + ++-------------------+------------------+-------------------+ +| Network Upgrade | Protocol Version | Activation Height | ++===================+==================+===================+ +| Sprout | 170002 | (always active) | ++-------------------+------------------+-------------------+ +| Overwinter | 170005 | 347,500 | ++-------------------+------------------+-------------------+ +| Sapling | 170007 | 419,200 | ++-------------------+------------------+-------------------+ +| Blossom | 170009 | 653,600 | ++-------------------+------------------+-------------------+ +| Heartwood | 170011 | 903,000 | ++-------------------+------------------+-------------------+ +| Canopy | 170013 | 1,046,400 | ++-------------------+------------------+-------------------+ +| NU5 | 170100 | 1,687,104 | ++-------------------+------------------+-------------------+ +| NU6 | 170120 | 2,726,400 | ++-------------------+------------------+-------------------+ +| NU6.1 | 170140 | 3,146,400 | ++-------------------+------------------+-------------------+ + +The following protocol versions are associated with network upgrades on Testnet: + ++-------------------+------------------+-------------------+ +| Network Upgrade | Protocol Version | Activation Height | ++===================+==================+===================+ +| Sprout | 170002 | (always active) | ++-------------------+------------------+-------------------+ +| Overwinter | 170003 | 207,500 | ++-------------------+------------------+-------------------+ +| Sapling | 170007 | 280,000 | ++-------------------+------------------+-------------------+ +| Blossom | 170008 | 584,000 | ++-------------------+------------------+-------------------+ +| Heartwood | 170010 | 903,800 | ++-------------------+------------------+-------------------+ +| Canopy | 170012 | 1,028,500 | ++-------------------+------------------+-------------------+ +| NU5 | 170050 | 1,842,420 | ++-------------------+------------------+-------------------+ +| NU6 | 170110 | 2,976,000 | ++-------------------+------------------+-------------------+ +| NU6.1 | 170130 | 3,536,500 | ++-------------------+------------------+-------------------+ + +Note that testnet protocol versions differ from mainnet for several upgrades +(Overwinter, Blossom, Heartwood, Canopy, NU5, NU6, and NU6.1). + + +Message Types +------------- + +This section defines each protocol message. For each message, the command string, +direction, payload format, and semantics are specified. + +Control Messages +```````````````` + +.. _version-message: + +``version`` +''''''''''' + +:Command: ``version`` +:Direction: Both (sent by each side during handshake) +:Payload: See `Version Message`_. + +Initiates the connection handshake. The details of this message are specified in +`Connection Handshake`_. + + +.. _verack-message: + +``verack`` +'''''''''' + +:Command: ``verack`` +:Direction: Both +:Payload: Empty (0 bytes). + +Acknowledges receipt of a ``version`` message. After exchanging ``version`` and +``verack`` messages, the connection is considered established. + + +.. _ping-message: + +``ping`` +'''''''' + +:Command: ``ping`` +:Direction: Both +:Payload: + + +------+-----------+-----------------------------------+ + | Size | Field | Description | + +======+===========+===================================+ + | 8 | ``nonce`` | Random value (``uint64``). | + +------+-----------+-----------------------------------+ + +Sent periodically to measure latency and detect dead connections. The zcashd reference +implementation sends ``ping`` messages every 120 seconds (``PING_INTERVAL``). +The receiving node MUST respond with a ``pong`` message containing the same nonce. + +.. note:: + + Historically (BIP 31 [#bip-0031]_), ``ping`` messages had an empty payload for + protocol versions ≤ 60000 (``BIP0031_VERSION``). Since the minimum Zcash peer + protocol version is 170002 (``MIN_PEER_PROTO_VERSION``), well above this threshold, + all conformant Zcash peers use the nonce-bearing format. The empty-payload variant + will never be encountered on the Zcash network. + + +.. _pong-message: + +``pong`` +'''''''' + +:Command: ``pong`` +:Direction: Both +:Payload: + + +------+-----------+------------------------------------------------------+ + | Size | Field | Description | + +======+===========+======================================================+ + | 8 | ``nonce`` | The nonce from the corresponding ``ping`` message | + | | | (``uint64``). | + +------+-----------+------------------------------------------------------+ + +Sent in response to a ``ping``. The ``nonce`` MUST match the ``nonce`` from the ``ping`` +that is being responded to. + + +.. _reject-message: + +``reject`` +'''''''''' + +:Command: ``reject`` +:Direction: Both +:Payload: + + +---------+-------------+---------------------------------------------------+ + | Size | Field | Description | + +=========+=============+===================================================+ + | varies | ``message`` | The command string of the rejected message | + | | | (CompactSize-prefixed string). | + +---------+-------------+---------------------------------------------------+ + | 1 | ``ccode`` | Reject code (``uint8``). See `Reject Codes`_. | + +---------+-------------+---------------------------------------------------+ + | varies | ``reason`` | Human-readable rejection reason | + | | | (CompactSize-prefixed string). | + +---------+-------------+---------------------------------------------------+ + | 0 or 32 | ``data`` | Optional. For ``tx`` and ``block`` rejections, | + | | | the 32-byte hash of the rejected object. | + +---------+-------------+---------------------------------------------------+ + +Notifies the peer of a rejected message. This message is informational; receipt of a +``reject`` message does not require any specific action by the receiving node. + + +.. _alert-message: + +``alert`` +''''''''' + +:Command: ``alert`` +:Direction: Both +:Payload: + + +---------+---------------+--------------------------------------------------+ + | Size | Field | Description | + +=========+===============+==================================================+ + | varies | ``payload`` | Serialized alert data (CompactSize-prefixed | + | | | byte vector). | + +---------+---------------+--------------------------------------------------+ + | varies | ``signature`` | ECDSA signature over the payload | + | | | (CompactSize-prefixed byte vector). | + +---------+---------------+--------------------------------------------------+ + + The serialized alert data contains: + + +---------+------------------+------------------------------------------------+ + | Size | Field | Description | + +=========+==================+================================================+ + | 4 | ``version`` | Alert format version (``int32``). | + +---------+------------------+------------------------------------------------+ + | 8 | ``relay_until`` | Timestamp after which nodes should stop | + | | | relaying (``int64``). | + +---------+------------------+------------------------------------------------+ + | 8 | ``expiration`` | Timestamp after which the alert is no longer | + | | | in effect (``int64``). | + +---------+------------------+------------------------------------------------+ + | 4 | ``id`` | Unique alert identifier (``int32``). | + +---------+------------------+------------------------------------------------+ + | 4 | ``cancel`` | ID of a previous alert to cancel (``int32``). | + +---------+------------------+------------------------------------------------+ + | varies | ``set_cancel`` | Set of alert IDs to cancel | + | | | (CompactSize-prefixed vector of ``int32``). | + +---------+------------------+------------------------------------------------+ + | 4 | ``min_ver`` | Minimum applicable client version (``int32``). | + +---------+------------------+------------------------------------------------+ + | 4 | ``max_ver`` | Maximum applicable client version (``int32``). | + +---------+------------------+------------------------------------------------+ + | varies | ``set_sub_ver`` | Set of applicable user agent substrings | + | | | (CompactSize-prefixed vector of strings). | + +---------+------------------+------------------------------------------------+ + | 4 | ``priority`` | Alert priority (``int32``). | + +---------+------------------+------------------------------------------------+ + | varies | ``comment`` | Comment for operators (CompactSize-prefixed | + | | | string, max 65536 bytes). | + +---------+------------------+------------------------------------------------+ + | varies | ``status_bar`` | Status bar message (CompactSize-prefixed | + | | | string, max 256 bytes). | + +---------+------------------+------------------------------------------------+ + | varies | ``rpc_error`` | RPC error message (CompactSize-prefixed | + | | | string, max 256 bytes). | + +---------+------------------+------------------------------------------------+ + +The ``alert`` message is deprecated. It is documented here for completeness, as it +remains part of the zcashd implementation, but implementations MAY choose not to +support it. Nodes that do support ``alert`` messages SHOULD validate the alert +signature against the network's alert public key before processing or relaying alerts. + + +Address Messages +```````````````` + +.. _addr-message: + +``addr`` +'''''''' + +:Command: ``addr`` +:Direction: Both +:Payload: + + +---------+---------------+------------------------------------------------+ + | Size | Field | Description | + +=========+===============+================================================+ + | varies | ``count`` | Number of addresses (CompactSize). | + +---------+---------------+------------------------------------------------+ + | varies | ``addr_list`` | List of ``CAddress`` entries (with ``time`` | + | | | field). | + +---------+---------------+------------------------------------------------+ + +The ``count`` MUST NOT exceed 1000. A node receiving an ``addr`` message with more than +1000 entries MUST assign a misbehavior penalty of 20 points to the sending peer. + + +.. _getaddr-message: + +``getaddr`` +''''''''''' + +:Command: ``getaddr`` +:Direction: Both (but typically only sent to inbound peers) +:Payload: Empty (0 bytes). + +Requests peer addresses from the remote node. The remote node responds by sending one or +more ``addr`` messages. A node SHOULD only send ``getaddr`` once per connection, and +SHOULD only process ``getaddr`` from inbound peers to prevent address-based fingerprinting +attacks. + + +.. _addrv2-message: + +``addrv2`` +'''''''''' + +:Command: ``addrv2`` +:Direction: Both +:Payload: + + +---------+---------------+------------------------------------------------+ + | Size | Field | Description | + +=========+===============+================================================+ + | varies | ``count`` | Number of addresses (CompactSize). | + +---------+---------------+------------------------------------------------+ + | varies | ``addr_list`` | List of address entries in ``addrv2`` format | + | | | (see below). | + +---------+---------------+------------------------------------------------+ + +Each address entry has the following format: + + +---------+---------------+------------------------------------------------+ + | Size | Field | Description | + +=========+===============+================================================+ + | 4 | ``time`` | Unix timestamp when the node was last seen | + | | | (``uint32``, little-endian). | + +---------+---------------+------------------------------------------------+ + | varies | ``services`` | Service bits (CompactSize-encoded ``uint64``). | + +---------+---------------+------------------------------------------------+ + | 1 | ``networkID`` | Network identifier (``uint8``). | + +---------+---------------+------------------------------------------------+ + | varies | ``sizeAddr`` | Length of ``addr`` in bytes (CompactSize). | + +---------+---------------+------------------------------------------------+ + | varies | ``addr`` | Network address (``sizeAddr`` bytes). | + | | | Interpretation depends on ``networkID``. | + +---------+---------------+------------------------------------------------+ + | 2 | ``port`` | Network port (``uint16``, big-endian). MUST | + | | | be 0 if not relevant for the network. | + +---------+---------------+------------------------------------------------+ + +The ``count`` MUST NOT exceed 1000. A node MUST reject messages with more than 1000 +addresses. + +The ``addr`` field MUST NOT exceed 512 bytes. A node MUST reject messages with a longer +``addr`` field, irrespective of the network ID. + +The ``services`` field is encoded as a CompactSize, unlike the fixed 8-byte ``uint64`` +encoding used in ``addr`` messages. This makes the common case (few service bits) more +compact. + +The following network IDs are defined: + + +------------+-------------+--------------+-------------------------------------+ + | Network ID | Name | Address Size | Description | + +============+=============+==============+=====================================+ + | ``0x01`` | ``IPV4`` | 4 bytes | IPv4 address. | + +------------+-------------+--------------+-------------------------------------+ + | ``0x02`` | ``IPV6`` | 16 bytes | IPv6 address. | + +------------+-------------+--------------+-------------------------------------+ + | ``0x04`` | ``TORV3`` | 32 bytes | Tor v3 onion service address | + | | | | (Ed25519 public key). | + +------------+-------------+--------------+-------------------------------------+ + | ``0x05`` | ``I2P`` | 32 bytes | I2P overlay network address | + | | | | (SHA-256 hash). | + +------------+-------------+--------------+-------------------------------------+ + | ``0x06`` | ``CJDNS`` | 16 bytes | Cjdns overlay network address | + | | | | (IPv6 in ``fc00::/8``). | + +------------+-------------+--------------+-------------------------------------+ + +Network ID ``0x03`` is reserved (it was assigned to Tor v2 in BIP 155 [#bip-0155]_, but +Tor v2 addresses are no longer supported and MUST NOT be used). + +A node MUST reject addresses whose length does not match the expected length for the +given network ID. A node MUST NOT gossip addresses with unrecognized network IDs. + +``IPV4`` and ``IPV6`` addresses are encoded in network byte order (big-endian). ``TORV3`` +addresses consist of the 32-byte Ed25519 master public key of the onion service. +``I2P`` addresses consist of the decoded 32-byte SHA-256 hash. ``CJDNS`` addresses are +16-byte IPv6 addresses in the ``fc00::/8`` range, encoded in network byte order. + +**Deployment:** Unlike BIP 155 [#bip-0155]_, which uses a ``sendaddrv2`` handshake +message, Zcash signals ``addrv2`` support through protocol version negotiation, as +specified in ZIP 155 [#zip-0155]_. The deployment version has not yet been assigned. +A node MUST NOT send ``addrv2`` messages on connections where the negotiated protocol +version is below the deployment threshold. A node that supports ``addrv2`` MAY still +send ``addr`` messages on any connection. + +The full specification of the ``addrv2`` message, including network address encoding +details, is given in ZIP 155 [#zip-0155]_. + + +Inventory Messages +`````````````````` + +.. _inv-message: + +``inv`` +''''''' + +:Command: ``inv`` +:Direction: Both +:Payload: + + +---------+---------------+------------------------------------------------+ + | Size | Field | Description | + +=========+===============+================================================+ + | varies | ``count`` | Number of inventory vectors (CompactSize). | + +---------+---------------+------------------------------------------------+ + | varies | ``inventory`` | List of inventory vectors (see | + | | | `Inventory Vectors`_). | + +---------+---------------+------------------------------------------------+ + +Announces one or more objects (transactions or blocks) that the sender has available. +The ``count`` MUST NOT exceed 50,000. A node receiving an ``inv`` message with more than +50,000 entries MUST assign a misbehavior penalty of 20 points. + + +.. _getdata-message: + +``getdata`` +''''''''''' + +:Command: ``getdata`` +:Direction: Both +:Payload: + + +---------+---------------+------------------------------------------------+ + | Size | Field | Description | + +=========+===============+================================================+ + | varies | ``count`` | Number of inventory vectors (CompactSize). | + +---------+---------------+------------------------------------------------+ + | varies | ``inventory`` | List of inventory vectors (see | + | | | `Inventory Vectors`_). | + +---------+---------------+------------------------------------------------+ + +Requests one or more objects from the remote peer. The ``count`` MUST NOT exceed 50,000. +A node receiving a ``getdata`` message with more than 50,000 entries MUST assign a +misbehavior penalty of 20 points. + +If the requested object is not available, the receiving node SHOULD respond with a +``notfound`` message. + + +.. _notfound-message: + +``notfound`` +'''''''''''' + +:Command: ``notfound`` +:Direction: Both +:Payload: + + +---------+---------------+------------------------------------------------+ + | Size | Field | Description | + +=========+===============+================================================+ + | varies | ``count`` | Number of inventory vectors (CompactSize). | + +---------+---------------+------------------------------------------------+ + | varies | ``inventory`` | List of inventory vectors identifying objects | + | | | not found. | + +---------+---------------+------------------------------------------------+ + +Sent in response to a ``getdata`` message for objects that the node does not have. + + +Block Messages +`````````````` + +.. _getblocks-message: + +``getblocks`` +''''''''''''' + +:Command: ``getblocks`` +:Direction: Both +:Payload: + + +---------+---------------------------+------------------------------------------+ + | Size | Field | Description | + +=========+===========================+==========================================+ + | 4 | ``version`` | Protocol version (``uint32``). | + +---------+---------------------------+------------------------------------------+ + | varies | ``block_locator_count`` | Number of block locator hashes | + | | | (CompactSize). | + +---------+---------------------------+------------------------------------------+ + | varies | ``block_locator_hashes`` | Block locator hashes (each 32 bytes), | + | | | from highest to lowest height. | + +---------+---------------------------+------------------------------------------+ + | 32 | ``hash_stop`` | Hash of the last desired block, or all | + | | | zeros to request as many as possible. | + +---------+---------------------------+------------------------------------------+ + +Requests an ``inv`` message containing block hashes starting after the first block +locator hash found in the responder's best chain, up to ``hash_stop`` or 500 blocks, +whichever comes first. + + +.. _getheaders-message: + +``getheaders`` +'''''''''''''' + +:Command: ``getheaders`` +:Direction: Both +:Payload: + + +---------+---------------------------+------------------------------------------+ + | Size | Field | Description | + +=========+===========================+==========================================+ + | 4 | ``version`` | Protocol version (``uint32``). | + +---------+---------------------------+------------------------------------------+ + | varies | ``block_locator_count`` | Number of block locator hashes | + | | | (CompactSize). | + +---------+---------------------------+------------------------------------------+ + | varies | ``block_locator_hashes`` | Block locator hashes (each 32 bytes), | + | | | from highest to lowest height. | + +---------+---------------------------+------------------------------------------+ + | 32 | ``hash_stop`` | Hash of the last desired header, or all | + | | | zeros to request as many as possible. | + +---------+---------------------------+------------------------------------------+ + +Requests a ``headers`` message containing block headers starting after the first +block locator hash found in the responder's best chain. A node MUST return at most +160 headers (``MAX_HEADERS_RESULTS``). + + +.. _headers-message: + +``headers`` +''''''''''' + +:Command: ``headers`` +:Direction: Both +:Payload: + + +---------+-------------+---------------------------------------------------+ + | Size | Field | Description | + +=========+=============+===================================================+ + | varies | ``count`` | Number of headers (CompactSize). | + +---------+-------------+---------------------------------------------------+ + | varies | ``headers`` | Block headers. Each header is followed by a | + | | | transaction count field (CompactSize, always 0 in | + | | | ``headers`` messages). | + +---------+-------------+---------------------------------------------------+ + +The ``count`` MUST NOT exceed 160. The headers MUST form a contiguous chain +(each header's ``hashPrevBlock`` must match the hash of the preceding header). A +node receiving non-contiguous headers MUST assign a misbehavior penalty of 20 points. + +For the encoding of block headers, see the Zcash Protocol Specification +[#protocol-blockheader]_. + + +.. _block-message: + +``block`` +''''''''' + +:Command: ``block`` +:Direction: Both +:Payload: A single serialized block. + +Sent in response to a ``getdata`` request for a ``MSG_BLOCK`` inventory entry. For the +encoding of blocks, see the Zcash Protocol Specification [#protocol-blockencoding]_. + + +Transaction Messages +```````````````````` + +.. _tx-message: + +``tx`` +'''''' + +:Command: ``tx`` +:Direction: Both +:Payload: A single serialized transaction. + +Sent in response to a ``getdata`` request for a ``MSG_TX`` or ``MSG_WTX`` inventory +entry. For the encoding of transactions, see the Zcash Protocol Specification +[#protocol-txnencoding]_. + + +Bloom Filter Messages +````````````````````` + +These messages implement BIP 37 [#bip-0037]_ bloom filtering. As of protocol version +170004, a node MUST NOT send bloom filter commands to a peer that does not advertise +``NODE_BLOOM`` in its service flags. Sending bloom filter commands to a peer that does +not advertise ``NODE_BLOOM`` incurs a misbehavior penalty of 100 points (immediate ban). + +.. _filterload-message: + +``filterload`` +'''''''''''''' + +:Command: ``filterload`` +:Direction: Both +:Payload: A serialized bloom filter, as defined in BIP 37 [#bip-0037]_. + +Sets a bloom filter on the connection. After a filter is set, the peer will only relay +transactions that match the filter. + + +.. _filteradd-message: + +``filteradd`` +''''''''''''' + +:Command: ``filteradd`` +:Direction: Both +:Payload: + + +---------+----------+------------------------------------------------------+ + | Size | Field | Description | + +=========+==========+======================================================+ + | varies | ``data`` | Element to add to the bloom filter | + | | | (CompactSize-prefixed, max 520 bytes). | + +---------+----------+------------------------------------------------------+ + +Adds an element to the existing bloom filter. The data MUST NOT exceed 520 bytes. A node +receiving data exceeding 520 bytes MUST assign a misbehavior penalty of 100 points. + + +.. _filterclear-message: + +``filterclear`` +''''''''''''''' + +:Command: ``filterclear`` +:Direction: Both +:Payload: Empty (0 bytes). + +Removes the bloom filter from the connection. Transaction relay resumes normally. + + +Memory Pool +``````````` + +.. _mempool-message: + +``mempool`` +''''''''''' + +:Command: ``mempool`` +:Direction: Both +:Payload: Empty (0 bytes). + +Requests the contents of the peer's transaction memory pool. The peer responds by sending +one or more ``inv`` messages listing the transactions in its mempool. + + +Block Relay +----------- + +Headers-First Synchronization +````````````````````````````` + +Nodes synchronize the block chain using a headers-first approach: + +1. The synchronizing node sends a ``getheaders`` message with a block locator. +2. The remote peer responds with a ``headers`` message containing up to 160 headers. +3. The synchronizing node validates the headers and requests full blocks via ``getdata`` + with ``MSG_BLOCK`` inventory entries. +4. Steps 1–3 repeat until the node is synchronized with the network. + +Block Download Parameters +````````````````````````` + +- **Download window:** A node SHOULD NOT request blocks more than 1024 blocks ahead + of its current validated tip (``BLOCK_DOWNLOAD_WINDOW``). +- **Per-peer limit:** A node SHOULD NOT have more than 16 blocks in transit from a + single peer simultaneously (``MAX_BLOCKS_IN_TRANSIT_PER_PEER``). +- **Stalling timeout:** If a peer has not delivered a requested block within 2 seconds + (``BLOCK_STALLING_TIMEOUT``) and there are other peers available with the same + block, the node MAY request the block from an alternative peer. +- **Maximum headers per response:** 160 (``MAX_HEADERS_RESULTS``). + +Block Announcement +`````````````````` + +Blocks are announced immediately via ``inv`` messages; they are not subject to the +trickling delay applied to transactions. + + +Transaction Relay +----------------- + +Inventory-Based Relay +````````````````````` + +Transaction relay follows an inventory-based protocol: + +1. A node with a new transaction sends an ``inv`` message to its peers. +2. Peers that want the transaction respond with a ``getdata`` message. +3. The originating node sends the transaction in a ``tx`` message. + +Transactions with version ≤ 4 are announced using ``MSG_TX`` inventory vectors. +Transactions with version ≥ 5 MUST be announced using ``MSG_WTX`` inventory vectors, as +specified in ZIP 239 [#zip-0239]_. + +Trickling +````````` + +To prevent network topology inference, transaction inventory SHOULD NOT be sent +immediately but SHOULD instead be "trickled" at random intervals. The specific +trickling parameters are implementation-defined. The zcashd reference implementation +uses the following values: + +- The average broadcast interval is 5 seconds (``INVENTORY_BROADCAST_INTERVAL``). +- For outbound peers, the effective interval is halved via integer right-shift + (``5 >> 1 = 2`` seconds on average). +- At most 35 inventory entries (``INVENTORY_BROADCAST_MAX``) are sent per trickle + interval. +- Broadcast times follow a Poisson distribution centered on the broadcast interval. + +Transaction Expiry +`````````````````` + +A node SHOULD NOT relay a transaction that will expire within 3 blocks of the current +chain tip (``TX_EXPIRING_SOON_THRESHOLD``). + +Orphan Transactions +``````````````````` + +An orphan transaction is one that references inputs from unknown parent transactions. + +- A node SHOULD store at most 100 orphan transactions + (``DEFAULT_MAX_ORPHAN_TRANSACTIONS``). +- Orphan transactions expire and are removed after 1200 seconds (20 minutes, + ``ORPHAN_TX_EXPIRE_TIME``). Expiration checks occur at most every 300 seconds + (5 minutes, ``ORPHAN_TX_EXPIRE_INTERVAL``). +- Only transactions without shielded components (no JoinSplit descriptions, no Sapling + bundle, no Orchard bundle) are eligible for orphan storage. +- When the orphan pool is full, the oldest orphan transactions are evicted. + +Relay Fee +````````` + +Transactions are subject to a minimum relay fee of 100 zatoshis per 1000 bytes +(``DEFAULT_MIN_RELAY_TX_FEE``). A node SHOULD NOT relay transactions with fees below +this threshold. + + +Address Relay +------------- + +Address relay allows nodes to discover peers by propagating ``CAddress`` records through +the network. + +Rate Limiting +````````````` + +Address records SHOULD be subject to rate limiting to prevent address flooding. The +specific rate limiting mechanism is implementation-defined. The zcashd reference +implementation uses a token bucket algorithm: + +- Rate: 0.1 address records per second per peer (``MAX_ADDR_RATE_PER_SECOND``). +- Bucket capacity: 1000 (``MAX_ADDR_PROCESSING_TOKEN_BUCKET``), replenished at 0.1 + tokens per second. +- Upon receiving a ``getaddr`` response, 1000 tokens (``MAX_ADDR_TO_SEND``) are added + to the bucket, exempt from the soft limit. +- Whitelisted peers bypass address rate limiting. + +Address Broadcasting +```````````````````` + +The specific broadcast intervals are implementation-defined. The zcashd reference +implementation uses the following values: + +- Addresses are broadcast to peers at an average interval of 30 seconds + (``AVG_ADDRESS_BROADCAST_INTERVAL``). +- A node's own address is broadcast approximately every 9.6 hours + (``AVG_LOCAL_ADDRESS_BROADCAST_INTERVAL = 24 * 24 * 60 = 34560`` seconds). + + +Misbehavior and Banning +----------------------- + +Nodes SHOULD track misbehavior scores for each connected peer. The zcashd reference +implementation bans a peer when its cumulative score reaches or exceeds 100 +(``DEFAULT_BANSCORE_THRESHOLD``), with bans lasting 24 hours +(``DEFAULT_MISBEHAVING_BANTIME``). The ban threshold and duration are +implementation-defined. + +Whitelisted peers accumulate misbehavior scores but are exempt from banning. + +The following table lists the misbehavior penalties assigned for specific protocol +violations: + ++--------+-------------------------------------------------------------------+ +| Points | Violation | ++========+===================================================================+ +| 1 | Duplicate ``version`` message. | ++--------+-------------------------------------------------------------------+ +| 1 | Message received before ``version`` handshake. | ++--------+-------------------------------------------------------------------+ +| 1 | Duplicate ``verack`` message. | ++--------+-------------------------------------------------------------------+ +| 10 | Alert processing failure. | ++--------+-------------------------------------------------------------------+ +| 20 | ``addr`` message with more than 1000 entries. | ++--------+-------------------------------------------------------------------+ +| 20 | ``inv`` message with more than 50,000 entries. | ++--------+-------------------------------------------------------------------+ +| 20 | ``getdata`` message with more than 50,000 entries. | ++--------+-------------------------------------------------------------------+ +| 20 | ``headers`` message with more than 160 entries. | ++--------+-------------------------------------------------------------------+ +| 20 | Non-contiguous headers sequence. | ++--------+-------------------------------------------------------------------+ +| 50 | Causing send buffer overflow. | ++--------+-------------------------------------------------------------------+ +| 100 | Bloom filter commands without ``NODE_BLOOM`` support. | ++--------+-------------------------------------------------------------------+ +| 100 | Invalid bloom filter parameters. | ++--------+-------------------------------------------------------------------+ +| 100 | ``filteradd`` data exceeding 520 bytes. | ++--------+-------------------------------------------------------------------+ +| 100 | Using ``MSG_TX`` to announce a v5 transaction, or ``MSG_WTX`` | +| | to announce a v4-or-earlier transaction (see ZIP 239 | +| | [#zip-0239]_). | ++--------+-------------------------------------------------------------------+ +| varies | Transaction, block, or header validation failure. The penalty is | +| | determined by the severity of the validation error. | ++--------+-------------------------------------------------------------------+ + + +Network Upgrade Peer Management +------------------------------- + +Network upgrade peer management is specified in ZIP 201 [#zip-0201]_. This section +summarizes the key behaviors. + +Pre-Activation +`````````````` + +In the 1728-block window (``NETWORK_UPGRADE_PEER_PREFERENCE_BLOCK_PERIOD``) before a +network upgrade activation height, a node SHOULD preferentially connect to peers that +advertise a protocol version at or above the version required by the upcoming upgrade. +This period corresponds to approximately 1.5 days at the post-Blossom block interval. + +Post-Activation +``````````````` + +After a network upgrade activates, a node MUST disconnect any peer whose negotiated +protocol version is below the version required by the active epoch. The node SHOULD send +a ``reject`` message with code ``REJECT_OBSOLETE`` (``0x11``) before disconnecting. + + +Reject Codes +============= + ++----------+----------------------------+-----------------------------------------------+ +| Code | Constant | Description | ++==========+============================+===============================================+ +| ``0x01`` | ``REJECT_MALFORMED`` | The message could not be decoded. | ++----------+----------------------------+-----------------------------------------------+ +| ``0x10`` | ``REJECT_INVALID`` | The message was invalid (e.g., a block or | +| | | transaction that fails validation). | ++----------+----------------------------+-----------------------------------------------+ +| ``0x11`` | ``REJECT_OBSOLETE`` | The message uses an obsolete protocol | +| | | version. | ++----------+----------------------------+-----------------------------------------------+ +| ``0x12`` | ``REJECT_DUPLICATE`` | The message is a duplicate of one already | +| | | received. | ++----------+----------------------------+-----------------------------------------------+ +| ``0x40`` | ``REJECT_NONSTANDARD`` | The transaction is valid but not standard. | ++----------+----------------------------+-----------------------------------------------+ +| ``0x41`` | ``REJECT_DUST`` | One or more transaction outputs are below | +| | | the dust threshold. | ++----------+----------------------------+-----------------------------------------------+ +| ``0x42`` | ``REJECT_INSUFFICIENTFEE`` | The transaction fee is insufficient. | ++----------+----------------------------+-----------------------------------------------+ +| ``0x43`` | ``REJECT_CHECKPOINT`` | The block conflicts with a checkpoint. | ++----------+----------------------------+-----------------------------------------------+ + + +References +========== + +.. [#BCP14] `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" `_ +.. [#protocol-networks] `Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 3.12: Mainnet and Testnet `_ +.. [#protocol-blockchain] `Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 3.3: The Block Chain `_ +.. [#protocol-txnencoding] `Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 7.1: Transaction Encoding and Consensus `_ +.. [#protocol-blockencoding] `Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 7.6: Block Encoding `_ +.. [#protocol-blockheader] `Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 7.5: Block Header Encoding `_ +.. [#zip-0200] `ZIP 200: Network Upgrade Mechanism `_ +.. [#zip-0201] `ZIP 201: Network Peer Management for Overwinter `_ +.. [#zip-0225] `ZIP 225: Version 5 Transaction Format `_ +.. [#zip-0155] `ZIP 155: addrv2 message `_ +.. [#zip-0239] `ZIP 239: Relay of Version 5 Transactions `_ +.. [#zip-0244] `ZIP 244: Transaction Identifier Non-Malleability `_ +.. [#bip-0031] `BIP 31: Pong Message `_ +.. [#bip-0037] `BIP 37: Connection Bloom filtering `_ +.. [#bip-0155] `BIP 155: addrv2 message `_ +.. [#bip-0111] `BIP 111: NODE_BLOOM service bit `_ +.. [#bip-0130] `BIP 130: sendheaders message `_ +.. [#bitcoin-protocol] `Bitcoin Developer Reference: P2P Network `_ From 8a799436b99c833f5efcbed49c77ed91a46fbfe4 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Tue, 10 Feb 2026 10:44:19 -0700 Subject: [PATCH 23/50] ZIP 204: Address PR review feedback - Fix "order of preference" phrasing for peer discovery mechanisms - Replace "zcashd reference implementation" with "zcashd implementation" throughout and document Zebra's corresponding values - Remove integer type table (belongs in protocol spec) - Add note that CompactSize is not formally defined in protocol spec - Add RFC 4291 reference for IPv4-mapped IPv6 addresses - Spell out "little-endian" instead of abbreviating "LE" - Add Protocol Version Negotiation section to clarify ambiguous "the protocol version" usage - Spell out bit numbering convention for service flags - Add reference to zcashd PR #7039 for alert removal - Note ZIP 155 for addrv2 deployment version assignment status Co-Authored-By: Claude Opus 4.6 --- zips/zip-0204.rst | 143 ++++++++++++++++++++++++++++------------------ 1 file changed, 87 insertions(+), 56 deletions(-) diff --git a/zips/zip-0204.rst b/zips/zip-0204.rst index fb56b4672..1e340cc8c 100644 --- a/zips/zip-0204.rst +++ b/zips/zip-0204.rst @@ -129,7 +129,7 @@ Regtest does not use DNS seeds or hardcoded seed nodes. Peer Discovery -------------- -A node discovers peers through the following mechanisms, in order of preference: +A node discovers peers through the following mechanisms: 1. **DNS seeding.** On startup, if the node's address manager is empty or if fewer than 2 outbound connections have been established within 11 seconds, the node @@ -140,6 +140,9 @@ A node discovers peers through the following mechanisms, in order of preference: 2. **Hardcoded seed nodes.** If DNS seeding fails or is insufficient, the node falls back to a compiled-in list of seed node addresses (``SeedSpec6`` entries). +DNS seeding is preferred over hardcoded seed nodes. The following mechanism operates +independently of the above: + 3. **Address relay.** Connected peers exchange address information using ``addr`` and ``getaddr`` messages (see `addr`_ and `getaddr`_). @@ -156,30 +159,31 @@ encryption or authentication. Connection Limits ````````````````` -The zcashd reference implementation defaults to a maximum of 125 peer connections -(``DEFAULT_MAX_PEER_CONNECTIONS``), of which a maximum of 8 are outbound connections -(``MAX_OUTBOUND_CONNECTIONS``). Implementations MAY use different limits. +The specific connection limits are implementation-defined. The zcashd implementation +defaults to a maximum of 125 peer connections (``DEFAULT_MAX_PEER_CONNECTIONS``), of +which a maximum of 8 are outbound connections (``MAX_OUTBOUND_CONNECTIONS``). The Zebra +implementation computes its limits from a configurable initial target size (default 25), +applying multipliers to derive an outbound limit of 75 and an inbound limit of 125. Timeouts ```````` A node SHOULD disconnect a peer if no message has been received from that peer within -a reasonable timeout period. The zcashd reference implementation uses 1200 seconds -(20 minutes, ``TIMEOUT_INTERVAL``) for this purpose. Automatic ``ping`` messages (see -`ping`_) are sent periodically to keep connections alive and measure latency. +a reasonable timeout period. The zcashd implementation uses 1200 seconds (20 minutes, +``TIMEOUT_INTERVAL``) for this purpose; the Zebra implementation uses a 20-second +request timeout (``REQUEST_TIMEOUT``). Automatic ``ping`` messages (see `ping`_) are +sent periodically to keep connections alive and measure latency. Additional timeout rules: - A node SHOULD close the connection if a peer has not sent a ``version`` message - within a reasonable time after connection establishment. The zcashd reference - implementation uses 60 seconds. + within a reasonable time after connection establishment. The zcashd implementation + uses 60 seconds; the Zebra implementation uses 3 seconds (``HANDSHAKE_TIMEOUT``). - A node SHOULD close the connection if a peer has not responded to a ``ping`` with - a ``pong`` within a reasonable time. The zcashd reference implementation uses - 1200 seconds (20 minutes). + a ``pong`` within a reasonable time. The zcashd implementation uses 1200 seconds + (20 minutes); the Zebra implementation uses 20 seconds (``REQUEST_TIMEOUT``). -Implementations MAY use different timeout values. The specific values above are from -the zcashd reference implementation; other implementations (e.g. Zebra) use -significantly shorter timeouts. +The specific timeout values are implementation-defined. Message Framing @@ -235,30 +239,17 @@ Data Types and Encoding ----------------------- All multi-byte integer types are encoded in little-endian byte order unless otherwise -specified. - -Integers -```````` - -+------------+------+------------------------------------------+ -| Type | Size | Description | -+============+======+==========================================+ -| ``uint8`` | 1 | Unsigned 8-bit integer. | -+------------+------+------------------------------------------+ -| ``uint16`` | 2 | Unsigned 16-bit integer, little-endian. | -+------------+------+------------------------------------------+ -| ``int32`` | 4 | Signed 32-bit integer, little-endian. | -+------------+------+------------------------------------------+ -| ``uint32`` | 4 | Unsigned 32-bit integer, little-endian. | -+------------+------+------------------------------------------+ -| ``int64`` | 8 | Signed 64-bit integer, little-endian. | -+------------+------+------------------------------------------+ -| ``uint64`` | 8 | Unsigned 64-bit integer, little-endian. | -+------------+------+------------------------------------------+ +specified. The integer types used in this specification (``uint8``, ``uint16``, +``int32``, ``uint32``, ``int64``, ``uint64``) have their conventional meanings. CompactSize ``````````` +.. note:: + + The CompactSize encoding is used in the Zcash Protocol Specification (section 7) + but is not formally defined there. It is defined here for completeness. + A variable-length unsigned integer encoding used for lengths and counts: +------------------------------------------+---------------+---------------------------------------------------+ @@ -290,13 +281,15 @@ A network address without associated metadata, as inherited from the Bitcoin pro +------+----------+--------------------------------------------------------------+ | Size | Field | Description | +======+==========+==============================================================+ -| 16 | ``ip`` | IPv6 address (or IPv4-mapped IPv6 address for IPv4 peers). | +| 16 | ``ip`` | IPv6 address (or IPv4-mapped IPv6 address [#rfc4291]_ for | +| | | IPv4 peers). | +------+----------+--------------------------------------------------------------+ | 2 | ``port`` | TCP port number (big-endian, i.e. network byte order). | +------+----------+--------------------------------------------------------------+ -IPv4 addresses are represented as IPv4-mapped IPv6 addresses: the first 12 bytes are -``00 00 00 00 00 00 00 00 00 00 FF FF`` followed by the 4-byte IPv4 address. +IPv4 addresses are represented as IPv4-mapped IPv6 addresses as defined in RFC 4291 +section 2.5.5.2 [#rfc4291]_: the first 12 bytes are ``00 00 00 00 00 00 00 00 00 00 FF FF`` +followed by the 4-byte IPv4 address. Peer Address (``CAddress``) ``````````````````````````` @@ -307,16 +300,17 @@ messages: +------+--------------+-----------------------------------------------------+ | Size | Field | Description | +======+==============+=====================================================+ -| 8 | ``services`` | Bitfield of service flags (``uint64``, LE). | +| 8 | ``services`` | Bitfield of service flags (``uint64``, | +| | | little-endian). | +------+--------------+-----------------------------------------------------+ | 16 | ``ip`` | IPv6 address (or IPv4-mapped IPv6). | +------+--------------+-----------------------------------------------------+ | 2 | ``port`` | TCP port number (big-endian). | +------+--------------+-----------------------------------------------------+ -When the protocol version is ≥ 31402 (``CADDR_TIME_VERSION``) and the address appears -in a context other than a ``version`` message, the encoding is preceded by a ``uint32`` -timestamp field: +When the negotiated protocol version (see `Protocol Version Negotiation`_) is +≥ 31402 (``CADDR_TIME_VERSION``) and the address appears in a context other than a +``version`` message, the encoding is preceded by a ``uint32`` timestamp field: +------+--------------+-----------------------------------------------------+ | Size | Field | Description | @@ -324,7 +318,8 @@ timestamp field: | 4 | ``time`` | Unix timestamp when the node was last seen | | | | (``uint32``, little-endian). | +------+--------------+-----------------------------------------------------+ -| 8 | ``services`` | Bitfield of service flags (``uint64``, LE). | +| 8 | ``services`` | Bitfield of service flags (``uint64``, | +| | | little-endian). | +------+--------------+-----------------------------------------------------+ | 16 | ``ip`` | IPv6 address (or IPv4-mapped IPv6). | +------+--------------+-----------------------------------------------------+ @@ -336,7 +331,9 @@ Service Flags ------------- Service flags are advertised in the ``services`` field of ``version`` messages and -``CAddress`` structures. +``CAddress`` structures. In the table below, bit :math:`k` refers to the bit with +numeric weight :math:`2^k`; that is, the ``services`` field has the corresponding flag +set if and only if ``services & (1 << k) != 0``. +------------------+-----+------------------------------------------------------+ | Name | Bit | Description | @@ -408,6 +405,32 @@ A peer MUST NOT send any message other than ``version`` before receiving the rem peer's ``version`` message. A peer MUST NOT send any message other than ``verack`` after sending its ``version`` and before receiving the remote peer's ``verack``. +.. _protocol-version-negotiation: + +Protocol Version Negotiation +```````````````````````````` + +Each peer advertises its own protocol version in its ``version`` message. The +*negotiated protocol version* for the connection is defined as: + + ``negotiated_version = min(local_version, remote_version)`` + +Before the handshake completes, messages are serialized using the initial protocol +version 209 (``INIT_PROTO_VERSION``). Once both ``version`` and ``verack`` messages +have been exchanged, the negotiated protocol version is used for all subsequent +interpretation of protocol features and message semantics on that connection. In +particular, the negotiated protocol version determines: + +- Whether ``CAddress`` structures include a ``time`` field (version ≥ 31402). +- Whether ``MSG_WTX`` inventory vectors are permitted (version ≥ 170014). +- Whether ``addrv2`` messages are supported (see `addrv2`_). +- Whether the peer meets the minimum version requirements for the current network + epoch (see `Network Upgrade Epoch Enforcement`_). + +Note that "the protocol version" as used in this document refers to the negotiated +protocol version unless otherwise specified. A node's *advertised* protocol version +is the version it includes in its ``version`` message. + Version Message ``````````````` @@ -621,8 +644,9 @@ Acknowledges receipt of a ``version`` message. After exchanging ``version`` and | 8 | ``nonce`` | Random value (``uint64``). | +------+-----------+-----------------------------------+ -Sent periodically to measure latency and detect dead connections. The zcashd reference -implementation sends ``ping`` messages every 120 seconds (``PING_INTERVAL``). +Sent periodically to measure latency and detect dead connections. The zcashd +implementation sends ``ping`` messages every 120 seconds (``PING_INTERVAL``); the Zebra +implementation uses a 59-second heartbeat interval (``HEARTBEAT_INTERVAL``). The receiving node MUST respond with a ``pong`` message containing the same nonce. .. note:: @@ -741,7 +765,8 @@ Notifies the peer of a rejected message. This message is informational; receipt +---------+------------------+------------------------------------------------+ The ``alert`` message is deprecated. It is documented here for completeness, as it -remains part of the zcashd implementation, but implementations MAY choose not to +remains part of the zcashd implementation but has been proposed for removal +[#zcashd-remove-alert]_, and implementations MAY choose not to support it. Nodes that do support ``alert`` messages SHOULD validate the alert signature against the network's alert public key before processing or relaying alerts. @@ -867,7 +892,8 @@ addresses consist of the 32-byte Ed25519 master public key of the onion service. **Deployment:** Unlike BIP 155 [#bip-0155]_, which uses a ``sendaddrv2`` handshake message, Zcash signals ``addrv2`` support through protocol version negotiation, as -specified in ZIP 155 [#zip-0155]_. The deployment version has not yet been assigned. +specified in ZIP 155 [#zip-0155]_. The deployment version has not yet been assigned; +see ZIP 155 for the status of this assignment. A node MUST NOT send ``addrv2`` messages on connections where the negotiated protocol version is below the deployment threshold. A node that supports ``addrv2`` MAY still send ``addr`` messages on any connection. @@ -1190,8 +1216,8 @@ Trickling To prevent network topology inference, transaction inventory SHOULD NOT be sent immediately but SHOULD instead be "trickled" at random intervals. The specific -trickling parameters are implementation-defined. The zcashd reference implementation -uses the following values: +trickling parameters are implementation-defined. The zcashd implementation uses the +following values: - The average broadcast interval is 5 seconds (``INVENTORY_BROADCAST_INTERVAL``). - For outbound peers, the effective interval is halved via integer right-shift @@ -1200,6 +1226,8 @@ uses the following values: interval. - Broadcast times follow a Poisson distribution centered on the broadcast interval. +The Zebra implementation uses a 7-second gossip delay (``PEER_GOSSIP_DELAY``). + Transaction Expiry `````````````````` @@ -1238,8 +1266,8 @@ Rate Limiting ````````````` Address records SHOULD be subject to rate limiting to prevent address flooding. The -specific rate limiting mechanism is implementation-defined. The zcashd reference -implementation uses a token bucket algorithm: +specific rate limiting mechanism is implementation-defined. The zcashd implementation +uses a token bucket algorithm: - Rate: 0.1 address records per second per peer (``MAX_ADDR_RATE_PER_SECOND``). - Bucket capacity: 1000 (``MAX_ADDR_PROCESSING_TOKEN_BUCKET``), replenished at 0.1 @@ -1251,8 +1279,8 @@ implementation uses a token bucket algorithm: Address Broadcasting ```````````````````` -The specific broadcast intervals are implementation-defined. The zcashd reference -implementation uses the following values: +The specific broadcast intervals are implementation-defined. The zcashd implementation +uses the following values: - Addresses are broadcast to peers at an average interval of 30 seconds (``AVG_ADDRESS_BROADCAST_INTERVAL``). @@ -1263,11 +1291,12 @@ implementation uses the following values: Misbehavior and Banning ----------------------- -Nodes SHOULD track misbehavior scores for each connected peer. The zcashd reference +Nodes SHOULD track misbehavior scores for each connected peer. The zcashd implementation bans a peer when its cumulative score reaches or exceeds 100 (``DEFAULT_BANSCORE_THRESHOLD``), with bans lasting 24 hours -(``DEFAULT_MISBEHAVING_BANTIME``). The ban threshold and duration are -implementation-defined. +(``DEFAULT_MISBEHAVING_BANTIME``). The Zebra implementation also uses a threshold of +100 (``MAX_PEER_MISBEHAVIOR_SCORE``) but bans persist indefinitely. The ban threshold +and duration are implementation-defined. Whitelisted peers accumulate misbehavior scores but are exempt from banning. @@ -1365,6 +1394,8 @@ Reject Codes References ========== +.. [#rfc4291] `RFC 4291: IP Version 6 Addressing Architecture, Section 2.5.5.2 `_ +.. [#zcashd-remove-alert] `zcashd PR 7039: Remove alert handling `_ .. [#BCP14] `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" `_ .. [#protocol-networks] `Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 3.12: Mainnet and Testnet `_ .. [#protocol-blockchain] `Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 3.3: The Block Chain `_ From 8e1952a3a6cbd37bd625db1a22f699effe19d96c Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Tue, 10 Feb 2026 11:08:42 -0700 Subject: [PATCH 24/50] ZIP 204: Fix undefined bool type and clarify timestamp descriptions - Replace undefined ``bool`` with ``uint8``; 0 for false, 1 for true in the version message relay field - Change "Unix epoch time" / "Unix timestamp" to "Unix-epoch UTC time in seconds" for all timestamp fields Co-Authored-By: Claude Opus 4.6 --- zips/zip-0204.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/zips/zip-0204.rst b/zips/zip-0204.rst index 1e340cc8c..014de7ed0 100644 --- a/zips/zip-0204.rst +++ b/zips/zip-0204.rst @@ -315,8 +315,8 @@ When the negotiated protocol version (see `Protocol Version Negotiation`_) is +------+--------------+-----------------------------------------------------+ | Size | Field | Description | +======+==============+=====================================================+ -| 4 | ``time`` | Unix timestamp when the node was last seen | -| | | (``uint32``, little-endian). | +| 4 | ``time`` | Unix-epoch UTC time in seconds when the node | +| | | was last seen (``uint32``, little-endian). | +------+--------------+-----------------------------------------------------+ | 8 | ``services`` | Bitfield of service flags (``uint64``, | | | | little-endian). | @@ -443,7 +443,7 @@ The ``version`` message payload has the following format: +--------+---------+------------------+------------------------------------------------+ | 4 | 8 | ``services`` | Bitfield of service flags (``uint64``). | +--------+---------+------------------+------------------------------------------------+ -| 12 | 8 | ``timestamp`` | Unix epoch time (``int64``). | +| 12 | 8 | ``timestamp`` | Unix-epoch UTC time in seconds (``int64``). | +--------+---------+------------------+------------------------------------------------+ | 20 | 26 | ``addr_recv`` | Address of the receiving node (``CAddress`` | | | | | without ``time`` field). | @@ -461,7 +461,7 @@ The ``version`` message payload has the following format: | | | | (``int32``). | +--------+---------+------------------+------------------------------------------------+ | varies | 1 | ``relay`` | Whether the sender wants transaction relay | -| | | | (``bool``). | +| | | | (``uint8``; 0 for false, 1 for true). | +--------+---------+------------------+------------------------------------------------+ The ``addr_recv`` and ``addr_from`` fields use the ``CAddress`` encoding *without* @@ -834,8 +834,8 @@ Each address entry has the following format: +---------+---------------+------------------------------------------------+ | Size | Field | Description | +=========+===============+================================================+ - | 4 | ``time`` | Unix timestamp when the node was last seen | - | | | (``uint32``, little-endian). | + | 4 | ``time`` | Unix-epoch UTC time in seconds when the node | + | | | was last seen (``uint32``, little-endian). | +---------+---------------+------------------------------------------------+ | varies | ``services`` | Service bits (CompactSize-encoded ``uint64``). | +---------+---------------+------------------------------------------------+ From 5a3b4c08b13bdf3b8b9513434756b8cc84147a39 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Tue, 10 Feb 2026 15:40:12 -0700 Subject: [PATCH 25/50] ZIP 204: Address additional PR review feedback - Revise DNS seeding to describe both zcashd and Zebra behavior - Remove zcashd-specific SeedSpec6 reference from hardcoded seeds - Clarify command string validation: "ignored" not "rejected"; enumerate all currently used command strings - Use $k$ inline math syntax instead of :math: for service flags - Rewrap pong timeout line with "a corresponding pong" - Fix getblocks/getheaders descriptions: "up to and including hash_stop" and explicit MUST NOT limits - Soften misbehavior penalties from MUST to SHOULD (overspecification) - Note that zcashd does not use headers-first sync (refs zcashd#6292) - Make MSG_TX MUST for v4 transactions (bidirectional requirement) - "To impede" instead of "To prevent" for trickling rationale - "halved rounding down" instead of "halved via integer right-shift" - "its view of the current chain tip" for transaction expiry - Remove orphan expiration check interval (overspecification) - Simplify shielded eligibility to "fully transparent transactions" - Document relay fee complexity with zcashd source reference - Use "zcashd-specific rate-limiting" and "token-bucket algorithm" - Reorder references per ZIP convention (BCP14, RFCs, protocol spec, ZIPs, BIPs, external) Co-Authored-By: Claude Opus 4.6 --- zips/zip-0204.rst | 104 ++++++++++++++++++++++++++-------------------- 1 file changed, 60 insertions(+), 44 deletions(-) diff --git a/zips/zip-0204.rst b/zips/zip-0204.rst index 014de7ed0..8f9fdc3e4 100644 --- a/zips/zip-0204.rst +++ b/zips/zip-0204.rst @@ -131,14 +131,16 @@ Peer Discovery A node discovers peers through the following mechanisms: -1. **DNS seeding.** On startup, if the node's address manager is empty or if fewer - than 2 outbound connections have been established within 11 seconds, the node - queries the DNS seed hostnames listed above for A and AAAA records. Addresses - obtained from DNS seeds are added to the address manager with a random age of - 3–7 days. +1. **DNS seeding.** On startup, a node queries the DNS seed hostnames listed above + for A and AAAA records. The zcashd implementation does this only if the address + manager is empty or if fewer than 2 outbound connections have been established + within 11 seconds; the Zebra implementation always performs DNS lookups on + startup (alongside consulting a persistent address cache). 2. **Hardcoded seed nodes.** If DNS seeding fails or is insufficient, the node - falls back to a compiled-in list of seed node addresses (``SeedSpec6`` entries). + MAY fall back to a compiled-in list of seed node addresses. In the zcashd + implementation these hardcoded addresses may be found in the chain + parameters for the relevant network. DNS seeding is preferred over hardcoded seed nodes. The following mechanism operates independently of the above: @@ -180,8 +182,9 @@ Additional timeout rules: within a reasonable time after connection establishment. The zcashd implementation uses 60 seconds; the Zebra implementation uses 3 seconds (``HANDSHAKE_TIMEOUT``). - A node SHOULD close the connection if a peer has not responded to a ``ping`` with - a ``pong`` within a reasonable time. The zcashd implementation uses 1200 seconds - (20 minutes); the Zebra implementation uses 20 seconds (``REQUEST_TIMEOUT``). + a corresponding ``pong`` within a reasonable time. The zcashd implementation uses + 1200 seconds (20 minutes); the Zebra implementation uses 20 seconds + (``REQUEST_TIMEOUT``). The specific timeout values are implementation-defined. @@ -215,7 +218,14 @@ Command String Validation The ``command`` field MUST contain only printable ASCII characters (bytes in the range ``0x20`` to ``0x7E`` inclusive) up to the first NUL byte (``0x00``). After the first NUL byte, all remaining bytes MUST be ``0x00``. A message that violates these constraints -MUST be rejected. +MUST be ignored. + +The following command strings are currently used on the Zcash network: + +``version``, ``verack``, ``ping``, ``pong``, ``reject``, ``addr``, ``addrv2``, +``getaddr``, ``inv``, ``getdata``, ``notfound``, ``getblocks``, ``getheaders``, +``headers``, ``block``, ``tx``, ``mempool``, ``filterload``, ``filteradd``, +``filterclear``, ``alert``. Maximum Message Size ```````````````````` @@ -331,8 +341,8 @@ Service Flags ------------- Service flags are advertised in the ``services`` field of ``version`` messages and -``CAddress`` structures. In the table below, bit :math:`k` refers to the bit with -numeric weight :math:`2^k`; that is, the ``services`` field has the corresponding flag +``CAddress`` structures. In the table below, bit $k$ refers to the bit with +numeric weight $2^k$; that is, the ``services`` field has the corresponding flag set if and only if ``services & (1 << k) != 0``. +------------------+-----+------------------------------------------------------+ @@ -793,7 +803,7 @@ Address Messages +---------+---------------+------------------------------------------------+ The ``count`` MUST NOT exceed 1000. A node receiving an ``addr`` message with more than -1000 entries MUST assign a misbehavior penalty of 20 points to the sending peer. +1000 entries SHOULD assign a misbehavior penalty of 20 points to the sending peer. .. _getaddr-message: @@ -925,7 +935,7 @@ Inventory Messages Announces one or more objects (transactions or blocks) that the sender has available. The ``count`` MUST NOT exceed 50,000. A node receiving an ``inv`` message with more than -50,000 entries MUST assign a misbehavior penalty of 20 points. +50,000 entries SHOULD assign a misbehavior penalty of 20 points. .. _getdata-message: @@ -1003,8 +1013,8 @@ Block Messages +---------+---------------------------+------------------------------------------+ Requests an ``inv`` message containing block hashes starting after the first block -locator hash found in the responder's best chain, up to ``hash_stop`` or 500 blocks, -whichever comes first. +locator hash found in the responder's best chain, up to and including ``hash_stop`` or +500 blocks, whichever comes first. A node MUST NOT return more than 500 blocks. .. _getheaders-message: @@ -1032,7 +1042,8 @@ whichever comes first. +---------+---------------------------+------------------------------------------+ Requests a ``headers`` message containing block headers starting after the first -block locator hash found in the responder's best chain. A node MUST return at most +block locator hash found in the responder's best chain, up to and including +``hash_stop`` or 160 headers, whichever comes first. A node MUST NOT return more than 160 headers (``MAX_HEADERS_RESULTS``). @@ -1057,7 +1068,7 @@ block locator hash found in the responder's best chain. A node MUST return at mo The ``count`` MUST NOT exceed 160. The headers MUST form a contiguous chain (each header's ``hashPrevBlock`` must match the hash of the preceding header). A -node receiving non-contiguous headers MUST assign a misbehavior penalty of 20 points. +node receiving non-contiguous headers SHOULD assign a misbehavior penalty of 20 points. For the encoding of block headers, see the Zcash Protocol Specification [#protocol-blockheader]_. @@ -1096,10 +1107,11 @@ entry. For the encoding of transactions, see the Zcash Protocol Specification Bloom Filter Messages ````````````````````` -These messages implement BIP 37 [#bip-0037]_ bloom filtering. As of protocol version -170004, a node MUST NOT send bloom filter commands to a peer that does not advertise -``NODE_BLOOM`` in its service flags. Sending bloom filter commands to a peer that does -not advertise ``NODE_BLOOM`` incurs a misbehavior penalty of 100 points (immediate ban). +These messages implement BIP 37 [#bip-0037]_ bloom filtering. As of protocol +version 170004, a node MUST NOT send bloom filter commands to a peer that does +not advertise ``NODE_BLOOM`` in its service flags. Sending bloom filter +commands to a peer that does not advertise ``NODE_BLOOM`` SHOULD incur a +misbehavior penalty of 100 points (immediate ban). .. _filterload-message: @@ -1131,7 +1143,7 @@ transactions that match the filter. +---------+----------+------------------------------------------------------+ Adds an element to the existing bloom filter. The data MUST NOT exceed 520 bytes. A node -receiving data exceeding 520 bytes MUST assign a misbehavior penalty of 100 points. +receiving data exceeding 520 bytes SHOULD assign a misbehavior penalty of 100 points. .. _filterclear-message: @@ -1168,7 +1180,8 @@ Block Relay Headers-First Synchronization ````````````````````````````` -Nodes synchronize the block chain using a headers-first approach: +Nodes MAY synchronize the block chain using a headers-first approach. The Zebra +implementation uses headers-first synchronization; zcashd does not [#zcashd-6292]_. 1. The synchronizing node sends a ``getheaders`` message with a block locator. 2. The remote peer responds with a ``headers`` message containing up to 160 headers. @@ -1207,21 +1220,22 @@ Transaction relay follows an inventory-based protocol: 2. Peers that want the transaction respond with a ``getdata`` message. 3. The originating node sends the transaction in a ``tx`` message. -Transactions with version ≤ 4 are announced using ``MSG_TX`` inventory vectors. -Transactions with version ≥ 5 MUST be announced using ``MSG_WTX`` inventory vectors, as -specified in ZIP 239 [#zip-0239]_. +Transactions with version ≤ 4 MUST be announced using ``MSG_TX`` inventory vectors. +Transactions with version ≥ 5 MUST be announced using ``MSG_WTX`` inventory vectors. +Using the wrong inventory type for a transaction version SHOULD incur a misbehavior +penalty. See ZIP 239 [#zip-0239]_. Trickling ````````` -To prevent network topology inference, transaction inventory SHOULD NOT be sent +To impede network topology inference, transaction inventory SHOULD NOT be sent immediately but SHOULD instead be "trickled" at random intervals. The specific trickling parameters are implementation-defined. The zcashd implementation uses the following values: - The average broadcast interval is 5 seconds (``INVENTORY_BROADCAST_INTERVAL``). -- For outbound peers, the effective interval is halved via integer right-shift - (``5 >> 1 = 2`` seconds on average). +- For outbound peers, the effective interval in seconds is halved rounding down + (2 seconds on average). - At most 35 inventory entries (``INVENTORY_BROADCAST_MAX``) are sent per trickle interval. - Broadcast times follow a Poisson distribution centered on the broadcast interval. @@ -1231,8 +1245,8 @@ The Zebra implementation uses a 7-second gossip delay (``PEER_GOSSIP_DELAY``). Transaction Expiry `````````````````` -A node SHOULD NOT relay a transaction that will expire within 3 blocks of the current -chain tip (``TX_EXPIRING_SOON_THRESHOLD``). +A node SHOULD NOT relay a transaction that will expire within 3 blocks of its view of +the current chain tip (``TX_EXPIRING_SOON_THRESHOLD``). Orphan Transactions ``````````````````` @@ -1242,18 +1256,18 @@ An orphan transaction is one that references inputs from unknown parent transact - A node SHOULD store at most 100 orphan transactions (``DEFAULT_MAX_ORPHAN_TRANSACTIONS``). - Orphan transactions expire and are removed after 1200 seconds (20 minutes, - ``ORPHAN_TX_EXPIRE_TIME``). Expiration checks occur at most every 300 seconds - (5 minutes, ``ORPHAN_TX_EXPIRE_INTERVAL``). -- Only transactions without shielded components (no JoinSplit descriptions, no Sapling - bundle, no Orchard bundle) are eligible for orphan storage. + ``ORPHAN_TX_EXPIRE_TIME``). +- Only fully transparent transactions are eligible for orphan storage. - When the orphan pool is full, the oldest orphan transactions are evicted. Relay Fee ````````` -Transactions are subject to a minimum relay fee of 100 zatoshis per 1000 bytes -(``DEFAULT_MIN_RELAY_TX_FEE``). A node SHOULD NOT relay transactions with fees below -this threshold. +Transactions are subject to a minimum relay fee. Both the zcashd and Zebra +implementations use a base rate of 100 zatoshis per 1000 bytes +(``DEFAULT_MIN_RELAY_TX_FEE``), though the zcashd implementation applies additional +logic for low-fee and free transactions [#zcashd-relay-fee]_. A node SHOULD NOT relay +transactions with fees below its minimum relay fee threshold. Address Relay @@ -1266,8 +1280,8 @@ Rate Limiting ````````````` Address records SHOULD be subject to rate limiting to prevent address flooding. The -specific rate limiting mechanism is implementation-defined. The zcashd implementation -uses a token bucket algorithm: +specific rate-limiting mechanism is implementation-defined. The zcashd-specific +rate-limiting mechanism uses a token-bucket algorithm: - Rate: 0.1 address records per second per peer (``MAX_ADDR_RATE_PER_SECOND``). - Bucket capacity: 1000 (``MAX_ADDR_PROCESSING_TOKEN_BUCKET``), replenished at 0.1 @@ -1394,23 +1408,25 @@ Reject Codes References ========== -.. [#rfc4291] `RFC 4291: IP Version 6 Addressing Architecture, Section 2.5.5.2 `_ -.. [#zcashd-remove-alert] `zcashd PR 7039: Remove alert handling `_ .. [#BCP14] `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" `_ +.. [#rfc4291] `RFC 4291: IP Version 6 Addressing Architecture, Section 2.5.5.2 `_ .. [#protocol-networks] `Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 3.12: Mainnet and Testnet `_ .. [#protocol-blockchain] `Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 3.3: The Block Chain `_ .. [#protocol-txnencoding] `Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 7.1: Transaction Encoding and Consensus `_ .. [#protocol-blockencoding] `Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 7.6: Block Encoding `_ .. [#protocol-blockheader] `Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 7.5: Block Header Encoding `_ +.. [#zip-0155] `ZIP 155: addrv2 message `_ .. [#zip-0200] `ZIP 200: Network Upgrade Mechanism `_ .. [#zip-0201] `ZIP 201: Network Peer Management for Overwinter `_ .. [#zip-0225] `ZIP 225: Version 5 Transaction Format `_ -.. [#zip-0155] `ZIP 155: addrv2 message `_ .. [#zip-0239] `ZIP 239: Relay of Version 5 Transactions `_ .. [#zip-0244] `ZIP 244: Transaction Identifier Non-Malleability `_ .. [#bip-0031] `BIP 31: Pong Message `_ .. [#bip-0037] `BIP 37: Connection Bloom filtering `_ -.. [#bip-0155] `BIP 155: addrv2 message `_ .. [#bip-0111] `BIP 111: NODE_BLOOM service bit `_ .. [#bip-0130] `BIP 130: sendheaders message `_ +.. [#bip-0155] `BIP 155: addrv2 message `_ +.. [#zcashd-6292] `zcashd issue 6292: zcashd does not use headers-first sync `_ +.. [#zcashd-relay-fee] `zcashd relay fee policy (policy.h) `_ +.. [#zcashd-remove-alert] `zcashd PR 7039: Remove alert handling `_ .. [#bitcoin-protocol] `Bitcoin Developer Reference: P2P Network `_ From a77c4d778ca0489b2fa94090b0d39f5d35df2f73 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Tue, 10 Feb 2026 16:12:11 -0700 Subject: [PATCH 26/50] ZIP 204: Address further PR review feedback - Capitalize "Bloom" filter throughout (named after Burton Howard Bloom) - Capitalize "Testnet" and "Mainnet" in protocol version note - Add version validation disconnect summary to Protocol Version Negotiation section - relay field: no text change needed (informational links noted) - MSG_TX MUST for v4: already addressed in prior commit - MIN_TESTNET_PEER_PROTO_VERSION: confirmed 170040 matches zcashd Co-Authored-By: Claude Opus 4.6 --- zips/zip-0204.rst | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/zips/zip-0204.rst b/zips/zip-0204.rst index 8f9fdc3e4..7f663fcb4 100644 --- a/zips/zip-0204.rst +++ b/zips/zip-0204.rst @@ -351,7 +351,7 @@ set if and only if ``services & (1 << k) != 0``. | ``NODE_NETWORK`` | 0 | The node is capable of serving the complete block | | | | chain. | +------------------+-----+------------------------------------------------------+ -| ``NODE_BLOOM`` | 2 | The node supports bloom-filtered connections | +| ``NODE_BLOOM`` | 2 | The node supports Bloom-filtered connections | | | | (BIP 37 [#bip-0037]_). Zcash nodes used to support | | | | this by default without advertising the bit, but no | | | | longer do as of protocol version 170004 | @@ -415,6 +415,10 @@ A peer MUST NOT send any message other than ``version`` before receiving the rem peer's ``version`` message. A peer MUST NOT send any message other than ``verack`` after sending its ``version`` and before receiving the remote peer's ``verack``. +If validation of the ``version`` message received from a peer fails, the node +MUST disconnect the peer. See (see `Version Validation`_) below for additional +details. + .. _protocol-version-negotiation: Protocol Version Negotiation @@ -501,7 +505,6 @@ If any of these checks fail, the node MUST disconnect the peer. A ``reject`` mes with code ``REJECT_OBSOLETE`` (``0x11``) SHOULD be sent before disconnecting for version-related failures. - Protocol Versioning ------------------- @@ -600,7 +603,7 @@ The following protocol versions are associated with network upgrades on Testnet: | NU6.1 | 170130 | 3,536,500 | +-------------------+------------------+-------------------+ -Note that testnet protocol versions differ from mainnet for several upgrades +Note that Testnet protocol versions differ from Mainnet for several upgrades (Overwinter, Blossom, Heartwood, Canopy, NU5, NU6, and NU6.1). @@ -1107,9 +1110,9 @@ entry. For the encoding of transactions, see the Zcash Protocol Specification Bloom Filter Messages ````````````````````` -These messages implement BIP 37 [#bip-0037]_ bloom filtering. As of protocol -version 170004, a node MUST NOT send bloom filter commands to a peer that does -not advertise ``NODE_BLOOM`` in its service flags. Sending bloom filter +These messages implement BIP 37 [#bip-0037]_ Bloom filtering. As of protocol +version 170004, a node MUST NOT send Bloom filter commands to a peer that does +not advertise ``NODE_BLOOM`` in its service flags. Sending Bloom filter commands to a peer that does not advertise ``NODE_BLOOM`` SHOULD incur a misbehavior penalty of 100 points (immediate ban). @@ -1120,9 +1123,9 @@ misbehavior penalty of 100 points (immediate ban). :Command: ``filterload`` :Direction: Both -:Payload: A serialized bloom filter, as defined in BIP 37 [#bip-0037]_. +:Payload: A serialized Bloom filter, as defined in BIP 37 [#bip-0037]_. -Sets a bloom filter on the connection. After a filter is set, the peer will only relay +Sets a Bloom filter on the connection. After a filter is set, the peer will only relay transactions that match the filter. @@ -1138,11 +1141,11 @@ transactions that match the filter. +---------+----------+------------------------------------------------------+ | Size | Field | Description | +=========+==========+======================================================+ - | varies | ``data`` | Element to add to the bloom filter | + | varies | ``data`` | Element to add to the Bloom filter | | | | (CompactSize-prefixed, max 520 bytes). | +---------+----------+------------------------------------------------------+ -Adds an element to the existing bloom filter. The data MUST NOT exceed 520 bytes. A node +Adds an element to the existing Bloom filter. The data MUST NOT exceed 520 bytes. A node receiving data exceeding 520 bytes SHOULD assign a misbehavior penalty of 100 points. @@ -1155,7 +1158,7 @@ receiving data exceeding 520 bytes SHOULD assign a misbehavior penalty of 100 po :Direction: Both :Payload: Empty (0 bytes). -Removes the bloom filter from the connection. Transaction relay resumes normally. +Removes the Bloom filter from the connection. Transaction relay resumes normally. Memory Pool @@ -1342,7 +1345,7 @@ violations: +--------+-------------------------------------------------------------------+ | 100 | Bloom filter commands without ``NODE_BLOOM`` support. | +--------+-------------------------------------------------------------------+ -| 100 | Invalid bloom filter parameters. | +| 100 | Invalid Bloom filter parameters. | +--------+-------------------------------------------------------------------+ | 100 | ``filteradd`` data exceeding 520 bytes. | +--------+-------------------------------------------------------------------+ From e4ba5be85dc5c15048e19dbfd12cfd546c19b1cc Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Tue, 10 Feb 2026 16:26:27 -0700 Subject: [PATCH 27/50] ZIP 204: Add SHOULD for rejecting non-boolean relay field values Zebra strictly validates that the relay field is 0 or 1; zcashd accepts any non-zero value as true via implicit C++ bool conversion. Use SHOULD to recommend validation without making zcashd non-conformant. Co-Authored-By: Claude Opus 4.6 --- zips/zip-0204.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/zips/zip-0204.rst b/zips/zip-0204.rst index 7f663fcb4..a4f7c3738 100644 --- a/zips/zip-0204.rst +++ b/zips/zip-0204.rst @@ -475,7 +475,7 @@ The ``version`` message payload has the following format: | | | | (``int32``). | +--------+---------+------------------+------------------------------------------------+ | varies | 1 | ``relay`` | Whether the sender wants transaction relay | -| | | | (``uint8``; 0 for false, 1 for true). | +| | | | (``uint8``; 0 for false, nonzero for true). | +--------+---------+------------------+------------------------------------------------+ The ``addr_recv`` and ``addr_from`` fields use the ``CAddress`` encoding *without* @@ -487,6 +487,9 @@ The ``nonce`` field is used for self-connection detection. If a node receives a The ``user_agent`` string MUST NOT exceed 256 bytes. A node SHOULD disconnect peers that send a longer user agent. +A node SHOULD reject ``version`` messages in which the ``relay`` field has a value +other than 0 or 1. + Version Validation `````````````````` From 3443ebda6776c94f7f013e0e75983770c71b0eac Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Tue, 10 Feb 2026 16:40:55 -0700 Subject: [PATCH 28/50] ZIP 204: Fix rendering errors. --- zips/zip-0204.rst | 57 +++++------------------------------------------ 1 file changed, 6 insertions(+), 51 deletions(-) diff --git a/zips/zip-0204.rst b/zips/zip-0204.rst index a4f7c3738..5ca9c28d4 100644 --- a/zips/zip-0204.rst +++ b/zips/zip-0204.rst @@ -140,13 +140,12 @@ A node discovers peers through the following mechanisms: 2. **Hardcoded seed nodes.** If DNS seeding fails or is insufficient, the node MAY fall back to a compiled-in list of seed node addresses. In the zcashd implementation these hardcoded addresses may be found in the chain - parameters for the relevant network. - -DNS seeding is preferred over hardcoded seed nodes. The following mechanism operates -independently of the above: + parameters for the relevant network. DNS seeding is preferred over + hardcoded seed nodes. 3. **Address relay.** Connected peers exchange address information using ``addr`` and - ``getaddr`` messages (see `addr`_ and `getaddr`_). + ``getaddr`` messages (see `addr`_ and `getaddr`_). This mechanism operates + independently of the above. Connection Handling @@ -291,7 +290,7 @@ A network address without associated metadata, as inherited from the Bitcoin pro +------+----------+--------------------------------------------------------------+ | Size | Field | Description | +======+==========+==============================================================+ -| 16 | ``ip`` | IPv6 address (or IPv4-mapped IPv6 address [#rfc4291]_ for | +| 16 | ``ip`` | IPv6 address (or IPv4-mapped IPv6 address [#rfc4291]_ for | | | | IPv4 peers). | +------+----------+--------------------------------------------------------------+ | 2 | ``port`` | TCP port number (big-endian, i.e. network byte order). | @@ -342,7 +341,7 @@ Service Flags Service flags are advertised in the ``services`` field of ``version`` messages and ``CAddress`` structures. In the table below, bit $k$ refers to the bit with -numeric weight $2^k$; that is, the ``services`` field has the corresponding flag +numeric weight $2^k;$ that is, the ``services`` field has the corresponding flag set if and only if ``services & (1 << k) != 0``. +------------------+-----+------------------------------------------------------+ @@ -419,8 +418,6 @@ If validation of the ``version`` message received from a peer fails, the node MUST disconnect the peer. See (see `Version Validation`_) below for additional details. -.. _protocol-version-negotiation: - Protocol Version Negotiation ```````````````````````````` @@ -619,8 +616,6 @@ direction, payload format, and semantics are specified. Control Messages ```````````````` -.. _version-message: - ``version`` ''''''''''' @@ -632,8 +627,6 @@ Initiates the connection handshake. The details of this message are specified in `Connection Handshake`_. -.. _verack-message: - ``verack`` '''''''''' @@ -645,8 +638,6 @@ Acknowledges receipt of a ``version`` message. After exchanging ``version`` and ``verack`` messages, the connection is considered established. -.. _ping-message: - ``ping`` '''''''' @@ -674,8 +665,6 @@ The receiving node MUST respond with a ``pong`` message containing the same nonc will never be encountered on the Zcash network. -.. _pong-message: - ``pong`` '''''''' @@ -694,8 +683,6 @@ Sent in response to a ``ping``. The ``nonce`` MUST match the ``nonce`` from the that is being responded to. -.. _reject-message: - ``reject`` '''''''''' @@ -722,8 +709,6 @@ Notifies the peer of a rejected message. This message is informational; receipt ``reject`` message does not require any specific action by the receiving node. -.. _alert-message: - ``alert`` ''''''''' @@ -790,8 +775,6 @@ signature against the network's alert public key before processing or relaying a Address Messages ```````````````` -.. _addr-message: - ``addr`` '''''''' @@ -812,8 +795,6 @@ The ``count`` MUST NOT exceed 1000. A node receiving an ``addr`` message with mo 1000 entries SHOULD assign a misbehavior penalty of 20 points to the sending peer. -.. _getaddr-message: - ``getaddr`` ''''''''''' @@ -827,8 +808,6 @@ SHOULD only process ``getaddr`` from inbound peers to prevent address-based fing attacks. -.. _addrv2-message: - ``addrv2`` '''''''''' @@ -921,8 +900,6 @@ details, is given in ZIP 155 [#zip-0155]_. Inventory Messages `````````````````` -.. _inv-message: - ``inv`` ''''''' @@ -944,8 +921,6 @@ The ``count`` MUST NOT exceed 50,000. A node receiving an ``inv`` message with m 50,000 entries SHOULD assign a misbehavior penalty of 20 points. -.. _getdata-message: - ``getdata`` ''''''''''' @@ -970,8 +945,6 @@ If the requested object is not available, the receiving node SHOULD respond with ``notfound`` message. -.. _notfound-message: - ``notfound`` '''''''''''' @@ -994,8 +967,6 @@ Sent in response to a ``getdata`` message for objects that the node does not hav Block Messages `````````````` -.. _getblocks-message: - ``getblocks`` ''''''''''''' @@ -1023,8 +994,6 @@ locator hash found in the responder's best chain, up to and including ``hash_sto 500 blocks, whichever comes first. A node MUST NOT return more than 500 blocks. -.. _getheaders-message: - ``getheaders`` '''''''''''''' @@ -1053,8 +1022,6 @@ block locator hash found in the responder's best chain, up to and including 160 headers (``MAX_HEADERS_RESULTS``). -.. _headers-message: - ``headers`` ''''''''''' @@ -1080,8 +1047,6 @@ For the encoding of block headers, see the Zcash Protocol Specification [#protocol-blockheader]_. -.. _block-message: - ``block`` ''''''''' @@ -1096,8 +1061,6 @@ encoding of blocks, see the Zcash Protocol Specification [#protocol-blockencodin Transaction Messages ```````````````````` -.. _tx-message: - ``tx`` '''''' @@ -1119,8 +1082,6 @@ not advertise ``NODE_BLOOM`` in its service flags. Sending Bloom filter commands to a peer that does not advertise ``NODE_BLOOM`` SHOULD incur a misbehavior penalty of 100 points (immediate ban). -.. _filterload-message: - ``filterload`` '''''''''''''' @@ -1132,8 +1093,6 @@ Sets a Bloom filter on the connection. After a filter is set, the peer will only transactions that match the filter. -.. _filteradd-message: - ``filteradd`` ''''''''''''' @@ -1152,8 +1111,6 @@ Adds an element to the existing Bloom filter. The data MUST NOT exceed 520 bytes receiving data exceeding 520 bytes SHOULD assign a misbehavior penalty of 100 points. -.. _filterclear-message: - ``filterclear`` ''''''''''''''' @@ -1167,8 +1124,6 @@ Removes the Bloom filter from the connection. Transaction relay resumes normally Memory Pool ``````````` -.. _mempool-message: - ``mempool`` ''''''''''' From a9df76c94466de8dc8d3bbc0667b05009c7aefd2 Mon Sep 17 00:00:00 2001 From: Daira-Emma Hopwood Date: Wed, 11 Feb 2026 16:23:43 +0000 Subject: [PATCH 29/50] The `relay` field of the `version` message is optional: https://github.com/ZcashFoundation/zebra/issues/5713 Signed-off-by: Daira-Emma Hopwood --- zips/zip-0204.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/zips/zip-0204.rst b/zips/zip-0204.rst index 5ca9c28d4..f2184128e 100644 --- a/zips/zip-0204.rst +++ b/zips/zip-0204.rst @@ -472,7 +472,7 @@ The ``version`` message payload has the following format: | | | | (``int32``). | +--------+---------+------------------+------------------------------------------------+ | varies | 1 | ``relay`` | Whether the sender wants transaction relay | -| | | | (``uint8``; 0 for false, nonzero for true). | +| | | (optional) | (``uint8``; 0 for false, nonzero for true). | +--------+---------+------------------+------------------------------------------------+ The ``addr_recv`` and ``addr_from`` fields use the ``CAddress`` encoding *without* @@ -484,8 +484,10 @@ The ``nonce`` field is used for self-connection detection. If a node receives a The ``user_agent`` string MUST NOT exceed 256 bytes. A node SHOULD disconnect peers that send a longer user agent. -A node SHOULD reject ``version`` messages in which the ``relay`` field has a value -other than 0 or 1. +The ``relay`` field is optional; if not present, its value MUST be interpreted as true. +A node SHOULD reject ``version`` messages in which the ``relay`` field is present with +a value other than 0 or 1. Nodes SHOULD create `version` messages with this field +present. Version Validation `````````````````` From 66fe612c93e1bdcb24523885a63d1bb7baf76940 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Wed, 25 Feb 2026 16:20:47 -0700 Subject: [PATCH 30/50] [ZIP 231] Update abstract and motivation to clarify memo bundle data savings. In the aftermath of the recent coinholder vote, it became clear that the data-saving motivations for separating memos from transaction outputs had not been clearly represented in the draft ZIP. This alters the abstract and motivation sections to clarify this point. --- zips/zip-0231.md | 83 ++++++++++++++++++++++++++++++------------------ 1 file changed, 52 insertions(+), 31 deletions(-) diff --git a/zips/zip-0231.md b/zips/zip-0231.md index 05e29ade5..2cedc8ce5 100644 --- a/zips/zip-0231.md +++ b/zips/zip-0231.md @@ -31,10 +31,13 @@ The terms "Mainnet" and "Testnet" are to be interpreted as described in # Abstract -Currently, the memo sent in a shielded output is limited to at most 512 bytes. -This ZIP proposes to allow larger memos, and to enable memo data to be shared -between multiple recipients of a transaction. +Currently, the memo along with a shielded output is fixed to 512 bytes of data. +This ZIP proposes to decouple memo data from outputs. This will: +* reduce the default memo data of a transaction from a minimum of 1024 bytes to + approximately 580 bytes +* allow larger memos, with a proportionate increase in fees +* enable memo data to be shared between multiple recipients of a transaction # Motivation @@ -44,34 +47,47 @@ and a corresponding 512-byte memo field. [^protocol-noteptconcept] Recipients can only decrypt the outputs sent to them, and thus can also only observe the memo fields included with the outputs they can decrypt. -The shielded transaction protocol hides the sender(s) (that is, the addresses -corresponding to the keys used to spend the input notes) from all of the -recipients. For certain kinds of transactions, it is desirable to make one or -more sender addresses available to one or more recipients (for example, a reply -address). In such circumstances it is important to authenticate the sender -addresses, to give the recipient a guarantee that the address is controlled by -a sender of the transaction; failure to authenticate this address can enable -phishing attacks. These Authenticated Reply Addresses require zero-knowledge -proofs, and for the Orchard protocol these proofs are too large to fit into a -512-byte memo field. - -It is also desirable, for clients with more stringent bandwidth constraints, -to be able to transmit encrypted notes to the client without including the -encrypted memo data. In the current light client protocol [^zip-0307], this -is done by truncating the note ciphertext to just the part that encrypts the -memo. However, that has the effect of truncating the authentication tag, and -so the resulting decryption algorithm does not meet standard security notions -for an authenticated encryption scheme. It is a goal of this proposal to -rectify this, simplifying the security argument. - -Instead of the memo data, this ZIP proposes that it is possible to indicate whether -a memo is present for the recipient. When using the light client protocol, a recipient -need not download full transaction information if this indication tells them that they -have not received any memo in the transaction. - -At present, it is not possible to transmit the same memo data to multiple -transaction recipients without redundantly encoding that data, and sending -memo data greater than 512 bytes requires sending multiple outputs; the +An ordinary transaction is one that is padded to 2 inputs and 2 outputs (or 2 +Orchard actions), so as to make transfers that fully transfer a note +indistinguishable from an ordinary transaction with change. Such a transaction +will consume 1024 bytes of block space for memo data. An Orchard transfer that +spends a larger number of notes will incur a memo data cost of $512 * n$ bytes +on-chain, where `n` is the number of notes being spent as inputs. Ordinarily, +most of this data space is wasted, as most wallets support only a single +512-byte memo to be sent to the recipient of the transfer. Virtually all +transactions with shielded components consume more that 1024 bytes of memo +data, and between half and 3/4 of that data payload is ordinarily waste. +Adopting this ZIP will eliminate a significant source of chain bloat. + +In addition to reducing chain data usage, for certain kinds of transactions, it +is desirable to make one or more sender addresses available to one or more +recipients (for example, a reply address). In such circumstances it is +important to authenticate the sender addresses, to give the recipient a +guarantee that the address is controlled by a sender of the transaction; +failure to authenticate this address can enable phishing attacks. These +Authenticated Reply Addresses require zero-knowledge proofs, and for the +Orchard protocol these proofs are too large to fit into the existing 512-byte +memo field. To support the inclusion of such proofs, we make it possible to +support memos with up to 16 kilobytes of contiguous data, with the user +paying an additional fee for each 512 byte chunk of data. + +Another motivation is that it is desirable, for clients with more stringent +bandwidth constraints, to be able to transmit encrypted notes to the client +without including the encrypted memo data. In the current light client protocol +[^zip-0307], this is done by truncating the note ciphertext to just the part +that encrypts the memo. However, that has the effect of truncating the +authentication tag, and so the resulting decryption algorithm does not meet +standard security notions for an authenticated encryption scheme. It is a goal +of this proposal to rectify this, simplifying the security argument. + +Instead of the memo data, this ZIP proposes that it is possible to indicate +whether a memo is present for the recipient. When using the light client +protocol, a recipient need not download full transaction information if this +indication tells them that they have not received any memo in the transaction. + +Finally, at present, it is not possible to transmit the same memo data to +multiple transaction recipients without redundantly encoding that data, and +sending memo data greater than 512 bytes requires sending multiple outputs; the problem is compounded when attempting to send more than 512 bytes to each recipient. By separating memo data from the decryption capability for those memos, it admits a greater variety of applications that utilize memo data, @@ -111,6 +127,11 @@ potential distinguisher along another. # Requirements +- Standard Zcash shielded transactions continue to include a single 512-byte + memo. +- The mechanism should be able to reproduce the existing functionality where + each output may include a corresponding 512 bytes of memo data that is + decryptable only by the recipient of that output. - Recipients can receive memo data that is greater than 512 bytes in length. - Multiple recipients, across any of the shielded pools, can be given the capability to view the same memo data. From 99baad4ead2d1d3c46bc59c653d470da96a1a0ef Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Wed, 25 Feb 2026 17:38:59 -0700 Subject: [PATCH 31/50] Apply suggestions from code review Co-authored-by: Daira-Emma Hopwood Co-authored-by: Jack Grigg --- zips/zip-0231.md | 60 +++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/zips/zip-0231.md b/zips/zip-0231.md index 2cedc8ce5..8e97b3890 100644 --- a/zips/zip-0231.md +++ b/zips/zip-0231.md @@ -31,45 +31,52 @@ The terms "Mainnet" and "Testnet" are to be interpreted as described in # Abstract -Currently, the memo along with a shielded output is fixed to 512 bytes of data. +Currently, the memo associated with a shielded output is fixed to 512 bytes of data. This ZIP proposes to decouple memo data from outputs. This will: -* reduce the default memo data of a transaction from a minimum of 1024 bytes to - approximately 580 bytes -* allow larger memos, with a proportionate increase in fees -* enable memo data to be shared between multiple recipients of a transaction +* reduce the default memo data of a transaction from a minimum of 1024 bytes to + approximately 576 bytes; +* allow larger memos, with a proportionate increase in fees; +* enable memo data to be shared between multiple recipients of a transaction; +* enable memo data to be pruned from a stored transaction without impairing the + ability of a consensus node to validate the transaction. + # Motivation In Zcash transaction versions v2 to v5 inclusive, each Sapling or Orchard -shielded output contains a ciphertext comprised of a 52-byte note plaintext, -and a corresponding 512-byte memo field. [^protocol-noteptconcept] Recipients -can only decrypt the outputs sent to them, and thus can also only observe the -memo fields included with the outputs they can decrypt. +shielded output contains a ciphertext comprised of a 52-byte note plaintext and +corresponding 512-byte memo field, with a 16-byte authentication tag +[^protocol-noteptconcept]. Recipients can only decrypt the outputs sent to +them, and thus can also only observe the memo fields included with the outputs +they can decrypt. An ordinary transaction is one that is padded to 2 inputs and 2 outputs (or 2 Orchard actions), so as to make transfers that fully transfer a note indistinguishable from an ordinary transaction with change. Such a transaction will consume 1024 bytes of block space for memo data. An Orchard transfer that -spends a larger number of notes will incur a memo data cost of $512 * n$ bytes -on-chain, where `n` is the number of notes being spent as inputs. Ordinarily, -most of this data space is wasted, as most wallets support only a single -512-byte memo to be sent to the recipient of the transfer. Virtually all -transactions with shielded components consume more that 1024 bytes of memo -data, and between half and 3/4 of that data payload is ordinarily waste. -Adopting this ZIP will eliminate a significant source of chain bloat. - -In addition to reducing chain data usage, for certain kinds of transactions, it -is desirable to make one or more sender addresses available to one or more -recipients (for example, a reply address). In such circumstances it is -important to authenticate the sender addresses, to give the recipient a +spends a larger number of notes will incur a memo data cost of $512 \times n$ +bytes on-chain, where $n$ is the number of notes being spent as inputs. +Ordinarily, most of this data space is wasted, as most wallets support only a +single 512-byte memo to be sent to the recipient of the transfer. Virtually all +transactions with shielded components consume at least 1024 bytes of block +space for memo data, and between half and 3/4 of that data payload is +ordinarily waste. Adopting this ZIP will eliminate a significant source of +chain bloat. + +Beyond reducing chain bloat, decoupling memos from shielded outputs allows for +some important use cases to be served. The shielded transaction protocol always +hides the sender(s) (that is, the addresses corresponding to the keys used to +spend the input notes) from all of the recipients. For certain kinds of +transactions, it is desirable to make one or more sender addresses available to +one or more recipients (for example, a reply address). In such circumstances it +is important to authenticate the sender address(es), to give the recipient a guarantee that the address is controlled by a sender of the transaction; failure to authenticate this address can enable phishing attacks. These Authenticated Reply Addresses require zero-knowledge proofs, and for the Orchard protocol these proofs are too large to fit into the existing 512-byte -memo field. To support the inclusion of such proofs, we make it possible to -support memos with up to 16 kilobytes of contiguous data, with the user -paying an additional fee for each 512 byte chunk of data. +memo field. This ZIP makes the maximum size of memo data large enough to +support the inclusion of such proofs. Another motivation is that it is desirable, for clients with more stringent bandwidth constraints, to be able to transmit encrypted notes to the client @@ -85,6 +92,11 @@ whether a memo is present for the recipient. When using the light client protocol, a recipient need not download full transaction information if this indication tells them that they have not received any memo in the transaction. +In addition to reducing chain bloat by eliminating wasted memo space, this ZIP +defines a mechanism by which validating nodes may reduce their long-term +storage requirements by pruning memo data, without impairing their ability to +validate the entire chain. + Finally, at present, it is not possible to transmit the same memo data to multiple transaction recipients without redundantly encoding that data, and sending memo data greater than 512 bytes requires sending multiple outputs; the From f70696dc2a876ac8d487522750ba1a0a460cf2a0 Mon Sep 17 00:00:00 2001 From: Daira-Emma Hopwood Date: Mon, 2 Mar 2026 09:46:53 +0000 Subject: [PATCH 32/50] [zip-template] Adjust the title and regenerate `README.rst`. Signed-off-by: Daira-Emma Hopwood --- README.rst | 2 ++ zips/zip-template.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 53f690b36..e2376fe52 100644 --- a/README.rst +++ b/README.rst @@ -212,6 +212,7 @@ written. 2005 Quantum Recoverability Draft zips#1135 guide-markdown {Something Short and To the Point} Draft guide {Something Short and To the Point} Draft + template {Template for new ZIPs} Draft Drafts without assigned ZIP numbers @@ -384,4 +385,5 @@ Index of ZIPs 2005 Quantum Recoverability Draft guide-markdown {Something Short and To the Point} Draft guide {Something Short and To the Point} Draft + template {Template for new ZIPs} Draft diff --git a/zips/zip-template.md b/zips/zip-template.md index 487259eb2..63b69f34d 100644 --- a/zips/zip-template.md +++ b/zips/zip-template.md @@ -1,5 +1,5 @@ ZIP: Unassigned {numbers are assigned by ZIP editors} - Title: {Something Short and To the Point} + Title: {Template for new ZIPs} Owners: First Owner ... Credits: First Credited From 0ed578ff7592cb9ca8a01068c993b82424a16a7a Mon Sep 17 00:00:00 2001 From: Daira-Emma Hopwood Date: Mon, 2 Mar 2026 09:56:54 +0000 Subject: [PATCH 33/50] Update to katex 0.16.33 and mermaid 11.12.3. Signed-off-by: Daira-Emma Hopwood --- render.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/render.sh b/render.sh index 34f18b2a3..045e9e7b5 100755 --- a/render.sh +++ b/render.sh @@ -32,11 +32,11 @@ fi title="$(basename -s ${filetype} ${inputfile} | sed -E 's|zip-0{0,3}|ZIP |; s|draft-|Draft |')$(grep -E '^(\.\.)?\s*Title: ' ${inputfile} |sed -E 's|.*Title||')" echo " ${title}" -Math1='' -Math2='' -Math3='' +Math1='' +Math2='' +Math3='' -Mermaid='' +Mermaid='' ViewAndStyle='' From 57909f11df28104c8f1c15d8e7b57a51cd765e24 Mon Sep 17 00:00:00 2001 From: Daira-Emma Hopwood Date: Sun, 1 Mar 2026 17:24:50 +0000 Subject: [PATCH 34/50] ZIP 32: clarify the entropy requirement for wallet seeds. Signed-off-by: Daira-Emma Hopwood --- zips/zip-0032.rst | 63 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/zips/zip-0032.rst b/zips/zip-0032.rst index 5ced05e57..93294433c 100644 --- a/zips/zip-0032.rst +++ b/zips/zip-0032.rst @@ -148,6 +148,57 @@ Note: no corresponding notation is currently defined for the result of `Hardened-only child key derivation`_ with non-zero $\mathsf{lead}$ and/or non-empty $\mathsf{tag}$. +Specification: Wallet seeds +=========================== + +Several of the key derivation algorithms specified in this ZIP derive a master key from a +seed byte sequence. Any such seed byte sequence MUST be at least 32 and at most 252 bytes. + +The method of generating such a seed byte sequence MUST ensure that it has at least 256 bits +of entropy. This requirement also applies to any mnemonic or input randomness used to obtain +the seed byte sequence. For example, when the seed byte sequence is generated from a BIP 39 +mnemonic [#bip-0039]_ (usually called a "secret recovery phrase"), the generator of the +mnemonic MUST ensure that it has at least 256 bits of entropy, which will require at least +24-word mnemonics. BIP 39 mnemonics SHOULD be exactly 24 words for interoperability. + +In the case where a wallet implementation restores a wallet from an existing mnemonic / +secret recovery phrase, it will normally not be in a position to enforce a minimum entropy +requirement on that mnemonic. It SHOULD NOT present the wallet restore option as enabling +the user to arbitrarily pick their own mnemonic, since it would be unrealistic to assume +that such user-chosen mnemonics will meet the entropy requirement in general. + +A wallet implementation MAY accept BIP 39 mnemonics of fewer than 24 words when restoring +a wallet (but as specified above, MUST NOT generate such mnemonics). If it accepts them —or +in other cases where it can reliably detect that the seed to be restored will have less than +256 bits of entropy— it SHOULD warn the user that the security of the restored wallet will +be weaker than expected, and SHOULD recommend transferring all of the wallet's funds, once +it has fully synced, to another wallet controlled by the user. + +Rationale for the 256-bit entropy requirement +--------------------------------------------- + +Zcash consistently uses cryptovalues of length at or close to 256 bits, throughout its +cryptographic design. Although the target security level for the protocol against classical +cryptanalytic attacks is $2^{125}$ (i.e. any such attack should take at least $2^{125}$ +operations, as explained in [#zcash-security]_), this does not imply that 128-bit keys or +seeds are sufficient. The apparent gap between the security target and the key length is +well motivated: it provides better resistance to attacks using parallel hardware +[#Bernstein2005]_ in the multi-user setting [#Zaverucha2012]_; it takes into account small +entropy losses in the key derivation process; and it simplifies the analysis of the protocol +against quantum attacks for unknown addresses [#zcash-security]_, or in the context of a +future post-quantum recovery protocol [#zip-2005]_. + +In particular, for the hierarchical key derivation method described in this ZIP, if the seed +or mnemonic has entropy less than 256 bits, it will be a weak link in the derivation of +*all* keys belonging to that wallet. + +It should be noted that an adversary can search for uses of lower-entropy mnemonics across +multiple wallets simultaneously. They can collect a large set of (transparent or shielded) +target addresses and/or viewing keys, and then perform a brute-force search over mnemonics +in a lower-entropy subspace, efficiently checking whether the first few addresses or viewing +keys that would be generated from each mnemonic match any of the targets. + + Specification: Sapling key derivation ===================================== @@ -187,7 +238,7 @@ Define Sapling master key generation ----------------------------- -Let $S$ be a seed byte sequence of a chosen length, which MUST be at least 32 and at most 252 bytes. +Let $S$ be a seed byte sequence meeting the requirements in `Specification: Wallet seeds`_. - Calculate $I = \mathsf{BLAKE2b}\text{-}\mathsf{512}(\texttt{“ZcashIP32Sapling”}, S)$. - Split $I$ into two 32-byte sequences, $I_L$ and $I_R$. @@ -440,7 +491,7 @@ is the normal Orchard spending key (opaque 32 bytes), and $\mathsf{c}$ is the ch Orchard master key generation ----------------------------- -Let $S$ be a seed byte sequence of a chosen length, which MUST be at least 32 and at most 252 bytes. +Let $S$ be a seed byte sequence meeting the requirements in `Specification: Wallet seeds`_. - Return $\mathsf{MKGh}^\mathsf{Orchard}(S)$ as the master extended spending key $m_\mathsf{Orchard}$. @@ -552,7 +603,7 @@ We instantiate the hardened key generation process with the following constants: Registered subtree root key generation -------------------------------------- -Let $S$ be a seed byte sequence of a chosen length, which MUST be at least 32 and at most 252 bytes. +Let $S$ be a seed byte sequence meeting the requirements in `Specification: Wallet seeds`_. The registered subtree root is obtained as: @@ -624,7 +675,7 @@ We instantiate the hardened key derivation process with the following constants: Ad-hoc master key generation (deprecated) ----------------------------------------- -Let $S$ be a seed byte sequence of a chosen length, which MUST be at least 32 and at most 252 bytes. +Let $S$ be a seed byte sequence meeting the requirements in `Specification: Wallet seeds`_. The master extended ad-hoc key is: @@ -890,5 +941,9 @@ References .. [#protocol-orchardfullviewingkeyencoding] `Zcash Protocol Specification, Version 2022.2.19. Section 5.6.4.4: Orchard Raw Full Viewing Keys `_ .. [#protocol-orchardspendingkeyencoding] `Zcash Protocol Specification, Version 2022.2.19. Section 5.6.4.5: Orchard Spending Keys `_ .. [#NIST-SP-800-38G] `NIST Special Publication 800-38G — Recommendation for Block Cipher Modes of Operation: Methods for Format-Preserving Encryption `_ +.. [#zcash-security] `Understanding the Security of Zcash. Presentation by Daira-Emma Hopwood at Zcon3 `_ (`slides `_). +.. [#Bernstein2005] `Understanding brute force. Daniel Bernstein, 2005. `_ +.. [#Zaverucha2012] `Hybrid Encryption in the Multi-User Setting. Gregory M. Zaverucha, 2012. `_ .. [#zip-0000] `ZIP 0: ZIP Process `_ .. [#zip-0316] `ZIP 316: Unified Addresses and Unified Viewing Keys `_ +.. [#zip-2005] `ZIP 2005: Orchard Quantum Recoverability `_ From 1cac5738735e9c7db9cd8e9e324975a204a05005 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Thu, 26 Feb 2026 12:06:42 -0700 Subject: [PATCH 35/50] Use zcash/MultiMarkdown-6 fork via Nix flake input Pin multimarkdown to the zcash fork (commit 543434c9) instead of the nixpkgs package, ensuring the same version used by the Docker-based build. Co-Authored-By: Claude Opus 4.6 --- flake.lock | 25 +++++++++++++++++++++++++ flake.nix | 48 +++++++++++++++++++++++++++--------------------- 2 files changed, 52 insertions(+), 21 deletions(-) diff --git a/flake.lock b/flake.lock index 5a9df8191..9dd4af3af 100644 --- a/flake.lock +++ b/flake.lock @@ -18,6 +18,30 @@ "type": "github" } }, + "multimarkdown6": { + "inputs": { + "flake-utils": [ + "flake-utils" + ], + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1772132433, + "narHash": "sha256-ScYZ7ME1N1zI34iwdGIdshChqsdrOgS09aLbkIZ7Xjo=", + "owner": "zcash", + "repo": "MultiMarkdown-6", + "rev": "543434c9df78b6be9e8125ff19a5e6934dc8ba82", + "type": "github" + }, + "original": { + "owner": "zcash", + "repo": "MultiMarkdown-6", + "rev": "543434c9df78b6be9e8125ff19a5e6934dc8ba82", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1768564909, @@ -37,6 +61,7 @@ "root": { "inputs": { "flake-utils": "flake-utils", + "multimarkdown6": "multimarkdown6", "nixpkgs": "nixpkgs" } }, diff --git a/flake.nix b/flake.nix index b69455b2b..6b1df41a2 100644 --- a/flake.nix +++ b/flake.nix @@ -4,44 +4,50 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; + multimarkdown6 = { + url = "github:zcash/MultiMarkdown-6/543434c9df78b6be9e8125ff19a5e6934dc8ba82"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.flake-utils.follows = "flake-utils"; + }; }; - outputs = { self, nixpkgs, flake-utils }: + outputs = { self, nixpkgs, flake-utils, multimarkdown6 }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; + mmd = multimarkdown6.packages.${system}.default; in { devShells.default = pkgs.mkShell { - buildInputs = with pkgs; [ + buildInputs = [ # Core dependencies for render.sh - python3Packages.docutils # provides rst2html5 - pandoc # pandoc markdown renderer - multimarkdown # multimarkdown renderer - perl # perl for text processing + pkgs.python3Packages.docutils # provides rst2html5 + pkgs.pandoc # pandoc markdown renderer + mmd # multimarkdown renderer (zcash fork) + pkgs.perl # perl for text processing # Build system dependencies - gnumake # make command for building - git # required by Makefile for safe.directory + pkgs.gnumake # make command for building + pkgs.git # required by Makefile for safe.directory # LaTeX dependencies for protocol PDF generation - (texlive.combine { - inherit (texlive) scheme-full; + (pkgs.texlive.combine { + inherit (pkgs.texlive) scheme-full; }) # Python dependencies for links_and_dests.py - python3 - python3Packages.beautifulsoup4 - python3Packages.html5lib - python3Packages.certifi + pkgs.python3 + pkgs.python3Packages.beautifulsoup4 + pkgs.python3Packages.html5lib + pkgs.python3Packages.certifi # Standard utilities (usually available, but ensuring they're present) - coreutils # sed, grep, cat, basename, wc, diff, cp, rm, mkdir, touch - bash # shell interpreter - gnused # GNU sed - gnugrep # GNU grep - diffutils # diff command - findutils # utilities for finding files + pkgs.coreutils + pkgs.bash + pkgs.gnused + pkgs.gnugrep + pkgs.diffutils + pkgs.findutils ]; shellHook = '' @@ -63,4 +69,4 @@ }; } ); -} \ No newline at end of file +} From 46e1685048370791bca16a5c8db909866e691dd5 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Thu, 26 Feb 2026 12:08:28 -0700 Subject: [PATCH 36/50] Switch CI from Docker to Nix for rendering Replace Docker-based GitHub Actions with composite actions that use cachix/install-nix-action and `nix develop` to run builds. This eliminates Docker flakiness in CI and uses the same reproducible Nix environment defined in flake.nix. Changes: - Convert render and render-protocol actions from Docker to composite - Remove safe.directory workarounds (only needed for Docker UID mismatch) - Use `make all` directly instead of `make all-docker` Co-Authored-By: Claude Opus 4.6 --- .github/actions/render-protocol/action.yml | 10 +++++++--- .github/actions/render/action.yml | 12 +++++++----- .github/workflows/publish.yaml | 1 - .github/workflows/render.yml | 6 ------ 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/.github/actions/render-protocol/action.yml b/.github/actions/render-protocol/action.yml index f9839b4c3..2b403e3dc 100644 --- a/.github/actions/render-protocol/action.yml +++ b/.github/actions/render-protocol/action.yml @@ -2,6 +2,10 @@ name: Render Zcash Protocol Specification description: GitHub Action to compile ZIPs and also Zcash Protocol Specification LaTeX documents author: Deirdre Connolly and Daira-Emma Hopwood runs: - using: docker - # Runs the default `make all-docker`. - image: ../../../Dockerfile + using: composite + steps: + - uses: cachix/install-nix-action@19effe9fe722874e6d46dd7182e4b8b7a43c4a99 # v31.10.0 + with: + nix_path: nixpkgs=channel:nixos-unstable + - shell: bash + run: nix develop --command make all diff --git a/.github/actions/render/action.yml b/.github/actions/render/action.yml index b9676e908..b9b0eed4f 100644 --- a/.github/actions/render/action.yml +++ b/.github/actions/render/action.yml @@ -2,8 +2,10 @@ name: Render ZIPs description: GitHub Action to compile ZIPs only author: Deirdre Connolly and Daira-Emma Hopwood runs: - using: docker - image: ../../../Dockerfile - # Runs "make all-zips". - args: - - all-zips + using: composite + steps: + - uses: cachix/install-nix-action@19effe9fe722874e6d46dd7182e4b8b7a43c4a99 # v31.10.0 + with: + nix_path: nixpkgs=channel:nixos-unstable + - shell: bash + run: nix develop --command make all-zips diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 8ca31dacb..b6286f4f6 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -50,7 +50,6 @@ jobs: set -x git config --global user.name 'github_actions' git config --global user.email 'actions@github.com' - git config --global --add safe.directory /github/workspace version="$(git describe --tags --abbrev=6 origin/main |sed 's/-1-g.*//')" # Merge preferring the version in main. git merge -s recursive -Xtheirs origin/main --commit -m 'Auto-deploy: merging "main" branch' diff --git a/.github/workflows/render.yml b/.github/workflows/render.yml index aef4f8b97..a770ff9d4 100644 --- a/.github/workflows/render.yml +++ b/.github/workflows/render.yml @@ -17,9 +17,6 @@ jobs: run: | if [ -e rendered ]; then exit 1; fi - - name: Set git config - run: git config --global --add safe.directory /github/workspace - - name: Compile ZIPs uses: ./.github/actions/render @@ -38,9 +35,6 @@ jobs: if [ -e rendered ]; then exit 1; fi if [ -e base_ref ]; then exit 1; fi - - name: Set git config - run: git config --global --add safe.directory /github/workspace - - name: Set base ref run: | git show --format=%H --no-notes --no-patch "HEAD~1" -- |tee base_ref From 29c1edeb9b708e7933c654eee227dbf0ff731c8d Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Thu, 26 Feb 2026 12:09:56 -0700 Subject: [PATCH 37/50] Add Nix store caching to CI actions Use DeterminateSystems/magic-nix-cache-action to cache the Nix store across CI runs via GitHub Actions cache, avoiding repeated downloads of texlive and other large dependencies. Co-Authored-By: Claude Opus 4.6 --- .github/actions/render-protocol/action.yml | 5 ++--- .github/actions/render/action.yml | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/actions/render-protocol/action.yml b/.github/actions/render-protocol/action.yml index 2b403e3dc..479286f06 100644 --- a/.github/actions/render-protocol/action.yml +++ b/.github/actions/render-protocol/action.yml @@ -4,8 +4,7 @@ author: Deirdre Connolly and Daira-Emma Hopwood runs: using: composite steps: - - uses: cachix/install-nix-action@19effe9fe722874e6d46dd7182e4b8b7a43c4a99 # v31.10.0 - with: - nix_path: nixpkgs=channel:nixos-unstable + - uses: DeterminateSystems/nix-installer-action@c5a866b6ab867e88becbed4467b93592bce69f8a # v21 + - uses: DeterminateSystems/magic-nix-cache-action@565684385bcd71bad329742eefe8d12f2e765b39 # v13 - shell: bash run: nix develop --command make all diff --git a/.github/actions/render/action.yml b/.github/actions/render/action.yml index b9b0eed4f..780c5a5d3 100644 --- a/.github/actions/render/action.yml +++ b/.github/actions/render/action.yml @@ -4,8 +4,7 @@ author: Deirdre Connolly and Daira-Emma Hopwood runs: using: composite steps: - - uses: cachix/install-nix-action@19effe9fe722874e6d46dd7182e4b8b7a43c4a99 # v31.10.0 - with: - nix_path: nixpkgs=channel:nixos-unstable + - uses: DeterminateSystems/nix-installer-action@c5a866b6ab867e88becbed4467b93592bce69f8a # v21 + - uses: DeterminateSystems/magic-nix-cache-action@565684385bcd71bad329742eefe8d12f2e765b39 # v13 - shell: bash run: nix develop --command make all-zips From 6664795d287284e6510a8c68cc32421d319b614f Mon Sep 17 00:00:00 2001 From: Daira-Emma Hopwood Date: Tue, 3 Mar 2026 21:50:27 +0000 Subject: [PATCH 38/50] Apply suggestion from @daira to clarify what was meant by "default memo data" --- zips/zip-0231.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zips/zip-0231.md b/zips/zip-0231.md index 8e97b3890..2f9b208f9 100644 --- a/zips/zip-0231.md +++ b/zips/zip-0231.md @@ -34,8 +34,8 @@ The terms "Mainnet" and "Testnet" are to be interpreted as described in Currently, the memo associated with a shielded output is fixed to 512 bytes of data. This ZIP proposes to decouple memo data from outputs. This will: -* reduce the default memo data of a transaction from a minimum of 1024 bytes to - approximately 576 bytes; +* reduce the memo data of a transaction with two shielded outputs from a minimum + of 1024 bytes to approximately 576 bytes; * allow larger memos, with a proportionate increase in fees; * enable memo data to be shared between multiple recipients of a transaction; * enable memo data to be pruned from a stored transaction without impairing the From 7d0a6b66e66cfa3a72ae63f18f615427321fc126 Mon Sep 17 00:00:00 2001 From: Daira-Emma Hopwood Date: Tue, 3 Mar 2026 22:22:54 +0000 Subject: [PATCH 39/50] ZIPs 32 and 315: Updates from ZIP sync meeting concerning wallet seeds. Co-authored-by: Jack Grigg Co-authored-by: Kris Nuttycombe --- zips/zip-0032.rst | 29 ++++++++--------------------- zips/zip-0315.rst | 26 ++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/zips/zip-0032.rst b/zips/zip-0032.rst index 93294433c..5fb3e8f16 100644 --- a/zips/zip-0032.rst +++ b/zips/zip-0032.rst @@ -66,8 +66,8 @@ Zcash's transparent addresses [#slip-0044]_) generate keys and addresses determi advantages over random generation: - Wallets only need to store a single seed (particularly useful for hardware wallets). -- A one-time backup of the seed (usually stored as a word phrase [#bip-0039]_) can be used to recover funds - from all future addresses. +- A one-time backup of the seed (usually stored as a BIP 39 mnemonic [#bip-0039]_ or SLIP 39 shares + [#slip-0039]_) can be used to recover funds from all future addresses. - Keys are arranged into a tree of chains, enabling wallets to represent "accounts" or other high-level structures. - Viewing authority or spending authority can be delegated independently for sub-trees without compromising @@ -154,25 +154,10 @@ Specification: Wallet seeds Several of the key derivation algorithms specified in this ZIP derive a master key from a seed byte sequence. Any such seed byte sequence MUST be at least 32 and at most 252 bytes. -The method of generating such a seed byte sequence MUST ensure that it has at least 256 bits -of entropy. This requirement also applies to any mnemonic or input randomness used to obtain -the seed byte sequence. For example, when the seed byte sequence is generated from a BIP 39 -mnemonic [#bip-0039]_ (usually called a "secret recovery phrase"), the generator of the -mnemonic MUST ensure that it has at least 256 bits of entropy, which will require at least -24-word mnemonics. BIP 39 mnemonics SHOULD be exactly 24 words for interoperability. - -In the case where a wallet implementation restores a wallet from an existing mnemonic / -secret recovery phrase, it will normally not be in a position to enforce a minimum entropy -requirement on that mnemonic. It SHOULD NOT present the wallet restore option as enabling -the user to arbitrarily pick their own mnemonic, since it would be unrealistic to assume -that such user-chosen mnemonics will meet the entropy requirement in general. - -A wallet implementation MAY accept BIP 39 mnemonics of fewer than 24 words when restoring -a wallet (but as specified above, MUST NOT generate such mnemonics). If it accepts them —or -in other cases where it can reliably detect that the seed to be restored will have less than -256 bits of entropy— it SHOULD warn the user that the security of the restored wallet will -be weaker than expected, and SHOULD recommend transferring all of the wallet's funds, once -it has fully synced, to another wallet controlled by the user. +The method of generating such a seed byte sequence for Zcash purposes MUST ensure that it +has at least 256 bits of entropy. This requirement also applies to any mnemonic or input +randomness used to obtain the seed byte sequence. See ZIP 315 [#zip-0315-wallet-seeds]_ for +further guidance. Rationale for the 256-bit entropy requirement --------------------------------------------- @@ -923,6 +908,7 @@ References .. [#BCP14] `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" `_ .. [#bip-0032] `BIP 32: Hierarchical Deterministic Wallets `_ .. [#bip-0039] `BIP 39: Mnemonic code for generating deterministic keys `_ +.. [#slip-0039] `SLIP 39: Shamir's Secret-Sharing for Mnemonic Codes `_ .. [#bip-0043] `BIP 43: Purpose Field for Deterministic Wallets `_ .. [#bip-0044] `BIP 44: Multi-Account Hierarchy for Deterministic Wallets `_ .. [#slip-0044] `SLIP 44: Registered coin types for BIP-0044 `_ @@ -945,5 +931,6 @@ References .. [#Bernstein2005] `Understanding brute force. Daniel Bernstein, 2005. `_ .. [#Zaverucha2012] `Hybrid Encryption in the Multi-User Setting. Gregory M. Zaverucha, 2012. `_ .. [#zip-0000] `ZIP 0: ZIP Process `_ +.. [#zip-0315-wallet-seeds] `ZIP 315: Best Practices for Wallet Implementations — Specification: Wallet seeds `_ .. [#zip-0316] `ZIP 316: Unified Addresses and Unified Viewing Keys `_ .. [#zip-2005] `ZIP 2005: Orchard Quantum Recoverability `_ diff --git a/zips/zip-0315.rst b/zips/zip-0315.rst index 9a0d4a7a2..df3c381da 100644 --- a/zips/zip-0315.rst +++ b/zips/zip-0315.rst @@ -126,6 +126,29 @@ other. Specification ============= +Wallet seeds +------------ + +To meet the ZIP 32 requirement on the entropy of wallet seeds +[#zip-0032-wallet-seeds]_, when generating a seed byte sequence: + +* if using a BIP 39 mnemonic [#bip-0039]_, a 24-word mnemonic will be needed; +* if using SLIP 39 secret sharing [#slip-0039]_, a share length of 33 words will + be needed. + +In the case where a wallet implementation restores a wallet from an existing +mnemonic, it will normally not be in a position to enforce a minimum entropy +requirement on that mnemonic. + +A wallet implementation MAY accept BIP 39 mnemonics of fewer than 24 words or +SLIP 39 shares of fewer than 33 words when restoring a wallet (but as specified +above, MUST NOT generate them). If it accepts them —or in other cases where it +can reliably detect that the seed to be restored will have less than 256 bits of +entropy— it SHOULD warn the user that the security of the restored wallet will +be weaker than expected, and SHOULD recommend transferring all of the wallet's +funds, once it has fully synced, to another wallet controlled by the user. + + Long-term storage of funds -------------------------- @@ -751,7 +774,10 @@ References ========== .. [#BCP14] `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" `_ +.. [#bip-0039] `BIP 39: Mnemonic code for generating deterministic keys `_ +.. [#slip-0039] `SLIP 39: Shamir's Secret-Sharing for Mnemonic Codes `_ .. [#zip-0032] `ZIP 32: Shielded Hierarchical Deterministic Wallets `_ +.. [#zip-0032-wallet-seeds] `ZIP 32: Shielded Hierarchical Deterministic Wallets — Specification: Wallet seeds `_ .. [#zip-0032-wallet-usage] `ZIP 32: Shielded Hierarchical Deterministic Wallets — Specification: Wallet usage `_ .. [#zip-0203] `ZIP 203: Transaction Expiry `_ .. [#zip-0316] `ZIP 316: Unified Addresses and Unified Viewing Keys `_ From ea5db32bc81e33a7437868bd75eb176c778ce16a Mon Sep 17 00:00:00 2001 From: Daira-Emma Hopwood Date: Tue, 3 Mar 2026 22:34:11 +0000 Subject: [PATCH 40/50] ZIP 32: collapse rationale for the 256-bit entropy requirement. Signed-off-by: Daira-Emma Hopwood --- zips/zip-0032.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/zips/zip-0032.rst b/zips/zip-0032.rst index 5fb3e8f16..8fba1d59b 100644 --- a/zips/zip-0032.rst +++ b/zips/zip-0032.rst @@ -162,6 +162,11 @@ further guidance. Rationale for the 256-bit entropy requirement --------------------------------------------- +.. raw:: html + +

+ Click to show/hide + Zcash consistently uses cryptovalues of length at or close to 256 bits, throughout its cryptographic design. Although the target security level for the protocol against classical cryptanalytic attacks is $2^{125}$ (i.e. any such attack should take at least $2^{125}$ @@ -183,6 +188,10 @@ target addresses and/or viewing keys, and then perform a brute-force search over in a lower-entropy subspace, efficiently checking whether the first few addresses or viewing keys that would be generated from each mnemonic match any of the targets. +.. raw:: html + +
+ Specification: Sapling key derivation ===================================== From 1a115f2518ffc18f311b3bad9d3ca407d5dd4cf5 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Fri, 6 Mar 2026 17:13:54 -0700 Subject: [PATCH 41/50] Use PyPI rst2html5 2.0.1 in Nix dev shell instead of docutils' built-in rst2html5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Nix flake was providing docutils' built-in rst2html5 (the html5_polyglot writer), but render.sh expects the separate PyPI package rst2html5 2.0.1 by André Felipe Dias, which has different math handling. This mismatch (introduced by the switch to Nix-based CI rendering) caused warnings for math commands like \underline and \mathbin, and for syntax highlighting of code blocks. This adds a custom derivation for rst2html5 2.0.1 from PyPI with its dependencies (docutils, Genshi, Pygments), matching the versions specified in zip-guide.rst. Co-Authored-By: Claude Opus 4.6 --- flake.nix | 55 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/flake.nix b/flake.nix index 6b1df41a2..bf207164d 100644 --- a/flake.nix +++ b/flake.nix @@ -11,24 +11,63 @@ }; }; - outputs = { self, nixpkgs, flake-utils, multimarkdown6 }: - flake-utils.lib.eachDefaultSystem (system: + outputs = + { + self, + nixpkgs, + flake-utils, + multimarkdown6, + }: + flake-utils.lib.eachDefaultSystem ( + system: let pkgs = nixpkgs.legacyPackages.${system}; mmd = multimarkdown6.packages.${system}.default; + + # Pin rst2html5 to the version specified in zip-guide.rst. + # This is a separate PyPI package from docutils' built-in rst2html5; + # it provides its own HTML5 writer with different math handling. + rst2html5 = pkgs.python3Packages.buildPythonPackage rec { + pname = "rst2html5"; + version = "2.0.1"; + pyproject = true; + + src = pkgs.fetchPypi { + inherit pname version; + hash = "sha256-MJmYyF+rAo8vywGizNyIbbCvxDmCYueVoC6pxNDzKuk="; + }; + + build-system = [ pkgs.python3Packages.poetry-core ]; + + dependencies = [ + pkgs.python3Packages.docutils + pkgs.python3Packages.genshi + pkgs.python3Packages.pygments + ]; + + # rst2html5_.py is a top-level module referenced by the entry point + # but poetry-core's include directive doesn't always install it. + postInstall = '' + cp rst2html5_.py $out/${pkgs.python3.sitePackages}/ + ''; + + # Tests require additional fixtures not included in the PyPI tarball + doCheck = false; + }; in { devShells.default = pkgs.mkShell { buildInputs = [ # Core dependencies for render.sh - pkgs.python3Packages.docutils # provides rst2html5 - pkgs.pandoc # pandoc markdown renderer - mmd # multimarkdown renderer (zcash fork) - pkgs.perl # perl for text processing + rst2html5 # rst2html5 2.0.1 (PyPI) + pkgs.python3Packages.pygments # syntax highlighting for code blocks + pkgs.pandoc # pandoc markdown renderer + mmd # multimarkdown renderer (zcash fork) + pkgs.perl # perl for text processing # Build system dependencies - pkgs.gnumake # make command for building - pkgs.git # required by Makefile for safe.directory + pkgs.gnumake # make command for building + pkgs.git # required by Makefile for safe.directory # LaTeX dependencies for protocol PDF generation (pkgs.texlive.combine { From 5c6645f74c53a3f26f62ac08afd62ff4c0172db7 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Fri, 6 Mar 2026 17:21:40 -0700 Subject: [PATCH 42/50] Pin docutils to 0.21.2 to match zip-guide.rst Prevents the docutils version from drifting when nixpkgs updates. Co-Authored-By: Claude Opus 4.6 --- flake.nix | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index bf207164d..14035b348 100644 --- a/flake.nix +++ b/flake.nix @@ -24,7 +24,16 @@ pkgs = nixpkgs.legacyPackages.${system}; mmd = multimarkdown6.packages.${system}.default; - # Pin rst2html5 to the version specified in zip-guide.rst. + # Pin docutils and rst2html5 to the versions specified in zip-guide.rst. + docutils = pkgs.python3Packages.docutils.overridePythonAttrs (old: rec { + version = "0.21.2"; + src = pkgs.fetchPypi { + pname = "docutils"; + inherit version; + hash = "sha256-OmsYcy7fGC2qPNEndbuzOM9WkUaPke7rEJ3v9uv6mG8="; + }; + }); + # This is a separate PyPI package from docutils' built-in rst2html5; # it provides its own HTML5 writer with different math handling. rst2html5 = pkgs.python3Packages.buildPythonPackage rec { @@ -40,7 +49,7 @@ build-system = [ pkgs.python3Packages.poetry-core ]; dependencies = [ - pkgs.python3Packages.docutils + docutils pkgs.python3Packages.genshi pkgs.python3Packages.pygments ]; From 201ca47094b57c998058d8b2adf522109595f005 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Fri, 6 Mar 2026 17:46:39 -0700 Subject: [PATCH 43/50] Merge CI render jobs and enable FlakeHub Cache authentication The render workflow had two separate jobs that each independently set up Nix and magic-nix-cache, doubling store fetches. FlakeHub Cache also couldn't authenticate due to missing OIDC permissions, causing fallback to GitHub Actions cache which quickly hit rate limits (thousands of "substituter disabled" errors per run). - Add id-token: write permission so FlakeHub Cache can authenticate - Merge render and render-protocol into a single job so Nix is set up once; make all-zips runs first as a fast gate, then make all adds the protocol spec build on top Co-Authored-By: Claude Opus 4.6 --- .github/workflows/render.yml | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/.github/workflows/render.yml b/.github/workflows/render.yml index a770ff9d4..9e29a105c 100644 --- a/.github/workflows/render.yml +++ b/.github/workflows/render.yml @@ -6,39 +6,31 @@ on: jobs: render: runs-on: ubuntu-latest + permissions: + id-token: write + contents: read steps: - name: Checkout repository uses: actions/checkout@v6.0.2 with: fetch-depth: 3 - - name: Verify nonexistence of `rendered` - shell: bash - run: | - if [ -e rendered ]; then exit 1; fi - - - name: Compile ZIPs - uses: ./.github/actions/render - - render-protocol: - needs: render - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v6.0.2 - with: - fetch-depth: 100 - - name: Verify nonexistence of `rendered` and `base_ref` shell: bash run: | if [ -e rendered ]; then exit 1; fi if [ -e base_ref ]; then exit 1; fi + - uses: DeterminateSystems/nix-installer-action@c5a866b6ab867e88becbed4467b93592bce69f8a # v21 + - uses: DeterminateSystems/magic-nix-cache-action@565684385bcd71bad329742eefe8d12f2e765b39 # v13 + + - name: Compile ZIPs + run: nix develop --command make all-zips + - name: Set base ref run: | git show --format=%H --no-notes --no-patch "HEAD~1" -- |tee base_ref if ! ( grep -E '^[0-9a-f]{40}$' base_ref ); then exit 1; fi - name: Compile Protocol Specification - uses: ./.github/actions/render-protocol + run: nix develop --command make all From 819c9ed6be84f7916f58c597ba8ba721bb391d0e Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Fri, 6 Mar 2026 17:57:18 -0700 Subject: [PATCH 44/50] Remove unused render-protocol action; use render action instead. This separation previously made sense before the render workflow was simplified to ease caching issues. Now it no longer serves a purpose. --- .github/actions/render-protocol/action.yml | 10 ---------- .github/actions/render/action.yml | 6 +++--- .github/workflows/publish.yaml | 2 +- 3 files changed, 4 insertions(+), 14 deletions(-) delete mode 100644 .github/actions/render-protocol/action.yml diff --git a/.github/actions/render-protocol/action.yml b/.github/actions/render-protocol/action.yml deleted file mode 100644 index 479286f06..000000000 --- a/.github/actions/render-protocol/action.yml +++ /dev/null @@ -1,10 +0,0 @@ -name: Render Zcash Protocol Specification -description: GitHub Action to compile ZIPs and also Zcash Protocol Specification LaTeX documents -author: Deirdre Connolly and Daira-Emma Hopwood -runs: - using: composite - steps: - - uses: DeterminateSystems/nix-installer-action@c5a866b6ab867e88becbed4467b93592bce69f8a # v21 - - uses: DeterminateSystems/magic-nix-cache-action@565684385bcd71bad329742eefe8d12f2e765b39 # v13 - - shell: bash - run: nix develop --command make all diff --git a/.github/actions/render/action.yml b/.github/actions/render/action.yml index 780c5a5d3..15dc4f852 100644 --- a/.github/actions/render/action.yml +++ b/.github/actions/render/action.yml @@ -1,5 +1,5 @@ -name: Render ZIPs -description: GitHub Action to compile ZIPs only +name: Render All +description: GitHub Action to compile ZIPs and the protocol specification. author: Deirdre Connolly and Daira-Emma Hopwood runs: using: composite @@ -7,4 +7,4 @@ runs: - uses: DeterminateSystems/nix-installer-action@c5a866b6ab867e88becbed4467b93592bce69f8a # v21 - uses: DeterminateSystems/magic-nix-cache-action@565684385bcd71bad329742eefe8d12f2e765b39 # v13 - shell: bash - run: nix develop --command make all-zips + run: nix develop --command make all diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index b6286f4f6..db03443fe 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -58,7 +58,7 @@ jobs: git tag -f "${version}-auto" - name: Compile ZIPs and Zcash Protocol Specification - uses: ./.github/actions/render-protocol + uses: ./.github/actions/render - name: Set `.gitignore` to not ignore `rendered/` # This needs to be afer rendering so that it is not considered to make the tree dirty. From 7f0c3dfdd1c343f1aefdc3cbc7a12806559c1b54 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Mon, 9 Mar 2026 11:44:06 -0600 Subject: [PATCH 45/50] Pin action versions used in ZIP rendering/deployment. --- .github/workflows/publish.yaml | 10 +++++----- .github/workflows/render.yml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index db03443fe..ed56d973c 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -26,7 +26,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: publish fetch-depth: 0 @@ -43,7 +43,7 @@ jobs: if ! ( grep -E '^[0-9a-f]{40}$' base_ref ); then exit 1; fi - name: Setup Pages - uses: actions/configure-pages@v5 + uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5 - name: Merge `main` to the `publish` branch run: | @@ -65,16 +65,16 @@ jobs: run: sed -i 's@^rendered/$@@' .gitignore - name: Commit and push to `publish` branch - uses: EndBug/add-and-commit@v9.1.4 + uses: EndBug/add-and-commit@a94899bca583c204427a224a7af87c02f9b325d5 # v9.1.4 with: add: 'rendered' default_author: github_actions - name: Upload artifact - uses: actions/upload-pages-artifact@v4 + uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4 with: path: 'rendered' - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4 diff --git a/.github/workflows/render.yml b/.github/workflows/render.yml index 9e29a105c..a108122e9 100644 --- a/.github/workflows/render.yml +++ b/.github/workflows/render.yml @@ -11,7 +11,7 @@ jobs: contents: read steps: - name: Checkout repository - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 3 From a30e803dab7e3209c736190b7041d67abb2abdb0 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Mon, 9 Mar 2026 11:47:46 -0600 Subject: [PATCH 46/50] Replace magic-nix-cache with actions/cache for Nix store caching magic-nix-cache required a paid FlakeHub Cache subscription and fell back to GitHub Actions cache with aggressive rate limiting (thousands of "substituter disabled" errors per run). Replace it with actions/cache using nix-store --export/--import to persist the dev shell closure between runs. On cache hit, all store paths are imported locally so nix develop skips network fetches. On cache miss, the build fetches from cache.nixos.org and exports the closure for next time. Also drops the id-token: write permission from render.yml since FlakeHub authentication is no longer needed. Co-Authored-By: Claude Opus 4.6 --- .github/actions/render/action.yml | 23 +++++++++++++++++++++-- .github/workflows/render.yml | 25 +++++++++++++++++++------ 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/.github/actions/render/action.yml b/.github/actions/render/action.yml index 15dc4f852..4cb2983ef 100644 --- a/.github/actions/render/action.yml +++ b/.github/actions/render/action.yml @@ -5,6 +5,25 @@ runs: using: composite steps: - uses: DeterminateSystems/nix-installer-action@c5a866b6ab867e88becbed4467b93592bce69f8a # v21 - - uses: DeterminateSystems/magic-nix-cache-action@565684385bcd71bad329742eefe8d12f2e765b39 # v13 + + - name: Restore Nix store cache + id: nix-cache + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + with: + path: /tmp/nix-closure + key: nix-devshell-${{ runner.os }}-${{ hashFiles('flake.lock', 'flake.nix') }} + + - name: Import cached Nix store paths + if: steps.nix-cache.outputs.cache-hit == 'true' + shell: bash + run: nix-store --import < /tmp/nix-closure/store.nar + - shell: bash - run: nix develop --command make all + run: nix develop --profile /tmp/dev-profile --command make all + + - name: Export Nix store for caching + if: steps.nix-cache.outputs.cache-hit != 'true' + shell: bash + run: | + mkdir -p /tmp/nix-closure + nix-store --export $(nix-store -qR /tmp/dev-profile) > /tmp/nix-closure/store.nar diff --git a/.github/workflows/render.yml b/.github/workflows/render.yml index a108122e9..7ef92c9d2 100644 --- a/.github/workflows/render.yml +++ b/.github/workflows/render.yml @@ -6,9 +6,6 @@ on: jobs: render: runs-on: ubuntu-latest - permissions: - id-token: write - contents: read steps: - name: Checkout repository uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -22,10 +19,20 @@ jobs: if [ -e base_ref ]; then exit 1; fi - uses: DeterminateSystems/nix-installer-action@c5a866b6ab867e88becbed4467b93592bce69f8a # v21 - - uses: DeterminateSystems/magic-nix-cache-action@565684385bcd71bad329742eefe8d12f2e765b39 # v13 + + - name: Restore Nix store cache + id: nix-cache + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + with: + path: /tmp/nix-closure + key: nix-devshell-${{ runner.os }}-${{ hashFiles('flake.lock', 'flake.nix') }} + + - name: Import cached Nix store paths + if: steps.nix-cache.outputs.cache-hit == 'true' + run: nix-store --import < /tmp/nix-closure/store.nar - name: Compile ZIPs - run: nix develop --command make all-zips + run: nix develop --profile /tmp/dev-profile --command make all-zips - name: Set base ref run: | @@ -33,4 +40,10 @@ jobs: if ! ( grep -E '^[0-9a-f]{40}$' base_ref ); then exit 1; fi - name: Compile Protocol Specification - run: nix develop --command make all + run: nix develop --profile /tmp/dev-profile --command make all + + - name: Export Nix store for caching + if: steps.nix-cache.outputs.cache-hit != 'true' + run: | + mkdir -p /tmp/nix-closure + nix-store --export $(nix-store -qR /tmp/dev-profile) > /tmp/nix-closure/store.nar From 36060f65f19117453b3fa5da66a74f3219d994fe Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Thu, 12 Mar 2026 10:25:55 -0400 Subject: [PATCH 47/50] update zip-233.md with issuance specification --- zips/zip-0233.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/zips/zip-0233.md b/zips/zip-0233.md index bca2ef1f7..af4a81eaa 100644 --- a/zips/zip-0233.md +++ b/zips/zip-0233.md @@ -51,10 +51,12 @@ checks. # Abstract This ZIP proposes the introduction of a mechanism to voluntarily remove funds -entirely from circulation on the network. This mechanism, in combination with -ZIP 234 [^zip-0234] and ZIP 235 [^zip-0235], comprises a long-term strategy for -the sustainability of the network. We will refer to the combined effects of -these three ZIPs as the “Network Sustainability Mechanism”. +entirely from circulation on the network. The explicit intent of this removal +is that the funds will be returned to circulation through future block subsidies, +rather than being permanently destroyed or held in reserve for discretionary use. +This mechanism, in combination with ZIP 234 and ZIP 235 [^zip-0235], comprises a +long-term strategy for the sustainability of the network. We will refer to the +combined effects of these three ZIPs as the “Network Sustainability Mechanism”. # Motivation @@ -66,7 +68,9 @@ design shared by Bitcoin-like systems: circulation, the network gains the ability to create "headroom" between the chain value and $\mathsf{MAX\_MONEY}$. This lays necessary groundwork for extending the block subsidy system, which currently has a clear final end - date. + date. The intent is that removed funds will be automatically and + algorithmically reissued through future block subsidies, sustaining the + network's long-term security budget. 2. **Benefits to ZEC Holders:** Removing funds from circulation reduces the circulating supply of ZEC. To the extent that this potentially contributes to an increase in the value of remaining ZEC, it can be argued to benefit network @@ -100,8 +104,8 @@ chain value pool, and therefore from the point at which the transaction is applied to the global chain state, $\mathsf{zip233\_amount}$ is subtracted from the issued supply. It is unavailable for circulation on the network at least through to the end of the block in which the transaction is mined. ZIP 234 -[^zip-0234] specifies a potential mechanism by which the funds removed from -circulation would again become available. +[^zip-0234] specifies the mechanism by which the funds removed from +circulation are reissued through future block subsidies. ## Changes to ZIP 230 [^zip-0230] From c5f6221964ed61e66e31afbdfec90c4fb403025b Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Thu, 12 Mar 2026 10:26:31 -0400 Subject: [PATCH 48/50] update ZIP-234 with network security detail --- zips/zip-0234.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/zips/zip-0234.md b/zips/zip-0234.md index 2ba717898..9c34e9115 100644 --- a/zips/zip-0234.md +++ b/zips/zip-0234.md @@ -112,10 +112,11 @@ mitigate the risks associated with abrupt changes in issuance rates. This new NSM-based issuance scheme addresses these problems by ensuring a more consistent and predictable rate of coin issuance, while preserving the core -aspects of Zcash's issuance policy and the 21-million-coin cap. At the same -time, it introduces the first mechanism to reissue and distribute ZEC that has -been voluntarily removed from circulation, as well as transaction fees that are -deliberately redirected into the reserve, over future block subsidies. +aspects of Zcash's issuance policy and the 21-million-coin cap. Critically, +it establishes the intended path for ZEC that has been voluntarily removed from +circulation, as well as transaction fees that are deliberately redirected into +the reserve: these funds are automatically and algorithmically reissued over +future block subsidies, ensuring they benefit the network's long-term security. # Requirements From 8b2389f0322330faf259201406256b2966f39b31 Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Thu, 12 Mar 2026 10:26:53 -0400 Subject: [PATCH 49/50] update ZIP-235 with issuance specification --- zips/zip-0235.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/zips/zip-0235.md b/zips/zip-0235.md index 42709f412..4646e622b 100644 --- a/zips/zip-0235.md +++ b/zips/zip-0235.md @@ -44,9 +44,10 @@ ZIP 233. [^zip-0233] # Abstract This ZIP proposes to remove 60% of transaction fees from circulation, while -the remaining 40% is directed as before, providing a deflationary effect, and -building the groundwork for long-term support of the Zcash network via the new -block subsidy rules proposed by ZIP 234 [^zip-0234]. +the remaining 40% is directed as before. The intent of this removal is that the +funds will be automatically and algorithmically reissued through future block +subsidies, rather than being permanently destroyed or held as a discretionary +reserve. # Motivation @@ -63,9 +64,8 @@ of the network as described below: 1. **Network Sustainability**: This mechanism involves temporarily reducing the supply of ZEC, similar to asset burning in Ethereum’s EIP-1559 [^eip-1559], - but with long-term sustainability benefits, as the funds removed from - circulation effectively boost future mining rewards, making it an attractive - option for current and future Zcash users. + but with long-term sustainability benefits. Unlike a permanent burn, the + removed funds are intended to be reissued through future block subsidies. 2. **Incentivizing Transaction Inclusion**: By maintaining a 40% share of transaction fees for miners, we continue incentivizing miners to prioritize including transactions in their blocks. This helps ensure the continued @@ -81,9 +81,9 @@ of the network as described below: network's reputation and security. 4. **Future-Proofing the Network**: Removing a portion of transaction fees from circulation is a forward-looking approach that prepares the Zcash network for - future challenges and opportunities. It establishes a financial buffer that - can be instrumental in addressing unforeseen issues and seizing strategic - advantages as the Zcash ecosystem evolves. + long-term sustainability. By returning these funds to circulation through + future block subsidies, the network maintains a viable security budget + beyond the original issuance schedule. # Requirements From 094bb0579b59dce551c9d99838c215058d2f6804 Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Thu, 12 Mar 2026 10:27:09 -0400 Subject: [PATCH 50/50] update ZIP-315 with wallet language suggestion --- zips/zip-0315.rst | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/zips/zip-0315.rst b/zips/zip-0315.rst index df3c381da..5229a7d51 100644 --- a/zips/zip-0315.rst +++ b/zips/zip-0315.rst @@ -442,6 +442,25 @@ have an expiry height), and their balances as described in `Reporting of balances`_. +Display of voluntary fund removal +'''''''''''''''''''''''''''''''''' + +Wallets that support voluntary removal of funds from circulation as specified +in ZIP 233 [#zip-0233]_ SHOULD display clear, user-friendly messaging at +transaction confirmation time explaining the purpose and effect of the removal. + +For example, a wallet might display: + + "These funds will be used for network sustainability purposes. They will + be gradually reissued to support the long-term security of the Zcash + network." + +This guidance applies to user-initiated voluntary removals via ZIP 233. It +does not apply to the automatic removal of transaction fees specified in +ZIP 235 [#zip-0235]_, which occurs without user action and does not require +explicit user confirmation. + + Transaction creation -------------------- @@ -780,6 +799,8 @@ References .. [#zip-0032-wallet-seeds] `ZIP 32: Shielded Hierarchical Deterministic Wallets — Specification: Wallet seeds `_ .. [#zip-0032-wallet-usage] `ZIP 32: Shielded Hierarchical Deterministic Wallets — Specification: Wallet usage `_ .. [#zip-0203] `ZIP 203: Transaction Expiry `_ +.. [#zip-0233] `ZIP 233: Network Sustainability Mechanism: Removing Funds From Circulation `_ +.. [#zip-0235] `ZIP 235: Remove 60% of Transaction Fees From Circulation `_ .. [#zip-0316] `ZIP 316: Unified Addresses and Unified Viewing Keys `_ .. [#zip-0316-deriving-a-unified-address] `ZIP 316: Unified Addresses and Unified Viewing Keys — Deriving a Unified Address from a UIVK `_ .. [#zip-0317] `ZIP 317: Proportional Transfer Fee Mechanism `_