This section constructs the record that every node keeps of the issued Custom Assets: the global issuance state of ZIP 227 and its chaining through blocks and transactions (§7.1); the transition of that state under one transaction, in which burn precedes issuance, together with the order in which the note commitments of a transaction enter the note commitment tree (§7.2); the properties of finalisation and of the recorded balance (§7.3); and the complete verification of an OrchardZSA transaction, with each check paired with the requirement that it serves (§7.4). The rules are those of ZIP 227, which is Draft; one case that they leave undetermined is an open problem (Remark 7.5).
Let
the largest value of one Issue Note (Definition 6.1). The global issuance state is a finite partial map
from Asset Bases to triples, with as in §2.3. The components are written
An Asset Base outside the domain of the map, written , reads as , and a write to a component of such an Asset Base creates its entry from that default. The components mean the following.
The balance is the amount of the Asset in circulation: the amount issued less the amount burnt.
The finalisation bit records whether occurred in an earlier issuance of the Asset; it never changes from to .
The reference note is the Asset’s reference note (Definition 6.10), or .
ZIP 227 types the third component in while its default reads ; it is typed here in . The bound applies to the balance, the amount in circulation, and not to cumulative issuance: after burns an unfinalised Asset can be issued again, so the sum of all values issued of one Asset may exceed . The phrases “maximum total supply” and “limit the total issuance” of ZIP 227 are looser than its rule (I6) of Construction 7.3, which the volume follows.
Chaining. Every node MUST update the map while processing any transaction that contains a burn set or an Issuance Bundle. A transaction has an input state and an output state :
the input state of the first transaction of the OrchardZSA activation block is the empty map;
the input state of the first transaction of any later block is the final state of the preceding block;
the input state of every later transaction of a block is the output state of the preceding transaction;
the final state of a block is the output state of its last transaction.
The chaining is that of treestates in the Ironwood Guide’s Definition “Treestate and anchor” (§“Anchors”) (ZIP 227, “Global Issuance State” and “Management of the Global Issuance State”). Class: specified. The OrchardZSA activation block is not assigned, since ZIP 227, “Deployment”, reads “TBD”; this is an open problem, listed in “Open problems” (§10.2).
ZIP 227, “Rationale for Global Issuance State”, gives three reasons, which are rationale of the ZIP. The balance of an issued Custom Asset must never become negative, along the lines of ZIP 209, and no single transaction field carries both the issued and the burnt amounts, so nodes keep a running record of the amount in circulation. The bound is a practical limit that lets an issuer issue the complete supply of an Asset in one transaction, indeed in one Issue Note. The finalisation bit lets nodes reject further issuance of a finalised Asset. The properties themselves are proved in “Finalisation” (§7.3).
By the chaining of Definition 7.1, the final state of a block is a function of the branch from the OrchardZSA activation block to that block. A reorganisation (Ironwood Guide, Definition “Reorganisation”) therefore replaces the state by the one obtained by chaining along the new branch from the last common block, as it replaces the treestates. ZIP 227 states forward chaining only and no rule for reorganisations: the statement here is a consequence of the definition, not a rule of the ZIP. Every result of this section, and Theorem 9.7, holds per branch.
Input. A transaction that may contain an OrchardZSA bundle (Definition 5.2), with burn set , empty when has none, and an Issuance Bundle (Definition 6.5); and its input state .
Output. The output state , defined only when every requirement below holds; otherwise is invalid and contributes no state. Every write below is to , and every read is of its current value. The labels follow the order of ZIP 227, which numbers none.
For every transaction:
The transaction carries at most one Action Group, and that Action Group has no expiry height of its own.
.
The burn set satisfies (B1) to (B3) of Definition 5.1.
For every , it MUST hold that
the node then sets, for every pair,
before any issuance is processed. By (B3) the pairs have distinct Asset Bases, so checking every pair and then subtracting equals processing the pairs one by one.
If contains an Issuance Bundle: rules (I1) to (I3) of Definition 6.12 hold, and for each Issuance Action of , in order, with zero-based position in the bundle, let be derived from and by Construction 2.10 (Remark 6.14). Then:
Every Issue Note description of the action MUST be a valid encoding, and each yields the Issue Note of Definition 6.5 with that . It MUST hold that , evaluated against the state as updated by the earlier actions of the same bundle.
If , the first Issue Note of the action MUST be a reference note (Definition 6.10): its value MUST be , and its recipient MUST be the default diversified address of the all-zero Orchard spending key. The node then sets to that note.
If in , the node sets .
(ZIP 227, “Specification: Consensus Rule Changes”; ZIP 226, “Additional Consensus Rules for the assetBurn set”.) Class: specified. The encodings that (T1) and (I4) name belong to the carrier: ZIP 227 states (T1) “for every transaction” as and , fields that exist only in withdrawn ZIP 230, and (I4) by reference to the field encodings of ZIP 230; that carrier is open (Remark 8.1). ZIP 227 writes the balance of (I6) as , without the argument , which is restored here.
Four consequences are read off Construction 7.3. Burns are checked against the balance before issuance, so a transaction cannot burn units that it issues. A burn of an Asset Base without an entry fails (T4), since the default balance is and (B2) gives . A finalised Asset remains burnable, since no rule of the burn half reads . Since (I4) precedes (I7) within an action, one action may issue notes and finalise its Asset.
When a transaction that passes Construction 7.3 is added to the block chain, the leaves that it appends to the note commitment tree of its treestate are, in this order:
for each Action of the Action Group of , in order, the extracted commitment of the note that the Action creates, whatever its value and whether or not the Action is a Split Action;
then, for each Issuance Action of the Issuance Bundle of , in order, and each of its Issue Notes, in order, the extracted commitment of the note commitment computed by (I6).
The transactions of a block are taken in block order. The definition extends the Ironwood Guide’s Construction “State update” (§“Verification of a transaction”), which appends the commitments of Actions only. The position of every leaf, and hence every authentication path, is a function of the chain under this order, so nodes and wallets agree on positions only under it. Which pool’s tree the order extends is the open problem of Remark 1.7 (ZIP 227, “Addition to the Note Commitment Tree”; protocol specification, §“Note Commitment Trees”). Class: specified.
The rules of ZIP 227 place no requirement on the number of Issue Notes of an Issuance Action, and withdrawn ZIP 230, “Issuance Action Description (IssueAction)”, admits an action without notes so that an issuer can finalise an Asset without issuing more of it. Consider such an action on the Asset Base .
If when the action is processed, an action with changes nothing, and one with sets by (I7).
If , rule (I5) refers to a first Issue Note that does not exist, and the rules do not determine whether the action, finalising or not, is valid. If a finalising one were accepted, it would create the entry : an Asset finalised with no reference note and no issuance.
Class: case (b) is an open problem, listed in “Open problems” (§10.2); a rule that fixes the validity of such an action closes it.
An issuance state is reachable if it is the input or the output state of a transaction in a sequence of transactions, chained from the empty map as in Definition 7.1, each of which has an output state under Construction 7.3. A valid chain in the results of this section is such a sequence; an invalid transaction contributes no state. Every chain accepted by Construction 7.10 is a valid chain in this sense, since that procedure includes the transition.
Assume that no valid chain contains an Issuance Action without Issue Notes on an Asset Base whose is when the action is processed, which is case (b) of Remark 7.5. Then in every reachable issuance state , and for every , the Asset Base is in the domain of if and only if . Hence conditioning (I5) on the absence of an entry is equivalent to conditioning it on . Status (Definition 1.3): proved here for the specified rules; conditional on the hypothesis, which concerns the open case of Remark 7.5.
Induction over the transactions of a valid chain, the invariant being checked after every write of Construction 7.3. It holds for the empty map. Rule (T2) copies a state. Rule (T4) writes only Asset Bases with , by (B2), hence Asset Bases already in the domain, and leaves unchanged. Rule (I4) only reads. For an action on an Asset Base outside the domain, and the action has at least one Issue Note by the hypothesis, so (I5) sets to that note before (I6) and (I7) write: the entry is created together with its reference note. For an action on an Asset Base in the domain, by the invariant, and (I5) does not apply. No rule writes to or removes an entry. Both the burn step and the hypothesis are needed: without the hypothesis, a finalising action of case (b), if accepted, creates the entry by (I7). □
In every reachable issuance state, every Asset Base in the domain equals for the Asset Identifier of some accepted Issuance Action (Construction 2.10), and is therefore the value of at an input under z.cash:OrchardZSA (Table 3). For every transaction of a valid chain, the Asset Base of every pair of its burn set is in the domain of its input state, and is therefore of the same form. Status (Definition 1.3): proved here for the specified rules; unconditional, case (b) of Remark 7.5 included. The lemma discharges, in Theorem 9.5, the premise of Proposition 5.6 on the bases of burn pairs, which (B1) alone does not discharge.
Induction over the transactions of a valid chain. The initial map is empty. Rules (I4) to (I7) write only the entry at the Asset Base that Construction 7.3 derives from and by Construction 2.10, whether or not the action has Issue Notes, and so does (I7) in case (b) of Remark 7.5 if such an action is accepted. Rule (T4) writes only an Asset Base in the domain: an Asset Base outside it reads , and (B2) requires , so the check of (T4) fails. The same argument gives the second claim, since (T4) reads the input state, copied by (T2), before any issuance of the transaction. □
Every Issuance Action carries the Boolean in (Definition 6.5). An Asset is finalised in a reachable issuance state when for its Asset Base. Setting finalises the Asset by (I7), and every later Issuance Action for its Asset Base, with or without Issue Notes, fails (I4). Only (I7) writes , and it writes , so never returns from to , as Definition 7.1 states. Finalisation is the only mechanism of the issuance life cycle that ZIP 227 specifies (ZIP 227, “Requirements”, “Issuance Action” and “Specification: Consensus Rule Changes”). Class: specified.
If in a reachable issuance state of a valid chain, then in every later reachable state of the same chain and , and the balance is non-increasing from on. The Asset can still be burnt. This is a property of the map; its relation to the notes in the tree is Theorem 9.7. Status (Definition 1.3): proved here for the specified rules; unconditional.
Induction over the later transactions. Only (I7) writes , and it writes . Rule (I4) rejects every later Issuance Action for , with or without Issue Notes, since it reads , so (I6) never runs for that Asset Base again. The only other rule that writes is (T4), which subtracts. No rule of the burn half reads , so a burn of the Asset is accepted whenever (T3) and (T4) hold. □
In every reachable issuance state of a valid chain and for every Asset Base ,
the first sum over the values of the Issue Notes of Asset Base of the accepted Issuance Actions up to , the second over the values of the pairs of the burn sets of the accepted transactions up to . The balance increases only under (I6) and decreases only under (T4), so burn is the only mechanism that lowers it, and a burn of an Asset Base that has never been issued is rejected. The bound is on circulation, not on cumulative issuance (Definition 7.1). This is a property of the map; its equality with the value of the notes created and not consumed is Theorem 9.7. Status (Definition 1.3): proved here for the specified rules; unconditional.
Induction over the transactions, the claim being checked after every write. For the empty map both sides are . Rule (T2) copies a state. Rule (T4) subtracts after checking , which keeps the identity and ; an Asset Base without an entry reads , and (B2) gives , so a burn of a never-issued Asset Base fails. Rule (I6) adds after checking that the sum is at most , which keeps the identity and the upper bound; the reference note of (I5) has value and enters both sides as . No other rule writes , and a rejected transaction contributes no state. □
Figure 2 draws the transitions of one entry of the map.
The following procedure has the form of the Ironwood Guide’s Construction “Verification” (§“Verification of a transaction”). Each check is tagged with the requirements of Definition 1.8 that it serves and with the conditions of Definition 4.6 that it completes, and with its class in the sense of Definition 1.2: “specified” for the rule, followed by “carrier designed but unspecified” when its encoding exists only in withdrawn text, or “carrier open” when no design without conflict exists (Remark 8.1).
Given the note commitment tree and the nullifier set of the pool that carries OrchardZSA notes (Remark 1.7), and the issuance state , a transaction is accepted, as far as its OrchardZSA bundle and its Issuance Bundle are concerned, if and only if the following checks pass.
Per Action.
Proof. The aggregate proof of the Action Group verifies for the relation of Definition 4.6, under the OrchardZSA verifying key of Assumption 4.9, at the primary input
of each Action. [Z1, Z2, Z3 and Z5, through A1′ to A5′ and C1 to C3; statement specified, circuit and verifying key designed but unspecified.]
Spend authorisation. Each Action’s spend-authorisation signature is valid under its on (Ironwood Guide, §“Randomised validating keys”; unchanged by ZIP 226). [Requirement R5 of the Ironwood Guide’s Definition “Requirements R1 to R5”, with A6 and A7; specified, signed message designed but unspecified.]
Per Action Group and OrchardZSA bundle.
Flags. The values , and are read from the Action Group into every primary input of step (1) (Definition 4.13). [Z2, through C2; flags specified, the bit of open.]
Anchor. The anchor of the Action Group is the root of the carrying pool’s note commitment tree in the final treestate of an earlier block of the chain (Ironwood Guide, §“Anchors”). [Z2, through A3′; specified, the pool open.]
Nullifiers. The nullifiers of , real and split, are pairwise distinct and absent from the carrying pool’s nullifier set (Ironwood Guide, §“Nullifier sets”). [Z3, through A5′; specified.]
Burn set. The burn set satisfies (B1) to (B3) of Definition 5.1; this is (T3). [Z1 and Z3; specified, carrier designed but unspecified.]
Balance. The binding signature is valid on under the key of Definition 5.4, computed from the Actions’ net value commitments, the balancing value and the burn set; the balancing value enters the transparent transaction value pool as in the Ironwood Guide’s Definition “Balancing value”. [Z1 and Z2, through A4′; specified, carrier designed but unspecified; the fee terms are classified in Remark 8.4.]
Per transaction.
Issuance authorisation. If contains an Issuance Bundle, rules (I1) to (I3) of Definition 6.12 hold. [Z4; specified, signed message designed but unspecified.]
Issuance state. The output state of Construction 7.3 is defined: rules (T1), (T2) and (T4), and (I4) to (I7) for every Issuance Action. [(T1): carrier open; (T4): Z2 and Z3; (I4): Z2, Z3 and Z4; (I5) to (I7): Z3; specified.]
State update, on accepting the block that contains .
The leaves of Definition 7.4 are appended to the carrying pool’s note commitment tree. [Z2 and Z3; specified, the pool open.]
Every nullifier of , real and split, enters the carrying pool’s nullifier set. [Z3; specified.]
The issuance state becomes , chained as in Definition 7.1; the ZEC chain value pool balance of the carrying pool decreases by the balancing value, as in the Ironwood Guide’s Construction “State update”. [Z3; specified.]
The remaining checks of the Ironwood Guide’s Construction “Verification”, on the transaction’s other components and on its expiry, apply unchanged; the parsing of the OrchardZSA components depends on the carrier, which is open (Remark 8.1) (ZIP 226, “Circuit Statement”, “Additional Consensus Rules for the assetBurn set” and “Value Balance Verification”; ZIP 227, “Specification: Consensus Rule Changes” and “Addition to the Note Commitment Tree”; protocol specification, §“Transactions and Treestates”, §“Nullifier Sets” and §“Note Commitment Trees”). Class: every rule specified; the classes of the carrier, the circuit, the signed message and the pool are as tagged.
The division of the checks follows the Ironwood Guide’s Remark “Division of the checks”. Under Assumption 4.9 the proof of step (1) yields, for each Action, a witness of Definition 4.6. Whether is a root that the chain recorded, whether a nullifier is new, and whether a burn or an issuance is admitted by the issuance state are facts about the chain’s history, which no proof over one Action’s data attests; the verifier checks them against its state, in steps (4), (5) and (9). Issuance is checked entirely outside the proof, from public data (Remark 6.6). Table 6 maps each requirement to the conditions of the statement, the issuance and state rules, the checks outside the proof and the result that discharges it, the last as in Table 2.
| Requirement | Conditions | Issuance and state rules | Checks | Result |
|---|---|---|---|---|
| Z1, per-Asset conservation | A1′, A2′, A4′, C1 | none | (6), (7) | Theorem 9.5, “No counterfeiting across Assets” |
| Z2, no counterfeiting across Assets | A1′, A2′, A3′, A4′, C1, C2, C3 | (I4), the derived base; (T4) with Lemma 7.7; Definition 7.4 | (3), (4), (7), (10) | Theorem 9.5, “No counterfeiting across Assets” |
| Z3, supply integrity | A4′, value of Split Inputs; A5′, split nullifier | (T4), (I4) to (I7) | (5), (6), (9) to (12) | Theorem 9.7, “Supply integrity”; Proposition 7.8, “Finalised supply never grows” |
| Z4, issuance authority | none | (I1) to (I3); (I4), the base derived from | (8); (5), through | Theorem 9.8, “Issuance authority” |
| Z5, hiding of the Asset type | the statement as a whole under Assumption 4.10; A4′, A5′ | none, issuance being public (Remark 6.6) | none beyond the published burn set | Theorem 9.11, “Privacy of the Asset type” |