diff --git a/rendered/zip-0226.html b/rendered/zip-0226.html
index bd3e83f33..99406b462 100644
--- a/rendered/zip-0226.html
+++ b/rendered/zip-0226.html
@@ -39,7 +39,7 @@
This ZIP (ZIP 226) proposes the Zcash Shielded Assets (ZSA) protocol, in conjunction with ZIP 227 5. The ZSA protocol is an extension of the Orchard protocol that enables the issuance, transfer and burn of custom Assets on the Zcash chain. The issuance of such Assets is defined in ZIP 227 5, while the transfer and burn of such Assets is defined in this ZIP (ZIP 226). While the proposed ZSA protocol is a modification to the Orchard protocol, it has been designed with adaptation to possible future shielded protocols in mind. This ZIP (ZIP 226) proposes the Orchard Zcash Shielded Assets (OrchardZSA) protocol, in conjunction with ZIP 227 5. The OrchardZSA protocol is an extension of the Orchard protocol that enables the issuance, transfer and burn of custom Assets on the Zcash chain. The issuance of such Assets is defined in ZIP 227 5, while the transfer and burn of such Assets is defined in this ZIP (ZIP 226). While the proposed OrchardZSA protocol is a modification to the Orchard protocol, it has been designed with adaptation to possible future shielded protocols in mind. None of the currently deployed Zcash transfer protocols support Custom Assets. Enabling multi-asset support on the Zcash chain will open the door for a host of applications, and enhance the ecosystem with application developers and Asset custody institutions for issuance and bridging purposes. This ZIP builds on the issuance mechanism introduced in ZIP 227 5.Abstract
- Motivation
The Asset Identifier (via means of the Asset Digest and Asset Base) will be used to enforce that the balance of an Action Description 16 29 is preserved across Assets (see the Orchard Binding Signature 19), and by extension the balance of an Orchard transaction. That is, the sum of all the + that is stored in OrchardZSA notes. These terms are formally defined in ZIP 227 5.
+The Asset Identifier (via means of the Asset Digest and Asset Base) will be used to enforce that the balance of an Action Description 18 31 is preserved across Assets (see the Orchard Binding Signature 21), and by extension the balance of an Orchard transaction. That is, the sum of all the \(\mathsf{value^{net}}\) from each Action Description, computed as \(\mathsf{value^{old}} - \mathsf{value^{new}}\!\) , must be balanced only with respect to the same Asset Identifier. This is especially important since we will allow different Action Descriptions to transfer notes of different Asset Identifiers, where the overall balance is checked without revealing which (or how many distinct) Assets are being transferred.
-As was initially proposed by Jack Grigg and Daira-Emma Hopwood 30 31, we propose to make this happen by changing the value base point, +
As was initially proposed by Jack Grigg and Daira-Emma Hopwood 32 33, we propose to make this happen by changing the value base point, \(\mathcal{V}^{\mathsf{Orchard}}\!\) , in the Homomorphic Pedersen Commitment that derives the value commitment, \(\mathsf{cv^{net}}\!\) , of the net value in an Orchard Action.
-Because in a single transaction all value commitments are balanced, there must be as many different value base points as there are Asset Identifiers for a given shielded protocol used in a transaction. We propose to make the Asset Base an auxiliary input to the proof for each Action statement 21, represented already as a point on the Pallas curve. The circuit then should check that the same Asset Base is used in the old note commitment and the new note commitment 26, and as the base point in the value commitment 25. This ensures (1) that the input and output notes are of the same Asset Base, and (2) that only Actions with the same Asset Base will balance out in the Orchard binding signature.
-In order to ensure the security of the transfers, and as we will explain below, we are redefining input dummy notes 18 for Custom Assets, as we need to enforce that the +
Because in a single transaction all value commitments are balanced, there must be as many different value base points as there are Asset Identifiers for a given shielded protocol used in a transaction. We propose to make the Asset Base an auxiliary input to the proof for each Action statement 23, represented already as a point on the Pallas curve. The circuit then should check that the same Asset Base is used in the old note commitment and the new note commitment 28, and as the base point in the value commitment 27. This ensures (1) that the input and output notes are of the same Asset Base, and (2) that only Actions with the same Asset Base will balance out in the Orchard binding signature.
+In order to ensure the security of the transfers, and as we will explain below, we are redefining input dummy notes 20 for Custom Assets, as we need to enforce that the
\(\mathsf{AssetBase}\)
of the output note of that Split Action is the output of a valid
\(\mathsf{ZSAValueBase}\)
@@ -80,7 +80,7 @@
Most of the protocol is kept the same as the Orchard protocol released with NU5, except for the following. For every new Asset, there must be a new and unique Asset Identifier. Every Asset is defined by an Asset description,
+ For every new Asset, there MUST be a new and unique Asset Identifier. Every Asset is defined by an Asset description,
\(\mathsf{asset\_desc}\!\)
, which is a global byte string (scoped across all future versions of Zcash). From this Asset description and the issuance validating key of the issuer, the specific Asset Identifier,
\(\mathsf{AssetId}\!\)
@@ -95,26 +95,30 @@
Let
- \(\mathsf{Note^{OrchardZSA}}\)
- be the type of a ZSA note, i.e.
- \(\mathsf{Note^{OrchardZSA}} := \mathsf{Note^{Orchard}} \times \mathbb{P}^*\!\)
- . An Orchard ZSA note differs from an Orchard note 15 by additionally including the Asset Base,
+ An OrchardZSA note differs from an Orchard note 17 by additionally including the Asset Base,
\(\mathsf{AssetBase}\!\)
- . So a ZSA note is a tuple
- \((\mathsf{g_d}, \mathsf{pk_d}, \mathsf{v}, \text{ρ}, \text{ψ}, \mathsf{AssetBase})\!\)
+ . So an OrchardZSA note is a tuple
+ \((\mathsf{d}, \mathsf{pk_d}, \mathsf{v}, \mathsf{AssetBase}, \text{ρ}, \text{ψ}, \mathsf{rcm})\!\)
, where Note that the above assumes a canonical encoding, which is true for the Pallas group, but may not hold for future shielded protocols. Let
+ \(\mathsf{Note^{OrchardZSA}}\)
+ be the type of a OrchardZSA note, i.e. where
+ \(\mathbb{P}^*\)
+ is the Pallas group excluding the identity element, and the other types are as defined in §3.2 of the protocol specification 17. Non-normative note: The type and definition of the OrchardZSA note reflect that it is a tuple of all the components of an Orchard note, with the addition of the Asset Base into the tuple. We define the note commitment scheme
\(\mathsf{NoteCommit^{OrchardZSA}_{rcm}}\)
as follows: where
\(\mathbb{P}, \ell_{\mathbb{P}}, q_{\mathbb{P}}\)
- are as defined for the Pallas curve 27, and where
+ are as defined for the Pallas curve 29, and where
\(\mathsf{NoteCommit^{Orchard}.\{Trapdoor, Output\}}\)
- are as defined in the Zcash protocol specification 17. This note commitment scheme is instantiated using the Sinsemilla Commitment 26 as follows:Specification
Asset Identifiers
- Note Structure & Commitment
-
The nullifier is generated in the same manner as in the Orchard protocol 20.
-The ZSA note plaintext also includes the Asset Base in addition to the components in the Orchard note plaintext 28. It consists of
+ is as defined in §5.1 24 of the Zcash protocol specification. +The nullifier is generated in the same manner as in the Orchard protocol 22.
+The OrchardZSA note plaintext also includes the Asset Base in addition to the components in the Orchard note plaintext 30. It consists of
In the ZSA protocol, the instance of the note commitment scheme, +
In the OrchardZSA protocol, the instance of the note commitment scheme, \(\mathsf{NoteCommit^{OrchardZSA}_{rcm}}\!\) , differs from the Orchard note commitment \(\mathsf{NoteCommit^{Orchard}_{rcm}}\) - in that for Custom Assets, the Asset Base will be added as an input to the commitment computation. In the case where the Asset is the ZEC Asset, the commitment is computed identically to the Orchard note commitment, without making use of the ZEC Asset Base as an input. As we will see, the nested structure of the Sinsemilla-based commitment 26 allows us to add the Asset Base as a final recursive step.
-The note commitment output is still indistinguishable from the original Orchard ZEC note commitments, by definition of the Sinsemilla hash function 24. ZSA note commitments will therefore be added to the same Orchard Note Commitment Tree. In essence, we have:
+ in that for Custom Assets, the Asset Base will be added as an input to the commitment computation. In the case where the Asset is the ZEC Asset, the commitment is computed identically to the Orchard note commitment, without making use of the ZEC Asset Base as an input. As we will see, the nested structure of the Sinsemilla-based commitment 28 allows us to add the Asset Base as a final recursive step. +The note commitment output is still indistinguishable from the original Orchard ZEC note commitments, by definition of the Sinsemilla hash function 26. OrchardZSA note commitments will therefore be added to the same Orchard Note Commitment Tree. In essence, we have:
This definition can be viewed as a generalization of the Orchard note commitment, and will allow maintaining a single commitment instance for the note commitment, which will be used both for pre-ZSA Orchard and ZSA notes.
+This definition can be viewed as a generalization of the Orchard note commitment, and will allow maintaining a single commitment instance for the note commitment, which will be used both for pre-ZSA Orchard and OrchardZSA notes.
In the case of the Orchard-based ZSA protocol, the value of different Asset Identifiers in a given transaction will be committed using a different value base point. The value commitment becomes:
+In the case of the OrchardZSA protocol, the value of different Asset Identifiers in a given transaction will be committed using a different value base point. The value commitment becomes:
where \(\mathsf{v^{net}_{AssetId}} = \mathsf{v^{old}_{AssetId}} - \mathsf{v^{new}_{AssetId}}\) @@ -187,20 +191,20 @@ respectively,
For ZEC, we define \(\mathsf{AssetBase}_{\mathsf{AssetId}} := \mathcal{V}^{\mathsf{Orchard}}\) - so that the value commitment for ZEC notes is computed identically to the Orchard protocol deployed in NU5 4. As such + so that the value commitment for ZEC notes is computed identically to the Orchard protocol deployed in NU5 4. As such \(\mathsf{ValueCommit^{Orchard}_{rcv}}(\mathsf{v})\) - as defined in 4 is used as + as defined in 4 is used as \(\mathsf{ValueCommit^{OrchardZSA}_{rcv}}(\mathcal{V}^{\mathsf{Orchard}}, \mathsf{v})\) here.
The Orchard Protocol uses a Homomorphic Pedersen Commitment 25 to perform the value commitment, with fixed base points +
The Orchard Protocol uses a Homomorphic Pedersen Commitment 27 to perform the value commitment, with fixed base points \(\mathcal{V}^{\mathsf{Orchard}}\) and \(\mathcal{R}^{\mathsf{Orchard}}\) @@ -209,8 +213,8 @@
The burn mechanism is a transparent extension to the transfer protocol that enables a specific amount of any Custom Asset to be "destroyed" by the holder. The burn mechanism does NOT send Assets to a non-spendable address, it simply reduces the total number of units of a given Custom Asset in circulation. It is enforced at the consensus level, by using an extension of the value balance mechanism used for ZEC Assets. Burning makes it globally provable that a given amount of a Custom Asset has been destroyed. Note that the OrchardZSA Protocol does not allow for the burning of ZEC (or TAZ).
-In the Orchard-ZSA Transaction Structure, there is now an +
The burn mechanism is a transparent extension to the transfer protocol that enables a specific amount of any Custom Asset to be "destroyed" by the holder. The burn mechanism does NOT send Assets to a non-spendable address, it simply reduces the total number of units of a given Custom Asset in circulation. It is enforced at the consensus level, by using an extension of the value balance mechanism used for ZEC Assets. Burning makes it globally provable that a given amount of a Custom Asset has been destroyed. Note that the OrchardZSA Protocol does not allow for the burning of the Native Asset (i.e. ZEC or TAZ).
+In the OrchardZSA Transaction Structure, there is now an \(\mathsf{assetBurn}\) set. For every Custom Asset (represented by its \(\mathsf{AssetBase}\!\) @@ -226,41 +230,28 @@ \(\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. This ensures that the values are all balanced out on a per-Asset basis in the transaction.
-If all these checks pass, then for every - \((\mathsf{AssetBase}, \mathsf{v}) \in \mathsf{assetBurn}\!\) - , reduce the value of - \(\mathsf{issued\_assets(AssetBase).balance}\) - in the global state by - \(\mathsf{v}\!\) - .
-Note: Even if this mechanism allows having transparent ↔ shielded Asset transfers in theory, 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.
+The other consensus rule changes for the OrchardZSA protocol are specified in ZIP 227 8.
+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.
In order to verify the balance of the different Assets, the verifier MUST perform a similar process as for the Orchard protocol 19, with the addition of the burn information.
+In order to verify the balance of the different Assets, the verifier MUST perform a similar process as for the Orchard protocol 21, with the addition of the burn information.
For a total of \(n\) Actions in a transfer, the prover MUST still sign the SIGHASH transaction hash using the binding signature key @@ -283,7 +274,7 @@ the set of indices of Actions that are related to Custom Assets.
The right hand side of the value balance verification equation can be expanded to:
This equation contains the balance check of the Orchard protocol 19. With ZSA, transfer Actions for Custom Assets must also be balanced across Asset Bases. All Custom Assets are contained within the shielded pool, and cannot be unshielded via a regular transfer. Custom Assets can be burnt, the mechanism for which reveals the amount and identifier of the Asset being burnt, within the +
This equation contains the balance check of the Orchard protocol 21. With ZSA, transfer Actions for Custom Assets must also be balanced across Asset Bases. All Custom Assets are contained within the shielded pool, and cannot be unshielded via a regular transfer. Custom Assets can be burnt, the mechanism for which reveals the amount and identifier of the Asset being burnt, within the \(\mathsf{assetBurn}\) set. As such, for a correctly constructed transaction, we will get \(\sum_{j \in S_{\mathsf{CA}}} \mathsf{cv}^{\mathsf{net}}_j - \sum_{(\mathsf{AssetBase}, \mathsf{v}) \in \mathsf{assetBurn}} [\mathsf{v}]\,\mathsf{AssetBase} = \sum_{j \in S_{\mathsf{CA}}} [\mathsf{rcv}^{\mathsf{net}}_j]\,\mathcal{R}^{\mathsf{Orchard}}\!\) @@ -332,21 +323,21 @@ \(\mathbb{F}_{q_{\mathbb{P}}}\!\) , \(\mathcal{K}^{\mathsf{Orchard}}\) - is the Orchard Nullifier Base as defined in 20, and + is the Orchard Nullifier Base as defined in 22, and \(\mathcal{L}^{\mathsf{Orchard}} := \mathsf{GroupHash^{\mathbb{P}}}(\texttt{“z.cash:Orchard”}, \texttt{“L”})\!\) .
In the Orchard protocol, since each Action represents an input and an output, the transaction that wants to send one input to multiple outputs must have multiple inputs. The Orchard protocol gives dummy spend notes 18 to the Actions that have not been assigned input notes.
-The Orchard technique requires modification for the ZSA protocol with multiple Asset Identifiers, as the output note of the split Actions cannot contain just any Asset Base. We must enforce it to be an actual output of a GroupHash computation (in fact, we want it to be of the same Asset Base as the original input note, but the binding signature takes care that the proper balancing is performed). Without this enforcement the prover could input a multiple (or linear combination) of an existing Asset Base, and thereby attack the network by overflowing the ZEC value balance and hence counterfeiting ZEC funds.
-Therefore, for Custom Assets we enforce that every input note to an ZSA Action must be proven to exist in the set of note commitments in the note commitment tree. We then enforce this real note to be “unspendable” in the sense that its value will be zeroed in split Actions and the nullifier will be randomized, making the note not spendable in the specific Action. Then, the proof itself ensures that the output note is of the same Asset Base as the input note. In the circuit, the split note functionality will be activated by a boolean private input to the proof (aka the +
In the Orchard protocol, since each Action represents an input and an output, the transaction that wants to send one input to multiple outputs must have multiple inputs. The Orchard protocol gives dummy spend notes 20 to the Actions that have not been assigned input notes.
+The Orchard technique requires modification for the OrchardZSA protocol with multiple Asset Identifiers, as the output note of the split Actions cannot contain just any Asset Base. We must enforce it to be an actual output of a GroupHash computation (in fact, we want it to be of the same Asset Base as the original input note, but the binding signature takes care that the proper balancing is performed). Without this enforcement the prover could input a multiple (or linear combination) of an existing Asset Base, and thereby attack the network by overflowing the ZEC value balance and hence counterfeiting ZEC funds.
+Therefore, for Custom Assets we enforce that every input note to an OrchardZSA Action must be proven to exist in the set of note commitments in the note commitment tree. We then enforce this real note to be “unspendable” in the sense that its value will be zeroed in split Actions and the nullifier will be randomized, making the note not spendable in the specific Action. Then, the proof itself ensures that the output note is of the same Asset Base as the input note. In the circuit, the split note functionality will be activated by a boolean private input to the proof (aka the \(\mathsf{split\_flag}\) boolean). This ensures that the value base points of all output notes of a transfer are actual outputs of a GroupHash, as they originate in the Issuance protocol which is publicly verified.
Note that the Orchard dummy note functionality remains in use for ZEC notes, and the Split Input technique is used in order to support Custom Assets.
Every ZSA Action statement is closely similar to the Orchard Action statement 21, except for a few additions that ensure the security of the Asset Identifier system. We detail these changes below.
-All modifications in the Circuit are detailed in 32.
+Every OrchardZSA Action statement is closely similar to the Orchard Action statement 23, except for a few additions that ensure the security of the Asset Identifier system. We detail these changes below.
+All modifications in the Circuit are detailed in 34.
The following constraints must be added to ensure that the input and output note are of the same \(\mathsf{AssetBase}\!\) @@ -355,12 +346,12 @@
The input note in the old note commitment integrity check must either include an Asset Base (ZSA note) or not (pre-ZSA Orchard note). If the note is a pre-ZSA Orchard note, the note commitment is computed in the original Orchard fashion 17. If the note is a ZSA note, the note commitment is computed as defined in the Note Structure & Commitment section.
+The input note in the old note commitment integrity check must either include an Asset Base (OrchardZSA note) or not (pre-ZSA Orchard note). If the note is a pre-ZSA Orchard note, the note commitment is computed in the original Orchard fashion 19. If the note is an OrchardZSA note, the note commitment is computed as defined in the Note Structure & Commitment section.
The transaction format for v6 transactions is described in ZIP 230 11.
+The transaction format for v6 transactions is described in ZIP 230 12.
The transaction digest algorithm defined in ZIP 244 12 is modified by the ZSA protocol to add a new branch for issuance information, along with modifications within the orchard_digest
to account for the inclusion of the Asset Base. The details of these changes are described in this section, and highlighted using the [UPDATED FOR ZSA]
or [ADDED FOR ZSA]
text label. We omit the details of the sections that do not change for the ZSA protocol.
The transaction digest algorithm defined in ZIP 244 14 is modified by the OrchardZSA protocol to add a new branch for issuance information, along with modifications within the orchard_digest
to account for the inclusion of the Asset Base. The details of these changes are described in this section, and highlighted using the [UPDATED FOR ZSA]
or [ADDED FOR ZSA]
text label. We omit the details of the sections that do not change for the OrchardZSA protocol.
A BLAKE2b-256 hash of the following values
+A BLAKE2b-256 hash of the following values:
T.1: header_digest (32-byte hash output) T.2: transparent_digest (32-byte hash output) T.3: sapling_digest (32-byte hash output) T.4: orchard_digest (32-byte hash output) [UPDATED FOR ZSA] T.5: issuance_digest (32-byte hash output) [ADDED FOR ZSA]-
The personalization field remains the same as in ZIP 244 12.
+The personalization field remains the same as in ZIP 244 14.
When Orchard Actions are present in the transaction, this digest is a BLAKE2b-256 hash of the following values
-T.4a: orchard_actions_compact_digest (32-byte hash output) [UPDATED FOR ZSA] -T.4b: orchard_actions_memos_digest (32-byte hash output) [UPDATED FOR ZSA] -T.4c: orchard_actions_noncompact_digest (32-byte hash output) [UPDATED FOR ZSA] -T.4d: orchard_zsa_burn_digest (32-byte hash output) [ADDED FOR ZSA] -T.4e: flagsOrchard (1 byte) -T.4f: valueBalanceOrchard (64-bit signed little-endian) -T.4g: anchorOrchard (32 bytes)-
A BLAKE2b-256 hash of the subset of Orchard Action information intended to be included in an updated version of the ZIP-307 13 CompactBlock
format for all Orchard Actions belonging to the transaction. For each Action, the following elements are included in the hash:
T.4a.i : nullifier (field encoding bytes) -T.4a.ii : cmx (field encoding bytes) -T.4a.iii: ephemeralKey (field encoding bytes) -T.4a.iv : encCiphertext[..84] (First 84 bytes of field encoding) [UPDATED FOR ZSA]-
The personalization field of this hash is the same as in ZIP 244:
-"ZTxIdOrcActCHash"-
A BLAKE2b-256 hash of the subset of Orchard shielded memo field data for all Orchard Actions belonging to the transaction. For each Action, the following elements are included in the hash:
-T.4b.i: encCiphertext[84..596] (contents of the encrypted memo field) [UPDATED FOR ZSA]-
The personalization field of this hash remains identical to ZIP 244:
-"ZTxIdOrcActMHash"-
A BLAKE2b-256 hash of the remaining subset of Orchard Action information not intended for inclusion in an updated version of the the ZIP 307 13 CompactBlock
format, for all Orchard Actions belonging to the transaction. For each Action, the following elements are included in the hash:
T.4d.i : cv (field encoding bytes) -T.4d.ii : rk (field encoding bytes) -T.4d.iii: encCiphertext[596..] (post-memo suffix of field encoding) [UPDATED FOR ZSA] -T.4d.iv : outCiphertext (field encoding bytes)-
The personalization field of this hash is defined identically to ZIP 244:
-"ZTxIdOrcActNHash"+
When OrchardZSA Actions Groups are present in the transaction, this digest is a BLAKE2b-256 hash of the following values:
+T.4a: orchard_action_groups_digest (32-byte hash output) [ADDED FOR ZSA] +T.4b: orchard_zsa_burn_digest (32-byte hash output) [ADDED FOR ZSA] +T.4c: valueBalanceOrchard (64-bit signed little-endian)+
The personalization field of this hash is the same as in ZIP 244 14
+"ZTxIdOrchardHash"+
In the case that the transaction has no OrchardZSA Action Groups, orchard_digest
is
BLAKE2b-256("ZTxIdOrchardHash", [])+
A BLAKE2b-256 hash of the subset of OrchardZSA Action Groups information for all OrchardZSA Action Groups belonging to the transaction. For each Action Group, the following elements are included in the hash:
+T.4a.i : orchard_actions_compact_digest (32-byte hash output) +T.4a.ii : orchard_actions_memos_digest (32-byte hash output) +T.4a.iii: orchard_actions_noncompact_digest (32-byte hash output) +T.4a.iv : flagsOrchard (1 byte) +T.4a.v : anchorOrchard (32 bytes) +T.4a.vi : nAGExpiryHeight (4 bytes)+
The personalization field of this hash is set to:
+"ZTxIdOrcActGHash"+
A BLAKE2b-256 hash of the subset of OrchardZSA Action information intended to be included in an updated version of the ZIP-307 16 CompactBlock
format for all OrchardZSA Actions belonging to the Action Group. For each Action, the following elements are included in the hash:
T.4a.i.1 : nullifier (field encoding bytes) +T.4a.i.2 : cmx (field encoding bytes) +T.4a.i.3 : ephemeralKey (field encoding bytes) +T.4a.i.4 : encCiphertext[..84] (First 84 bytes of field encoding) [UPDATED FOR ZSA]+
The personalization field of this hash is the same as in ZIP 244:
+"ZTxIdOrcActCHash"+
A BLAKE2b-256 hash of the subset of Orchard shielded memo field data for all OrchardZSA Actions belonging to the Action Group. For each Action, the following elements are included in the hash:
+T.4a.ii.1: encCiphertext[84..596] (contents of the encrypted memo field) [UPDATED FOR ZSA]+
The personalization field of this hash remains identical to ZIP 244:
+"ZTxIdOrcActMHash"+
A BLAKE2b-256 hash of the remaining subset of OrchardZSA Action information not intended for inclusion in an updated version of the the ZIP 307 16 CompactBlock
format, for all OrchardZSA Actions belonging to the Action Group. For each Action, the following elements are included in the hash:
T.4a.iii.1 : cv (field encoding bytes) +T.4a.iii.2 : rk (field encoding bytes) +T.4a.iii.3 : encCiphertext[596..] (post-memo suffix of field encoding) [UPDATED FOR ZSA] +T.4a.iii.4 : outCiphertext (field encoding bytes)+
The personalization field of this hash is defined identically to ZIP 244:
+"ZTxIdOrcActNHash"+
A BLAKE2b-256 hash of the data from the burn fields of the transaction. For each tuple in the \(\mathsf{assetBurn}\) set, the following elements are included in the hash:
-T.4d.i : assetBase (field encoding bytes) -T.4d.ii: valueBurn (field encoding bytes)+
T.4b.i : assetBase (field encoding bytes) +T.4b.ii: valueBurn (field encoding bytes)
The personalization field of this hash is set to:
"ZTxIdOrcBurnHash"
In case the transaction does not perform the burning of any Assets (i.e. the \(\mathsf{assetBurn}\) set is empty), the ''orchard_zsa_burn_digest'' is:
BLAKE2b-256("ZTxIdOrcBurnHash", [])-
The Asset Base being burnt encoded as the 32-byte representation of a point on the Pallas curve.
Value of the Asset Base being burnt encoded as little-endian 8-byte representation of 64-bit unsigned integer (e.g. u64 in Rust) raw value.
The details of the computation of this value are in ZIP 227 8.
+The details of the computation of this value are in ZIP 227 9.
The details of the changes to these algorithms are in ZIP 227 9 10.
+The details of the changes to this algorithm are in ZIP 227 10.
+The transaction digest algorithm defined in ZIP 244 15 which commits to the authorizing data of a transaction is modified by the OrchardZSA protocol to have the structure specified in this section. There is a new branch added for issuance information, along with modifications within the orchard_auth_digest
to account for the presence of Action Groups.
We highlight the changes for the OrchardZSA protocol via the [UPDATED FOR ZSA]
or [ADDED FOR ZSA]
text label, and we omit the descriptions of the sections that do not change for the OrchardZSA protocol:
auth_digest +├── transparent_scripts_digest +├── sapling_auth_digest +├── orchard_auth_digest [UPDATED FOR ZSA] +└── issuance_auth_digest [ADDED FOR ZSA]+
The pair (Transaction Identifier, Auth Commitment) constitutes a commitment to all the data of a serialized transaction that may be included in a block.
+A BLAKE2b-256 hash of the following values
+A.1: transparent_scripts_digest (32-byte hash output) +A.2: sapling_auth_digest (32-byte hash output) +A.3: orchard_auth_digest (32-byte hash output) [UPDATED FOR ZSA] +A.4: issuance_auth_digest (32-byte hash output) [ADDED FOR ZSA]+
The personalization field of this hash remains the same as in ZIP 244.
+In the case that OrchardZSA Action Groups are present, this is a BLAKE2b-256 hash of the following values:
+A.3a: orchard_action_groups_auth_digest (32-byte hash output) [ADDED FOR ZSA] +A.3b: bindingSigOrchard (field encoding bytes)+
The personalization field of this hash is the same as in ZIP 244, that is:
+"ZTxAuthOrchaHash"+
In case that the transaction has no OrchardZSA Action Groups, orchard_auth_digest
is:
BLAKE2b-256("ZTxAuthOrchaHash", [])+
This is a BLAKE2b-256 hash of the proofsOrchard
and spendAuthSigsOrchard
fields of all OrchardZSA Action Groups belonging to the transaction:
A.3a.i: proofsOrchard (field encoding bytes) +A.3a.ii: spendAuthSigsOrchard (field encoding bytes)+
The personalization field of this hash is set to:
+"ZTxAuthOrcAGHash"+
The details of the computation of this value are in ZIP 227 11.
+The fee mechanism for the upgrades proposed in this ZIP will follow the mechanism described in ZIP 317 for the ZSA protocol upgrade 14.
+The fee mechanism for the upgrades proposed in this ZIP will follow the mechanism described in ZIP 317 for the OrchardZSA protocol upgrade, and are described in ZIP 230 13.
In order to have backward compatibility with the ZEC notes, we have designed the circuit to support both ZEC and ZSA notes. As we specify above, there are three main reasons we can do this:
+In order to have backward compatibility with the ZEC notes, we have designed the circuit to support both ZEC and OrchardZSA notes. As we specify above, there are three main reasons we can do this:
The Zcash Shielded Assets protocol will be deployed in a subsequent Network Upgrade.
+The Zcash Shielded Assets protocol is scheduled to be deployed in Network Upgrade 7 (NU7).
8 | +ZIP 227: Issuance of Zcash Shielded Assets: Specification: Consensus Rule Changes | +
---|
9 | ZIP 227: Issuance of Zcash Shielded Assets: TxId Digest - Issuance |
---|
9 | +10 | ZIP 227: Issuance of Zcash Shielded Assets: Signature Digest |
---|
10 | -ZIP 227: Issuance of Zcash Shielded Assets: Authorizing Data Commitment | +11 | +ZIP 227: Issuance of Zcash Shielded Assets: Authorizing Data Commitment |
---|
11 | +12 | ZIP 230: Version 6 Transaction Format |
---|
13 | +ZIP 230: Version 6 Transaction Format: OrchardZSA Fee Calculation | +
---|
12 | +14 | ZIP 244: Transaction Identifier Non-Malleability |
---|
13 | -ZIP 307: Light Client Protocol for Payment Detection | +15 | +ZIP 244: Transaction Identifier Non-Malleability: Authorizing Data Commitment |
---|
14 | -ZIP 317: Proportional Transfer Fee Mechanism - Pull Request #667 for ZSA Protocol ZIPs | +16 | +ZIP 307: Light Client Protocol for Payment Detection |
---|
15 | +17 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 3.2: Notes |
---|
16 | +18 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 3.7: Action Transfers and their Descriptions |
---|
17 | +19 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 4.1.8: Commitment |
---|
18 | +20 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 4.8.3: Dummy Notes (Orchard) |
---|
19 | +21 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 4.14: Balance and Binding Signature (Orchard) |
---|
20 | +22 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 4.16: Computing ρ values and Nullifiers |
---|
21 | +23 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 4.18.4: Action Statement (Orchard) |
---|
22 | +24 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 5.1: Integers, Bit Sequences, and Endianness |
---|
23 | +25 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 5.3: Constants |
---|
24 | +26 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 5.4.1.9: Sinsemilla hash function |
---|
25 | +27 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 5.4.8.3: Homomorphic Pedersen commitments (Sapling and Orchard) |
---|
26 | +28 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 5.4.8.4: Sinsemilla commitments |
---|
27 | +29 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 5.4.9.6: Pallas and Vesta |
---|
28 | +30 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 5.5: Encodings of Note Plaintexts and Memo Fields |
---|
29 | +31 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 7.5: Action Description Encoding and Consensus |
---|
30 | +32 | User-Defined Assets and Wrapped Assets |
---|
31 | +33 | Comment on Generalized Value Commitments |
---|
32 | -Modifications to the Orchard circuit for the ZSA Protocol | +34 | +Modifications to the Orchard circuit for the OrchardZSA Protocol |
---|
The terms "Orchard" and "Action" in this document are to be interpreted as described in ZIP 224 9.
We define the following additional terms:
This ZIP (ZIP 227) proposes the Zcash Shielded Assets (ZSA) protocol, in conjunction with ZIP 226 10. This protocol is an extension of the Orchard protocol that enables the creation, transfer and burn of Custom Assets on the Zcash chain. The creation of such Assets is defined in this ZIP (ZIP 227), while the transfer and burn of such Assets is defined in ZIP 226 10. This ZIP must only be implemented in conjunction with ZIP 226 10. The proposed issuance mechanism is only valid for the Orchard-ZSA transfer protocol, because it produces notes that can only be transferred under ZSA.
+This ZIP (ZIP 227) proposes the Orchard Zcash Shielded Assets (OrchardZSA) protocol, in conjunction with ZIP 226 10. This protocol is an extension of the Orchard protocol that enables the creation, transfer and burn of Custom Assets on the Zcash chain. The creation of such Assets is defined in this ZIP (ZIP 227), while the transfer and burn of such Assets is defined in ZIP 226 10. This ZIP must only be implemented in conjunction with ZIP 226 10. The proposed issuance mechanism is only valid for the OrchardZSA transfer protocol, because it produces notes that can only be transferred via this protocol.
This ZIP introduces the issuance mechanism for Custom Assets on the Zcash chain. While originally part of a single ZSA ZIP, the issuance mechanism turned out to be substantial enough to stand on its own and justify the creation of this supporting ZIP for ZIP 226 10.
@@ -75,7 +75,7 @@The Orchard-ZSA Protocol adds the following keys to the key components 20 21:
+The OrchardZSA Protocol adds the following keys to the key components 25 27:
The relations between these keys are shown in the following diagram:
We instantiate the issuance authorization signature scheme \(\mathsf{IssueAuthSig}\) - as a BIP-340 Schnorr signature over the secp256k1 curve. The signing and validation algorithms, signature encoding, and public key encoding MUST follow BIP 340 18.
+ as a BIP-340 Schnorr signature over the secp256k1 curve. The signing and validation algorithms, signature encoding, and public key encoding MUST follow BIP 340 23.Batch verification MAY be used. Precomputation MAY be used if and only if it produces equivalent results; for example, for a given verification key \(pk\) and @@ -122,7 +122,7 @@ \(k\) bytes, and \(\mathbb{B}^{\mathbb{Y}^{[\mathbb{N}]}}\) - denotes the type of byte sequences of arbitrary length, as defined in the Zcash protocol specification 19.
+ denotes the type of byte sequences of arbitrary length, as defined in the Zcash protocol specification 24.The issuance authorizing key generation algorithm and the issuance validating key derivation algorithm are defined in the Issuance Key Derivation section, while the corresponding signing and validation algorithms are defined in the Issuance Authorization Signing and Validation section.
where the \(\textit{PubKey}\) - algorithm is defined in BIP 340 18. Note that the byte representation of + algorithm is defined in BIP 340 23. Note that the byte representation of \(\mathsf{ik}\) is in big-endian order as defined in BIP 340.
It is possible for the @@ -240,7 +240,7 @@ \(\mathsf{Sign}\) algorithm is defined in BIP 340 and \(a\) - denotes the auxiliary data used in BIP 340 18. Note that + denotes the auxiliary data used in BIP 340 23. Note that \(\mathsf{IssueAuthSig.Sign}\) could return \(\bot\) @@ -264,11 +264,11 @@
where the \(\mathsf{Verify}\) - algorithm is defined in BIP 340 18.
+ algorithm is defined in BIP 340 23.For every new Asset, there must be a new and unique Asset Identifier, denoted
+ For every new Asset, there MUST be a new and unique Asset Identifier, denoted
\(\mathsf{AssetId}\!\)
. We define this to be a globally unique pair
\(\mathsf{AssetId} := (\mathsf{ik}, \mathsf{asset\_desc})\!\)
@@ -277,7 +277,7 @@
is the issuance key and
\(\mathsf{asset\_desc}\)
is a byte string. A given Asset Identifier is used across all Zcash protocols that support ZSAs -- that is, the Orchard-ZSA protocol and potentially future Zcash shielded protocols. For this Asset Identifier, we derive an Asset Digest,
+ A given Asset Identifier is used across all Zcash protocols that support ZSAs -- that is, the OrchardZSA protocol and potentially future Zcash shielded protocols. For this Asset Identifier, we derive an Asset Digest,
\(\mathsf{AssetDigest}\!\)
, which is simply is a
\(\textsf{BLAKE2b-512}\)
@@ -291,9 +291,9 @@
\(\mathsf{ik}\)
be the issuance validating key of the issuer, a public key used to verify the signature on the issuance transaction's SIGHASH.
- Define
- \(\mathsf{AssetDigest_{AssetId}} := \textsf{BLAKE2b-512}(\texttt{“ZSA-Asset-Digest”},\; \mathsf{EncodeAssetId}(\mathsf{AssetId}))\!\)
- , where Define where Define
- \(\mathsf{AssetBase_{AssetId}} := \mathsf{ZSAValueBase}(\mathsf{AssetDigest_{AssetId}})\)
- In the case of the Orchard-ZSA protocol, we define
- \(\mathsf{ZSAValueBase}(\mathsf{AssetDigest_{AssetId}}) := \mathsf{GroupHash}^\mathbb{P}(\texttt{“z.cash:OrchardZSA”}, \mathsf{AssetDigest_{AssetId}})\)
- where
+ Define In the case of the OrchardZSA protocol, we define where
\(\mathsf{GroupHash}^\mathbb{P}\)
- is defined as in 22.Specification: Asset Identifier, Asset Digest, and Asset Base
+
-
The relations between the Asset Identifier, Asset Digest, and Asset Base are shown in the following diagram:
Note: To keep notations light and concise, we may omit \(\mathsf{AssetId}\) @@ -328,137 +327,63 @@
Issuance requires the following additions to the global state defined at block boundaries:
-A map, - \(\mathsf{issued\_assets}\!\) - , from the Asset Base, - \(\mathsf{AssetBase}\!\) - , to a tuple - \((\mathsf{balance}, \mathsf{final})\!\) - , for every Asset that has been issued up until the block boundary. For each Asset:
-We use the notation - \(\mathsf{issued\_assets}(\mathsf{AssetBase}).\!\mathsf{balance}\) - and - \(\mathsf{issued\_assets}(\mathsf{AssetBase}).\!\mathsf{final}\) - to access, respectively, the balance and finalization status of the Asset stored in the global state.
-It is necessary to ensure that the balance of any issued Custom Asset never becomes negative within a shielded pool, along the lines of ZIP 209 8. However, unlike for the shielded ZEC pools, there is no individual transaction field that directly corresponds to both the issued and burnt amounts for a given Asset. Therefore, we require that all nodes maintain a record of the current amount in circulation for every issued Custom Asset, and update this record at the block boundary based on the issuance and burn transactions within the block. This allows for efficient detection of balance violations for any Asset, in which scenario we specify a consensus rule to reject the block.
-Nodes also need to ensure the rejection of blocks in which issuance of Custom Assets that have been previously finalized. The - \(\mathsf{issued\_assets}\) - map allows nodes to store whether or not a given Asset has been finalized.
+Let + \(\ell_{\mathsf{value}}\) + be as defined in §5.3 of the protocol specification 29. An Issue Note represents that a value + \(\mathsf{v} : \{0 .. 2^{\ell_{\mathsf{value}}} - 1\}\) + of a specific Custom Asset is issued to a recipient. An Issue Note is a tuple + \((\mathsf{d}, \mathsf{pk_d}, \mathsf{v}, \mathsf{AssetBase}, \text{ρ}, \mathsf{rseed})\!\) + , where:
+The complete encoding of these fields into an IssueNote
is defined in ZIP 230 16.
Let + \(\mathsf{Note^{Issue}}\) + be the type of an Issue Note, i.e.
+The note commitments of Issue Notes are computed in the same manner as for OrchardZSA Notes. They will be added to the note commitment tree as any other shielded note when the transaction issuing the Asset is included on chain. This prevents future usage of the note from being linked to the issuance transaction, as the nullifier key is not known to the validators and chain observers.
An issuance action, IssueAction
, is the instance of issuing a specific Custom Asset, and contains the following fields:
assetDescSize
: the size of the Asset description, a number between
\(0\)
and
\(512\!\)
- , stored in two bytes.asset_desc
: the Asset description, a byte string of up to 512 bytes as defined in the Specification: Asset Identifier section.vNotes
: an array of Note
containing the unencrypted output notes of the recipients of the Asset.asset_desc
: the Asset description, a byte string of up to 512 bytes as defined in the Specification: Asset Identifier, Asset Digest, and Asset Base section.vNotes
: an array of Issue Notes containing the unencrypted output notes to the recipients of the Asset.flagsIssuance
: a byte that stores the
\(\mathsf{finalize}\)
boolean that defines whether the issuance of that specific Custom Asset is finalized or not.An asset's - \(\mathsf{AssetDigest}\) - is added to the - \(\mathsf{previously\_finalized}\) - set after a block that contains any issuance transaction for that asset with - \(\mathsf{finalize} = 1\!\) - . It then cannot be removed from this set. For Assets with - \(\mathsf{AssetDigest} \in \mathsf{previously\_finalized}\!\) - , no further tokens can be issued, so as seen below, the validators will reject the transaction. For Assets with - \(\mathsf{AssetDigest} \not\in \mathsf{previously\_finalized}\!\) - , new issuance actions can be issued in future transactions. These must use the same Asset description, - \(\mathsf{asset\_desc}\!\) - , and can either maintain - \(\mathsf{finalize} = 0\) - or change it to - \(\mathsf{finalize} = 1\!\) - , denoting that this Custom Asset cannot be issued after the containing block.
-Bytes | -Name | -Data Type | -Description | -
---|---|---|---|
2 |
- assetDescSize |
- byte |
- The length of the asset_desc string in bytes. |
-
assetDescSize |
- asset_desc |
- byte[assetDescSize] |
- A byte sequence of length assetDescSize bytes which SHOULD be a well-formed UTF-8 code unit sequence according to Unicode 15.0.0 or later. |
-
varies |
- nNotes |
- compactSize |
- The number of notes in the issuance action. | -
noteSize * nNotes |
- vNotes |
- Note[nNotes] |
- A sequence of note descriptions within the issuance action, where noteSize is the size, in bytes, of a Note. |
-
1 |
- flagsIssuance |
- byte |
-
-
|
-
We note that the output note commitment of the recipient's notes are not included in the actual transaction, but when added to the global state of the chain, they will be added to the note commitment tree as a shielded note. This prevents future usage of the note from being linked to the issuance transaction, as the nullifier key is not known to the validators and chain observers.
+The + \(\mathsf{finalize}\) + boolean is set by the Issuer to signal that there will be no further issuance of the specific Custom Asset. As we will see in Specification: Consensus Rule Changes, transactions that attempt to issue further amounts of a Custom Asset that has previously been finalized will be rejected.
+The complete encoding of these fields into an IssueAction
is defined in ZIP 230 15.
An issuance bundle, IssueBundle
, is the aggregate of all the issuance-related information. Specifically, contains all the issuance actions and the issuer signature on the transaction SIGHASH that validates the issuance itself. It contains the following fields:
An issuance bundle is the aggregate of all the issuance-related information. Specifically, contains all the issuance actions and the issuer signature on the transaction SIGHASH that validates the issuance itself. It contains the following fields:
The issuance bundle is then added within the transaction format as a new bundle. That is, issuance requires the addition of the following information to the transaction format 24.
-Bytes | -Name | -Data Type | -Description | -
---|---|---|---|
varies |
- nIssueActions |
- compactSize |
- The number of issuance actions in the bundle. | -
IssueActionSize * nIssueActions |
- vIssueActions |
- IssueAction[nIssueActions] |
- A sequence of issuance action descriptions, where IssueActionSize is the size, in bytes, of an IssueAction description. | -
32 |
- ik |
- byte[32] |
- The issuance validating key of the issuer, used to validate the signature. | -
64 |
- issueAuthSig |
- byte[64] |
- The signature of the transaction SIGHASH, signed by the issuer, validated as in Issuance Authorization Signature Scheme. | -
The issuance bundle is added within the transaction format as a new bundle. The detailed encoding of the issuance bundle as a part of the V6 transaction format is defined in ZIP 230 17.
+We define a function + \(\mathsf{DeriveIssuedRho} : \mathbb{F}_{q_{\mathbb{P}}} \times \{0 .. 2^{32} - 1\} \times \{0 .. 2^{32} - 1\} \to \mathbb{F}_{q_{\mathbb{P}}}\) + as follows:
+where
+The + \(\text{ρ}\) + field of an Issue Note is computed as
+where + \(\mathsf{nf}_{1,1}\) + is the nullifier of the first Note in the first Action of the OrchardZSA Bundle of the transaction, + \(\mathsf{index_{Action}}\) + is the index of the Issuance Action in the Issuance Bundle, and + \(\mathsf{index_{Note}}\) + is the index of the Issue Note in the Issuance Action.
The issuer program performs the following operations:
@@ -523,12 +442,12 @@ \(\mathsf{ik}\) and \(\mathsf{asset\_desc}\) - as decribed in the Specification: Asset Identifier section. + as decribed in the Specification: Asset Identifier, Asset Digest, and Asset Base section.vNotes
of the IssueAction
.IssueAction
into the vector vIssueActions
of the bundle.Note: that the commitment is not included in the IssuanceAction
itself. As explained below, it is computed later by the validators and added to the note commitment tree.
A reference note for a Custom Asset MUST be included by the issuer as the first Note in the Action of the Issuance Bundle where that Custom Asset is being issued for the first time.
+A reference note for a Custom Asset is an Issue Note where the value
+ \(\mathsf{v}\)
+ is set to
+ \(0\!\)
+ , the Asset Base (
+ \(\mathsf{AssetBase}\!\)
+ ) corresponds to that of the Custom Asset, and the recipient address
+ \((\mathsf{d}, \mathsf{pk}_{\mathsf{d}})\)
+ is set to the default diversified payment address (i.e. the diversified payment address with diversifier index
+ \(0\!\)
+ ) derived from the all-zero Orchard spending key using the algorithm specified in §4.2.3 of the protocol specification 27. This corresponds to a 43 byte u8
array with the following entries:
[ + 204, 54, 96, 25, 89, 33, 59, 107, 12, 219, 150, 167, 92, 23, 195, 166, 104, 169, 127, 13, 106, + 140, 92, 225, 100, 165, 24, 234, 155, 169, 165, 14, 167, 81, 145, 253, 134, 27, 15, 241, 14, + 98, 176, +]+
The maximum total supply of any issued Custom Asset is denoted by the constant + \(\mathsf{MAX\_ISSUE} := 2^{64} - 1\!\) + . Issuance requires the following additions to the global state:
+A map, + \(\mathsf{issued\_assets} : \mathbb{P}^* \to \{0 .. \mathsf{MAX\_ISSUE}\} \times \mathbb{B} \times \mathsf{Note^{Issue}}\!\) + , from the Asset Base, + \(\mathsf{AssetBase} : \mathbb{P}^*\!\) + , to a tuple + \((\mathsf{balance}, \mathsf{final}, \mathsf{note_{ref}})\!\) + , for every Asset that has been issued. We use the notation + \(\mathsf{issued\_assets}(\mathsf{AssetBase}).\mathsf{balance}\!\) + , + \(\mathsf{issued\_assets}(\mathsf{AssetBase}).\mathsf{final}\!\) + , and + \(\mathsf{issued\_assets}(\mathsf{AssetBase}).\mathsf{note_{ref}}\) + to access, respectively, the elements of the tuple stored in the global state for a given + \(\mathsf{AssetBase}\!\) + . If + \(\mathsf{issued\_assets}(\mathsf{AssetBase}) = \bot\!\) + , it is assumed that + \(\mathsf{issued\_assets}(\mathsf{AssetBase}).\mathsf{balance} = 0\!\) + , + \(\mathsf{issued\_assets}(\mathsf{AssetBase}).\mathsf{final} = 0\!\) + , and + \(\mathsf{issued\_assets}(\mathsf{AssetBase}).\mathsf{note_{ref}} = \bot\!\) + .
+For any Asset represented by + \(\mathsf{AssetBase}\!\) + :
+The maximum total supply of any issued Custom Asset is denoted by the constant + \(\mathsf{MAX\_ISSUE} := 2^{64} - 1\!\) + .
+The issuance state, that is, the + \(\mathsf{issued\_assets}\) + map, MUST be updated by a node during the processing of any transaction that contains burn information, or an issuance bundle. The issuance state is chained as follows:
+We describe the consensus rule changes that govern the management of the global issuance state in the Specification: Consensus Rule Changes section. We use + \(\mathsf{issued\_assets}_{\mathsf{IN}}\) + and + \(\mathsf{issued\_assets}_{\mathsf{OUT}}\) + to denote the input issuance state and output issuance state for a transaction, respectively.
+For the IssueBundle
:
For every transaction:
For each IssueAction
in IssueBundle
:
IssueAction
contains the same
- \(\mathsf{AssetBase}\)
- and is properly constructed as
- \(\mathsf{note} = (\mathsf{g_d}, \mathsf{pk_d}, \mathsf{v}, \text{ρ}, \mathsf{rseed}, \mathsf{AssetBase})\!\)
+ If all of the above checks pass, do the following:
-IssueAction
MUST be a valid encoding of the
+ \(\mathsf{Note^{Issue}}\)
+ type, and MUST encode the same
+ \(\mathsf{AssetBase}\!\)
+ .IssueAction
:
+ flagsIssuance
field of IssueAction
, the node MUST set
+ \(\mathsf{issued\_assets}_{\mathsf{OUT}}(\mathsf{AssetBase}).\mathsf{final} = 1\!\)
.The following is a list of rationale for different decisions made in the proposal:
It is necessary to ensure that the balance of any issued Custom Asset never becomes negative within a shielded pool, along the lines of ZIP 209 8. However, unlike for the shielded ZEC pools, there is no individual transaction field that directly corresponds to both the issued and burnt amounts for a given Asset. Therefore, we require that all nodes maintain a record of the current amount in circulation for every issued Custom Asset, and update this record based on the issuance and burn transactions processed. This allows for efficient detection of balance violations for any Asset, in which scenario we specify a consensus rule to reject the transaction or block.
+We limit the total issuance of any Asset to a maximum of + \(\mathsf{MAX\_ISSUE}\!\) + . This is a practical limit that also allows an issuer to issue the complete supply of an Asset in a single transaction.
+Nodes also need to reject transactions that issue Custom Assets that have been previously finalized. The + \(\mathsf{issued\_assets}\) + map allows nodes to store whether or not a given Asset has been finalized.
+Asset Features
This section details the construction of the subtree of hashes in the transaction digest that corresponds to issuance transaction data. Details of the overall changes to the transaction digest due to the Orchard-ZSA protocol can be found in ZIP 226 12. As in ZIP 244 13, the digests are all personalized BLAKE2b-256 hashes, and in cases where no elements are available for hashing, a personalized hash of the empty byte array is used.
+This section details the construction of the subtree of hashes in the transaction digest that corresponds to issuance transaction data. Details of the overall changes to the transaction digest due to the OrchardZSA protocol can be found in ZIP 226 13. As in ZIP 244 19, the digests are all personalized BLAKE2b-256 hashes, and in cases where no elements are available for hashing, a personalized hash of the empty byte array is used.
A new issuance transaction digest algorithm is defined that constructs the subtree of the transaction digest tree of hashes for the issuance portion of a transaction. Each branch of the subtree will correspond to a specific subset of issuance transaction data. The overall structure of the hash is as follows; each name referenced here will be described in detail below:
issuance_digest ├── issue_actions_digest @@ -727,7 +798,7 @@In case the transaction has no Issue Notes, ''issue_notes_digest'' is:
BLAKE2b-256("ZTxIdIAcNoteHash", [])T.5a.i.1: recipient
-This is the raw encoding of an Orchard shielded payment address as defined in the protocol specification 23.
+This is the raw encoding of an Orchard shielded payment address as defined in the protocol specification 31.
T.5a.i.2: value
Note value encoded as little-endian 8-byte representation of 64-bit unsigned integer (e.g. u64 in Rust) raw value.
@@ -761,8 +832,8 @@
The per-input transaction digest algorithm to generate the signature digest in ZIP 244 14 is modified so that a signature digest is produced for each transparent input, each Sapling input, each Orchard action, and additionally for each Issuance Action. For Issuance Actions, this algorithm has the exact same output as the transaction digest algorithm, thus the txid may be signed directly.
-The overall structure of the hash is as follows. We highlight the changes for the Orchard-ZSA protocol via the [ADDED FOR ZSA]
text label, and we omit the descriptions of the sections that do not change for the Orchard-ZSA protocol:
The per-input transaction digest algorithm to generate the signature digest in ZIP 244 20 is modified so that a signature digest is produced for each transparent input, each Sapling input, each Orchard action, and additionally for each Issuance Action. For Issuance Actions, this algorithm has the exact same output as the transaction digest algorithm, thus the txid may be signed directly.
+The overall structure of the hash is as follows. We highlight the changes for the OrchardZSA protocol via the [ADDED FOR ZSA]
text label, and we omit the descriptions of the sections that do not change for the OrchardZSA protocol:
signature_digest ├── header_digest ├── transparent_sig_digest @@ -776,40 +847,109 @@ S.3: sapling_digest (32-byte hash output) S.4: orchard_digest (32-byte hash output) S.5: issuance_digest (32-byte hash output) [ADDED FOR ZSA]-
The personalization field remains the same as in ZIP 244 13.
+The personalization field remains the same as in ZIP 244 19.
Identical to that specified for the transaction identifier.
The transaction digest algorithm defined in ZIP 244 15 which commits to the authorizing data of a transaction is modified by the Orchard-ZSA protocol to have the following structure. We highlight the changes for the Orchard-ZSA protocol via the [ADDED FOR ZSA]
text label, and we omit the descriptions of the sections that do not change for the Orchard-ZSA protocol:
auth_digest -├── transparent_scripts_digest -├── sapling_auth_digest -├── orchard_auth_digest -└── issuance_auth_digest [ADDED FOR ZSA]-
The pair (Transaction Identifier, Auth Commitment) constitutes a commitment to all the data of a serialized transaction that may be included in a block.
-A BLAKE2b-256 hash of the following values
-A.1: transparent_scripts_digest (32-byte hash output) -A.2: sapling_auth_digest (32-byte hash output) -A.3: orchard_auth_digest (32-byte hash output) -A.4: issuance_auth_digest (32-byte hash output) [ADDED FOR ZSA]-
The personalization field of this hash remains the same as in ZIP 244.
-In the case that Issuance Actions are present, this is a BLAKE2b-256 hash of the field encoding of the issueAuthSig
field of the transaction:
A.4a: issueAuthSig (field encoding bytes)-
The personalization field of this hash is set to:
-"ZTxAuthZSAOrHash"-
In the case that the transaction has no Orchard Actions, issuance_auth_digest
is
BLAKE2b-256("ZTxAuthZSAOrHash", [])-
This section covers the construction of the subtree of hashes in the authorizing data commitment that corresponds to issuance transaction data. Details of the overall changes to the authorizing data commitment due to the OrchardZSA protocol can be found in ZIP 226 14.
+In the case that Issuance Actions are present, this is a BLAKE2b-256 hash of the field encoding of the issueAuthSig
field of the transaction:
A.4a: issueAuthSig (field encoding bytes)+
The personalization field of this hash is set to:
+"ZTxAuthZSAOrHash"+
In the case that the transaction has no Orchard Actions, issuance_auth_digest
is
BLAKE2b-256("ZTxAuthZSAOrHash", [])+
In addition to the parameters defined in the Fee calculation section of ZIP 317 21, the OrchardZSA protocol upgrade defines the following additional parameters:
+Parameter | +Value | +
---|---|
+ \(issuance\_fee\) + | ++ \(100 \cdot marginal\_fee\) + per issuance action (as defined below) | +
Wallets implementing this specification SHOULD use a conventional fee, viz. + \(zsa\_conventional\_fee\!\) + , that is calculated in zatoshis. Additional definitions that are used in the formula for the calculation are in the table below:
+Input | +Units | +Description | +
---|---|---|
+ \(nOrchardActions\) + | +number | +the number of OrchardZSA transfer actions (including ZEC actions) | +
+ \(nTotalOutputsZSAIssuance\) + | +number | +the total number of OrchardZSA issuance outputs (added across issuance actions) | +
+ \(nCreateActions\) + | +number | +the number of OrchardZSA issuance actions that issue a Custom Asset that is not present in the Global Issuance State | +
The other inputs to this formula are taken from transaction fields defined in the Zcash protocol specification 32 and the global state. They are defined in the Fee calculation section of ZIP 317 21. Note that + \(nOrchardActions\!\) + , that is used in the computation of + \(logical\_actions\!\) + , is redefined in the above table, and now combines the actions for native ZEC as well as OrchardZSA transfer actions for Custom Assets.
+The formula for the computation of the + \(zsa\_logical\_actions\) + (with the updated computation of + \(logical\_actions\) + as described above) is:
+The formula for the computation of the + \(zsa\_conventional\_fee\) + is:
+It is not a consensus requirement that fees follow this formula; however, wallets SHOULD create transactions that pay this fee, in order to reduce information leakage, unless overridden by the user.
+The OrchardZSA fee calculation accounts for the additions to the Global Issuance State that are required for the OrchardZSA protocol. Every newly created Custom Asset adds a new row to the Global Issuance State. Subsequent issuance, finalization, or burn of existing Custom Assets only changes the values in the corresponding row.
+This explains the need for a higher fee for the creation of entirely new Custom Assets, in order to disincentivize the creation of "junk" assets.
+We choose to maintain the native ZEC Asset as the primary token for the Zcash blockchain, similar to how ETH is needed for ERC20 transactions to the benefit of the Ethereum ecosystem.
+An alternative proposal for the OrchardZSA fee mechanism that was not adopted was to adopt a new type of fee, denominated in the custom Asset being issued or transferred. In the context of transparent transactions, such a fee allows miners to “tap into” the ZSA value of the transactions, rather than the ZEC value of transactions. However when transactions are shielded, any design that lifts value from the transaction would also leak information about it.
Wallets need to communicate the names of the Assets in a non-confusing way to users, since the byte representation of the Asset Identifier would be hard to read for an end user. Possible solutions are provided in the Specification: Asset Identifier section.
+Wallets need to communicate the names of the Assets in a non-confusing way to users, since the byte representation of the Asset Identifier would be hard to read for an end user. Possible solutions are provided in the Specification: Asset Identifier, Asset Digest, and Asset Base section.
The design of this protocol does not currently allow for rotation of the issuance validating key that would allow for replacing the key of a specific Asset. In case of compromise, the following actions are recommended:
@@ -824,7 +964,7 @@For bridging purposes, the secure method of off-boarding Assets is to burn an Asset with the burning mechanism in ZIP 226 10. Users should be aware of issuers that demand the Assets be sent to a specific address on the Zcash chain to be redeemed elsewhere, as this may not reflect the real reserve value of the specific Wrapped Asset.
+For bridging purposes, the secure method of off-boarding Assets is to burn an Asset with the burning mechanism in ZIP 226 10. Users should be aware of issuers that demand the Assets be sent to a specific address on the Zcash chain to be redeemed elsewhere, as this may not reflect the real reserve value of the specific Wrapped Asset.
The fee mechanism described in this ZIP will follow the mechanism described in ZIP 317 16.
+The fee mechanism described in this ZIP will follow the mechanism described in ZIP 317, and is described in ZIP 230 18.
12 | -ZIP 226: Transfer and Burn of Zcash Shielded Assets - TxId Digest | +ZIP 226: Transfer and Burn of Zcash Shielded Assets - Additional Consensus Rules for the assetBurn set |
---|
13 | -ZIP 244: Transaction Identifier Non-Malleability | +ZIP 226: Transfer and Burn of Zcash Shielded Assets - TxId Digest |
---|
14 | -ZIP 244: Transaction Identifier Non-Malleability: Signature Digest | +ZIP 226: Transfer and Burn of Zcash Shielded Assets - Authorizing Data Commitment |
---|
15 | -ZIP 244: Transaction Identifier Non-Malleability: Authorizing Data Commitment | +ZIP 230: Version 6 Transaction Format: Issuance Action Description (IssueAction) |
---|
16 | -ZIP 317: Proportional Transfer Fee Mechanism | +ZIP 230: Version 6 Transaction Format: Issue Note (IssueNote) |
---|
17 | -BIP 43: Purpose Field for Deterministic Wallets | +ZIP 230: Version 6 Transaction Format: Transaction Format |
---|
18 | +ZIP 230: Version 6 Transaction Format: OrchardZSA Fee Calculation | +
---|
19 | +ZIP 244: Transaction Identifier Non-Malleability | +
---|
20 | +ZIP 244: Transaction Identifier Non-Malleability: Signature Digest | +
---|
21 | +ZIP 317: Proportional Transfer Fee Mechanism, Fee calculation | +
---|
22 | +BIP 43: Purpose Field for Deterministic Wallets | +
---|
23 | BIP 340: Schnorr Signatures for secp256k1 |
---|
19 | +24 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 2: Notation |
---|
20 | +25 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 3.1: Payment Addresses and Keys |
---|
26 | +Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 3.2: Notes | +
---|
21 | +27 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 4.2.3: Orchard Key Components |
---|
28 | +Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 4.10: SIGHASH Transaction Hashing | +
---|
29 | +Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 5.3: Constants | +
---|
22 | +30 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 5.4.9.8: Group Hash into Pallas and Vesta |
---|
23 | +31 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 5.6.4.2: Orchard Raw Payment Addresses |
---|
24 | +32 | Zcash Protocol Specification, Version 2024.5.1 [NU6]. Section 7.1: Transaction Encoding and Consensus | A Sapling binding signature on the SIGHASH transaction hash. | ||||
---|---|---|---|---|---|---|---|
Orchard-ZSA Transaction Fields | +OrchardZSA Transaction Fields | ||||||
varies |
- nActionsOrchard |
+ nActionGroupsOrchard |
compactSize |
- The number of Orchard-ZSA Action descriptions in vActionsOrchard . |
- |||
852 * nActionsOrchard |
- vActionsOrchard |
- OrchardZsaAction[nActionsOrchard] |
- A sequence of Orchard-ZSA Action descriptions, encoded per the Orchard-ZSA Action Description Encoding. | +The number of Action Group descriptions in vActionGroupsOrchard . This MUST have a value of either 0 or 1 . |
|||
1 |
- flagsOrchard |
- byte |
-
-
|
+ varies |
+ vActionGroupsOrchard |
+ ActionGroupDescription[nActionGroupsOrchard] |
+ A sequence of Action Group descriptions, encoded as per the OrchardZSA Action Group Description. |
8 |
@@ -252,32 +232,6 @@
int64 |
The net value of Orchard spends minus outputs. | |||||
32 |
- anchorOrchard |
- byte[32] |
- A root of the Orchard note commitment tree at some block height in the past. | -||||
varies |
- sizeProofsOrchardZSA |
- compactSize |
- Length in bytes of proofsOrchardZSA . Value is (TO UPDATE)
- \(2720 + 2272 \cdot \mathtt{nActionsOrchard}\!\)
- . |
- ||||
sizeProofsOrchardZSA |
- proofsOrchardZSA |
- byte[sizeProofsOrchardZSA] |
- Encoding of aggregated zk-SNARK proofs for Orchard-ZSA Actions. | -||||
64 * nActionsOrchard |
- vSpendAuthSigsOrchard |
- byte[64 * nActionsOrchard] |
- Authorizing signatures for each Orchard-ZSA Action. | -||||
varies |
nAssetBurn |
@@ -288,16 +242,16 @@
40 * nAssetBurn |
vAssetBurn |
AssetBurn[nAssetBurn] |
- A sequence of Asset Burn descriptions, encoded per Orchard-ZSA Asset Burn Description. | +A sequence of Asset Burn descriptions, encoded per OrchardZSA Asset Burn Description. | |
64 |
bindingSigOrchard |
byte[64] |
- An Orchard-ZSA binding signature on the SIGHASH transaction hash. | +An OrchardZSA binding signature on the SIGHASH transaction hash. | |||
Orchard-ZSA Issuance Fields | +OrchardZSA Issuance Fields | ||||||
varies |
@@ -321,7 +275,7 @@
64 |
issueAuthSig |
byte[64] |
- The signature of the transaction SIGHASH, signed by the issuer, validated as in Issuance Authorization Signature Scheme 8. | +The signature of the transaction SIGHASH, signed by the issuer, validated as in Issuance Authorization Signature Scheme 9. |
vSpendProofsSapling
and vSpendAuthSigsSapling
have a 1:1 correspondence to the elements of vSpendsSapling
and MUST be ordered such that the proof or signature at a given index corresponds to the SpendDescriptionV6
at the same index.vOutputProofsSapling
have a 1:1 correspondence to the elements of vOutputsSapling
and MUST be ordered such that the proof at a given index corresponds to the OutputDescriptionV6
at the same index.flagsOrchard
, valueBalanceOrchard
, anchorOrchard
, sizeProofsOrchardZSA
, proofsOrchardZSA
, and bindingSigOrchard
are present if and only if
- \(\mathtt{nActionsOrchard} > 0\!\)
+ valueBalanceOrchard
and bindingSigOrchard
are present if and only if
+ \(\mathtt{nActionGroupsOrchard} > 0\!\)
. If valueBalanceOrchard
is not present, then
\(\mathsf{v^{balanceOrchard}}\)
is defined to be
\(0\!\)
.proofsOrchardZSA
, and the elements of vSpendAuthSigsOrchard
, each have a 1:1 correspondence to the elements of vActionsOrchard
and MUST be ordered such that the proof or signature at a given index corresponds to the OrchardZsaAction
at the same index.ik
and issueAuthSig
are present if and only if
\(\mathtt{nIssueActions} > 0\!\)
.The encodings of tx_in
, and tx_out
are as in a version 4 transaction (i.e. unchanged from Canopy). The encodings of SpendDescriptionV6
, OutputDescriptionV6
, OrchardZsaAction
, AssetBurn
and IssueAction
are described below. The encoding of Sapling Spends and Outputs has changed relative to prior versions in order to better separate data that describe the effects of the transaction from the proofs of and commitments to those effects, and for symmetry with this separation in the Orchard-related parts of the transaction format.
The encodings of tx_in
, and tx_out
are as in a version 4 transaction (i.e. unchanged from Canopy). The encodings of SpendDescriptionV6
, OutputDescriptionV6
, ActionGroupDescription
, AssetBurn
and IssueAction
are described below. The encoding of Sapling Spends and Outputs has changed relative to prior versions in order to better separate data that describe the effects of the transaction from the proofs of and commitments to those effects, and for symmetry with this separation in the Orchard-related parts of the transaction format.
SpendDescriptionV6
) The encodings of each of these elements are defined in §7.4 ‘Output Description Encoding and Consensus’ of the Zcash Protocol Specification 4.
OrchardZsaAction
) The OrchardZSA Action Group Description is encoded in a transaction as an instance of an ActionGroupDescription
type:
Bytes | +Name | +Data Type | +Description | +
---|---|---|---|
varies |
+ nActionsOrchard |
+ compactSize |
+ The number of Action descriptions in vActionsOrchard . This MUST have a value strictly greater than 0 . |
+
852 * nActionsOrchard |
+ vActionsOrchard |
+ OrchardZSAAction[nActionsOrchard] |
+ A sequence of OrchardZSA Action descriptions in the Action Group. | +
1 |
+ flagsOrchard |
+ byte |
+ As defined in Section 7.1 of the Protocol Specification 6. | +
32 |
+ anchorOrchard |
+ byte[32] |
+ As defined in Section 7.1 of the Protocol Specification 6. | +
varies |
+ sizeProofsOrchard |
+ compactSize |
+ As defined in Section 7.1 of the Protocol Specification 6. | +
sizeProofsOrchard |
+ proofsOrchard |
+ byte[sizeProofsOrchard] |
+ The aggregated zk-SNARK proof for all Actions in the Action Group. | +
4 |
+ nAGExpiryHeight |
+ uint32 |
+ A block height (in the future) after which the Actions of the Action Group become invalid and should be rejected by consensus. This MUST have a value of 0 . |
+
64 * nActionsOrchard |
+ vSpendAuthSigsOrchard |
+ byte[64 * nActionsOrchard] |
+ Authorizing signatures for each Action of the Action Group in a transaction. | +
The encoding of OrchardZSAAction
is described below.
proofsOrchardZSA
, and the elements of vSpendAuthSigsOrchard
, each have a 1:1 correspondence to the elements of vActionsOrchard
and MUST be ordered such that the proof or signature at a given index corresponds to the OrchardZSAAction
at the same index.We introduce the nAGExpiryHeight
field in this transaction format in order to be forward compatible with Swaps over ZSAs, as proposed in ZIP 228 10. For the OrchardZSA protocol, which does not make use of an additional expiry height for transactions, we set the value of nAGExpiryHeight
to be 0
by consensus. This serves as a default value to represent the situation where there is no expiry, analogous to the convention adopted for nExpiryHeight
in ZIP 203 [#zip-0203].
OrchardZSAAction
) 32 |
ephemeralKey |
byte[32] |
- An encoding of an ephemeral Pallas public key | +An encoding of an ephemeral Pallas public key. |
612 |
@@ -492,10 +515,10 @@
The encodings of each of these elements are defined in §7.5 ‘Action Description Encoding and Consensus’ of the Zcash Protocol Specification 5.
+The encodings of each of these elements are defined in §7.5 ‘Action Description Encoding and Consensus’ of the Zcash Protocol Specification 5.
An Orchard-ZSA Asset Burn description is encoded in a transaction as an instance of an AssetBurn
type:
An OrchardZSA Asset Burn description is encoded in a transaction as an instance of an AssetBurn
type:
32 | AssetBase |
byte[32] |
- For the Orchard-based ZSA protocol, this is the encoding of the Asset Base + | For the OrchardZSA protocol, this is the encoding of the Asset Base \(\mathsf{AssetBase^{Orchard}}\!\) . |
The encodings of each of these elements are defined in ZIP 226 7.
+The encodings of each of these elements are defined in ZIP 226 8.
IssueAction
) An issuance action, IssueAction
, is the instance of issuing a specific Custom Asset, and contains the following fields:
In addition to the parameters defined in the Fee calculation section of ZIP 317 12, the OrchardZSA protocol upgrade defines the following additional parameters:
-Parameter | -Value | -
---|---|
- \(\mathsf{issuance\_fee}\) - | -- \(100 \cdot marginal\_fee\) - per issuance action (as defined below) | -
Wallets implementing this specification SHOULD use a conventional fee, viz. - \(\mathsf{zsa\_conventional\_fee}\!\) - , that is calculated in zatoshis. Additional definitions that are used in the formula for the calculation are in the table below:
-Input | -Units | -Description | -
---|---|---|
- \(\mathsf{nOrchardActions}\) - | -number | -the number of OrchardZSA transfer actions (including ZEC actions) | -
- \(\mathsf{nTotalOutputsZsaIssuance}\) - | -number | -the total number of OrchardZSA issuance outputs (added across issuance actions) | -
- \(\mathsf{nCreateActions}\) - | -number | -the number of OrchardZSA issuance actions that issue a Custom Asset that is not present in the Global Issuance State | -
The other inputs to this formula are taken from transaction fields defined in the Zcash protocol specification 6 and the global state. They are defined in the Fee calculation section of ZIP 317 12. Note that - \(\mathsf{nOrchardActions}\!\) - , that is used in the computation of - \(\mathsf{logical\_actions}\!\) - , is redefined in the above table, and now combines the actions for native ZEC as well as OrchardZSA transfer actions for Custom Assets.
-The formula for the computation of the - \(\mathsf{zsa\_logical\_actions}\) - (with the updated computation of - \(\mathsf{logical\_actions}\) - as described above) is:
-The formula for the computation of the - \(\mathsf{zsa\_conventional\_fee}\) - is:
-It is not a consensus requirement that fees follow this formula; however, wallets SHOULD create transactions that pay this fee, in order to reduce information leakage, unless overridden by the user.
-The OrchardZSA fee calculation accounts for the additions to the Global Issuance State that are required for the OrchardZSA protocol. Every newly created Custom Asset adds a new row to the Global Issuance State. Subsequent issuance, finalization, or burn of existing Custom Assets only changes the values in the corresponding row.
-This explains the need for a higher fee for the creation of entirely new Custom Assets, in order to disincentivize the creation of "junk" assets.
-We choose to maintain the native ZEC Asset as the primary token for the Zcash blockchain, similar to how ETH is needed for ERC20 transactions to the benefit of the Ethereum ecosystem.
-An alternative proposal for the OrchardZSA fee mechanism that was not adopted was to adopt a new type of fee, denominated in the custom Asset being issued or transferred. In the context of transparent transactions, such a fee allows miners to “tap into” the ZSA value of the transactions, rather than the ZEC value of transactions. However when transactions are shielded, any design that lifts value from the transaction would also leak information about it.
-Version 6 transactions are proposed to be allowed on the network starting from Network Upgrade 7. 10
+Version 6 transactions are proposed to be allowed on the network starting from Network Upgrade 7. 12
TODO
@@ -778,34 +718,50 @@7 | -ZIP 226: Transfer and Burn of Zcash Shielded Assets | +ZIP 203: Transaction Expiry |
---|
8 | -ZIP 227: Issuance of Zcash Shielded Assets | +ZIP 226: Transfer and Burn of Zcash Shielded Assets |
---|
9 | -ZIP 244: Transaction Identifier Non-Malleability | +ZIP 227: Issuance of Zcash Shielded Assets |
---|
10 | +ZIP 228: Asset Swaps for Zcash Shielded Assets | +
---|
11 | +ZIP 244: Transaction Identifier Non-Malleability | +
---|
12 | ZIP 254: Deployment of the NU7 Network Upgrade |
---|
11 | -ZIP 317: Proportional Transfer Fee Mechanism | +13 | +ZIP 317: Proportional Transfer Fee Mechanism |
---|
12 | -ZIP 317: Proportional Transfer Fee Mechanism, Fee calculation | +14 | +ZIP 317: Proportional Transfer Fee Mechanism, Fee calculation |
---|