diff --git a/rendered/zip-0228.html b/rendered/zip-0228.html index c94504188..dfb944166 100644 --- a/rendered/zip-0228.html +++ b/rendered/zip-0228.html @@ -25,7 +25,7 @@

The key word "MUST" in this document is to be interpreted as described in RFC 2119 1.

The term "network upgrade" in this document is to be interpreted as described in ZIP 200 2.

The terms "Orchard" and "Action" in this document are to be interpreted as described in ZIP 224 3.

-

The terms "Asset", "Custom Asset" and "Asset Base” in this document are to be interpreted as described in ZIP 227 5.

+

The terms "Asset", "Custom Asset" and "Asset Base” in this document are to be interpreted as described in ZIP 227 6.

We define the following additional terms:

Abstract

-

This ZIP introduces Asset Swaps for Zcash Shielded Assets (ZSA). It builds on top of ZIP 227 5 and ZIP 226 4. ZSA Swaps simplify the process of trading assets within the Zcash ecosystem, and lower the reliance on centralized exchanges for trading.

+

This ZIP introduces Asset Swaps for Zcash Shielded Assets (ZSA). It builds on top of ZIP 227 6 and ZIP 226 4. ZSA Swaps simplify the process of trading assets within the Zcash ecosystem, and lower the reliance on centralized exchanges for trading.

Motivation

ZIP 227 and ZIP 226 equip Zcash with the ability to issue, transfer, and burn Custom Assets, enabling multi-asset support on the Zcash chain. This support opens the door for applications like asset swaps, which allow users to trade assets on Zcash without using centralized exchanges. Importantly, ZSA Swaps will allow users to keep full custody of their funds while trading their assets. In light of the number of “DeFi/smart contract hacks” and bankrupt exchanges which mismanaged user funds (e.g. FTX), providing users with a secure and privacy-preserving way to trade, while staying in control of their funds, is a tremendous improvement on the status quo in the realm of (privacy preserving) cryptocurrencies. Assets Swaps for ZSA is another milestone that would unleash a myriad of use cases on the Zcash ecosystem.

@@ -54,12 +54,12 @@
The P2P setting, where two traders swap Assets between themselves.

A key challenge is that Swap Orders that match may contain Actions and Zero Knowledge Proofs generated using different blockchain states and roots of note commitment trees. In the current (NU5) protocol, each transaction contains a set of Actions and Proofs generated using a single anchor/Merkle root, and there is no way to combine independently generated halo2 proofs into a single combined proof.

-

To enable combining Actions and Proofs from different blockchain states, the concept of an Action Group is introduced in this ZIP. An Action Group groups together Actions and Proofs generated using a common commitment tree root. Action Groups replace Actions in the Zcash transaction format. This allows for creating a single Zcash transaction from different sets of Actions and Proofs generated using different anchors and blockchain states. This Action Groups-based transaction structure enables a wide range of use-cases to be built on Zcash, such as: P2P ZSA Swaps, Zcash transaction relays or ZSA Swaps via a centralized Matcher - to name a few (More details are under the Matchers heading in the Other Considerations section of this ZIP).

+

To enable combining Actions and Proofs from different blockchain states, the concept of an Action Group is introduced in this ZIP. An Action Group groups together Actions and Proofs generated using a common commitment tree root. Action Groups replace Actions in the Zcash transaction format. This allows for creating a single Zcash transaction from different sets of Actions and Proofs generated using different anchors and blockchain states. This Action Groups-based transaction structure enables a wide range of use-cases to be built on Zcash, such as: P2P ZSA Swaps, Zcash transaction relays or ZSA Swaps via a centralized Matcher - to name a few. (More details are under the Matchers heading in the Other Considerations section of this ZIP.)

Specification: Protocol Changes

-

The protocol is largely the same as that in the Orchard-ZSA Protocol described in ZIP 226 4 and ZIP 227 5. The changes to the protocol are described in this section. The specification of the structure of Swap Orders (that are sent off-chain) is provided in the next section, Specification: Swap Orders.

+

The protocol is largely the same as that in the Orchard-ZSA Protocol described in ZIP 226 4 and ZIP 227 6. The changes to the protocol are described in this section. The specification of the structure of Swap Orders (that are sent off-chain) is provided in the next section, Specification: Swap Orders.

Action Groups and Swap Bundle

-

The transaction format is modified to group Actions 10 into Action Groups characterized by anchors and flagsOrchard. Specifically, the Orchard-ZSA transaction fields 7 are modified as in the table below: This is the Swap Bundle, and it is pictorially represented in the figure below.

+

The transaction format is modified to group Actions 12 into Action Groups characterized by anchors and flagsOrchard. Specifically, the Orchard-ZSA transaction fields 9 are modified as in the table below: This is the Swap Bundle, and it is pictorially represented in the figure below.

@@ -143,26 +143,26 @@ - - + + - + - + - + @@ -185,15 +185,15 @@

Spend Authorization Signature Changes

-

The spend authorization signature is computed in the manner specified in Section 4.15 of the protocol specification 11, except that the signature is generated over the Action Group Hash, +

The spend authorization signature is computed in the manner specified in Section 4.15 of the protocol specification 13, except that the signature is generated over the Action Group Hash, \(\mathsf{AGHash}\) , which is defined to be \(\mathsf{AGHash} := \mathsf{BLAKE2b}\texttt{-}\mathsf{256}(\texttt{"ZcashActionGroup"}, \mathsf{preAuthActionGroup})\) .

-

This change ensures that no changes are required in the Action Statement to be proved.

+

This change ensures that no changes are required in the Action statement 5 to be proved.

SIGHASH Computation Changes

-

The addition of Action Groups to the Zcash transaction as another level of abstraction requires a change in the way transactions are hashed to compute the SIGHASH in ZIP 244, specifically in the orchard_digest section 8. We update the structure of the orchard_digest component of the SIGHASH as follows:

+

The addition of Action Groups to the Zcash transaction as another level of abstraction requires a change in the way transactions are hashed to compute the SIGHASH in ZIP 244, specifically in the orchard_digest section 10. We update the structure of the orchard_digest component of the SIGHASH as follows:

orchard_digest
 ├── orchard_action_groups_digest
 │   ├── orchard_actions_compact_digest
@@ -219,7 +219,7 @@
 T.4a.iv : flagsOrchard                        (1 byte)
 T.4a.v  : anchorOrchard                       (32 bytes)
 T.4a.vi : timeLimit                           (4 bytes)
-

The content of T.4a.i, T.4a.ii, and T.4a.iii are the same as T.4a, T.4b, and T.4c of the txid_digest defined in ZIP 244 8, over the Actions in the Action Group, and therefore are not expanded on for the sake of brevity.

+

The content of T.4a.i, T.4a.ii, and T.4a.iii are the same as T.4a, T.4b, and T.4c of the txid_digest defined in ZIP 244 10, over the Actions in the Action Group, and therefore are not expanded on for the sake of brevity.

The personalization field of this hash is set to:

"ZTxIdOrcActGHash"

In the case that the transaction has no Action Groups, orchard_action_groups_digest is

@@ -254,11 +254,11 @@ \(\mathsf{AGHash}\) using \(\mathsf{rk}\) - as the validating key. (That is, the signature is over + as the validating key (That is, the signature is over \(\mathsf{AGHash}\) instead of \(\mathsf{SigHash}\) - .) The time limit also needs to be checked during verification. Specifically, the consensus rule becomes (if any checks fail, the transaction MUST be rejected):

+ ). The time limit also needs to be checked during verification. Specifically, the consensus rule becomes (if any checks fail, the transaction MUST be rejected):

  • for all AG in ActionGroups do: @@ -291,7 +291,7 @@

    The timeLimit is an integer that represents the max block height in which a given Action Group can be included on the chain. As such, the time limit truly represents the settlement time limit, not the execution time limit. This distinction is important because in our example, execution is happening offchain on the Matcher and settlement happens on the chain (i.e. introducing the Matcher to create bundles and match SO's together adds a step to the lifecycle of the trade and decouples execution and settlement, which otherwise happen at the same time, on-chain). So, if we want the time limit to be part of the validity checks of a transaction on Zcash, we have to treat the time limit as a settlement parameter rather than an execution one. As a result, it is plausible that the party performing the matching and sending it for settlement will not match orders having a time limit that is near enough that it might not get settled on time due to the expected delay between the matching and the inclusion within a block.

Rationale for Spend Authorization Signature Changes

-

In the current (NU5) Zcash protocol, each Action includes a Spend Authorization Signature 11 that binds a specific spend instruction to a specific transaction and prevents replay attacks. However, in the context of Asset Swaps, there are two problems that prevent this mechanism from being carried over unchanged.

+

In the current (NU5) Zcash protocol, each Action includes a Spend Authorization Signature 13 that binds a specific spend instruction to a specific transaction and prevents replay attacks. However, in the context of Asset Swaps, there are two problems that prevent this mechanism from being carried over unchanged.

  • The SIGHASH represents a hash over a full consensus-compliant transaction object. Since a Swap Order is a trade intent to be used by the party performing the matching to form a valid bundle/transaction, the sender of the Swap Order cannot compute a SIGHASH as per ZIP244. This trader doesn't know all the transaction fields in advance, as they are set when the full bundle transaction is formed and sent to the chain.
  • The timeLimit parameter is a new addition to the protocol, and is therefore not included in the existing SIGHASH. Swap Orders need to be made non-malleable in order to ensure that the party performing the matching cannot change the time limit unilaterally.
  • @@ -373,7 +373,7 @@
- + @@ -389,14 +389,14 @@ and create a note for themself, to receive the desired amount of another Asset \(\mathsf{A}_2\) .

-

To support a CLOB like trading environment, the Order senders do not know in advance with whom their orders will be matched, so they do not know, in advance, who is the recipient of the funds they offer to swap. As such, they cannot create notes for a recipient other than themself. To form an Order, the sender must generate Actions with output notes and associated commitments, that use their own diversifier +

To support a Closed Ledger Order Book (CLOB)-like trading environment, the Order senders do not know in advance with whom their orders will be matched, so they do not know, in advance, who is the recipient of the funds they offer to swap. As such, they cannot create notes for a recipient other than themself. To form an Order, the sender must generate Actions with output notes and associated commitments, that use their own diversifier \(\mathsf{d}\) and diversified transmission key \(\mathsf{pk_d}\) - 9.

+ 11.

Each Order can be seen as an “invalid" ZSA transaction to oneself, which is unbalanced w.r.t each ZSA AssetBase. Each Order only “becomes valid” in the context of a Swap Bundle, whose overall value is balanced across Asset Bases (i.e. the two Orders balance each other).

Furthermore, each Order contains a specific Action that pays "matching fees" to the party performing the matching. This Action, paying fees, in ZEC, to the matcher, is generated using the matcher's details to generate output notes, since we assume, generally, that the matcher is known by all trading parties. In the P2P case the matcher is simply the second party out of the two (See the Fees section for more details).

-

ZIP 226 4, that this ZIP builds on, introduces changes to the NU5 circuit to include support for different Assets. The structure there requires that the input and output notes of the OrchardZSA Action must have the same asset base. This ZIP continues with the same idea, i.e. the manipulation of a single Asset Base per Action. Therefore, Swap Orders are expected to generally have at least three Actions:

+

ZIP 226 4, that this ZIP builds on, introduces changes to the NU5 circuit to include support for different Assets. The structure there requires that the input and output notes of the OrchardZSA Action must have the same Asset Base. This ZIP continues with the same idea, i.e. the manipulation of a single Asset Base per Action. Therefore, Swap Orders are expected to generally have at least three Actions:

852 * nActionsOrchard vActionsOrchardOrchardZSAAction[nActionsOrchard]A sequence of ZSA Swap Action descriptions in the Action Group.OrchardZsaAction[nActionsOrchard]A sequence of ZSA Swap Action descriptions in the Action Group. The ''OrchardZsaAction'' type is defined in ZIP 230 8.
1 flagsOrchard byteAs defined in Section 7.1 of the Protocol Specification 12.As defined in Section 7.1 of the Protocol Specification 14.
32 anchorOrchard byte[32]As defined in Section 7.1 of the Protocol Specification 12.As defined in Section 7.1 of the Protocol Specification 14.
varies sizeProofsOrchard compactSizeAs defined in Section 7.1 of the Protocol Specification 12.As defined in Section 7.1 of the Protocol Specification 14.
sizeProofsOrchard 32 asset_base byte[32]The Asset Base 6 of the input/output of the Swap Order.The Asset Base 7 of the input/output of the Swap Order.
8
- +
+ + + +
5ZIP 226: Transfer and Burn of Zcash Shielded Assets - Circuit Statement
+ + + + @@ -563,15 +571,23 @@
6 ZIP 227: Issuance of Zcash Shielded Assets
- +
67 ZIP 227: Issuance of Zcash Shielded Assets - Specification: Asset Identifier
+ + + + + + + +
8ZIP 230: Version 6 Transaction Format
- + @@ -579,7 +595,7 @@
79 ZIP 230: Version 6 Transaction Format - Transaction Format
- + @@ -587,7 +603,7 @@
810 ZIP 244: Transaction Identifier Non-Malleability: T4. orchard_digest
- + @@ -595,7 +611,7 @@
911 Zcash Protocol Specification, Version 2023.4.0. Section 3.2: Notes
- + @@ -603,7 +619,7 @@
1012 Zcash Protocol Specification, Version 2023.4.0. Section 3.7: Action Transfers and their Descriptions
- + @@ -611,7 +627,7 @@
1113 Zcash Protocol Specification, Version 2023.4.0. Section 4.15: Spend Authorization Signatures (Sapling and Orchard)
- + @@ -619,7 +635,7 @@
1214 Zcash Protocol Specification, Version 2023.4.0. Section 7.1: Transaction Encoding and Consensus
- + diff --git a/zips/zip-0228.rst b/zips/zip-0228.rst index 88329f994..a7f4b6a9e 100644 --- a/zips/zip-0228.rst +++ b/zips/zip-0228.rst @@ -62,7 +62,7 @@ In the current (NU5) protocol, each transaction contains a set of Actions and Pr To enable combining Actions and Proofs from different blockchain states, the concept of an Action Group is introduced in this ZIP. An Action Group groups together Actions and Proofs generated using a common commitment tree root. Action Groups replace Actions in the Zcash transaction format. This allows for creating a single Zcash transaction from different sets of Actions and Proofs generated using different anchors and blockchain states. -This Action Groups-based transaction structure enables a wide range of use-cases to be built on Zcash, such as: P2P ZSA Swaps, Zcash transaction relays or ZSA Swaps via a centralized Matcher - to name a few (More details are under the `Matchers`_ heading in the `Other Considerations`_ section of this ZIP). +This Action Groups-based transaction structure enables a wide range of use-cases to be built on Zcash, such as: P2P ZSA Swaps, Zcash transaction relays or ZSA Swaps via a centralized Matcher - to name a few. (More details are under the `Matchers`_ heading in the `Other Considerations`_ section of this ZIP.) Specification: Protocol Changes =============================== @@ -111,7 +111,8 @@ The pre-authorization Action Group description data type, ``ActionGroupDescripti +=============================+==========================+==================================================+=====================================================================+ |``varies`` |``nActionsOrchard`` |``compactSize`` |The number of Action descriptions in ``vActionsOrchard``. | +-----------------------------+--------------------------+--------------------------------------------------+---------------------------------------------------------------------+ -|``852 * nActionsOrchard`` |``vActionsOrchard`` |``OrchardZSAAction[nActionsOrchard]`` |A sequence of ZSA Swap Action descriptions in the Action Group. | +|``852 * nActionsOrchard`` |``vActionsOrchard`` |``OrchardZsaAction[nActionsOrchard]`` |A sequence of ZSA Swap Action descriptions in the Action Group. | +| | | |The ''OrchardZsaAction'' type is defined in ZIP 230 [#zip-0230]_. | +-----------------------------+--------------------------+--------------------------------------------------+---------------------------------------------------------------------+ |``1`` |``flagsOrchard`` |``byte`` |As defined in Section 7.1 of the Protocol | | | | |Specification [#protocol-txnencoding]_. | @@ -141,7 +142,7 @@ Spend Authorization Signature Changes The spend authorization signature is computed in the manner specified in Section 4.15 of the protocol specification [#protocol-spendauthsig]_, except that the signature is generated over the Action Group Hash, :math:`\mathsf{AGHash}`, which is defined to be :math:`\mathsf{AGHash} := \mathsf{BLAKE2b}\texttt{-}\mathsf{256}(\texttt{"ZcashActionGroup"}, \mathsf{preAuthActionGroup})`. -This change ensures that no changes are required in the Action Statement to be proved. +This change ensures that no changes are required in the Action statement [#zip-0226-circuit-statement]_ to be proved. SIGHASH Computation Changes --------------------------- @@ -212,7 +213,7 @@ Consensus Rule Changes ---------------------- The transaction verification becomes a nested loop, iterating over all Action Groups and verifying the Actions they contain. -Each spend authorization signature MUST be a valid :math:`\mathsf{SpendAuthSig^{Orchard}}` signature over :math:`\mathsf{AGHash}` using :math:`\mathsf{rk}` as the validating key. (That is, the signature is over :math:`\mathsf{AGHash}` instead of :math:`\mathsf{SigHash}`.) +Each spend authorization signature MUST be a valid :math:`\mathsf{SpendAuthSig^{Orchard}}` signature over :math:`\mathsf{AGHash}` using :math:`\mathsf{rk}` as the validating key (That is, the signature is over :math:`\mathsf{AGHash}` instead of :math:`\mathsf{SigHash}`). The time limit also needs to be checked during verification. Specifically, the consensus rule becomes (if any checks fail, the transaction MUST be rejected): @@ -330,7 +331,7 @@ Rationale for Swap Orders In a Swap Order, senders only manipulate their funds. This means that senders of Orders spend their notes (input) denominated in an Asset :math:`\mathsf{A}_1` and create a note for themself, to receive the desired amount of another Asset :math:`\mathsf{A}_2`. -To support a CLOB like trading environment, the Order senders do not know in advance with whom their orders will be matched, so they do not know, in advance, who is the recipient of the funds they offer to swap. +To support a Closed Ledger Order Book (CLOB)-like trading environment, the Order senders do not know in advance with whom their orders will be matched, so they do not know, in advance, who is the recipient of the funds they offer to swap. As such, they cannot create notes for a recipient other than themself. To form an Order, the sender must generate Actions with output notes and associated commitments, that use their own diversifier :math:`\mathsf{d}` and diversified transmission key :math:`\mathsf{pk_d}` [#protocol-notes]_. @@ -342,7 +343,7 @@ This Action, paying fees, in ZEC, to the matcher, is generated using the matcher In the P2P case the matcher is simply the second party out of the two (See the `Fees`_ section for more details). ZIP 226 [#zip-0226]_, that this ZIP builds on, introduces changes to the NU5 circuit to include support for different Assets. -The structure there requires that the input and output notes of the OrchardZSA Action must have the same asset base. +The structure there requires that the input and output notes of the OrchardZSA Action must have the same Asset Base. This ZIP continues with the same idea, i.e. the manipulation of a single Asset Base per Action. Therefore, Swap Orders are expected to generally have at least three Actions: @@ -353,20 +354,20 @@ Therefore, Swap Orders are expected to generally have at least three Actions: Security and Privacy Considerations =================================== -Protection against Replay attacks +Protection Against Replay attacks --------------------------------- We consider whether our change from signing the SIGHASH in the spend authorization signature to signing the Action Group Hash opens any possibilities of replay attacks. This is prevented by the use of the updated SIGHASH in the binding signature. If an adversary tries to extract an Action Group and associated Spend Authorization Signature from a transaction on the network to replay it within another transaction - which would potentially be detrimental to the matcher as it could make their bundle invalid (if the replayed Action Group gets included first on-chain) - the adversary will also need to be able to generate a binding signature on their replayed transaction, which is not possible without knowing the :math:`\mathsf{bsk}` associated with the Action Group being replayed. -The :math:`\mathsf{bsk}` is sent within the Swap Order, which is assumed to be communicated over a secure channel off-chain between the parties. +The :math:`\mathsf{bsk}` is sent within the Swap Order. The Swap Order is assumed to be communicated over a secure channel off-chain between the parties. This precludes the possibility of replay attacks. Non-Malleability of the Time Limit ---------------------------------- -We protect against the malleation of the time limit field by a malicious matching party (in order to take advantage of the "free option" that it could obtain by extending the validity of an Order) by including the time limit inside the Action Group Hash that is signed using the Spend Authorization Signature (see more details in `Rationale for Time Limit`_). +We protect against the malleation of the ``timeLimit`` field by a malicious matching party (in order to take advantage of the "free option" that it could obtain by extending the validity of an Order) by including the time limit inside the Action Group Hash that is signed using the Spend Authorization Signature (see more details in `Rationale for Time Limit`_). The security of the Spend Authorization Signature and the collision resistance of the BLAKE2b-256 hash then ensures that the time limit remains the same as the one mandated by the creator of the Swap Order. Other Considerations @@ -377,10 +378,10 @@ Fees The primary goal of a fee mechanism is twofold: -- It should disincentivize malicious users from flooding the network with spam Swap offers that are unlikely to be matched. +- It should disincentivize malicious users from flooding the network with spam Swap Orders that are unlikely to be matched. - It should incentivize the party performing the matching to perform the additional work required to match orders and bundle them together. -For the matching to be economically viable, the fees captured by the matcher to create the bundle must at least be higher than the fees needed to settle the bundle on the chain. +For the matching to be economically viable, the fees captured by the Matcher to create the bundle must at least be higher than the fees needed to settle the bundle on the chain. The proposed changes to the transaction structure and the consensus checks also require a change in the fees paid to miners. The use of Action Groups adds information to the transaction object, and adds more bytes to the blockchain state. @@ -424,17 +425,17 @@ Receive the Swap Order and Perform Order Matching The Matcher must be able to receive incoming Swap Orders from traders willing to use it to Swap ZSAs. We assume that a Matcher is discoverable by market participant (e.g. it has a website), that traders can send Orders to the Matcher (e.g. using a secure 1-to-1 communication channel) and that a Matcher defines its own logic to process the received Swap Orders. Examples of such logic are: - A set of validity checks to run on the received Swap Orders, e.g. to prevent DoS attacks (See `Denial-of-Service (DoS) Prevention`_). If the verification of a Swap Order fails, the Swap Order gets rejected. -- A set of operations to manage the valid Swap Orders waiting to be matched. This could include, for instance, a set of data structures and operations to manage a mempool/Central Limit Order Book (CLOB), following a chosen ordering policy (See, `CLOB and Matching Policies`_ for more details), etc. +- A set of operations to manage the valid Swap Orders waiting to be matched. This could include, for instance, a set of data structures and operations to manage a mempool/CLOB, following a chosen ordering policy (See, `CLOB and Matching Policies`_ for more details), etc. -Create Swap Bundles and Settle -'''''''''''''''''''''''''''''' +Create Swap Bundles and Send on-chain +''''''''''''''''''''''''''''''''''''' This step performs a set of operations, which from a set of matched Orders (see the previous step) builds a Swap Bundle to be sent on-chain as a Zcash transaction for settlement. CLOB and Matching Policies -------------------------- -The Matcher-based trading protocol for ZSA is primarily modeled after Central Limit Order Book (CLOB)-based execution [#clob]_. The Matcher is assumed to receive Swap Orders, add and order them in a data structure and match them when their terms align. +The Matcher-based trading protocol for ZSA is primarily modeled after CLOB-based execution [#clob]_. The Matcher is assumed to receive Swap Orders, add and order them in a data structure and match them when their terms align. Generally, sorting in a CLOB is made according to: 1st prices and 2nd the time at which an order is received by the Matcher. We can identify different ways to “consume” the CLOB, i.e., match Swap Orders together: @@ -461,7 +462,7 @@ This is particularly at odds with the protocol in this ZIP, since the Matcher is Some of the proposals to allow for this are: - The use of standard denomination for orders. -- The inclusion of a special flag “partialFill = true” to flag to the Matcher that the trader is willing to stay online to split orders on demand.\ +- The inclusion of a special flag “partialFill = true” to flag to the Matcher that the trader is willing to stay online to split orders on demand. - Existence of a third party Market Maker providing liquidity to the many ZSA pairs traded on the system. All of these proposals have their pros and cons, and warrant further study and discussion. @@ -520,8 +521,10 @@ References .. [#zip-0200] `ZIP 200: Network Upgrade Mechanism `_ .. [#zip-0224] `ZIP 224: Orchard `_ .. [#zip-0226] `ZIP 226: Transfer and Burn of Zcash Shielded Assets `_ +.. [#zip-0226-circuit-statement] `ZIP 226: Transfer and Burn of Zcash Shielded Assets - Circuit Statement `_ .. [#zip-0227] `ZIP 227: Issuance of Zcash Shielded Assets `_ .. [#zip-0227-assetbase] `ZIP 227: Issuance of Zcash Shielded Assets - Specification: Asset Identifier `_ +.. [#zip-0230] `ZIP 230: Version 6 Transaction Format `_ .. [#zip-0230-transaction-format] `ZIP 230: Version 6 Transaction Format - Transaction Format `_ .. [#zip-0244-orchard-digest] `ZIP 244: Transaction Identifier Non-Malleability: T4. orchard_digest `_ .. [#protocol-notes] `Zcash Protocol Specification, Version 2023.4.0. Section 3.2: Notes `_
1315 Central Limit Order Book Definition - Risk.net