mirror of https://github.com/zcash/zips.git
\crossref{coinbasetransactions} effectively defined a coinbase transaction as the first
transaction in a block. This wording was copied from the Bitcoin Developer Reference (https://developer.bitcoin.org/reference/transactions.html#coinbase-input-the-input-of-the-first-transaction-in-a-block), but it does not match the implementation in zcashd that was inherited from Bitcoin Core. Instead, a coinbase transaction should be, and now is, defined as a transaction with a single null prevout. The specifications of consensus rules have been clarified and adjusted (without any actual consensus change) to take this into account, as follows: * a block MUST have at least one transaction; * the first transaction in a block MUST be a coinbase transaction, and subsequent transactions MUST NOT be coinbase transactions; * a transparent input in a non-coinbase transaction MUST NOT have a null prevout; * every non-null prevout MUST point to a unique UTXO in either a preceding block, or a *previous* transaction in the same block (this rule was previously not given explicitly because it was assumed to be inherited from Bitcoin); * the rule that "A coinbase transaction MUST NOT have any transparent inputs with non-null prevout fields" is removed as an explicit consensus rule because it is implied by the corrected definition of coinbase transaction. Signed-off-by: Daira Hopwood <daira@jacaranda.org>
This commit is contained in:
parent
e123584794
commit
e381ded490
|
@ -3677,9 +3677,11 @@ The calculations are described in \crossref{subsidies}.
|
||||||
|
|
||||||
\lsubsection{Coinbase Transactions}{coinbasetransactions}
|
\lsubsection{Coinbase Transactions}{coinbasetransactions}
|
||||||
|
|
||||||
The first (and only the first) \transaction in a block is a \defining{\coinbaseTransaction},
|
A \transaction that has a single \transparentInput with a null \prevoutField{} field, is
|
||||||
which collects and spends any \minerSubsidy and \transactionFees paid by \transactions
|
called a \defining{\coinbaseTransaction}. Every \block has a single \coinbaseTransaction
|
||||||
included in this \block.
|
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.
|
||||||
|
|
||||||
\precanopy{As described in \crossref{foundersreward}, the \coinbaseTransaction \MUST also pay
|
\precanopy{As described in \crossref{foundersreward}, the \coinbaseTransaction \MUST also pay
|
||||||
the \foundersReward.}
|
the \foundersReward.}
|
||||||
|
@ -12601,13 +12603,9 @@ in \cite{ZIP-239}.
|
||||||
\item The total value in \zatoshi of \transparentOutputs from a \coinbaseTransaction\heartwood{, minus
|
\item The total value in \zatoshi of \transparentOutputs from a \coinbaseTransaction\heartwood{, minus
|
||||||
$\vBalance{Sapling}$,}\nufive{ minus $\vBalance{Orchard}$,} \MUSTNOT be greater than the value in
|
$\vBalance{Sapling}$,}\nufive{ minus $\vBalance{Orchard}$,} \MUSTNOT be greater than the value in
|
||||||
\zatoshi of \blockSubsidy plus the \transactionFees paid by \transactions in this \block.
|
\zatoshi of \blockSubsidy plus the \transactionFees paid by \transactions in this \block.
|
||||||
\item A \coinbaseTransaction \MUSTNOT have any \transparentInputs with non-null $\prevout$ fields,\notheartwood{
|
\item A \coinbaseTransaction \MUSTNOT have any \joinSplitDescriptions.
|
||||||
\joinSplitDescriptions\sapling{, \spendDescriptions, or \outputDescriptions}.
|
\item \sapling{A \coinbaseTransaction \MUSTNOT have any \spendDescriptions.}
|
||||||
}
|
\preheartwooditem{\sapling{A \coinbaseTransaction \MUST have any \outputDescriptions.}}
|
||||||
\notbeforeheartwood{
|
|
||||||
\joinSplitDescriptions\sapling{, or \spendDescriptions}.
|
|
||||||
\preheartwooditem{\sapling{A \coinbaseTransaction also \MUSTNOT have any \outputDescriptions.}}
|
|
||||||
}
|
|
||||||
\nufiveonwarditem{In a version 5 \coinbaseTransaction, the \enableSpendsOrchard{} flag \MUST be $0$.}
|
\nufiveonwarditem{In a version 5 \coinbaseTransaction, the \enableSpendsOrchard{} flag \MUST be $0$.}
|
||||||
\nufiveonwarditem{In a version 5 \transaction, the reserved bits $\barerange{2}{7}$ of the
|
\nufiveonwarditem{In a version 5 \transaction, the reserved bits $\barerange{2}{7}$ of the
|
||||||
\flagsOrchard{} field \MUST be zero.}
|
\flagsOrchard{} field \MUST be zero.}
|
||||||
|
@ -12621,6 +12619,9 @@ in \cite{ZIP-239}.
|
||||||
the encoding used by \Bitcoin in the implementation of \cite{BIP-34} (but the description here
|
the encoding used by \Bitcoin in the implementation of \cite{BIP-34} (but the description here
|
||||||
is to be considered normative).
|
is to be considered normative).
|
||||||
\item A \coinbaseTransaction script \MUST have length in $\range{2}{100}$ bytes.
|
\item A \coinbaseTransaction script \MUST have length in $\range{2}{100}$ bytes.
|
||||||
|
\item A \transparentInput in a non-coinbase \transaction \MUSTNOT have a null \prevout.
|
||||||
|
\item Every non-null \prevout \MUST point to a unique \utxo in either a preceding \block, or a
|
||||||
|
\emph{previous} \transaction in the same \block.
|
||||||
\item %\consensuslink{bad-txns-premature-spend-of-coinbase}
|
\item %\consensuslink{bad-txns-premature-spend-of-coinbase}
|
||||||
A \transaction \MUSTNOT spend a \transparentOutput of a \coinbaseTransaction
|
A \transaction \MUSTNOT spend a \transparentOutput of a \coinbaseTransaction
|
||||||
from a \block less than 100 \blocks prior to the spend. Note that \transparentOutputs of
|
from a \block less than 100 \blocks prior to the spend. Note that \transparentOutputs of
|
||||||
|
@ -13100,6 +13101,9 @@ preceding \blocks if there are fewer than $\PoWMedianBlockSpan$). The \medianTim
|
||||||
\nufiveonwarditem{$\hashBlockCommitments$ \MUST be set to the value of $\hashBlockCommitments$
|
\nufiveonwarditem{$\hashBlockCommitments$ \MUST be set to the value of $\hashBlockCommitments$
|
||||||
for this \block, as specified in \cite{ZIP-244}.}
|
for this \block, as specified in \cite{ZIP-244}.}
|
||||||
}
|
}
|
||||||
|
\item A \block \MUST have at least one \transaction.
|
||||||
|
\item The first \transaction in a \block \MUST be a \coinbaseTransaction, and subsequent
|
||||||
|
\transactions \MUSTNOT be \coinbaseTransactions.
|
||||||
\item \todo{Other rules inherited from \Bitcoin.}
|
\item \todo{Other rules inherited from \Bitcoin.}
|
||||||
\end{consensusrules}
|
\end{consensusrules}
|
||||||
|
|
||||||
|
@ -14627,6 +14631,29 @@ Peter Newell's illustration of the Jubjub bird, from \cite{Carroll1902}.
|
||||||
} %sapling
|
} %sapling
|
||||||
\item Document the consensus rule that coinbase script length \MUST be
|
\item Document the consensus rule that coinbase script length \MUST be
|
||||||
$\range{2}{100}$ bytes.
|
$\range{2}{100}$ bytes.
|
||||||
|
\item \crossref{coinbasetransactions} effectively defined a \coinbaseTransaction
|
||||||
|
as the first \transaction in a \block. This wording was copied from the
|
||||||
|
Bitcoin Developer Reference \cite{Bitcoin-CbInput}, but it does not match
|
||||||
|
the implementation in \zcashd that was inherited from \BitcoinCore.
|
||||||
|
Instead, a \coinbaseTransaction should be, and now is, defined as a
|
||||||
|
\transaction with a single null \prevout.
|
||||||
|
The specifications of consensus rules have been clarified and adjusted
|
||||||
|
(without any actual consensus change) to take this into account, as follows:
|
||||||
|
\begin{itemize}
|
||||||
|
\item a \block \MUST have at least one \transaction;
|
||||||
|
\item the first \transaction in a \block \MUST be a \coinbaseTransaction,
|
||||||
|
and subsequent \transactions \MUSTNOT be \coinbaseTransactions;
|
||||||
|
\item a \transparentInput in a non-coinbase \transaction \MUSTNOT have
|
||||||
|
a null \prevout;
|
||||||
|
\item every non-null \prevout \MUST point to a unique \utxo in either
|
||||||
|
a preceding \block, or a \emph{previous} \transaction in the
|
||||||
|
same \block (this rule was previously not given explicitly
|
||||||
|
because it was assumed to be inherited from \Bitcoin);
|
||||||
|
\item the rule that ``A \coinbaseTransaction \MUSTNOT have any
|
||||||
|
\transparentInputs with non-null \prevoutField{} fields'' is
|
||||||
|
removed as an explicit consensus rule because it is implied by
|
||||||
|
the corrected definition of \coinbaseTransaction.
|
||||||
|
\end{itemize}
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -990,6 +990,13 @@ Last revised February~5, 2018.}
|
||||||
urldate={2020-07-13}
|
urldate={2020-07-13}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@misc{Bitcoin-CbInput,
|
||||||
|
presort={Bitcoin-CoinbaseIn},
|
||||||
|
title={Coinbase Input --- {B}itcoin {D}eveloper {R}eference},
|
||||||
|
url={https://developer.bitcoin.org/reference/transactions.html#coinbase-input-the-input-of-the-first-transaction-in-a-block},
|
||||||
|
urldate={2022-03-17}
|
||||||
|
}
|
||||||
|
|
||||||
@misc{Bitcoin-Multisig,
|
@misc{Bitcoin-Multisig,
|
||||||
presort={Bitcoin-Multisig},
|
presort={Bitcoin-Multisig},
|
||||||
title={Transactions: {M}ultisig --- {B}itcoin {D}eveloper {G}uide},
|
title={Transactions: {M}ultisig --- {B}itcoin {D}eveloper {G}uide},
|
||||||
|
|
Loading…
Reference in New Issue