@@ -84,6 +84,7 @@
\newcommand{\NUSixOneSpec}{NU6.1}
\newcommand{\NUSixTwoSpec}{NU6.2}
\newcommand{\NUSixThreeSpec}{NU6.3}
+\newcommand{\NUSevenSpec}{NU7}
\newtoggle{issapling}
\togglefalse{issapling}
\newtoggle{isblossom}
@@ -647,6 +648,7 @@
\colorlet{pink}{magenta!70}
\definecolor{burgundy}{RGB}{210,20,80}
\definecolor{brown}{RGB}{160,50,50}
+ \definecolor{teal}{RGB}{40,190,190}
\colorlet{warningred}{BrickRed}
\colorlet{cream}{yellow!20}
@@ -662,6 +664,7 @@
\colorlet{pink}{magenta!75}
\definecolor{burgundy}{RGB}{200,18,75}
\colorlet{brown}{Sepia}
+ \definecolor{teal}{RGB}{0,135,135}
\colorlet{warningred}{BrickRed}
\colorlet{cream}{yellow!20}
@@ -691,10 +694,21 @@
\newcommand{\nusixtwocolorname}{\nusixtwocolor}
\newcommand{\nusixthreecolor}{blue}
\newcommand{\nusixthreecolorname}{bright blue}
+\newcommand{\nusevencolor}{teal}
+\newcommand{\nusevencolorname}{\nusevencolor}
\newcommand{\labelcolor}{cream}
\iftoggle{isnuseven}{
- \errmessage{NU7 is not defined yet}
+ \iftoggle{darkmode}{
+ \providecommand{\baseurl}{https://zips.z.cash/protocol/nu7-dark.pdf}
+ }{
+ \providecommand{\baseurl}{https://zips.z.cash/protocol/nu7.pdf}
+ }
+ \toggletrue{isnusixthree}
+ \newcommand{\setnuseven}{\color{\nusevencolor}}
+ \newcommand{\nuseven}[1]{\texorpdfstring{{\setnuseven{#1}}}{#1}}
+ \newcommand{\notnuseven}[1]{}
+ \newcommand{\notbeforenuseven}[1]{#1}
} {
\newcommand{\setnuseven}{}
\newcommand{\nuseven}[1]{}
@@ -703,11 +717,7 @@
}
\iftoggle{isnusixthree}{
- \iftoggle{darkmode}{
- \providecommand{\baseurl}{https://zips.z.cash/protocol/nu6_3-dark.pdf}
- }{
- \providecommand{\baseurl}{https://zips.z.cash/protocol/nu6_3.pdf}
- }
+ \providecommand{\baseurl}{https://zips.z.cash/protocol/nu6_3.pdf}
\toggletrue{isnusixtwo}
\newcommand{\setnusixthree}{\color{\nusixthreecolor}}
\newcommand{\nusixthree}[1]{\texorpdfstring{{\setnusixthree{#1}}}{#1}}
@@ -2228,9 +2238,12 @@
\newcommand{\fsRecipientIndex}{\fs\mathsf{.RecipientIndex}}
\newcommand{\fsNumRecipients}{\fs\mathsf{.NumRecipients}}
\newcommand{\fsRedeemScriptHash}{\fs\mathsf{.RedeemScriptHash}}
+\newcommand{\fsPubKeyHash}{\fs\mathsf{.PubKeyHash}}
\newcommand{\SlowStartInterval}{\mathsf{SlowStartInterval}}
\newcommand{\SlowStartShift}{\mathsf{SlowStartShift}}
\newcommand{\SlowStartRate}{\mathsf{SlowStartRate}}
+\newcommand{\BlossomAdjustment}{\mathsf{BlossomAdjustment}}
+\newcommand{\NUSevenAdjustment}{\mathsf{NU7Adjustment}}
\newcommand{\PreBlossomHalvingInterval}{\mathsf{\notbeforeblossom{PreBlossom}HalvingInterval}}
\newcommand{\PostBlossomHalvingInterval}{\mathsf{PostBlossomHalvingInterval}}
\newcommand{\MaxBlockSubsidy}{\mathsf{MaxBlockSubsidy}}
@@ -2239,6 +2252,7 @@
\newcommand{\FoundersFraction}{\mathsf{FoundersFraction}}
\newcommand{\FSRecipientChangeInterval}{\mathsf{FSRecipientChangeInterval}}
\newcommand{\FSRecipientPeriod}{\mathsf{FSRecipientPeriod}}
+\newcommand{\PreNUSevenEquivalentHeight}{\mathsf{PreNU7EquivalentHeight}}
\newcommand{\BlockHeight}{\mathsf{height}}
\newcommand{\FounderAddressAdjustedHeight}{\mathsf{FounderAddressAdjustedHeight}}
\newcommand{\FoundersRewardLastBlockHeight}{\mathsf{FoundersRewardLastBlockHeight}}
@@ -2252,6 +2266,18 @@
\newcommand{\heightBytes}{\mathsf{heightBytes}}
\newcommand{\ChainValuePoolBalance}[1]{\ensuremath{\mathsf{ChainValuePoolBalance}^{#1}}}
\newcommand{\IssuedSupply}{\mathsf{IssuedSupply}}
+\newcommand{\TransactionFees}{\mathsf{TransactionFees}}
+\newcommand{\NSMFeeContribution}{\mathsf{NSMFeeContribution}}
+\newcommand{\MinerFees}{\mathsf{MinerFees}}
+\newcommand{\ScheduledBlockSubsidy}{\mathsf{ScheduledBlockSubsidy}}
+\newcommand{\AdditionalBlockSubsidy}{\mathsf{AdditionalBlockSubsidy}}
+\newcommand{\HalvingIntervalFunc}{\mathsf{HalvingInterval}}
+\newcommand{\BlockSubsidyFraction}{\mathsf{BLOCK\_SUBSIDY\_FRACTION}}
+\newcommand{\LNTwoScaled}{\mathsf{LN2\_SCALED}}
+\newcommand{\InitialNSMValueBalance}{\mathsf{INITIAL\_NSM\_VALUE\_BALANCE}}
+\newcommand{\NSMReissuanceHeight}{\mathsf{NSM\_REISSUANCE\_HEIGHT}}
+\newcommand{\NSMValueBalance}{\mathsf{NSMValueBalance}}
+\newcommand{\NSMValueRemoved}{\mathsf{NSMValueRemoved}}
\newcommand{\blockSubsidy}{\term{block subsidy}}
\newcommand{\minerSubsidy}{\term{miner subsidy}}
@@ -2272,6 +2298,9 @@
\newcommand{\BlossomActivationHeight}{\mathsf{BlossomActivationHeight}}
\newcommand{\IsBlossomActivated}{\mathsf{IsBlossomActivated}}
+\newcommand{\NUSevenActivationHeight}{\mathsf{NU7ActivationHeight}}
+\newcommand{\IsNUSevenActivated}{\mathsf{IsNU7Activated}}
+\newcommand{\PostNUSevenHalvingInterval}{\mathsf{PostNU7HalvingInterval}}
\newcommand{\CanopyActivationHeight}{\mathsf{CanopyActivationHeight}}
\newcommand{\ZIPTwoOneTwoGracePeriod}{\mathsf{ZIP212GracePeriod}}
\newcommand{\ZIPTwoSevenOneActivationHeight}{\mathsf{ZIP271ActivationHeight}}
@@ -2281,13 +2310,22 @@
\newcommand{\PoWLimit}{\mathsf{PoWLimit}}
\newcommand{\PoWAveragingWindow}{\mathsf{PoWAveragingWindow}}
+\newcommand{\PreNUSevenPoWAveragingWindow}{\mathsf{PreNU7PoWAveragingWindow}}
+\newcommand{\PostNUSevenPoWAveragingWindow}{\mathsf{PostNU7PoWAveragingWindow}}
+\newcommand{\GlobalShieldedBudget}{\mathsf{GlobalShieldedBudget}}
+\newcommand{\OrchardProtocolBlockActionLimit}{\mathsf{OrchardProtocolBlockActionLimit}}
+\newcommand{\SaplingBlockIOLimit}{\mathsf{SaplingBlockIOLimit}}
+\newcommand{\SproutBlockJoinSplitLimit}{\mathsf{SproutBlockJoinSplitLimit}}
\newcommand{\PoWMedianBlockSpan}{\mathsf{PoWMedianBlockSpan}}
\newcommand{\PoWMaxAdjustDown}{\mathsf{PoWMaxAdjustDown}}
\newcommand{\PoWMaxAdjustUp}{\mathsf{PoWMaxAdjustUp}}
\newcommand{\PoWDampingFactor}{\mathsf{PoWDampingFactor}}
\newcommand{\PreBlossomPoWTargetSpacing}{\mathsf{\notbeforeblossom{PreBlossom}PoWTargetSpacing}}
\newcommand{\PostBlossomPoWTargetSpacing}{\mathsf{PostBlossomPoWTargetSpacing}}
\newcommand{\BlossomPoWTargetSpacingRatio}{\mathsf{BlossomPoWTargetSpacingRatio}}
+\newcommand{\PostNUSevenPoWTargetSpacing}{\mathsf{PostNU7PoWTargetSpacing}}
+\newcommand{\NUSevenPoWTargetSpacingRatio}{\mathsf{NU7PoWTargetSpacingRatio}}
+\newcommand{\CombinedPoWTargetSpacingRatio}{\mathsf{CombinedPoWTargetSpacingRatio}}
\newcommand{\PoWTargetSpacingFunc}{\mathsf{PoWTargetSpacing}}
\newcommand{\MeanTarget}{\mathsf{MeanTarget}}
\newcommand{\MedianTime}{\mathsf{MedianTime}}
@@ -2523,6 +2561,7 @@
\newcommand{\saplingtype}[1]{\textcolor{\saplingcolor}{\type{#1}}}
\newcommand{\nufivetype}[1]{\textcolor{\nufivecolor}{\type{#1}}}
\newcommand{\nusixthreetype}[1]{\textcolor{\nusixthreecolor}{\type{#1}}}
+\newcommand{\nuseventype}[1]{\textcolor{\nusevencolor}{\type{#1}}}
\newcommand{\typecodeField}{\mathtt{typecode}}
\newcommand{\lengthField}{\mathtt{length}}
\newcommand{\addrField}{\mathtt{addr}}
@@ -3069,7 +3108,8 @@
\notnusixone{\nusix{\thisspecdefines{\NUOverwinter, \NUSapling, \NUBlossom, \NUHeartwood, \NUCanopy, \NUFive, and \NUSix}}}%
\notnusixtwo{\nusixone{\thisspecdefines{\NUOverwinter, \NUSapling, \NUBlossom, \NUHeartwood, \NUCanopy, \NUFive, \NUSix, and \NUSixOne}}}%
\notnusixthree{\nusixtwo{\thisspecdefines{\NUOverwinter, \NUSapling, \NUBlossom, \NUHeartwood, \NUCanopy, \NUFive, \NUSix, \NUSixOne, and \NUSixTwo}}}%
-\nusixthree{\thisspecdefines{\NUOverwinter, \NUSapling, \NUBlossom, \NUHeartwood, \NUCanopy, \NUFive, \NUSix, \NUSixOne, \NUSixTwo, and \NUSixThree}}%
+\notnuseven{\nusixthree{\thisspecdefines{\NUOverwinter, \NUSapling, \NUBlossom, \NUHeartwood, \NUCanopy, \NUFive, \NUSix, \NUSixOne, \NUSixTwo, and \NUSixThree}}}%
+\nuseven{\thisspecdefines{\NUOverwinter, \NUSapling, \NUBlossom, \NUHeartwood, \NUCanopy, \NUFive, \NUSix, \NUSixOne, \NUSixTwo, \NUSixThree, and \NUSeven}}%
It is a work in progress. Protocol differences from \Zerocash and \Bitcoin are also explained.
\vspace{2ex}
@@ -3151,6 +3191,9 @@
\notbeforenusixthree{Changes specific to the \NUSixThree upgrade following \NUSixTwo
are highlighted in \nusixthree{\nusixthreecolorname}.}
+\notbeforenuseven{Changes specific to the \NUSeven upgrade following \NUSixThree
+are highlighted in \nuseven{\nusevencolorname}.}
+
All of these are also changes from \Zerocash.
The name ``Sprout'' refers to the \Zcash protocol prior to \NUSapling
@@ -3537,10 +3580,12 @@
$\PRFOutputLengthNfSapling$,} $\NoteCommitRandLengthSprout$, $\RandomSeedLength$, $\AuthPrivateLength$,
$\NoteUniquePreRandLength$,\sapling{ $\SpendingKeyLength$, $\DiversifierLength$,\nufive{ $\DiversifierKeyLength$,}\nusixthree{ $\QuantumSpendingKeyLength$, $\QuantumIntermediateKeyLength$,}
$\InViewingKeyLength{Sapling}$, $\OutViewingKeyLength$, $\ScalarLength{Sapling}$,\nufive{ $\ScalarLength{Orchard}$, $\BaseLength{Orchard}$,}}
- $\MAXMONEY$,\blossom{ $\BlossomActivationHeight$,}\strut\canopy{ $\CanopyActivationHeight$, $\ZIPTwoOneTwoGracePeriod$,}
+ $\MAXMONEY$,\blossom{ $\BlossomActivationHeight$,}\strut\canopy{ $\CanopyActivationHeight$, $\ZIPTwoOneTwoGracePeriod$,}\nuseven{ $\NUSevenActivationHeight$,}
$\SlowStartInterval$, $\PreBlossomHalvingInterval$, $\MaxBlockSubsidy$, $\NumFounderAddresses$,
- $\PoWLimit$, $\PoWAveragingWindow$, $\PoWMedianBlockSpan$, $\PoWDampingFactor$,
- \notblossom{and }$\PreBlossomPoWTargetSpacing$\blossom{, and $\PostBlossomPoWTargetSpacing$}.
+ $\PoWLimit$, \notnuseven{$\PoWAveragingWindow$}\nuseven{$\PreNUSevenPoWAveragingWindow$, $\PostNUSevenPoWAveragingWindow$}, $\PoWMedianBlockSpan$, $\PoWDampingFactor$,
+ \notblossom{and }$\PreBlossomPoWTargetSpacing$\blossom{, \notnuseven{and }$\PostBlossomPoWTargetSpacing$}\nuseven{, $\PostNUSevenPoWTargetSpacing$,
+ $\GlobalShieldedBudget$, $\OrchardProtocolBlockActionLimit$, $\SaplingBlockIOLimit$, $\SproutBlockJoinSplitLimit$,
+ $\LNTwoScaled$, $\InitialNSMValueBalance$, and $\NSMReissuanceHeight$}.
\end{flushleft}
\end{formulae}
@@ -4111,13 +4156,17 @@
\vspace{-2ex}
As in \Bitcoin, the remaining value in the \transparentTxValuePool of a non-coinbase \transaction
-is available to miners as a \defining{\transactionFee}. That is, the sum of those values for non-coinbase \transactions
-in each \block is treated as an implicit input to the \transparentTxValuePool balance of the
-\block's \coinbaseTransaction (in addition to the implicit input created by issuance).
+is a \defining{\transactionFee}. The sum of those values for non-coinbase \transactions in each
+\block\nuseven{ (pre-\NUSeven), or $\MinerFees(\BlockHeight)$ for the \block at \blockHeight
+$\BlockHeight$ (\NUSeven onward),} is available to miners: it is treated as an implicit input to
+the \transparentTxValuePool balance of the \block's \coinbaseTransaction (in addition to the
+implicit input created by issuance).\nuseven{ $\MinerFees$ is defined in \shortcrossref{subsidies}.}
The remaining value in the \transparentTxValuePool of \coinbaseTransactions\nusix{ in \blocks
-prior to \NUSix} is destroyed. \nusix{From \NUSix, this remaining value is required to be zero;
-that is, all of the available balance \MUST be consumed by outputs of the \coinbaseTransaction.}
+prior to \NUSix} is left unclaimed and is not added to any \chainValuePool. \nusix{From \NUSix, this
+remaining value is required to be zero; that is, all of the available balance \MUST be consumed by
+outputs of the \coinbaseTransaction.} \nusevenonward{This unclaimed value is included in
+$\InitialNSMValueBalance$, and so is reissued as specified in \shortcrossref{subsidies}.}
\vspace{-1ex}
\consensusrule{
@@ -4412,21 +4461,26 @@
\canopyonward{The \blockSubsidy is composed of a \minerSubsidy and a series of \defining{\fundingStreams}.}
-As in \Bitcoin, the miner of a \block also receives \defining{\transactionFees}.
+As in \Bitcoin, the miner of a \block also receives \defining{\transactionFees}\nuseven{
+(pre-\NUSeven), or $\MinerFees(\BlockHeight)$ (\NUSeven onward)}.
The calculations of the \blockSubsidy, \minerSubsidy, \notcanopy{and }\foundersReward\canopy{, and \fundingStreams}
depend on the \blockHeight, as defined in \crossref{blockchain}.
\crossref{subsidies}\notbeforenusixone{\\} describes these calculations.
+\nusevenonward{From $\NSMReissuanceHeight$, the \blockSubsidy also includes value reissued from the
+NSM Value Balance defined in \crossref{chainvaluepoolbalances}, and so depends on the NSM Value
+Balance after the preceding \block as well as on the \blockHeight.}
+
\lsubsection{Coinbase Transactions}{coinbasetransactions}
A \transaction that has a single \transparentInput with a null \prevoutField{} field, is
called a \defining{\coinbaseTransaction}. Every \block has a single \coinbaseTransaction
as the first \transaction in the \block. The purpose of this \coinbaseTransaction is to
-collect and spend any \minerSubsidy, and \transactionFees paid by other \transactions included
-in the \block.
+collect and spend any \minerSubsidy, and the \transactionFees paid by other \transactions
+included in the \block\nuseven{ (pre-\NUSeven) or $\MinerFees(\BlockHeight)$ (\NUSeven onward)}.
\precanopy{\crossref{foundersreward} specifies that the \coinbaseTransaction \MUST also pay
the \foundersReward.}
@@ -4458,6 +4512,8 @@
\Mainnet \NUSixThree \activationBlock: $\mathtt{00000000001a8b54bbde4e8996373417a6b33ee2bd984bcf02882e5d8128d761}$
+\Mainnet \NUSeven \activationBlock: $\mathtt{0000000000246a2b1fecb3f465770894d146f6b7044e46b13ffb65e57e4ccd4a}$
+
\introlist
There is also a public test \network called \defining{\Testnet}. It supports a \TAZ token which is
intended to have no monetary value. By convention, \Testnet normally activates \networkUpgrades (as described
@@ -4469,6 +4525,8 @@
\Testnet \NUSixThree \activationBlock: $\mathtt{000003943e1a2c60c17b69ed4d448ea9296019a247f1134b507917941957fccd}$
+\Testnet \NUSeven \activationBlock: $\mathtt{000089ba27100beede16d64b34e3d1b626b428cb7ee9fe6dcfdc217ce24e78af}$
+
We call the smallest units of currency (on either \network) \zatoshi.\footnote{\definingquotedterm{tazoshi}
may be used for the smallest units of currency on Testnet, but it is usually more convenient to use a
\network-independent term.}
@@ -7132,6 +7190,8 @@
as defined in \cite{ZIP-257}.}
\nusixthreeonlyitem{All \transactions \MUST use the \NUSixThree \consensusBranchID \hexint{37A5165B}
as defined in \cite{ZIP-258}.}
+ \nusevenonlyitem{All \transactions \MUST use the \NUSeven \consensusBranchID \hexint{77190AD9}
+ as defined in \cite{ZIP-259}.}
\end{consensusrules}
@@ -7863,6 +7923,47 @@
created as a result of accepting a \block, then all nodes \MUST reject the block as invalid.}
} %nusixthree
+\nuseven{
+\vspace{1.5ex}
+Let $\InitialNSMValueBalance$ and $\NUSevenActivationHeight$ be as defined in \crossref{constants},
+and let $\NSMFeeContribution$ and $\AdditionalBlockSubsidy$ be as defined in \shortcrossref{subsidies}.
+
+\cite{ZIP-237} specifies a Network Sustainability Mechanism that tracks value removed from
+circulation and reissues it through the \blockSubsidy. The value removed from circulation in the
+\block at \blockHeight $\BlockHeight$ is $\NSMValueRemoved(\BlockHeight) := \NSMFeeContribution(\BlockHeight)$,
+the part of the \transactionFees specified by \cite{ZIP-235}, which is the only removal mechanism
+deployed in \NUSeven.
+
+The \defining{NSM Value Balance} of a \blockChain up to and including \blockHeight $\BlockHeight$
+is given by:
+
+\begin{formulae}
+ \item $\NSMValueBalance(\BlockHeight \typecolon \Nat) :=$
+ \vspace{-0.5ex}
+ \item \tab $\begin{cases}
+ 0,&\caseif \BlockHeight < \NUSevenActivationHeight - 1 \\[0.6ex]
+ \InitialNSMValueBalance,&\caseif \BlockHeight = \NUSevenActivationHeight - 1 \\[0.6ex]
+ \NSMValueBalance(\BlockHeight - 1) - \AdditionalBlockSubsidy(\BlockHeight) \\[-0.4ex]
+ \hspace{1.5em} +\, \NSMValueRemoved(\BlockHeight),&\caseotherwise
+ \end{cases}$
+\end{formulae}
+
+\vspace{-2ex}
+\consensusrule{\nusevenonward{If $\NSMValueBalance(\BlockHeight)$ would become negative in the \blockChain
+created as a result of accepting a \block at \blockHeight $\BlockHeight$, then all nodes \MUST reject
+the block as invalid.}}
+
+\begin{pnotes}
+ \item The NSM Value Balance is tracked as consensus state alongside the \chainValuePools. It is
+ not a spendable \chainValuePool and is not included in $\IssuedSupply(\BlockHeight)$: it
+ counts \ZEC (or \TAZ) that is not in circulation. Reissuance moves value from the NSM Value
+ Balance into the \totalIssuedSupply through the \blockSubsidy.
+ \item As \cite{ZIP-2003} clarifies, the \SproutChainValuePool balance at \NUSeven activation
+ remains issued, and so is included in $\IssuedSupply(\BlockHeight)$ for the purposes of
+ \cite{ZIP-237}.
+\end{pnotes}
+} %nuseven
+
\vspace{2ex}
The \defining{\totalIssuedSupply} of a \blockChain at \blockHeight $\BlockHeight$ is given
by the function:
@@ -9290,6 +9391,12 @@
\end{cases}$
\item $\ZIPTwoOneTwoGracePeriod \typecolon \Nat := 32256$
} %canopy
+\nuseven{
+ \item $\NUSevenActivationHeight \typecolon \Nat := \begin{cases}
+ 3543405,&\squash\text{for \Mainnet} \\
+ 4465026,&\squash\text{for \Testnet}
+ \end{cases}$ \cite{ZIP-259}
+} %nuseven
\item $\SlowStartInterval \typecolon \Nat := 20000$
\item $\PreBlossomHalvingInterval \typecolon \Nat := 840000$
\item $\MaxBlockSubsidy \typecolon \Nat := 1.25 \smult 10^9$ (\zatoshi)
@@ -9299,7 +9406,13 @@
2^{243} - 1,&\squash\text{for \Mainnet} \\
2^{251} - 1,&\squash\text{for \Testnet}
\end{cases}$
+\notnuseven{
\item $\PoWAveragingWindow \typecolon \Nat := 17$
+} %notnuseven
+\nuseven{
+ \item $\PreNUSevenPoWAveragingWindow \typecolon \Nat := 17$
+ \item $\PostNUSevenPoWAveragingWindow \typecolon \Nat := 102$
+} %nuseven
\item $\PoWMedianBlockSpan \typecolon \Nat := 11$
\item $\PoWMaxAdjustDown \typecolon \Rat := \frac{32}{100}$
\item $\PoWMaxAdjustUp \typecolon \Rat := \frac{16}{100}$
@@ -9308,8 +9421,34 @@
\blossom{
\item $\PostBlossomPoWTargetSpacing \typecolon \Nat := 75$ (seconds).
} %blossom
+\nuseven{
+ \item $\PostNUSevenPoWTargetSpacing \typecolon \Nat := 25$ (seconds).
+ \item $\GlobalShieldedBudget \typecolon \Nat := 330$
+ \item $\OrchardProtocolBlockActionLimit \typecolon \Nat := 330$
+ \item $\SaplingBlockIOLimit \typecolon \Nat := 300$
+ \item $\SproutBlockJoinSplitLimit \typecolon \Nat := 0$
+ \item $\LNTwoScaled \typecolon \Nat := 6931680000$
+ \item $\InitialNSMValueBalance \typecolon \range{0}{\MAXMONEY} := \begin{cases}
+ 36858445520,&\squash\text{for \Mainnet} \\
+ 55768414957,&\squash\text{for \Testnet}
+ \end{cases}$ (\zatoshi)
+ \item $\NSMReissuanceHeight \typecolon \Nat := \begin{cases}
+ 8939664,&\squash\text{for \Mainnet} \\
+ 7305222,&\squash\text{for \Testnet}
+ \end{cases}$ \cite{ZIP-259}
+} %nuseven
\end{formulae}
+\nuseven{
+\vspace{-1.5ex}
+\pnote{$\InitialNSMValueBalance$ is the \blockSubsidy and \transactionFees left unclaimed by
+\coinbaseTransactions before \NUSix, which \cite{ZIP-237} derives for each \network from the
+scheduled issuance and the \totalIssuedSupply at the last pre-\NUSix \blockHeight.
+$\NSMReissuanceHeight$ is the height at which reissuance begins. \cite{ZIP-237} specifies how
+it is calculated from the scheduled issuance curve, and \cite{ZIP-259} gives the resulting value
+for each \network.}
+} %nuseven
+
\introsection
\lsubsection{Concrete Cryptographic Schemes}{concreteschemes}
@@ -13548,11 +13687,16 @@
and rationale is given in \cite{ZODL-Ironwood}. Specifications relating to wallet support and
migration to the \IronwoodPool are in \cite{ZIP-318} and \cite{ZIP-326}.}
+\nuseven{An eleventh upgrade, called \defining{\NUSeven}, activated on \Mainnet on 6~November, 2026
+at \blockHeight $3543405$ \cite{ZIP-259}. Its specifications are described in this document,
+\cite{ZIP-259}, \cite{ZIP-218}, \cite{ZIP-235}, \cite{ZIP-237}, \cite{ZIP-2003}, and \cite{ZIP-2008},
+with updates to \cite{ZIP-207} and \cite{ZIP-214}.}
+
\introlist
\vspace{1.5ex}
This section summarizes the strategy for upgrading from the Sprout epoch to subsequent epochs
of the protocol (\NUOverwinter, \NUSapling, \NUBlossom, \NUHeartwood, \NUCanopy, \NUFive, \NUSix,
-\NUSixOne, \NUSixTwo, and \NUSixThree), and for future upgrades.
+\NUSixOne, \NUSixTwo, \NUSixThree, and \NUSeven), and for future upgrades.
\defining{The \networkUpgrade mechanism is described in \cite{ZIP-200}.}
@@ -13932,7 +14076,8 @@
be $\hexint{03C48270}$.}
\saplingprenufiveitem{The \transactionVersionNumber{} \MUST be $4$.}
\nufiveprenusixthreeitem{The \transactionVersionNumber \MUST be $4$ or $5$.}
- \nusixthreeonwarditem{The \transactionVersionNumber \MUST be $4$ or $5$ or $6$.}
+ \nusixthreeonlyitem{The \transactionVersionNumber \MUST be $4$ or $5$ or $6$.}
+ \nusevenonwarditem{The \transactionVersionNumber \MUST be $5$ or $6$.}
\saplingonwarditem{If the \transactionVersionNumber{} is $4$ then the \versionGroupID \MUST be $\hexint{892F2085}$.}
\nufiveonwarditem{If the \transactionVersionNumber{} is $5$ then the \versionGroupID \MUST be $\hexint{26A7270A}$.}
\nusixthreeonwarditem{If the \transactionVersionNumber{} is $6$ then the \versionGroupID \MUST be $\hexint{D884B698}$.}
@@ -14015,14 +14160,16 @@
\end{itemize}}
\vspace{-1ex}
\item \nusix{Let $\totalDeferredOutput$\nusixone{ and $\totalDeferredInput$} be as defined in \shortcrossref{subsidies}.}
+ \nuseven{Let $\MinerFees$ be as defined in \shortcrossref{subsidies}.}
For the \block at \blockHeight $\mathsf{height}$:
\begin{itemize}
\item define the \totalOutputValue of its \coinbaseTransaction to be the total value
in \zatoshi of its \transparentOutputs\heartwood{, minus $\vBalance{\SaplingPoolId}$}\nufive{,
minus $\vBalance{\OrchardPoolId}$}\nusix{, plus $\totalDeferredOutput(\mathsf{height})$};
\item define the \totalInputValue of its \coinbaseTransaction to be the value in \zatoshi
- of the \blockSubsidy, plus the \transactionFees paid by \transactions in the
- \block\nusixone{, plus $\totalDeferredInput(\mathsf{height})$}.
+ of the \blockSubsidy, plus \prenuseven{the \transactionFees paid by \transactions in the
+ \block}\nuseven{ or }\nusevenonward{$\MinerFees(\mathsf{height})$}\nusixone{, plus
+ $\totalDeferredInput(\mathsf{height})$}.
\end{itemize}
\vspace{-1ex}
\prenusix{The \totalOutputValue of a \coinbaseTransaction \MUSTNOT be greater than its \totalInputValue.}
@@ -14558,6 +14705,18 @@
$653606$ or greater on \Testnet, $\nTimeField$ \MUST be less than or equal to
the \medianTimePast of that \block plus $90 \mult 60$ seconds.
\item The size of a \block \MUST be less than or equal to $2000000$ bytes.
+ \nusevenonwarditem{Let $\nActionsField{Orchard}$, $\nActionsField{Ironwood}$, $\nSpendsSapling$,
+ $\nOutputsSapling$, and $\nJoinSplit$ be the fields of a \transaction specified in
+ \crossref{txnencoding}, each taken as $0$ for a \transaction version that does not have
+ the field. Summed over the \transactions in the \block:
+ \begin{itemize}
+ \item $\nActionsField{Orchard}$ \MUSTNOT exceed $\OrchardProtocolBlockActionLimit$;
+ \item $\nActionsField{Ironwood}$ \MUSTNOT exceed $\OrchardProtocolBlockActionLimit$;
+ \item $\nSpendsSapling + \nOutputsSapling$ \MUSTNOT exceed $\SaplingBlockIOLimit$;
+ \item $\nJoinSplit$ \MUSTNOT exceed $\SproutBlockJoinSplitLimit$; and
+ \item $\nActionsField{Orchard} + \nActionsField{Ironwood} + \nSpendsSapling + \nOutputsSapling + 2 \mult \nJoinSplit$
+ \MUSTNOT exceed $\GlobalShieldedBudget$.
+ \end{itemize}}
\notheartwood{
\saplingonwarditem{$\hashFinalSaplingRoot$ \MUST be $\LEBStoOSPOf{256}{\rt{\SaplingPoolId}}$ where
$\rt{\SaplingPoolId}$ is the \merkleRoot of the \SaplingPoolAdj \noteCommitmentTree for the final
@@ -14847,10 +15006,14 @@
the desired \blockTargetSpacing. Unlike \Bitcoin, the difficulty adjustment occurs
after every \block.
-\notbeforeblossom{The constants }$\PoWLimit$, $\PreBlossomHalvingInterval$, $\PoWAveragingWindow$,
+\notbeforenuseven{\begingroup\raggedright}
+\notbeforeblossom{The constants }$\PoWLimit$, $\PreBlossomHalvingInterval$, \notnuseven{$\PoWAveragingWindow$}\nuseven{$\PreNUSevenPoWAveragingWindow$,
+$\PostNUSevenPoWAveragingWindow$},
$\PoWMaxAdjustDown$, $\PoWMaxAdjustUp$, $\PoWDampingFactor$,\notblossom{ and}
-$\PreBlossomPoWTargetSpacing$\blossom{, and $\PostBlossomPoWTargetSpacing$}
+$\PreBlossomPoWTargetSpacing$\blossom{, \notnuseven{and }$\PostBlossomPoWTargetSpacing$}\nuseven{, $\PostNUSevenPoWTargetSpacing$,
+and $\NUSevenActivationHeight$}
are specified in section \crossref{constants}.
+\notbeforenuseven{\par\endgroup}
Let $\ToCompact$ and $\ToTarget$ be as defined in \crossref{nbits}.
@@ -14879,25 +15042,53 @@
\item $\IsBlossomActivated(\BlockHeight \typecolon \Nat) := (\BlockHeight \geq \BlossomActivationHeight)$
\item $\BlossomPoWTargetSpacingRatio := \hfrac{\PreBlossomPoWTargetSpacing}{\PostBlossomPoWTargetSpacing}$
\item $\PostBlossomHalvingInterval := \floor{\PreBlossomHalvingInterval \mult \BlossomPoWTargetSpacingRatio}$
- \item $\PoWTargetSpacingFunc(\BlockHeight \typecolon \Nat) := \begin{cases}
+\nuseven{
+ \item $\IsNUSevenActivated(\BlockHeight \typecolon \Nat) := (\BlockHeight \geq \NUSevenActivationHeight)$
+ \item $\NUSevenPoWTargetSpacingRatio := \hfrac{\PostBlossomPoWTargetSpacing}{\PostNUSevenPoWTargetSpacing}$
+ \item $\CombinedPoWTargetSpacingRatio := \BlossomPoWTargetSpacingRatio \mult \NUSevenPoWTargetSpacingRatio$
+ \item $\PostNUSevenHalvingInterval := \floor{\PostBlossomHalvingInterval \mult \NUSevenPoWTargetSpacingRatio}$
+} %nuseven
+ \item $\PoWTargetSpacingFunc(\BlockHeight \typecolon \Nat) :=$
+ \vspace{-0.5ex}
+ \item \tab $\begin{cases}
\PreBlossomPoWTargetSpacing,&\caseif \text{not } \IsBlossomActivated(\BlockHeight) \\
- \PostBlossomPoWTargetSpacing,&\caseotherwise
+ \PostBlossomPoWTargetSpacing,&\notnuseven{\caseotherwise}\notbeforenuseven{\nuseven{\caseif \IsBlossomActivated(\BlockHeight)} \\[-0.8ex]
+ &\nuseven{\text{ and not } \IsNUSevenActivated(\BlockHeight)}\! \\
+ \nuseven{\PostNUSevenPoWTargetSpacing,}&\nuseven{\caseotherwise}}
+ \end{cases}$
+\nuseven{
+ \item $\PoWAveragingWindow(\BlockHeight \typecolon \Nat) :=$
+ \vspace{-0.5ex}
+ \item \tab $\begin{cases}
+ \PreNUSevenPoWAveragingWindow,&\caseif \text{not } \IsNUSevenActivated(\BlockHeight) \\
+ \PostNUSevenPoWAveragingWindow,&\caseotherwise
\end{cases}$
+} %nuseven
} %blossom
- \item $\AveragingWindowTimespan\blossom{(\BlockHeight \typecolon \Nat)} := \PoWAveragingWindow \mult \PoWTargetSpacingFunc\blossom{(\BlockHeight)}$
+ \item $\AveragingWindowTimespan\blossom{(\BlockHeight \typecolon \Nat)} :=\notnuseven{ \PoWAveragingWindow \mult \PoWTargetSpacingFunc\blossom{(\BlockHeight)}}$
+\notbeforenuseven{
+ \vspace{-0.8ex}
+ \item \tab $\PoWAveragingWindow(\BlockHeight) \mult \PoWTargetSpacingFunc(\BlockHeight)$
+} %notbeforenuseven
\item $\MinActualTimespan\blossom{(\BlockHeight \typecolon \Nat)} := \floor{\AveragingWindowTimespan\blossom{(\BlockHeight)} \mult (1 - \PoWMaxAdjustUp)}$
\item $\MaxActualTimespan\blossom{(\BlockHeight \typecolon \Nat)} := \floor{\AveragingWindowTimespan\blossom{(\BlockHeight)} \mult (1 + \PoWMaxAdjustDown)}$
\item $\MedianTime(\BlockHeight \typecolon \Nat) :=
\median(\listcomp{\nTime(i) \for i \from \maximum(0, \BlockHeight - \PoWMedianBlockSpan) \upto \BlockHeight - 1})$
- \item $\ActualTimespan(\BlockHeight \typecolon \Nat) := \MedianTime(\BlockHeight) - \MedianTime(\BlockHeight - \PoWAveragingWindow)$
+ \item $\ActualTimespan(\BlockHeight \typecolon \Nat) :=\notnuseven{ \MedianTime(\BlockHeight) - \MedianTime(\BlockHeight - \PoWAveragingWindow)}$
+\notbeforenuseven{
+ \vspace{-0.8ex}
+ \item \tab $\MedianTime(\BlockHeight) - \MedianTime(\BlockHeight - \PoWAveragingWindow(\BlockHeight))$
+} %notbeforenuseven
\item $\ActualTimespanDamped(\BlockHeight \typecolon \Nat) :=$
\vspace{-0.8ex}
\item \tab $\AveragingWindowTimespan\blossom{(\BlockHeight)} + \trunc{\hfrac{\ActualTimespan(\BlockHeight) - \AveragingWindowTimespan\blossom{(\BlockHeight)}}{\PoWDampingFactor}}$
\item $\ActualTimespanBounded(\BlockHeight \typecolon \Nat) := \bound{\MinActualTimespan\blossom{(\BlockHeight)}}{\MaxActualTimespan\blossom{(\BlockHeight)}}(\ActualTimespanDamped(\BlockHeight))$
- \item $\MeanTarget(\BlockHeight \typecolon \Nat) := \!\begin{cases}
- \PoWLimit, \hspace{16em}\text{if } \BlockHeight \leq \PoWAveragingWindow \\
- \mean(\listcomp{\!\ToTarget(\nBits(i)\kern-0.1em) \for i \from \BlockHeight\!-\!\PoWAveragingWindow \upto \BlockHeight\!-\!1\!}),\\
+ \item $\MeanTarget(\BlockHeight \typecolon \Nat) :=$
+ \vspace{-0.5ex}
+ \item \tab $\begin{cases}
+ \PoWLimit, \hspace{16em}\text{if } \BlockHeight \leq \PoWAveragingWindow\nuseven{(\BlockHeight)} \\
+ \mean(\listcomp{\!\ToTarget(\nBits(i)\kern-0.1em) \for i \from \BlockHeight\!-\!\PoWAveragingWindow\nuseven{(\BlockHeight)} \upto \BlockHeight\!-\!1\!}),\\
\hspace{20.7em}\text{otherwise.}
\end{cases}$
\end{formulae}
@@ -14906,9 +15097,11 @@
The \targetThreshold for a given \blockHeight $\BlockHeight$ is then calculated as:
\begin{formulae}
- \item $\Threshold(\BlockHeight \typecolon \Nat) \hspace{0.43em} := \hspace{0.3em} \begin{cases}
+ \item $\Threshold(\BlockHeight \typecolon \Nat) :=$
+ \vspace{-0.5ex}
+ \item \tab $\begin{cases}
\PoWLimit, \hspace{16em}\text{if } \BlockHeight = 0 \\
- \minimum(\PoWLimit, \floor{\hfrac{\MeanTarget(\BlockHeight)}{\AveragingWindowTimespan}}
+ \minimum(\PoWLimit, \floor{\hfrac{\MeanTarget(\BlockHeight)}{\AveragingWindowTimespan\blossom{(\BlockHeight)}}}
\mult \ActualTimespanBounded(\BlockHeight)),\\
\hspace{20.7em}\text{otherwise}
\end{cases}$
@@ -14922,7 +15115,7 @@
is that these functions use only information from \blocks \emph{preceding} the given \blockHeight.
\introlist
\item When the $\median$ function is applied to a sequence of even length (which only happens
- in the definition of $\MedianTime$ during the first $\PoWAveragingWindow - 1$ \blocks of
+ in the definition of $\MedianTime$ during the first $\PoWAveragingWindow\nuseven{(\BlockHeight)} - 1$ \blocks of
the \blockChain), the element that begins the second half of the sequence is taken.
This corresponds to the \zcashd implementation, but was not specified correctly in versions
of this specification prior to \historyref{2019.0.0}.
@@ -14932,6 +15125,8 @@
is changed to allow minimum-difficulty \blocks, as described in \cite{ZIP-205}.
\blossom{The \NUBlossom \networkUpgrade changes the minimum-difficulty time threshold to $6$ times
the \blockTargetSpacing, as described in \cite{ZIP-208}.}
+\nuseven{The \NUSeven \networkUpgrade changes it to $18$ times the \blockTargetSpacing, as described
+in \cite{ZIP-218}, so that it remains $450$ seconds at the $25$-second \blockTargetSpacing.}
\notbeforeblossom{These changes do}\notblossom{This change does} not apply to \Mainnet.
@@ -14958,10 +15153,10 @@
\end{formulae}
\introlist
-\vspace{-2ex}
+\vspace{0.5ex}
\lsubsubsection{Definition of Work}{workdef}
-\vspace{-0.5ex}
+\vspace{0.5ex}
As explained in \crossref{blockchain}, a node chooses the ``best'' \blockChain
visible to it by finding the chain of valid \blocks with the greatest total work.
@@ -14972,58 +15167,102 @@
\introlist
-\vspace{-1.5ex}
+\vspace{0.5ex}
\lsubsection{Calculating Block Subsidy\notbeforecanopy{, Funding Streams,}\notbeforenusixone{ Lockbox Disbursement,}
and Founders' Reward}{subsidies}
-\vspace{-0.5ex}
+\vspace{0.5ex}
In \crossref{subsidyconcepts} the \blockSubsidy, \minerSubsidy,\notcanopy{ and} \foundersReward\canopy{,
and \fundingStreams} are defined. Their amounts in \zatoshi are calculated from the \blockHeight using
the formulae below.
+\notbeforenuseven{\begingroup\raggedright}
Let\notbeforeblossom{ the constants} $\SlowStartInterval$,\, $\PreBlossomHalvingInterval$,\,
-\blossom{$\PostBlossomHalvingInterval$,\, $\BlossomActivationHeight$,\, }$\MaxBlockSubsidy$,
+\blossom{$\PostBlossomHalvingInterval$,\, $\BlossomActivationHeight$,\, }\nuseven{$\PostNUSevenHalvingInterval$,\,
+$\NUSevenActivationHeight$,\, $\LNTwoScaled$,\, $\NSMReissuanceHeight$,\, }$\MaxBlockSubsidy$,
and $\FoundersFraction$ be as defined in \crossref{constants}.
+\notbeforenuseven{\par\endgroup}
\canopy{Let $\FundingStreams$ be as specified in \crossref{zip214fundingstreams}.}
+\nuseven{Let $\NSMValueBalance$ be as defined in \crossref{chainvaluepoolbalances}.}
+
\nusixone{Let $\ZIPTwoSevenOneActivationHeight$ and $\ZIPTwoSevenOneDisbursementAmount$ be as defined in \cite{ZIP-271}.}
\vspace{1ex}
\begin{formulae}
\item $\SlowStartShift \typecolon \Nat := \hfrac{\SlowStartInterval}{2}$
\item $\SlowStartRate \typecolon \Nat := \hfrac{\MaxBlockSubsidy}{\SlowStartInterval}$
+\blossom{
+ \vspace{0.5ex}
+ \item $\BlossomAdjustment \typecolon \Rat := \hfrac{\BlossomActivationHeight - \SlowStartShift}{\PreBlossomHalvingInterval}$
+} %blossom
+\nuseven{
\vspace{0.5ex}
- \item $\Halving(\BlockHeight \typecolon \Nat) := \begin{cases}
+ \item $\NUSevenAdjustment \typecolon \Rat := \BlossomAdjustment + \hfrac{\NUSevenActivationHeight - \BlossomActivationHeight}{\PostBlossomHalvingInterval}$
+} %nuseven
+ \vspace{0.5ex}
+ \needspace{26ex}
+ \item $\Halving(\BlockHeight \typecolon \Nat) :=$
+ \vspace{-0.5ex}
+ \item \tab $\begin{cases}
0,&\caseif \BlockHeight < \SlowStartShift \\
\notblossom{
\floor{\hfrac{\BlockHeight - \SlowStartShift}{\PreBlossomHalvingInterval}}\kern-0.25em,&\caseotherwise
} %notblossom
\notbeforeblossom{
- \floor{\hfrac{\BlockHeight - \SlowStartShift}{\PreBlossomHalvingInterval}}\kern-0.25em,&\blossom{\caseif \text{not } \IsBlossomActivated(\BlockHeight)} \\[1.6ex]
- \multicolumn{2}{@{}l}{\blossom{\floor{\hfrac{\BlossomActivationHeight - \SlowStartShift}{\PreBlossomHalvingInterval} +
- \hfrac{\BlockHeight - \BlossomActivationHeight}{\PostBlossomHalvingInterval}}\kern-0.3em,\hspace{0.85em}\caseotherwise}}
+ \floor{\hfrac{\BlockHeight - \SlowStartShift}{\PreBlossomHalvingInterval}}\kern-0.25em,&\blossom{\caseif \text{not } \IsBlossomActivated(\BlockHeight)} \\[1.2ex]
+ \blossom{\floor{\BlossomAdjustment + \hfrac{\BlockHeight - \BlossomActivationHeight}{\PostBlossomHalvingInterval}}\kern-0.3em,}&\blossom{\notnuseven{\caseotherwise}\nuseven{\caseif \IsBlossomActivated(\BlockHeight)}}\notbeforenuseven{ \\[-1.8ex]
+ &\nuseven{\text{ and not } \IsNUSevenActivated(\BlockHeight)}\! \\[1.2ex]
+ \nuseven{\floor{\NUSevenAdjustment + \hfrac{\BlockHeight - \NUSevenActivationHeight}{\PostNUSevenHalvingInterval}}\kern-0.3em,}&\nuseven{\caseotherwise}}
} %notbeforeblossom
\end{cases}$
\vspace{1ex}
- \item $\BlockSubsidy(\BlockHeight \typecolon \Nat) := \begin{cases}
+ \needspace{32ex}
+ \item $\notnuseven{\BlockSubsidy}\nuseven{\ScheduledBlockSubsidy}(\BlockHeight \typecolon \Nat) :=$
+ \vspace{-0.5ex}
+ \item \tab $\begin{cases}
\SlowStartRate \mult \BlockHeight,&\caseif \BlockHeight < \SlowStartShift \\[1.2ex]
\SlowStartRate \mult (\BlockHeight + 1),&\caseif \SlowStartShift \leq \BlockHeight \\[-0.8ex]
&\text{ and } \BlockHeight < \SlowStartInterval \\[1.2ex]
\floor{\hfrac{\MaxBlockSubsidy}{2^{\Halving(\BlockHeight)}}}\kern-0.25em,&\notblossom{\caseotherwise}\notbeforeblossom{\caseif \SlowStartInterval \leq \BlockHeight} \\[-1.4ex]
\notbeforeblossom {
&\blossom{\text{ and not } \IsBlossomActivated(\BlockHeight)}\! \\[1.2ex]
- \blossom{\floor{\hfrac{\MaxBlockSubsidy}{\BlossomPoWTargetSpacingRatio \mult 2^{\Halving(\BlockHeight)}}}\kern-0.25em,}&\blossom{\caseotherwise}
+ \blossom{\floor{\hfrac{\MaxBlockSubsidy}{\BlossomPoWTargetSpacingRatio \mult 2^{\Halving(\BlockHeight)}}}\kern-0.25em,}&\blossom{\notnuseven{\caseotherwise}\nuseven{\caseif \IsBlossomActivated(\BlockHeight)}}\notbeforenuseven{ \\[-1.8ex]
+ &\nuseven{\text{ and not } \IsNUSevenActivated(\BlockHeight)}\! \\[1.2ex]
+ \nuseven{\floor{\hfrac{\MaxBlockSubsidy}{\CombinedPoWTargetSpacingRatio \mult 2^{\Halving(\BlockHeight)}}}\kern-0.25em,}&\nuseven{\caseotherwise}}
} %notbeforeblossom
\end{cases}$
+\nuseven{
+ \vspace{1ex}
+ \item $\HalvingIntervalFunc(\BlockHeight \typecolon \Nat) := \begin{cases}
+ \PostBlossomHalvingInterval,&\caseif \text{not } \IsNUSevenActivated(\BlockHeight) \\
+ \PostNUSevenHalvingInterval,&\caseotherwise
+ \end{cases}$
+ \vspace{0.5ex}
+ \item $\BlockSubsidyFraction(\BlockHeight \typecolon \Nat) \typecolon \Rat :=
+ \hfrac{\floor{\LNTwoScaled / \HalvingIntervalFunc(\BlockHeight)}}{10^{10}}$
\vspace{0.5ex}
+ \item $\AdditionalBlockSubsidy(\BlockHeight \typecolon \Nat) :=$
+ \vspace{-0.5ex}
+ \item \tab $\begin{cases}
+ 0,&\caseif \BlockHeight < \NSMReissuanceHeight \\[1ex]
+ \mathsf{ceiling}\big(\BlockSubsidyFraction(\BlockHeight) \mult \\[-0.4ex]
+ \hspace{4em} \NSMValueBalance(\BlockHeight - 1)\big),&\caseotherwise
+ \end{cases}$
+ \vspace{0.5ex}
+ \item $\BlockSubsidy(\BlockHeight \typecolon \Nat) := \ScheduledBlockSubsidy(\BlockHeight) + \AdditionalBlockSubsidy(\BlockHeight)$
+} %nuseven
+ \vspace{1ex}
\item $\FoundersReward(\BlockHeight \typecolon \Nat) := \begin{cases}
\BlockSubsidy(\BlockHeight) \mult \FoundersFraction,&\caseif \Halving(\BlockHeight) < 1 \\
0,&\caseotherwise
\end{cases}$
+ \vspace{0.5ex}
\canopy {
\vspace{0.5ex}
+ \needspace{14ex}
\item for $\fs \in \FundingStreams$,\, $\fsValue(\BlockHeight) :=$
\vspace{-0.5ex}
\item \tab $\begin{cases}
@@ -15049,8 +15288,27 @@
\item $\MinerSubsidy(\BlockHeight) := \BlockSubsidy(\BlockHeight) - \FoundersReward(\BlockHeight)
\canopy{\,- \ssum{\fs\, \in\, \FundingStreams}{} \fsValue(\BlockHeight)}$.
+\nuseven{
+ \vspace{1ex}
+ \item $\TransactionFees(\BlockHeight \typecolon \Nat) \typecolon \range{0}{\MAXMONEY} :=$ the total
+ value in \zatoshi of the \transactionFees paid by the non-coinbase \transactions in the
+ \block at \blockHeight $\BlockHeight$
+ \vspace{0.5ex}
+ \item $\NSMFeeContribution(\BlockHeight \typecolon \Nat) := \floor{\hfrac{6 \mult \TransactionFees(\BlockHeight)}{10}}$
+ \vspace{0.5ex}
+ \item $\MinerFees(\BlockHeight \typecolon \Nat) := \TransactionFees(\BlockHeight) - \NSMFeeContribution(\BlockHeight)$.
+} %nuseven
\end{formulae}
+\nuseven{
+\vspace{-3ex}
+\nnote{\cite{ZIP-235} writes $\NSMFeeContribution(\BlockHeight)$ as $6 \mult q + \floor{6 \mult r / 10}$,
+with $q$ and $r$ the quotient and remainder of $\TransactionFees(\BlockHeight)$ divided by $10$.
+That is equal to the definition above, and avoids forming $6 \mult \TransactionFees(\BlockHeight)$,
+which can exceed $\MAXMONEY$ in an implementation whose amounts are bounded by it. $\NSMFeeContribution(\BlockHeight)$
+is removed from circulation into the NSM Value Balance defined in \crossref{chainvaluepoolbalances}.}
+} %nuseven
+
\vspace{-2ex}
\lsubsection{Payment of Founders' Reward}{foundersreward}
@@ -15249,10 +15507,38 @@
\item $\HeightForHalving(\HalvingNum \typecolon \PosInt) :=
\minimum\Of{\setof{\BlockHeight \typecolon \Nat \suchthat \Halving(\BlockHeight) = \HalvingNum}}$
\item $\FSRecipientChangeInterval := \PostBlossomHalvingInterval / 48$
+\nuseven{
+ \item $\PreNUSevenEquivalentHeight(\BlockHeight \typecolon \Nat) :=$
+ \vspace{-0.5ex}
+ \item \tab $\begin{cases}
+ \BlockHeight,&\caseif \text{not } \IsNUSevenActivated(\BlockHeight) \\[1ex]
+ \NUSevenActivationHeight + \hfrac{\BlockHeight - \NUSevenActivationHeight}{\NUSevenPoWTargetSpacingRatio},&\caseotherwise
+ \end{cases}$
+} %nuseven
+\notnuseven{
\item $\FSRecipientPeriod(\BlockHeight) :=
\floor{\hfrac{\BlockHeight - (\HeightForHalving(1) - \PostBlossomHalvingInterval)}{\FSRecipientChangeInterval}}$.
+} %notnuseven
+\notbeforenuseven{
+ \item \nuseven{$\FSRecipientPeriod(\BlockHeight) :=$}
+ \vspace{-0.5ex}
+ \item \tab \nuseven{$\floor{\hfrac{\PreNUSevenEquivalentHeight(\BlockHeight) - (\HeightForHalving(1) - \PostBlossomHalvingInterval)}{\FSRecipientChangeInterval}}$.}
+} %notbeforenuseven
\end{formulae}
+\nuseven{
+\pnote{$\PreNUSevenEquivalentHeight(\BlockHeight)$ is a rational number: the \blockHeight that the
+\block at \blockHeight $\BlockHeight$ would have if the \blocks from \NUSeven activation onward had
+been mined at the pre-\NUSeven \blockTargetSpacing. Revision 2 of \cite{ZIP-207} writes the
+\NUSeven case of $\FSRecipientPeriod$ as $\floor{\hfrac{R \mult (A + I - H_1) + \BlockHeight - A}{R \mult C}}$,
+where $A$ is $\NUSevenActivationHeight$, $R$ is $\NUSevenPoWTargetSpacingRatio$, $C$ is
+$\FSRecipientChangeInterval$, $I$ is $\PostBlossomHalvingInterval$, and $H_1$ is $\HeightForHalving(1)$.
+Dividing its numerator and denominator by $R$ gives the definition above. This preserves the
+recipient index at \NUSeven activation. The remaining \blocks of the period in which \NUSeven
+activates are tripled in number, and each later period lasts $3 \mult \FSRecipientChangeInterval$
+\blocks, so that each period keeps approximately its previous duration and total value.}
+} %nuseven
+
\introlist
For each \fundingStream $\fs$, define:
@@ -15263,9 +15549,12 @@
\end{formulae}
$\fsRecipients$ \MUST be of length $\fsNumRecipients$. Each element of $\fsRecipients$
-\MUST represent either a \transparentPtoSHAddress as specified in \crossref{transparentaddrencoding},
-or a \Sapling \shieldedPaymentAddress as specified in \crossref{saplingpaymentaddrencoding}\nusix{,
-or the identifier $\DeferredPoolRecipient$}.
+\MUST represent either a \transparentPtoSHAddress\nuseven{ or \transparentPtoPKHAddress} as specified
+in \crossref{transparentaddrencoding}, or a \Sapling \shieldedPaymentAddress as specified in
+\crossref{saplingpaymentaddrencoding}\nuseven{, or a Unified Address \cite{ZIP-316} containing only
+an \Orchard Receiver and no other Items}\nusix{, or the identifier $\DeferredPoolRecipient$}.
+\nuseven{A Unified Address recipient identifier represents its \Orchard Receiver, which is paid by
+an \IronwoodPoolAdj output as specified below.}
A \fundingStream $\fs$ is ``active'' at \blockHeight $\BlockHeight$ when $\fsValue(\BlockHeight) > 0$,
where $\fsValue$ is defined in \crossref{subsidies}.
@@ -15299,6 +15588,15 @@
\defining{\xStandardRedeemScript} hashes are defined in \cite{ZIP-48} for
\PtoSHMultisigAddresses, or \cite{Bitcoin-P2SH} for other \PtoSHAddresses.
+\nuseven{
+ \vspace{0.5ex}
+ \item The \defining{\prescribedWay} to pay a \transparentPtoPKHAddress is to use a script of
+ the form $\ScriptOP{DUP}$ $\ScriptOP{HASH160}$ $\fsPubKeyHash(\BlockHeight)\;
+ \ScriptOP{EQUALVERIFY}$ $\ScriptOP{CHECKSIG}$ as the $\scriptPubKey$, where
+ $\fsPubKeyHash(\BlockHeight)$ is the direct push of the $20$-byte public key hash in the
+ raw encoding (\crossref{transparentaddrencoding}) of the recipient address for
+ $\fsRecipient(\BlockHeight)$. No other script encoding satisfies this rule.
+} %nuseven
\vspace{0.5ex}
\item The \defining{\prescribedWay} to pay a \SaplingOrOrchard \paymentAddress is
defined in \cite{ZIP-213}, using the post-\NUHeartwood consensus rules in
@@ -15329,8 +15627,9 @@
\SaplingAndOrchard \shieldedPaymentAddresses as recipients. \cite{ZIP-213}
permits \shieldedOutputs of \coinbaseTransactions to such addresses.\nufive{ The
recipient identifiers permitted above do not include \Orchard
- \shieldedPaymentAddresses before Revision 2 of \cite{ZIP-207}. The \prescribedWay
- to pay one is defined in anticipation of that revision.}
+ \shieldedPaymentAddresses before Revision 2 of \cite{ZIP-207}\nuseven{, which applies
+ from \NUSeven}.\notnuseven{ The \prescribedWay to pay one was already defined, in
+ anticipation of that revision.}}
\end{pnotes}
\vspace{-1ex}
@@ -15420,8 +15719,8 @@
\item \begin{tabular}{|l|c|c|c|c|}
\hline
Stream & Numerator & Denominator & Start height & End height \\\hline\raisedstrut
-\texttt{FS\_FPF\_ZCG\_H3}& $8$ & $100$ & $3146400$ & $4406400$ \\
-\texttt{FS\_CCF\_H3} & $12$ & $100$ & $3146400$ & $4406400$ \\\hline
+\texttt{FS\_FPF\_ZCG\_H3}& $8$ & $100$ & $3146400$ & $\notnuseven{4406400}\nuseven{6132390}$ \\
+\texttt{FS\_CCF\_H3} & $12$ & $100$ & $3146400$ & $\notnuseven{4406400}\nuseven{6132390}$ \\\hline
\end{tabular}
\end{formulae}
@@ -15431,10 +15730,20 @@
\item \begin{tabular}{|l|c|c|c|c|}
\hline
Stream & Numerator & Denominator & Start height & End height \\\hline\raisedstrut
-\texttt{FS\_FPF\_ZCG\_H3}& $8$ & $100$ & $3536500$ & $4476000$ \\
-\texttt{FS\_CCF\_H3} & $12$ & $100$ & $3536500$ & $4476000$ \\\hline
+\texttt{FS\_FPF\_ZCG\_H3}& $8$ & $100$ & $3536500$ & $\notnuseven{4476000}\nuseven{4497948}$ \\
+\texttt{FS\_CCF\_H3} & $12$ & $100$ & $3536500$ & $\notnuseven{4476000}\nuseven{4497948}$ \\\hline
\end{tabular}
\end{formulae}
+
+\nuseven{
+\vspace{1ex}
+\cite{ZIP-214} Revision 3, which applies from \NUSeven activation, changes the end height of each
+Revision 2 \fundingStream to $\HeightForHalving(3)$ under the \NUSeven definition of $\Halving$,
+as shown above; before \NUSeven the end heights were $4406400$ on \Mainnet and $4476000$ on
+\Testnet. It also changes the recipients of \texttt{FS\_FPF\_ZCG\_H3} on \Mainnet for the
+recipient periods after the one that contains the last pre-\NUSeven \block, as specified in
+\cite{ZIP-2008}.
+} %nuseven
} %nusixone
@@ -16167,8 +16476,12 @@
David Campbell, Elena Giralt, Francisco Gindre, Joseph Van~Geffen, Josh Swihart,
Kevin Gorham, Larry Ruane, Marshall Gaucher, Ryan Taylor, Sasha Meyer,
Conrado Gouvêa, Aditya Bharadwaj, Andrew Arnott, Arya, Andrea Kobrlova,
-Lukáš Korba, Honza Rychnovský, Schell Scivally, Julian Abraham, and no doubt
-others.
+Lukáš Korba, Honza Rychnovský, Schell Scivally, @Peacemonger, Nicolas Gailly, Danny Willems,
+Jason McGee, Mark Henderson, Tomek Piotrowski, Mariusz Pilarek, Paul Dann, Dev Ojha, Evan Forbes,
+Anna Rose, Jens Groth, Judah Caruso, Pablo Kogan, Vivek Arte, Daniel Benarroch, Aurelien Nicolas,
+Alexey Koren, Antoine Rondelet, Constance Beguier, Georgios Konstantopoulos, Matt Luongo,
+Alex Bornstein, @dontbeevil, @GGuy, @mistfpga, Gordon Mohr, Dimitris Apostolou, Gregory Maxwell,
+Pieter Wuille, Julian Abraham, and no doubt others.
We would also like to thank the designers and developers of \Bitcoin and
\BitcoinCore.
@@ -16196,6 +16509,8 @@
The 2019 Soundness vulnerability in \BCTV \cite{Gabizon2019}
was found by Ariel Gabizon.
+The 2026 \Orchard Action circuit soundness vulnerability was found by Taylor Hornby.
+
The design of \Sapling is primarily due to Matthew Green, Ian Miers,
\nh{Daira-Emma} Hopwood, Sean Bowe, Jack Grigg, and Jack Gavigan. A potential attack
linking \diversifiedPaymentAddresses, avoided in the adopted design, was
@@ -16222,7 +16537,7 @@
Amit Sahai.
We thank the organizers of the ZKProof standardization effort and workshops;
-and also Anna Rose, Fredrik Harrysson, Terun Chitra, James Prestwich,
+and also Anna Rose, Fredrik Harrysson, Tarun Chitra, James Prestwich,
Josh Cincinnati, Tanya Karsou, Henrik Jose, Chris Ward, and others for their
work on the Zero Knowledge Podcast, ZK Summits, and ZK Study Club. These
efforts have enriched the zero knowledge community immeasurably.
@@ -16242,7 +16557,7 @@
\xShieldedPool names are set in Raleway Italic, by Matt McInerney, Pablo Impallari,
and Rodrigo Fuenzalida.
The {\schoolbook New Century Schoolbook} font by URW Type Foundry, based on
-Century Schoolbook designed by Morris Fuller, is used for \emph{italics}\!.
+Century Schoolbook designed by Morris Fuller Benton, is used for \emph{italics}\!.
Finally, we would like to thank the Internet Archive for their scan of
Peter Newell's illustration of the Jubjub bird, from \cite{Carroll1902}.
@@ -16251,6 +16566,83 @@
\intropart
\lsection{Change History}{changehistory}
+\historyentry{2026.9.0}{2026-11-06}
+
+\begin{itemize}
+\nuseven{
+ \item Describe \NUSeven as having activated on \Mainnet at \blockHeight $3543405$ in
+ \shortcrossref{networkupgrades}, give its \activationBlock hashes in
+ \shortcrossref{networks}, and add the consensus rule that \transactions \MUST use the
+ \NUSeven \consensusBranchID.
+ \item Apply the change described in \cite{ZIP-2003}: from \NUSeven, the
+ \transactionVersionNumber \MUST be $5$ or $6$ (\shortcrossref{txnconsensus}).
+ \item Apply the changes described in \cite{ZIP-218}:
+ \vspace{0.5ex}
+ \begin{itemize}
+ \item Add $\NUSevenActivationHeight$, $\PostNUSevenPoWTargetSpacing$, the averaging
+ window constants, and the shielded limit constants to \shortcrossref{constants}
+ and \shortcrossref{notation}.
+ \item In \shortcrossref{diffadjustment}, make $\PoWTargetSpacingFunc$ return $25$
+ seconds from \NUSeven, make $\PoWAveragingWindow$ a function of \blockHeight that
+ returns $102$ from \NUSeven, define $\CombinedPoWTargetSpacingRatio$ and
+ $\PostNUSevenHalvingInterval$, and change the \Testnet minimum-difficulty
+ threshold to $18$ times the \blockTargetSpacing.
+ \item In \shortcrossref{subsidies}, define $\BlossomAdjustment$ and $\NUSevenAdjustment$,
+ and add the \NUSeven cases of $\Halving$ and $\BlockSubsidy$.
+ \item In \shortcrossref{blockheader}, add the per-pool limits and the global shielded
+ budget on the shielded components of the \transactions in a \block.
+ \end{itemize}
+ \vspace{-1.5ex}
+ \item Apply Revision 2 of \cite{ZIP-207}, \cite{ZIP-2008}, and Revision 3 of \cite{ZIP-214}:
+ \vspace{0.5ex}
+ \begin{itemize}
+ \item In \shortcrossref{fundingstreams}, add the \NUSeven case of $\FSRecipientPeriod$,
+ expressed through $\PreNUSevenEquivalentHeight$.
+ \item Permit transparent \PtoPKHAddresses and Unified Addresses containing only an
+ \Orchard Receiver as \fundingStream recipients, and define the \prescribedWay to
+ pay a \transparentPtoPKHAddress.
+ \item In \shortcrossref{zip214fundingstreams}, give the \NUSeven end heights of the
+ Revision 2 \fundingStreams, and note the \NUSeven change of recipients of
+ \texttt{FS\_FPF\_ZCG\_H3} on \Mainnet.
+ \end{itemize}
+ \vspace{-1.5ex}
+ \item Apply the changes described in \cite{ZIP-235}: define $\TransactionFees$,
+ $\NSMFeeContribution$, and $\MinerFees$ in \shortcrossref{subsidies}; from \NUSeven, the
+ \totalInputValue of a \coinbaseTransaction in \shortcrossref{txnconsensus} includes
+ $\MinerFees(\BlockHeight)$ in place of the \transactionFees, and \shortcrossref{transactions},
+ \shortcrossref{subsidyconcepts}, and \shortcrossref{coinbasetransactions} say so.
+ \item Apply the changes described in \cite{ZIP-237}:
+ \vspace{0.5ex}
+ \begin{itemize}
+ \item Add $\LNTwoScaled$, $\InitialNSMValueBalance$, and $\NSMReissuanceHeight$ to
+ \shortcrossref{constants} and \shortcrossref{notation}.
+ \item In \shortcrossref{subsidies}, rename $\BlockSubsidy$ to $\ScheduledBlockSubsidy$.
+ \item In \shortcrossref{subsidies}, define $\HalvingIntervalFunc$,
+ $\BlockSubsidyFraction$, and $\AdditionalBlockSubsidy$, and redefine
+ $\BlockSubsidy$ as the sum of $\ScheduledBlockSubsidy$ and $\AdditionalBlockSubsidy$.
+ \item In \shortcrossref{chainvaluepoolbalances}, define $\NSMValueRemoved$ and the
+ NSM Value Balance, with the consensus rule that it \MUSTNOT become negative, and
+ note that the \SproutChainValuePool balance remains issued (\cite{ZIP-2003}).
+ \item In \shortcrossref{transactions}, say that the value left unclaimed by
+ \coinbaseTransactions before \NUSix is reissued, and in
+ \shortcrossref{subsidyconcepts} that the \blockSubsidy includes reissued value
+ from $\NSMReissuanceHeight$.
+ \end{itemize}
+ \vspace{-1.5ex}
+} %nuseven
+ \item Add an acknowledgement to Taylor Hornby for finding the 2026 \Orchard Action
+ circuit soundness vulnerability.
+ \item Add acknowledgements to @Peacemonger, Nicolas Gailly, Danny Willems, Jason McGee,
+ Mark Henderson, Tomek Piotrowski, Mariusz Pilarek, Paul Dann, Dev Ojha, Evan Forbes,
+ Anna Rose, Jens Groth, Judah Caruso, Pablo Kogan, Vivek Arte, Daniel Benarroch,
+ Aurelien Nicolas, Alexey Koren, Antoine Rondelet, Constance Beguier,
+ Georgios Konstantopoulos, Matt Luongo, Alex Bornstein, @dontbeevil, @GGuy, @mistfpga,
+ Gordon Mohr, Dimitris Apostolou, Gregory Maxwell, and Pieter Wuille for discussions on
+ the Zcash protocol.
+ \item Correct the names of Tarun Chitra and Morris Fuller Benton in the Acknowledgements.
+\end{itemize}
+
+
\historyentry{2026.8.0}{2026-11-06}
\begin{itemize}