Skip to content

Commit

Permalink
ZIP 234: Update specification for DEPLOYMENT_BLOCK_HEIGHT
Browse files Browse the repository at this point in the history
Co-authored-by: shielded-nate <[email protected]>
  • Loading branch information
nuttycom and shielded-nate committed Nov 5, 2024
1 parent a0c503c commit b0d3760
Showing 1 changed file with 31 additions and 13 deletions.
44 changes: 31 additions & 13 deletions zips/zip-0234.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ Key Objectives:
4. We want the issuance rate to remain similar to the historical rate for Zcash
(and before that, Bitcoin).
5. We want issuance to be easy for all network users to understand and predict.
6. We want the new issuance to activate at a block with as minimal a delta from
the current issuance as possible.

The current Zcash economic model, inherited from Bitcoin, includes a halving
mechanism that dictates the issuance of new coins. While this has been
Expand Down Expand Up @@ -94,11 +96,38 @@ TODO daira: add a requirement that makes the initial total issuance match the pr

# Specification

## Definitions
## Parameters

`BLOCK_SUBSIDY_FRACTION` = 4126 / 10,000,000,000 or `0.0000004126`

`DEPLOYMENT_BLOCK_HEIGHT` = 2726400
`DEPLOYMENT_BLOCK_HEIGHT` = `TBD`

The block height will be chosen by the following criteria:

- It is after NU7 activation height.
- It is calculated to be the lowest height after the the second halving at
which the NSM issuance would be less than the current BTC-style issuance
_neglecting_ any burnt ZEC (ie. assuming the amount of ZEC burnt is exactly 0).

This selection is intended to achieve Key Objective 6 while still being a
constant height. An alternative would be to have a dynamic "latch" style
activation which would calculate the activation height by testing the "less
than" conditional with every block after the second halving. We prefer the
pre-defined constant height parameter to give everyone more _time_ certainty at
the cost of _issuance level_ certainty. The difference in up-front calculation
versus dynamic calculation is whether or not burns are accounted for (since
future burns cannot be calculated up-front). This means with the pre-defined
constant parameter approach, issuance will jump _up_ some amount at activation.
This amount should be equivalent to all ZEC burnt prior to that height times
`BLOCK_SUBSIDY_FRACTION`. For example, if a total of 100,000 ZEC were burnt
prior to the pre-defined constant activation height, then at activation the
issuance would be larger than BTC-style issuance by `100_000 ZEC *
BLOCK_SUBSIDY_FRACTION` which we calculate equals `0.04126 ZEC`. This example
is chosen to demonstrate that a very large burn amount (much larger than
expected) would elevate issuance by a relatively small amount. For this reason,
we believe a pre-defined constant is a better approach to achieving Key
Objective 6 than a "dynamic latch" logic because it is so much simpler to
implement and reason about.

`MoneyReserveAfter(block_height)` = The value of the Money Reserve after the
specified block height.
Expand Down Expand Up @@ -140,17 +169,6 @@ chose a power-of-10 denominator for simplicity.

TODO for ZIP owners: How many ZEC per day?

## `DEPLOYMENT_BLOCK_HEIGHT`

The deployment should happen at the next halving, which is block `2726400`.

Since there is a planned halving at this point, there will already be a
significant "shock" caused by the drop in issuance caused by the halving. This
reduces surprise and thus increases security, satisfying **Requirement 5**.
Also, due to the nature of the smoothed curve having a portion of the curve
above the respective step function line at times, this will maximally _reduce_
the issuance shock at the `DEPLOYMENT_BLOCK_HEIGHT`.

## Visualization of the Smoothed Curve

The following graph compares issuance for the current halving-based step
Expand Down

0 comments on commit b0d3760

Please sign in to comment.