From 3e4ca01c90c4f04570b4b8fafc2dcbd155613bb0 Mon Sep 17 00:00:00 2001 From: Tomek Piotrowski Date: Mon, 28 Aug 2023 15:16:11 +0200 Subject: [PATCH 01/55] Smooth Out The Block Subsidy Issuance --- draft-issuance.html | 159 +++++++++++++++++++++++++++++++++++++++++ draft-issuance.md | 169 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 328 insertions(+) create mode 100644 draft-issuance.html create mode 100644 draft-issuance.md diff --git a/draft-issuance.html b/draft-issuance.html new file mode 100644 index 000000000..93f69ae02 --- /dev/null +++ b/draft-issuance.html @@ -0,0 +1,159 @@ + + + + Draft issuance: Smooth Out The Block Subsidy Issuance + + + + + +
ZIP: 
+Title: Smooth Out The Block Subsidy Issuance
+Owners: Jason McGee <jason@shieldedlabs.com>
+        Mark Henderson <mark@equilibrium.co>
+        Tomek Piotrowski <tomek@eiger.co>
+        Mariusz Pilarek <mariusz@eiger.co>
+Original-Authors: Nathan Wilcox
+Credits: Nathan Wilcox
+         Mark Henderson
+         Jason McGee
+Status: Draft
+Category: Consensus
+Created: 2023-08-23
+License: BSD-2-Clause
+

Terminology

+

The key words “MUST”, “SHOULD”, “SHOULD NOT”, “MAY”, “RECOMMENDED”, +“OPTIONAL”, and “REQUIRED” in this document are to be interpreted as +described in RFC 2119. [1]

+

“Network upgrade” - to be interpreted as described in ZIP 200. +[2]

+

“Block Subsidy” - the algorithmic issuance of ZEC on block creation – +part of the consensus rules. Split between the miner and the Dev Fund. +Also known as Block Reward.

+

“Issuance” - The method by which unmined or unissued ZEC is converted +to ZEC available to users of the network

+

“We” - the ZIP authors, owners listed in the above front matter

+

AVAILABLE_SUBSIDIES(h)” is the total ZEC available to +pay out Block Subsidies from at block height h, ie. “not +yet mined ZEC at h”.

+

BLOCK_SUBSIDY_FRACTION” = 41 / 100,000,000 or +0.00000041

+

Abstract

+

This ZIP proposes a change to how nodes calculate the block +subsidy.

+

Instead of following a step function around the four-year halving +cycle inherited from Bitcoin, we propose a slow exponential “smoothing” +of the curve. The new issuance scheme would approximate the current 4 +year cycle, and results in the last zatoshi being spent in around 113 +years.

+

Motivation

+

Zcash’s economic model is inherited from Bitcoin and includes the +concept of a halving mechanism to regulate the issuance of new coins. +This approach, though foundational, invites a reevaluation amid Zcash’s +ongoing evolution. As the network matures, the need to address potential +future challenges and ensure a sustained and stable economic ecosystem +becomes apparent. The transition to a smoothed emissions curve offers an +opportunity to adjust the network’s issuance dynamics while maintaining +the supply cap of 21,000,000 coins. By doing so, Zcash endeavors to +optimize its economic framework, accommodating changing circumstances +while maintaining predictability and stability in rewards +distribution.

+

This proposal outlines a solution to address challenges associated +with the existing block subsidy issuance mechanism in the Zcash network. +The primary goal of this proposal is to introduce a more predictable and +stable issuance of ZEC by smoothing out the issuance curve while +preserving the supply cap. It’s important to note that this proposal +does not seek to alter the fundamental aspects of Zcash’s issuance +policy. The average block subsidy size over time will remain the same +and the funds for block subsidies will last a similar amount of time. +Instead, it focuses solely on enhancing the predictability and +consistency of the block subsidy issuance process.

+

Smoothing the emissions curve helps ensure that the network remains +economically viable and stable as it transitions from a traditional +issuance mechanism to one that maintains a sustainable and predictable +issuance of rewards over time. It prevents abrupt changes in the rate of +newly issued coins, which could lead to disruptions in the network’s +economic model and potentially impact its security and sustainability. A +smoother emissions curve allows for a more gradual and controlled +transition, providing ZEC stakeholders and participants with a clear +understanding of how rewards will be distributed over time.

+

Specification

+

Smoothing the issuance curve is possible using an exponential decay +formula that satisfies the following requirements:

+

Requirements

+
    +
  1. Block subsidies MUST be weakly decreasing
  2. +
  3. Block subsidies SHOULD approximate a continuous function
  4. +
  5. When AVAILABLE_SUBSIDIES(h) > 0 then block subsidies +for block h MUST always be > 0, preventing +a final “unmined” zatoshi
  6. +
  7. For any 4 year period, all paid out block subsidies MUST equal +approximately half of AVAILABLE_SUBSIDIES at the beginning +of that 4 year period
  8. +
  9. This functionality MUST be introduced as part of a network +upgrade
  10. +
+

The above requirements assume no deflationary action, i.e. that no +ZEC is added to AVAILABLE_SUBSIDIES. They are referenced +below as Rn.

+

Solution

+

Given the block height h define a function +S, such that:

+

S(h) = Block subsidy for a given h, +that satisfies above requirements.

+

Please note that

+

AVAILABLE_SUBSIDIES(h+1) = AVAILABLE_SUBSIDIES(h) - S(h) +assuming no deflationary action.

+

An exponential decay function S satisfies +R1 and R2 above:

+

S(h) = BLOCK_SUBSIDY_FRACTION * AVAILABLE_SUBSIDIES(h)

+

Finally, to satisfy R3 above we need to always round +up to at least 1 Zatoshi if +AVAILABLE_SUBSIDIES(h) > 0:

+

S(h) = ROUND_UP(BLOCK_SUBSIDY_FRACTION * AVAILABLE_SUBSIDIES(h))

+

Rationale

+

BLOCK_SUBSIDY_FRACTION

+

That value of 41 / 100_000_000 was selected so that it +satisfies the equation:

+

(1 - BLOCK_SUBSIDY_FRACTION)^NUMBER_OF_BLOCKS_IN_4_YEARS ~ ½

+

Meaning after a period of 4 years around half of +AVAILABLE_SUBSIDIES will be paid out as block subsidies, +thus satisfying R4.

+

Other Notes

+

The suggested implementation avoids using float numbers. Rust and C++ +will both round the result of the final division up, satisfying +R3 above.

+

Appendix: Simulation

+

We encourage readers to run the following Rust code, which simulates +block subsidies. According to this simulation, assuming no deflationary +action, block subsidies would last for approximately 113 years:

+

Rust Code

+
fn main() {
+    // approximate available subsidies in August of 2023
+    let mut available_subsidies: i64 = 4671731 * 100_000_000;
+    let mut block: u32 = 0;
+
+    while available_subsidies > 0 { 
+        let block_subsidy = (available_subsidies * 41 + 99_999_999) / 100_000_000;
+        available_subsidies -= block_subsidy;
+
+        println!(
+            "{} ({} years): {}({} ZEC) {}({} ZEC)",
+            block,                             // current block
+            block / 420_768,                   // ~ current year
+            block_subsidy,                     // block subsidy in zatoshis
+            block_subsidy / 100_000_000,       // block subsidy in ZEC
+            available_subsidies,               // available subsidies in zatoshis
+            available_subsidies / 100_000_000  // available subsidies in ZEC
+        );
+
+        block += 1;
+    }   
+}
+

Last line of output of the above program is:

+

47699804 (113 years): 1(0 ZEC) 0(0 ZEC)

+

Note the addition of 99,999,999 before division to force rounding up +of non-zero values.

+ + diff --git a/draft-issuance.md b/draft-issuance.md new file mode 100644 index 000000000..bd47dade7 --- /dev/null +++ b/draft-issuance.md @@ -0,0 +1,169 @@ +``` +ZIP: +Title: Smooth Out The Block Subsidy Issuance +Owners: Jason McGee + Mark Henderson + Tomek Piotrowski + Mariusz Pilarek +Original-Authors: Nathan Wilcox +Credits: Nathan Wilcox + Mark Henderson + Jason McGee +Status: Draft +Category: Consensus +Created: 2023-08-23 +License: BSD-2-Clause +``` + +# Terminology + +The key words “MUST”, “SHOULD”, “SHOULD NOT”, “MAY”, “RECOMMENDED”, “OPTIONAL”, +and “REQUIRED” in this document are to be interpreted as described in RFC 2119. [1] + +"Network upgrade" - to be interpreted as described in ZIP 200. [2] + +“Block Subsidy” - the algorithmic issuance of ZEC on block creation – part of +the consensus rules. Split between the miner and the Dev Fund. Also known as Block Reward. + +“Issuance” - The method by which unmined or unissued ZEC is converted to ZEC available +to users of the network + +“We” - the ZIP authors, owners listed in the above front matter + +“`AVAILABLE_SUBSIDIES(h)`” is the total ZEC available to pay out Block Subsidies from at +block height `h`, ie. “not yet mined ZEC at h”. + +“`BLOCK_SUBSIDY_FRACTION`” = 41 / 100,000,000 or `0.00000041` + +# Abstract + +This ZIP proposes a change to how nodes calculate the block subsidy. + +Instead of following a step function around the four-year halving cycle inherited +from Bitcoin, we propose a slow exponential “smoothing” of the curve. The new issuance +scheme would approximate the current 4 year cycle, and results in the last +zatoshi being spent in around 113 years. + +# Motivation + +Zcash’s economic model is inherited from Bitcoin and includes the concept of a halving +mechanism to regulate the issuance of new coins. This approach, though foundational, invites +a reevaluation amid Zcash’s ongoing evolution. As the network matures, the need to address +potential future challenges and ensure a sustained and stable economic ecosystem becomes +apparent. The transition to a smoothed emissions curve offers an opportunity to adjust the network's +issuance dynamics while maintaining the supply cap of 21,000,000 coins. By doing so, Zcash +endeavors to optimize its economic framework, accommodating changing circumstances while +maintaining predictability and stability in rewards distribution. + +This proposal outlines a solution to address challenges associated with the existing block +subsidy issuance mechanism in the Zcash network. The primary goal of this proposal is to +introduce a more predictable and stable issuance of ZEC by smoothing out the issuance +curve while preserving the supply cap. It's important to note that this proposal does +not seek to alter the fundamental aspects of Zcash's issuance policy. The average block +subsidy size over time will remain the same and the funds for block subsidies will last +a similar amount of time. Instead, it focuses solely on enhancing the predictability +and consistency of the block subsidy issuance process. + +Smoothing the emissions curve helps ensure that the network remains economically +viable and stable as it transitions from a traditional issuance mechanism to one +that maintains a sustainable and predictable issuance of rewards over time. It +prevents abrupt changes in the rate of newly issued coins, which could lead to +disruptions in the network's economic model and potentially impact its security +and sustainability. A smoother emissions curve allows for a more gradual and controlled +transition, providing ZEC stakeholders and participants with a clear understanding of +how rewards will be distributed over time. + + + +# Specification + +Smoothing the issuance curve is possible using an exponential decay formula that +satisfies the following requirements: + +## Requirements + +1. Block subsidies MUST be weakly decreasing +2. Block subsidies SHOULD approximate a continuous function +3. When `AVAILABLE_SUBSIDIES(h) > 0` then block subsidies for block `h` +MUST always be `> 0`, preventing a final “unmined” zatoshi +4. For any 4 year period, all paid out block subsidies MUST equal approximately +half of `AVAILABLE_SUBSIDIES` at the beginning of that 4 year period +5. This functionality MUST be introduced as part of a network upgrade + +The above requirements assume no deflationary action, i.e. that no ZEC is added +to `AVAILABLE_SUBSIDIES`. They are referenced below as **Rn**. + +## Solution + +Given the block height `h` define a function **S**, such that: + +**S(h)** = Block subsidy for a given `h`, that satisfies above requirements. + +Please note that + +`AVAILABLE_SUBSIDIES(h+1) = AVAILABLE_SUBSIDIES(h) - S(h)` assuming no deflationary action. + +An exponential decay function **S** satisfies **R1** and **R2** above: + +`S(h) = BLOCK_SUBSIDY_FRACTION * AVAILABLE_SUBSIDIES(h)` + +Finally, to satisfy **R3** above we need to always round up to at least 1 Zatoshi +if `AVAILABLE_SUBSIDIES(h) > 0`: + +`S(h) = ROUND_UP(BLOCK_SUBSIDY_FRACTION * AVAILABLE_SUBSIDIES(h))` + +# Rationale + +## `BLOCK_SUBSIDY_FRACTION` + +That value of `41 / 100_000_000` was selected so that it satisfies the equation: + +`(1 - BLOCK_SUBSIDY_FRACTION)^NUMBER_OF_BLOCKS_IN_4_YEARS ~ ½` + +Meaning after a period of 4 years around half of `AVAILABLE_SUBSIDIES` will be paid out +as block subsidies, thus satisfying **R4**. + + +## Other Notes + +The suggested implementation avoids using float numbers. Rust and C++ will both round +the result of the final division up, satisfying **R3** above. + +# Appendix: Simulation + +We encourage readers to run the following Rust code, which simulates block subsidies. +According to this simulation, assuming no deflationary action, block subsidies would +last for approximately 113 years: + +## Rust Code + +```rust +fn main() { + // approximate available subsidies in August of 2023 + let mut available_subsidies: i64 = 4671731 * 100_000_000; + let mut block: u32 = 0; + + while available_subsidies > 0 { + let block_subsidy = (available_subsidies * 41 + 99_999_999) / 100_000_000; + available_subsidies -= block_subsidy; + + println!( + "{} ({} years): {}({} ZEC) {}({} ZEC)", + block, // current block + block / 420_768, // ~ current year + block_subsidy, // block subsidy in zatoshis + block_subsidy / 100_000_000, // block subsidy in ZEC + available_subsidies, // available subsidies in zatoshis + available_subsidies / 100_000_000 // available subsidies in ZEC + ); + + block += 1; + } +} +``` + +Last line of output of the above program is: + +`47699804 (113 years): 1(0 ZEC) 0(0 ZEC)` + +Note the addition of 99,999,999 before division to force rounding up of non-zero values. From 753d1801f877da87a4939e63e8b2c08a97f091a5 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Tue, 19 Sep 2023 10:01:05 -0400 Subject: [PATCH 02/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index bd47dade7..a88125800 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -42,7 +42,7 @@ This ZIP proposes a change to how nodes calculate the block subsidy. Instead of following a step function around the four-year halving cycle inherited from Bitcoin, we propose a slow exponential “smoothing” of the curve. The new issuance scheme would approximate the current 4 year cycle, and results in the last -zatoshi being spent in around 113 years. +zatoshi being issued in around 114 years. # Motivation From b0c142f6e9148340e269bb4fe00f57cad9d3b101 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Tue, 19 Sep 2023 10:01:21 -0400 Subject: [PATCH 03/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index a88125800..e0bdb3cf9 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -60,7 +60,7 @@ subsidy issuance mechanism in the Zcash network. The primary goal of this propos introduce a more predictable and stable issuance of ZEC by smoothing out the issuance curve while preserving the supply cap. It's important to note that this proposal does not seek to alter the fundamental aspects of Zcash's issuance policy. The average block -subsidy size over time will remain the same and the funds for block subsidies will last +subsidy amount over time will remain the same and the funds for block subsidies will last a similar amount of time. Instead, it focuses solely on enhancing the predictability and consistency of the block subsidy issuance process. From 54317ed4faa818c37c5c5c95323c0bc9ce2fa168 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Tue, 19 Sep 2023 10:01:31 -0400 Subject: [PATCH 04/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index e0bdb3cf9..4e72176bf 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -93,7 +93,7 @@ half of `AVAILABLE_SUBSIDIES` at the beginning of that 4 year period The above requirements assume no deflationary action, i.e. that no ZEC is added to `AVAILABLE_SUBSIDIES`. They are referenced below as **Rn**. -## Solution +## Issuance Calculation Given the block height `h` define a function **S**, such that: From 2d691eb5fa946d84cd6bf64bdf43a6dd07d0d274 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Tue, 19 Sep 2023 10:01:44 -0400 Subject: [PATCH 05/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index 4e72176bf..7649d1b22 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -99,18 +99,14 @@ Given the block height `h` define a function **S**, such that: **S(h)** = Block subsidy for a given `h`, that satisfies above requirements. -Please note that +Using an exponential decay function for **BlockSubsidy** satisfies **G1** and **G2** above: -`AVAILABLE_SUBSIDIES(h+1) = AVAILABLE_SUBSIDIES(h) - S(h)` assuming no deflationary action. +`BlockSubsidy(h) = BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1)` -An exponential decay function **S** satisfies **R1** and **R2** above: +Finally, to satisfy **G3** above we need to always round up to at least 1 Zatoshi +if `ZsfBalanceAfter(h - 1) > 0`: -`S(h) = BLOCK_SUBSIDY_FRACTION * AVAILABLE_SUBSIDIES(h)` - -Finally, to satisfy **R3** above we need to always round up to at least 1 Zatoshi -if `AVAILABLE_SUBSIDIES(h) > 0`: - -`S(h) = ROUND_UP(BLOCK_SUBSIDY_FRACTION * AVAILABLE_SUBSIDIES(h))` +`BlockSubsidy(h) = ceiling(BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1))` # Rationale From 66dab1e63da09586cdea457d0d33afbc1f343bf9 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Tue, 19 Sep 2023 10:01:57 -0400 Subject: [PATCH 06/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index 7649d1b22..800342bf7 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -112,12 +112,12 @@ if `ZsfBalanceAfter(h - 1) > 0`: ## `BLOCK_SUBSIDY_FRACTION` -That value of `41 / 100_000_000` was selected so that it satisfies the equation: +The value `41 / 100_000_000` satisfies the approximation: -`(1 - BLOCK_SUBSIDY_FRACTION)^NUMBER_OF_BLOCKS_IN_4_YEARS ~ ½` +`(1 - BLOCK_SUBSIDY_FRACTION)^NUMBER_OF_BLOCKS_IN_4_YEARS ≈ 0.5` -Meaning after a period of 4 years around half of `AVAILABLE_SUBSIDIES` will be paid out -as block subsidies, thus satisfying **R4**. +Meaning after a period of 4 years around half of `ZSF_BALANCE` will be paid out +as block subsidies, thus satisfying **G4**. ## Other Notes From 907fe1cf7b28ae7b7ce4bdb50bf4fe85aecb6611 Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Tue, 19 Sep 2023 10:36:30 -0400 Subject: [PATCH 07/55] update: add ZSF_BALANCE and ZsfBalanceAfter(h) --- draft-issuance.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index 800342bf7..99b906dad 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -30,11 +30,15 @@ to users of the network “We” - the ZIP authors, owners listed in the above front matter -“`AVAILABLE_SUBSIDIES(h)`” is the total ZEC available to pay out Block Subsidies from at -block height `h`, ie. “not yet mined ZEC at h”. +“`ZSF_BALANCE(h)`” is the total ZEC available in the Zcash Sustainability Fund (ZSF), +described in ZIP #TODO#. This is used to pay out Block Subsidies from at block height +`h`, ie. “not yet mined ZEC at h”. “`BLOCK_SUBSIDY_FRACTION`” = 41 / 100,000,000 or `0.00000041` +"`ZsfBalanceAfter(h)`" is the total ZEC available in the ZSF _after_ the calculation +involving the `BLOCK_SUBSIDY_FRACTION` is applied. + # Abstract This ZIP proposes a change to how nodes calculate the block subsidy. @@ -84,14 +88,14 @@ satisfies the following requirements: 1. Block subsidies MUST be weakly decreasing 2. Block subsidies SHOULD approximate a continuous function -3. When `AVAILABLE_SUBSIDIES(h) > 0` then block subsidies for block `h` +3. When `ZSF_BALANCE(h) > 0` then block subsidies for block `h` MUST always be `> 0`, preventing a final “unmined” zatoshi 4. For any 4 year period, all paid out block subsidies MUST equal approximately -half of `AVAILABLE_SUBSIDIES` at the beginning of that 4 year period +half of `ZSF_BALANCE` at the beginning of that 4 year period 5. This functionality MUST be introduced as part of a network upgrade The above requirements assume no deflationary action, i.e. that no ZEC is added -to `AVAILABLE_SUBSIDIES`. They are referenced below as **Rn**. +to `ZSF_BALANCE`. They are referenced below as **Rn**. ## Issuance Calculation From 8b725d868d2e4de2b8a852475543134d6c51002f Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Tue, 19 Sep 2023 16:17:41 -0400 Subject: [PATCH 08/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index 99b906dad..ccaa30150 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -84,7 +84,7 @@ how rewards will be distributed over time. Smoothing the issuance curve is possible using an exponential decay formula that satisfies the following requirements: -## Requirements +## Issuance Goals 1. Block subsidies MUST be weakly decreasing 2. Block subsidies SHOULD approximate a continuous function From 087f7b9a5dbb1ed808499b5a1a3abd4141d1b8f8 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Tue, 19 Sep 2023 16:17:51 -0400 Subject: [PATCH 09/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index ccaa30150..667795f9f 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -87,7 +87,7 @@ satisfies the following requirements: ## Issuance Goals 1. Block subsidies MUST be weakly decreasing -2. Block subsidies SHOULD approximate a continuous function +2. Block subsidies approximate a continuous function 3. When `ZSF_BALANCE(h) > 0` then block subsidies for block `h` MUST always be `> 0`, preventing a final “unmined” zatoshi 4. For any 4 year period, all paid out block subsidies MUST equal approximately From e3a28eb4ffb41dd0a24a9346d2bc3b4486c48c12 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Tue, 19 Sep 2023 16:18:19 -0400 Subject: [PATCH 10/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index 667795f9f..add02f63a 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -86,7 +86,7 @@ satisfies the following requirements: ## Issuance Goals -1. Block subsidies MUST be weakly decreasing +1. Block subsidies are monotonically decreasing, as long as `ZsfBalanceAfter(h)` is monotonically decreasing 2. Block subsidies approximate a continuous function 3. When `ZSF_BALANCE(h) > 0` then block subsidies for block `h` MUST always be `> 0`, preventing a final “unmined” zatoshi From 609a3c66ec4a5def1bef679f20e8f9f7a17082f1 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Tue, 19 Sep 2023 16:18:46 -0400 Subject: [PATCH 11/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index add02f63a..56e8b96ec 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -30,15 +30,12 @@ to users of the network “We” - the ZIP authors, owners listed in the above front matter -“`ZSF_BALANCE(h)`” is the total ZEC available in the Zcash Sustainability Fund (ZSF), -described in ZIP #TODO#. This is used to pay out Block Subsidies from at block height -`h`, ie. “not yet mined ZEC at h”. +“`ZsfBalanceAfter(h)`” is the total ZEC available in the Zcash Sustainability Fund (ZSF) after the transactions +in block `h`, described in ZIP #TODO reference#. The Sustainability Fund is used to pay out Block Subsidies +from unmined ZEC, and other fund deposits. “`BLOCK_SUBSIDY_FRACTION`” = 41 / 100,000,000 or `0.00000041` -"`ZsfBalanceAfter(h)`" is the total ZEC available in the ZSF _after_ the calculation -involving the `BLOCK_SUBSIDY_FRACTION` is applied. - # Abstract This ZIP proposes a change to how nodes calculate the block subsidy. From 5e6c367720fc2d6707948bdaaded7f7a82a17bcc Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Wed, 27 Sep 2023 12:26:23 -0400 Subject: [PATCH 12/55] update: references and definitions --- draft-issuance.html | 252 +++++++++++++++++++------------------------- draft-issuance.md | 19 +++- 2 files changed, 123 insertions(+), 148 deletions(-) diff --git a/draft-issuance.html b/draft-issuance.html index 93f69ae02..05812d483 100644 --- a/draft-issuance.html +++ b/draft-issuance.html @@ -1,13 +1,4 @@ - - - - Draft issuance: Smooth Out The Block Subsidy Issuance - - - - - -
ZIP: 
+

ZIP: Title: Smooth Out The Block Subsidy Issuance Owners: Jason McGee <jason@shieldedlabs.com> Mark Henderson <mark@equilibrium.co> @@ -20,140 +11,115 @@ Status: Draft Category: Consensus Created: 2023-08-23 -License: BSD-2-Clause

-

Terminology

-

The key words “MUST”, “SHOULD”, “SHOULD NOT”, “MAY”, “RECOMMENDED”, -“OPTIONAL”, and “REQUIRED” in this document are to be interpreted as -described in RFC 2119. [1]

-

“Network upgrade” - to be interpreted as described in ZIP 200. -[2]

-

“Block Subsidy” - the algorithmic issuance of ZEC on block creation – -part of the consensus rules. Split between the miner and the Dev Fund. -Also known as Block Reward.

-

“Issuance” - The method by which unmined or unissued ZEC is converted -to ZEC available to users of the network

+License: BSD-2-Clause

+

Terminology

+

The key words “MUST”, “SHOULD”, “SHOULD NOT”, “MAY”, “RECOMMENDED”, “OPTIONAL”, +and “REQUIRED” in this document are to be interpreted as described in RFC 2119. [1]

+

"Network upgrade" - to be interpreted as described in ZIP 200. [2]

+

“Block Subsidy” - to be interpreted as described in ZIP TBD [3]

+

“Issuance” - to be interpreted as described in ZIP TBD [3]

“We” - the ZIP authors, owners listed in the above front matter

-

AVAILABLE_SUBSIDIES(h)” is the total ZEC available to -pay out Block Subsidies from at block height h, ie. “not -yet mined ZEC at h”.

-

BLOCK_SUBSIDY_FRACTION” = 41 / 100,000,000 or -0.00000041

-

Abstract

-

This ZIP proposes a change to how nodes calculate the block -subsidy.

-

Instead of following a step function around the four-year halving -cycle inherited from Bitcoin, we propose a slow exponential “smoothing” -of the curve. The new issuance scheme would approximate the current 4 -year cycle, and results in the last zatoshi being spent in around 113 -years.

-

Motivation

-

Zcash’s economic model is inherited from Bitcoin and includes the -concept of a halving mechanism to regulate the issuance of new coins. -This approach, though foundational, invites a reevaluation amid Zcash’s -ongoing evolution. As the network matures, the need to address potential -future challenges and ensure a sustained and stable economic ecosystem -becomes apparent. The transition to a smoothed emissions curve offers an -opportunity to adjust the network’s issuance dynamics while maintaining -the supply cap of 21,000,000 coins. By doing so, Zcash endeavors to -optimize its economic framework, accommodating changing circumstances -while maintaining predictability and stability in rewards -distribution.

-

This proposal outlines a solution to address challenges associated -with the existing block subsidy issuance mechanism in the Zcash network. -The primary goal of this proposal is to introduce a more predictable and -stable issuance of ZEC by smoothing out the issuance curve while -preserving the supply cap. It’s important to note that this proposal -does not seek to alter the fundamental aspects of Zcash’s issuance -policy. The average block subsidy size over time will remain the same -and the funds for block subsidies will last a similar amount of time. -Instead, it focuses solely on enhancing the predictability and -consistency of the block subsidy issuance process.

-

Smoothing the emissions curve helps ensure that the network remains -economically viable and stable as it transitions from a traditional -issuance mechanism to one that maintains a sustainable and predictable -issuance of rewards over time. It prevents abrupt changes in the rate of -newly issued coins, which could lead to disruptions in the network’s -economic model and potentially impact its security and sustainability. A -smoother emissions curve allows for a more gradual and controlled -transition, providing ZEC stakeholders and participants with a clear -understanding of how rewards will be distributed over time.

-

Specification

-

Smoothing the issuance curve is possible using an exponential decay -formula that satisfies the following requirements:

-

Requirements

-
    -
  1. Block subsidies MUST be weakly decreasing
  2. -
  3. Block subsidies SHOULD approximate a continuous function
  4. -
  5. When AVAILABLE_SUBSIDIES(h) > 0 then block subsidies -for block h MUST always be > 0, preventing -a final “unmined” zatoshi
  6. -
  7. For any 4 year period, all paid out block subsidies MUST equal -approximately half of AVAILABLE_SUBSIDIES at the beginning -of that 4 year period
  8. -
  9. This functionality MUST be introduced as part of a network -upgrade
  10. +

    ZsfBalanceAfter(h)” is the total ZEC available in the Zcash Sustainability Fund (ZSF) after the transactions +in block h, described in ZIP #TODO reference#. The Sustainability Fund is used to pay out Block Subsidies +from unmined ZEC, and other fund deposits.

    +

    BLOCK_SUBSIDY_FRACTION” = 41 / 100,000,000 or 0.00000041

    +

    "NUMBER_OF_BLOCKS_IN_4_YEARS" = (365.25 * 24 * 60 * 60/75 * 4), or 1_683_072

    +

    Abstract

    +

    This ZIP proposes a change to how nodes calculate the block subsidy.

    +

    Instead of following a step function around the four-year halving cycle inherited +from Bitcoin, we propose a slow exponential “smoothing” of the curve. The new issuance +scheme would approximate the current 4 year cycle, and results in the last +zatoshi being issued in around 114 years.

    +

    Motivation

    +

    Zcash’s economic model is inherited from Bitcoin and includes the concept of a halving +mechanism to regulate the issuance of new coins. This approach, though foundational, invites + a reevaluation amid Zcash’s ongoing evolution. As the network matures, the need to address +potential future challenges and ensure a sustained and stable economic ecosystem becomes +apparent. The transition to a smoothed emissions curve offers an opportunity to adjust the network's +issuance dynamics while maintaining the supply cap of 21,000,000 coins. By doing so, Zcash +endeavors to optimize its economic framework, accommodating changing circumstances while +maintaining predictability and stability in rewards distribution.

    +

    This proposal outlines a solution to address challenges associated with the existing block +subsidy issuance mechanism in the Zcash network. The primary goal of this proposal is to +introduce a more predictable and stable issuance of ZEC by smoothing out the issuance +curve while preserving the supply cap. It's important to note that this proposal does +not seek to alter the fundamental aspects of Zcash's issuance policy. The average block +subsidy amount over time will remain the same and the funds for block subsidies will last +a similar amount of time. Instead, it focuses solely on enhancing the predictability +and consistency of the block subsidy issuance process.

    +

    Smoothing the emissions curve helps ensure that the network remains economically +viable and stable as it transitions from a traditional issuance mechanism to one +that maintains a sustainable and predictable issuance of rewards over time. It +prevents abrupt changes in the rate of newly issued coins, which could lead to +disruptions in the network's economic model and potentially impact its security +and sustainability. A smoother emissions curve allows for a more gradual and controlled +transition, providing ZEC stakeholders and participants with a clear understanding of +how rewards will be distributed over time.

    +

    Specification

    +

    Smoothing the issuance curve is possible using an exponential decay formula that +satisfies the following requirements:

    +

    Issuance Goals

    +
      +
    1. Block subsidies are monotonically decreasing, as long as ZsfBalanceAfter(h) is monotonically decreasing
    2. +
    3. Block subsidies approximate a continuous function
    4. +
    5. When ZSF_BALANCE(h) > 0 then block subsidies for block h +MUST always be > 0, preventing a final “unmined” zatoshi
    6. +
    7. For any 4 year period, all paid out block subsidies MUST equal approximately +half of ZSF_BALANCE at the beginning of that 4 year period
    8. +
    9. This functionality MUST be introduced as part of a network upgrade
    -

    The above requirements assume no deflationary action, i.e. that no -ZEC is added to AVAILABLE_SUBSIDIES. They are referenced -below as Rn.

    -

    Solution

    -

    Given the block height h define a function -S, such that:

    -

    S(h) = Block subsidy for a given h, -that satisfies above requirements.

    -

    Please note that

    -

    AVAILABLE_SUBSIDIES(h+1) = AVAILABLE_SUBSIDIES(h) - S(h) -assuming no deflationary action.

    -

    An exponential decay function S satisfies -R1 and R2 above:

    -

    S(h) = BLOCK_SUBSIDY_FRACTION * AVAILABLE_SUBSIDIES(h)

    -

    Finally, to satisfy R3 above we need to always round -up to at least 1 Zatoshi if -AVAILABLE_SUBSIDIES(h) > 0:

    -

    S(h) = ROUND_UP(BLOCK_SUBSIDY_FRACTION * AVAILABLE_SUBSIDIES(h))

    -

    Rationale

    -

    BLOCK_SUBSIDY_FRACTION

    -

    That value of 41 / 100_000_000 was selected so that it -satisfies the equation:

    -

    (1 - BLOCK_SUBSIDY_FRACTION)^NUMBER_OF_BLOCKS_IN_4_YEARS ~ ½

    -

    Meaning after a period of 4 years around half of -AVAILABLE_SUBSIDIES will be paid out as block subsidies, -thus satisfying R4.

    -

    Other Notes

    -

    The suggested implementation avoids using float numbers. Rust and C++ -will both round the result of the final division up, satisfying -R3 above.

    -

    Appendix: Simulation

    -

    We encourage readers to run the following Rust code, which simulates -block subsidies. According to this simulation, assuming no deflationary -action, block subsidies would last for approximately 113 years:

    -

    Rust Code

    -
    fn main() {
    -    // approximate available subsidies in August of 2023
    -    let mut available_subsidies: i64 = 4671731 * 100_000_000;
    -    let mut block: u32 = 0;
    -
    -    while available_subsidies > 0 { 
    -        let block_subsidy = (available_subsidies * 41 + 99_999_999) / 100_000_000;
    -        available_subsidies -= block_subsidy;
    -
    -        println!(
    -            "{} ({} years): {}({} ZEC) {}({} ZEC)",
    -            block,                             // current block
    -            block / 420_768,                   // ~ current year
    -            block_subsidy,                     // block subsidy in zatoshis
    -            block_subsidy / 100_000_000,       // block subsidy in ZEC
    -            available_subsidies,               // available subsidies in zatoshis
    -            available_subsidies / 100_000_000  // available subsidies in ZEC
    -        );
    -
    -        block += 1;
    -    }   
    -}
    +

    The above requirements assume no deflationary action, i.e. that no ZEC is added +to ZSF_BALANCE. They are referenced below as Rn.

    +

    Issuance Calculation

    +

    Given the block height h define a function S, such that:

    +

    S(h) = Block subsidy for a given h, that satisfies above requirements.

    +

    Using an exponential decay function for BlockSubsidy satisfies G1 and G2 above:

    +

    BlockSubsidy(h) = BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1)

    +

    Finally, to satisfy G3 above we need to always round up to at least 1 Zatoshi +if ZsfBalanceAfter(h - 1) > 0:

    +

    BlockSubsidy(h) = ceiling(BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1))

    +

    Rationale

    +

    BLOCK_SUBSIDY_FRACTION

    +

    The value 41 / 100_000_000 satisfies the approximation:

    +

    (1 - BLOCK_SUBSIDY_FRACTION)^NUMBER_OF_BLOCKS_IN_4_YEARS ≈ 0.5

    +

    Meaning after a period of 4 years around half of ZSF_BALANCE will be paid out +as block subsidies, thus satisfying G4.

    +

    Other Notes

    +

    The suggested implementation avoids using float numbers. Rust and C++ will both round +the result of the final division up, satisfying R3 above.

    +

    Appendix: Simulation

    +

    We encourage readers to run the following Rust code, which simulates block subsidies. +According to this simulation, assuming no deflationary action, block subsidies would +last for approximately 113 years:

    +

    Rust Code

    +

    ```rust +fn main() { + // approximate available subsidies in August of 2023 + let mut available_subsidies: i64 = 4671731 * 100_000_000; + let mut block: u32 = 0;

    +
    while available_subsidies > 0 { 
    +    let block_subsidy = (available_subsidies * 41 + 99_999_999) / 100_000_000;
    +    available_subsidies -= block_subsidy;
    +
    +    println!(
    +        "{} ({} years): {}({} ZEC) {}({} ZEC)",
    +        block,                             // current block
    +        block / 420_768,                   // ~ current year
    +        block_subsidy,                     // block subsidy in zatoshis
    +        block_subsidy / 100_000_000,       // block subsidy in ZEC
    +        available_subsidies,               // available subsidies in zatoshis
    +        available_subsidies / 100_000_000  // available subsidies in ZEC
    +    );
    +
    +    block += 1;
    +}
    +
    +

    } +```

    Last line of output of the above program is:

    47699804 (113 years): 1(0 ZEC) 0(0 ZEC)

    -

    Note the addition of 99,999,999 before division to force rounding up -of non-zero values.

    - - +

    Note the addition of 99,999,999 before division to force rounding up of non-zero values.

    +

    References

    +

    [1] RFC-2119: https://datatracker.ietf.org/doc/html/rfc2119

    +

    [2] ZIP-200: https://zips.z.cash/zip-0200

    +

    [3] ZIP-XXX: Placeholder for the ZSF ZIP

    \ No newline at end of file diff --git a/draft-issuance.md b/draft-issuance.md index 56e8b96ec..8e1d3c1d5 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -22,11 +22,9 @@ and “REQUIRED” in this document are to be interpreted as described in RFC 21 "Network upgrade" - to be interpreted as described in ZIP 200. [2] -“Block Subsidy” - the algorithmic issuance of ZEC on block creation – part of -the consensus rules. Split between the miner and the Dev Fund. Also known as Block Reward. +“Block Subsidy” - to be interpreted as described in ZIP TBD [3] -“Issuance” - The method by which unmined or unissued ZEC is converted to ZEC available -to users of the network +“Issuance” - to be interpreted as described in ZIP TBD [3] “We” - the ZIP authors, owners listed in the above front matter @@ -36,6 +34,8 @@ from unmined ZEC, and other fund deposits. “`BLOCK_SUBSIDY_FRACTION`” = 41 / 100,000,000 or `0.00000041` +"`NUMBER_OF_BLOCKS_IN_4_YEARS`" = `(365.25 * 24 * 60 * 60/75 * 4)`, or `1_683_072` + # Abstract This ZIP proposes a change to how nodes calculate the block subsidy. @@ -49,7 +49,7 @@ zatoshi being issued in around 114 years. Zcash’s economic model is inherited from Bitcoin and includes the concept of a halving mechanism to regulate the issuance of new coins. This approach, though foundational, invites -a reevaluation amid Zcash’s ongoing evolution. As the network matures, the need to address + a reevaluation amid Zcash’s ongoing evolution. As the network matures, the need to address potential future challenges and ensure a sustained and stable economic ecosystem becomes apparent. The transition to a smoothed emissions curve offers an opportunity to adjust the network's issuance dynamics while maintaining the supply cap of 21,000,000 coins. By doing so, Zcash @@ -164,3 +164,12 @@ Last line of output of the above program is: `47699804 (113 years): 1(0 ZEC) 0(0 ZEC)` Note the addition of 99,999,999 before division to force rounding up of non-zero values. + + +# References + +[1] RFC-2119: https://datatracker.ietf.org/doc/html/rfc2119 + +[2] ZIP-200: https://zips.z.cash/zip-0200 + +[3] ZIP-XXX: Placeholder for the ZSF ZIP From 013dcc1812c8ba5a218d54a0636387fa976a7593 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Wed, 27 Sep 2023 17:56:59 -0400 Subject: [PATCH 13/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index 8e1d3c1d5..2ac01242c 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -22,9 +22,9 @@ and “REQUIRED” in this document are to be interpreted as described in RFC 21 "Network upgrade" - to be interpreted as described in ZIP 200. [2] -“Block Subsidy” - to be interpreted as described in ZIP TBD [3] +“Block Subsidy” - to be interpreted as described in the Zcash Protocol Specification (TODO ZIP Editors: link from comment). -“Issuance” - to be interpreted as described in ZIP TBD [3] +“Issuance” - the sum of Block Subsidies over time. (TODO ZIP Editors: work out if this definition is correct or can be removed). “We” - the ZIP authors, owners listed in the above front matter From bf090f46e6cbc751941c2f759fde3b4b5a972d8d Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Wed, 27 Sep 2023 17:57:07 -0400 Subject: [PATCH 14/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index 2ac01242c..44ffe49c6 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -26,8 +26,6 @@ and “REQUIRED” in this document are to be interpreted as described in RFC 21 “Issuance” - the sum of Block Subsidies over time. (TODO ZIP Editors: work out if this definition is correct or can be removed). -“We” - the ZIP authors, owners listed in the above front matter - “`ZsfBalanceAfter(h)`” is the total ZEC available in the Zcash Sustainability Fund (ZSF) after the transactions in block `h`, described in ZIP #TODO reference#. The Sustainability Fund is used to pay out Block Subsidies from unmined ZEC, and other fund deposits. From dca11748be4850baf19221d79041356201fabf2f Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Wed, 27 Sep 2023 17:58:33 -0400 Subject: [PATCH 15/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index 44ffe49c6..ef6c03d59 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -27,7 +27,7 @@ and “REQUIRED” in this document are to be interpreted as described in RFC 21 “Issuance” - the sum of Block Subsidies over time. (TODO ZIP Editors: work out if this definition is correct or can be removed). “`ZsfBalanceAfter(h)`” is the total ZEC available in the Zcash Sustainability Fund (ZSF) after the transactions -in block `h`, described in ZIP #TODO reference#. The Sustainability Fund is used to pay out Block Subsidies +in block `h`, described in ZIP draft-zsf.md. In this ZIP, the Sustainability Fund is used to pay out Block Subsidies from unmined ZEC, and other fund deposits. “`BLOCK_SUBSIDY_FRACTION`” = 41 / 100,000,000 or `0.00000041` From de30feac97ad991ef89239e951ffdac6979bd7ed Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Wed, 27 Sep 2023 17:58:47 -0400 Subject: [PATCH 16/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index ef6c03d59..c18bdb346 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -38,9 +38,9 @@ from unmined ZEC, and other fund deposits. This ZIP proposes a change to how nodes calculate the block subsidy. -Instead of following a step function around the four-year halving cycle inherited +Instead of following a step function around the 4-year halving intervals inherited from Bitcoin, we propose a slow exponential “smoothing” of the curve. The new issuance -scheme would approximate the current 4 year cycle, and results in the last +scheme would approximate the current issuance over 4-year intervals, and results in the last zatoshi being issued in around 114 years. # Motivation From 45ff587b6f4b030e810918ab2cb5835d9a47d10a Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Wed, 27 Sep 2023 18:31:54 -0400 Subject: [PATCH 17/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index c18bdb346..7e7e441e6 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -74,19 +74,18 @@ how rewards will be distributed over time. -# Specification +# Requirements Smoothing the issuance curve is possible using an exponential decay formula that satisfies the following requirements: -## Issuance Goals +## Issuance Requirements -1. Block subsidies are monotonically decreasing, as long as `ZsfBalanceAfter(h)` is monotonically decreasing +1. The issuance can be summarised into a reasonably simple explanation 2. Block subsidies approximate a continuous function -3. When `ZSF_BALANCE(h) > 0` then block subsidies for block `h` -MUST always be `> 0`, preventing a final “unmined” zatoshi -4. For any 4 year period, all paid out block subsidies MUST equal approximately -half of `ZSF_BALANCE` at the beginning of that 4 year period +3. If there are funds in the ZSF, then the block subsidy must be non-zero, preventing any final “unmined” zatoshis +4. For any 4 year period, all paid out block subsidies are approximately equal to half of the ZSF at the beginning of that 4 year period, if there are no deposits into the ZSF during those 4 years +TODO daira: add a requirement that makes the initial total issuance match the previous total issuance 5. This functionality MUST be introduced as part of a network upgrade The above requirements assume no deflationary action, i.e. that no ZEC is added From 8cc6f92b39b399b929b1e32e35d0cf2ab43c1811 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Wed, 27 Sep 2023 18:32:13 -0400 Subject: [PATCH 18/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index 7e7e441e6..77946fe6a 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -88,8 +88,6 @@ satisfies the following requirements: TODO daira: add a requirement that makes the initial total issuance match the previous total issuance 5. This functionality MUST be introduced as part of a network upgrade -The above requirements assume no deflationary action, i.e. that no ZEC is added -to `ZSF_BALANCE`. They are referenced below as **Rn**. ## Issuance Calculation From 9f4e7fd4771c6bd0980fd5aaa929b5d06c645270 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Wed, 27 Sep 2023 18:32:24 -0400 Subject: [PATCH 19/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/draft-issuance.md b/draft-issuance.md index 77946fe6a..7e0985ee7 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -89,6 +89,8 @@ TODO daira: add a requirement that makes the initial total issuance match the pr 5. This functionality MUST be introduced as part of a network upgrade +# Specification + ## Issuance Calculation Given the block height `h` define a function **S**, such that: From c2a591ab88d2d5693b4739562c1c444985fb55b9 Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Fri, 29 Sep 2023 10:45:00 -0400 Subject: [PATCH 20/55] fix: credits --- draft-issuance.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index 7e0985ee7..54fc12928 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -6,9 +6,7 @@ Owners: Jason McGee Tomek Piotrowski Mariusz Pilarek Original-Authors: Nathan Wilcox -Credits: Nathan Wilcox - Mark Henderson - Jason McGee +Credits: Status: Draft Category: Consensus Created: 2023-08-23 From 8ea2ecce1ffb6ab51bf44052c441fbfa2ef360dd Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Fri, 29 Sep 2023 10:48:43 -0400 Subject: [PATCH 21/55] fix: define constants --- draft-issuance.html | 37 +++++++++++++++++-------------------- draft-issuance.md | 11 ++++++++--- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/draft-issuance.html b/draft-issuance.html index 05812d483..0395afe0e 100644 --- a/draft-issuance.html +++ b/draft-issuance.html @@ -5,9 +5,7 @@ Tomek Piotrowski <tomek@eiger.co> Mariusz Pilarek <mariusz@eiger.co> Original-Authors: Nathan Wilcox -Credits: Nathan Wilcox - Mark Henderson - Jason McGee +Credits: Status: Draft Category: Consensus Created: 2023-08-23 @@ -16,19 +14,16 @@

    Terminology

    The key words “MUST”, “SHOULD”, “SHOULD NOT”, “MAY”, “RECOMMENDED”, “OPTIONAL”, and “REQUIRED” in this document are to be interpreted as described in RFC 2119. [1]

    "Network upgrade" - to be interpreted as described in ZIP 200. [2]

    -

    “Block Subsidy” - to be interpreted as described in ZIP TBD [3]

    -

    “Issuance” - to be interpreted as described in ZIP TBD [3]

    -

    “We” - the ZIP authors, owners listed in the above front matter

    +

    “Block Subsidy” - to be interpreted as described in the Zcash Protocol Specification (TODO ZIP Editors: link from comment).

    +

    “Issuance” - the sum of Block Subsidies over time. (TODO ZIP Editors: work out if this definition is correct or can be removed).

    ZsfBalanceAfter(h)” is the total ZEC available in the Zcash Sustainability Fund (ZSF) after the transactions -in block h, described in ZIP #TODO reference#. The Sustainability Fund is used to pay out Block Subsidies +in block h, described in ZIP draft-zsf.md. In this ZIP, the Sustainability Fund is used to pay out Block Subsidies from unmined ZEC, and other fund deposits.

    -

    BLOCK_SUBSIDY_FRACTION” = 41 / 100,000,000 or 0.00000041

    -

    "NUMBER_OF_BLOCKS_IN_4_YEARS" = (365.25 * 24 * 60 * 60/75 * 4), or 1_683_072

    Abstract

    This ZIP proposes a change to how nodes calculate the block subsidy.

    -

    Instead of following a step function around the four-year halving cycle inherited +

    Instead of following a step function around the 4-year halving intervals inherited from Bitcoin, we propose a slow exponential “smoothing” of the curve. The new issuance -scheme would approximate the current 4 year cycle, and results in the last +scheme would approximate the current issuance over 4-year intervals, and results in the last zatoshi being issued in around 114 years.

    Motivation

    Zcash’s economic model is inherited from Bitcoin and includes the concept of a halving @@ -55,21 +50,23 @@

    Motivation

    and sustainability. A smoother emissions curve allows for a more gradual and controlled transition, providing ZEC stakeholders and participants with a clear understanding of how rewards will be distributed over time.

    -

    Specification

    +

    Requirements

    Smoothing the issuance curve is possible using an exponential decay formula that satisfies the following requirements:

    -

    Issuance Goals

    +

    Issuance Requirements

      -
    1. Block subsidies are monotonically decreasing, as long as ZsfBalanceAfter(h) is monotonically decreasing
    2. +
    3. The issuance can be summarised into a reasonably simple explanation
    4. Block subsidies approximate a continuous function
    5. -
    6. When ZSF_BALANCE(h) > 0 then block subsidies for block h -MUST always be > 0, preventing a final “unmined” zatoshi
    7. -
    8. For any 4 year period, all paid out block subsidies MUST equal approximately -half of ZSF_BALANCE at the beginning of that 4 year period
    9. +
    10. If there are funds in the ZSF, then the block subsidy must be non-zero, preventing any final “unmined” zatoshis
    11. +
    12. For any 4 year period, all paid out block subsidies are approximately equal to half of the ZSF at the beginning of that 4 year period, if there are no deposits into the ZSF during those 4 years +TODO daira: add a requirement that makes the initial total issuance match the previous total issuance
    13. This functionality MUST be introduced as part of a network upgrade
    -

    The above requirements assume no deflationary action, i.e. that no ZEC is added -to ZSF_BALANCE. They are referenced below as Rn.

    +

    Specification

    +

    Constants

    +

    Define constants:

    +

    BLOCK_SUBSIDY_FRACTION” = 41 / 100,000,000 or 0.00000041

    +

    "NUMBER_OF_BLOCKS_IN_4_YEARS" = (365.25 * 24 * 60 * 60/75 * 4), or 1_683_072

    Issuance Calculation

    Given the block height h define a function S, such that:

    S(h) = Block subsidy for a given h, that satisfies above requirements.

    diff --git a/draft-issuance.md b/draft-issuance.md index 54fc12928..ba7dd91ba 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -28,9 +28,6 @@ and “REQUIRED” in this document are to be interpreted as described in RFC 21 in block `h`, described in ZIP draft-zsf.md. In this ZIP, the Sustainability Fund is used to pay out Block Subsidies from unmined ZEC, and other fund deposits. -“`BLOCK_SUBSIDY_FRACTION`” = 41 / 100,000,000 or `0.00000041` - -"`NUMBER_OF_BLOCKS_IN_4_YEARS`" = `(365.25 * 24 * 60 * 60/75 * 4)`, or `1_683_072` # Abstract @@ -89,6 +86,14 @@ TODO daira: add a requirement that makes the initial total issuance match the pr # Specification +## Constants + +Define constants: + +“`BLOCK_SUBSIDY_FRACTION`” = 41 / 100,000,000 or `0.00000041` + +"`NUMBER_OF_BLOCKS_IN_4_YEARS`" = `(365.25 * 24 * 60 * 60/75 * 4)`, or `1_683_072` + ## Issuance Calculation Given the block height `h` define a function **S**, such that: From 4983a321c16cc83b8b0d652b0c809fb5a3f3f769 Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Fri, 29 Sep 2023 11:08:54 -0400 Subject: [PATCH 22/55] fix: S(h) to BlockSubsidy(h) --- draft-issuance.html | 4 ++-- draft-issuance.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/draft-issuance.html b/draft-issuance.html index 0395afe0e..b88cff2e0 100644 --- a/draft-issuance.html +++ b/draft-issuance.html @@ -68,8 +68,8 @@

    Constants

    BLOCK_SUBSIDY_FRACTION” = 41 / 100,000,000 or 0.00000041

    "NUMBER_OF_BLOCKS_IN_4_YEARS" = (365.25 * 24 * 60 * 60/75 * 4), or 1_683_072

    Issuance Calculation

    -

    Given the block height h define a function S, such that:

    -

    S(h) = Block subsidy for a given h, that satisfies above requirements.

    +

    Given the block height h define a function BlockSubsidy(h), such that:

    +

    BlockSubsidy(h) = Block subsidy for a given h, that satisfies above requirements.

    Using an exponential decay function for BlockSubsidy satisfies G1 and G2 above:

    BlockSubsidy(h) = BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1)

    Finally, to satisfy G3 above we need to always round up to at least 1 Zatoshi diff --git a/draft-issuance.md b/draft-issuance.md index ba7dd91ba..d148a095d 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -96,9 +96,9 @@ Define constants: ## Issuance Calculation -Given the block height `h` define a function **S**, such that: +Given the block height `h` define a function **BlockSubsidy(h)**, such that: -**S(h)** = Block subsidy for a given `h`, that satisfies above requirements. +**BlockSubsidy(h)** = Block subsidy for a given `h`, that satisfies above requirements. Using an exponential decay function for **BlockSubsidy** satisfies **G1** and **G2** above: From c5f83c1643132be2ed201095d6734c91d73a2e1d Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Fri, 29 Sep 2023 11:27:40 -0400 Subject: [PATCH 23/55] fix: refactor motivation section --- draft-issuance.html | 27 +++------------------------ draft-issuance.md | 29 +++-------------------------- 2 files changed, 6 insertions(+), 50 deletions(-) diff --git a/draft-issuance.html b/draft-issuance.html index b88cff2e0..98bf3cfc7 100644 --- a/draft-issuance.html +++ b/draft-issuance.html @@ -26,30 +26,9 @@

    Abstract

    scheme would approximate the current issuance over 4-year intervals, and results in the last zatoshi being issued in around 114 years.

    Motivation

    -

    Zcash’s economic model is inherited from Bitcoin and includes the concept of a halving -mechanism to regulate the issuance of new coins. This approach, though foundational, invites - a reevaluation amid Zcash’s ongoing evolution. As the network matures, the need to address -potential future challenges and ensure a sustained and stable economic ecosystem becomes -apparent. The transition to a smoothed emissions curve offers an opportunity to adjust the network's -issuance dynamics while maintaining the supply cap of 21,000,000 coins. By doing so, Zcash -endeavors to optimize its economic framework, accommodating changing circumstances while -maintaining predictability and stability in rewards distribution.

    -

    This proposal outlines a solution to address challenges associated with the existing block -subsidy issuance mechanism in the Zcash network. The primary goal of this proposal is to -introduce a more predictable and stable issuance of ZEC by smoothing out the issuance -curve while preserving the supply cap. It's important to note that this proposal does -not seek to alter the fundamental aspects of Zcash's issuance policy. The average block -subsidy amount over time will remain the same and the funds for block subsidies will last -a similar amount of time. Instead, it focuses solely on enhancing the predictability -and consistency of the block subsidy issuance process.

    -

    Smoothing the emissions curve helps ensure that the network remains economically -viable and stable as it transitions from a traditional issuance mechanism to one -that maintains a sustainable and predictable issuance of rewards over time. It -prevents abrupt changes in the rate of newly issued coins, which could lead to -disruptions in the network's economic model and potentially impact its security -and sustainability. A smoother emissions curve allows for a more gradual and controlled -transition, providing ZEC stakeholders and participants with a clear understanding of -how rewards will be distributed over time.

    +

    The current Zcash economic model, inherited from Bitcoin, includes a halving mechanism which dictates the issuance of new coins. While this has been foundational, halvings can lead to abrupt changes in the rate of new coins being introduced to the market. Such sudden shifts can potentially disrupt the network's economic model, potentially impacting its security and stability.

    +

    To address this, we propose smoothing out the issuance curve of ZEC, ensuring a more consistent and predictable rate of coin issuance, while still preserving the overall supply cap of 21,000,000 coins. This modification does not seek to change the core aspects of Zcash's issuance policy. Instead, it solely aims to enhance predictability and avoid sudden changes. By making this shift, the average block subsidy over time will remain consistent, and the funds for block subsidies will be available for a similar duration.

    +

    In summary, by introducing a smoother emissions curve, Zcash seeks to maintain its economic viability, provide clarity on reward distribution, and enhance its stability as the network evolves.

    Requirements

    Smoothing the issuance curve is possible using an exponential decay formula that satisfies the following requirements:

    diff --git a/draft-issuance.md b/draft-issuance.md index d148a095d..76850a13c 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -40,34 +40,11 @@ zatoshi being issued in around 114 years. # Motivation -Zcash’s economic model is inherited from Bitcoin and includes the concept of a halving -mechanism to regulate the issuance of new coins. This approach, though foundational, invites - a reevaluation amid Zcash’s ongoing evolution. As the network matures, the need to address -potential future challenges and ensure a sustained and stable economic ecosystem becomes -apparent. The transition to a smoothed emissions curve offers an opportunity to adjust the network's -issuance dynamics while maintaining the supply cap of 21,000,000 coins. By doing so, Zcash -endeavors to optimize its economic framework, accommodating changing circumstances while -maintaining predictability and stability in rewards distribution. - -This proposal outlines a solution to address challenges associated with the existing block -subsidy issuance mechanism in the Zcash network. The primary goal of this proposal is to -introduce a more predictable and stable issuance of ZEC by smoothing out the issuance -curve while preserving the supply cap. It's important to note that this proposal does -not seek to alter the fundamental aspects of Zcash's issuance policy. The average block -subsidy amount over time will remain the same and the funds for block subsidies will last -a similar amount of time. Instead, it focuses solely on enhancing the predictability -and consistency of the block subsidy issuance process. - -Smoothing the emissions curve helps ensure that the network remains economically -viable and stable as it transitions from a traditional issuance mechanism to one -that maintains a sustainable and predictable issuance of rewards over time. It -prevents abrupt changes in the rate of newly issued coins, which could lead to -disruptions in the network's economic model and potentially impact its security -and sustainability. A smoother emissions curve allows for a more gradual and controlled -transition, providing ZEC stakeholders and participants with a clear understanding of -how rewards will be distributed over time. +The current Zcash economic model, inherited from Bitcoin, includes a halving mechanism which dictates the issuance of new coins. While this has been foundational, halvings can lead to abrupt changes in the rate of new coins being introduced to the market. Such sudden shifts can potentially disrupt the network's economic model, potentially impacting its security and stability. +To address this, we propose smoothing out the issuance curve of ZEC, ensuring a more consistent and predictable rate of coin issuance, while still preserving the overall supply cap of 21,000,000 coins. This modification does not seek to change the core aspects of Zcash's issuance policy. Instead, it solely aims to enhance predictability and avoid sudden changes. By making this shift, the average block subsidy over time will remain consistent, and the funds for block subsidies will be available for a similar duration. +In summary, by introducing a smoother emissions curve, Zcash seeks to maintain its economic viability, provide clarity on reward distribution, and enhance its stability as the network evolves. # Requirements From 1e977ba4475f55340d8a55767c7939f9876a58a8 Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Wed, 4 Oct 2023 12:40:31 -0400 Subject: [PATCH 24/55] update: add more context to motivation --- draft-issuance.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index 76850a13c..c76575add 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -44,7 +44,13 @@ The current Zcash economic model, inherited from Bitcoin, includes a halving mec To address this, we propose smoothing out the issuance curve of ZEC, ensuring a more consistent and predictable rate of coin issuance, while still preserving the overall supply cap of 21,000,000 coins. This modification does not seek to change the core aspects of Zcash's issuance policy. Instead, it solely aims to enhance predictability and avoid sudden changes. By making this shift, the average block subsidy over time will remain consistent, and the funds for block subsidies will be available for a similar duration. -In summary, by introducing a smoother emissions curve, Zcash seeks to maintain its economic viability, provide clarity on reward distribution, and enhance its stability as the network evolves. +Additionally, the current Bitcoin-style issuance does not take into account the current balance of `ZsfBalanceAfter(h)` where the new smoothed issuance curve would. If the issuance curve were to never be implemeneted, this creates the risk of funds never being disbursed after they are deposited back into the ZSF. Rather than adding complexity, the smoothed model satisfies this requirement with a simpler implementation. + +In summary, by introducing a smoother emissions curve, we: +- maintain the economic viability of Zcash +- provide clarity on reward distribution +- take into account deposits into the ZSF +- enhance Zcash's stability as the network evolves. # Requirements From 74649db574157c90bc5ba49f3cc02111d428f738 Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Wed, 4 Oct 2023 12:40:49 -0400 Subject: [PATCH 25/55] update: rename requirements from G* to R* --- draft-issuance.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index c76575add..b0b906987 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -83,11 +83,11 @@ Given the block height `h` define a function **BlockSubsidy(h)**, such that: **BlockSubsidy(h)** = Block subsidy for a given `h`, that satisfies above requirements. -Using an exponential decay function for **BlockSubsidy** satisfies **G1** and **G2** above: +Using an exponential decay function for **BlockSubsidy** satisfies requirements **R1** and **R2** above: `BlockSubsidy(h) = BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1)` -Finally, to satisfy **G3** above we need to always round up to at least 1 Zatoshi +Finally, to satisfy **R3** above we need to always round up to at least 1 Zatoshi if `ZsfBalanceAfter(h - 1) > 0`: `BlockSubsidy(h) = ceiling(BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1))` From 2448c6c09f73a99d29683d2babb173311d7841dc Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Wed, 4 Oct 2023 12:41:00 -0400 Subject: [PATCH 26/55] update: add graph --- draft-issuance.md | 7 ++++++- draft-zip-smoothed-issuance-curve.png | Bin 0 -> 16348 bytes 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 draft-zip-smoothed-issuance-curve.png diff --git a/draft-issuance.md b/draft-issuance.md index b0b906987..3f0b1d5f8 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -101,8 +101,13 @@ The value `41 / 100_000_000` satisfies the approximation: `(1 - BLOCK_SUBSIDY_FRACTION)^NUMBER_OF_BLOCKS_IN_4_YEARS ≈ 0.5` Meaning after a period of 4 years around half of `ZSF_BALANCE` will be paid out -as block subsidies, thus satisfying **G4**. +as block subsidies, thus satisfying **R4**. +## Visualization of the Smoothed Curve + +The following graph, taken from the ECC blog post, illustrates the smoothed curve. Note that depending on when the network upgrade takes place the disbursement may temporarily _increase_. + +![./draft-zip-smoothed-issuance-curve.png](A graph showing a comparison of the halving-based step function vs the smoothed curve) ## Other Notes diff --git a/draft-zip-smoothed-issuance-curve.png b/draft-zip-smoothed-issuance-curve.png new file mode 100644 index 0000000000000000000000000000000000000000..7bc9a98a8770cd77862ed2e30032126671d94c3e GIT binary patch literal 16348 zcmch82UJu|lxDqdXmZZE0g+$;CFd4YBqs@i1W^zK$&$k}fQS+#D-sn@5XnISX+;Dj z=M1e#MnI69_BH>^?9S}&oDJs;9J>2e-MaU?_kMM&`tj4Ikc&`%GcpK>%1Nt0R^1HJDV1efObC>;w7hjC&32JbLm-!Y4Qq}kt7k)Lr z_~QI`n!nLdn`65pCx?gKHFlxz6rW`{6PTnhQtzoA2sd}Vc;fEByksZkDCBBapONpg z`_QHQn^ydal9A4cw;9`HkXzll>5xqjgxLMx{e)5^3+Rp-jN7^|6 zARrCY0JsBy!~A~^!$VkNDiEb8#Kymw#~-Hcmt8UnE#Q@r+Yr*$G}`0;*6;Y7ut zEFQuisxY+(UMO8uRlRhru*q!1CrN34RN-UX3{lfwe^r*^3E)4zd!HPaT17_&>Z{PP zFMYaSu)sgP7PijPBH%;Z$U2u7)?Ri)%pA0cC!qnRYqdG3m1DZJt3d^Cx1>HnfCHbA zelC6D!E>#q?IoAS8s1kE8@q1h^WDq4!fwBA-adS!yfnl$uNt@07)IO1#a8rpXm~TE z%~2}g#G!v%|J3Y(PV~a&#;S=?nOXYfgU#ydOM7|~PR>zXvlbbu1M$MNnLgKi-`Knm zD%!_v{tj1(zL-2bJ@Rz)!gB@Pw;DHx`E8V9Pju071378Q-D?IszZ9QCtyFmbOXNL# ze+hZV=6;QAv{)(UF-=ox&tuCIb#MD|zoRgYJjq(*?lL2ms@V{-q<3p|lw}rM`+?a( zP~A;Q0h~Eq<1?!D^YV15innL#rLSPjaiGfvEAA&!;q`J0FZJa#7$o+f=)1q_|G`q?PP%dwdM)4z7iO-A_|HFT zG;M_52I#y`Sk9d!Bf%XMXZdz|XJ&cvFaZG)Za`A6T$3Yfm%Ka&D(I6{kA;sQ^KFvM#Xk>ggOFl6Y?U?X*4=+$p#(geaPg+%TSS-?CpU=>kB=E=my0V1A4%oz0*rm$kTI!nd z;3HcaO1-BSx-KpMv1qXxt_{f%o^Ve6&Ej0e;Qh_58>{{W!XHEJ{X)4{9tON!KSAo7 zRU3&icpa9+s8nspclzbhwh1FQK8^xD&AoJNJpG zY2qU!_%H1xdDg^CgI6*4NojGp0y$tbVeAiQN9$JJaVs9>H>~lPvq(A65x~Fv-mBzh zzlJh!lwPuEyQEt&{7F6mg{@cax3~<6ln;}AOeI{eZmLC_-yw@NA<5*@)2eBd6$7Tb zk2cyl+u~|!6=%SW%EMT+$gs*9-!0XL0aIGm)QjnINa9i=fi~2+UV>mqCQy!GurfQp z#8Q2LQGuCE=X^G-;M)eC+b3%BEWH>V4|y#IM=Le+xVcSCq<;WXT6J=>%2W%qc>#)P zaf^;|oox>#3xGvO5|luT<8Iy^8HqP8`V*dS)U>{EF|fAGHBA7Ghj32yRg;;|*%~_n z(|@fePDX-3F}w%s=tsT;4!D2P%5S*)6f_SM?B8bS%sm>NJ88!J5oOlF2czr zxd(}t#X{8V`EcTTU2eJDFm++pc#dh#httw%b{$rxIx*jtu92CapS)@xx4?>5gpR+a z#2K5|JNNPCorUdm9mpj)aP*1A)FNrd!X?>hJqG+0>mHl*IHu9CQsBQpen#fe{pUb*{+Ult(B>VMZ9!#{WptU%;rtH|Saavr}$UEfL`qUoiIg$MwzRc09-#sWFED}d1FUrFzK6Es7a;fwF5^vRr0m6veKwxlVS z6@cx=A!{Se#i^YI*BAVkNeSKRIH$`mv}9F(w>p4lFT6K9Rp13INUN3Zx1nAA?&H9X zECr52F2eQg&td{N

    T~+Xa!~<;zrRNw)S8|; zK3YE4_|WC{3mZ)j-i7|3F2hiB(3mW@Y*3b~a{y)RxaPNoq-$j?JnLd>9B|uuo+NNH z=D|4{E0#LPbym3!znI#&w@iYElzhIQ>#CYkN`ZbUM6wE7{4~1QSQxgYP`n|{_V)ci z(Qa;?>2?=Z8Y4zEqA9RWbO!O zR?dlLS`Yl))hhViH*dy^;=o_`0aPTmpH$%0o{EKd>0J*$r^XqEvz@LZwmhoUd}W`k z6@&l_8GYPNINh4P!)x?j@}HekbgYY#%2eF&_trfX__pshk6YRGpAvtE?(RX!QMWY|stfQ5&}o0&5l=8GVgG}Ca1ym-+@O@@}u z>7~=&6GJ6_O8kyGExulIw)qh5ITj)v%b93Gf@}wV-JaFZEA0!Z_a^Me&tKUn&#eJ} z*Kp1jN#Yd`j8CmBm;S0f><-JG=rDCTTv-dTp(@Iq;5EG}^ewRd5!+RD*Xag7RTsH; zEn&mS*0t9g6j#cf1L<;0E* z1OEqW5HcTd#J%Nzvh6&)w)`ZZyLm@$FN?P9lEirHkBZ#3ajcecPwM7W2YrMr^K7nz z+tsg5w>B@Z)q8;49yzJjI04Sl)!Itw=3* zae^;jfaxnfw26jFill$XgHNn<0yrf^&SPh{ZZ&nfwL9PQRl|L9dN%ZmY=KX`nH3jU zkMrES!+RdC_67n%>zyRHB3l{D3n+k9!NdmiIR*|1A)ljp;5IO1kuO04BC;U%xKhPQ z`?L@W^ODqk>^F|Zt!vx<$6l}YqNzt9rC~FtH|?5zOPkX6aoAJ)R-%0D*3z6&X;{Wu zXP~1x)WwM_=yvoUdgZd{*H><)`%QDfg}-yZt*tGyytbA*3aseg0zDlOig0a&i%1`< zXzH4!p4lruAJuU0GmE6244J-9_8@9!(0HQ;joN5^ph z!k2-|z|H!wy!UI8Y$(FDGnAn|HQ$WsB!=}#BI6)$zj^55?lX99mITR_1S>kCnI5JE zxTpEdZWjC; zgowc@IZ|y-hIAr4=!A-q??vc{Fk+v3Kgk>0dDzq&*$UIVj7@!A;Qaq3VKmqv$)V5kQFh79p5K#z0 zjw8bdLO=pGXU9Fv}N;9fg?kP!jR6Je?^Taq9zC9 zR7mTW&p<(G{U5VOt^E+f{gR`IMII?2+CD;k6s}A(-1Ri<&pn9xCZL8~6MFfdBn}{< z#gll|n_9O2k^WdDjd*Q)PgDFByYLBb(7*xIVJ`bcwi^BlN`X^dzrQ6o{B2R!j7M~o-{2ZRoIaJ&JqBg5$d;v_M5-pK0_ zDvv}M;SjNj7&jadPZ=oTL_P81!S6jLBL*BJp^PE$`h^hgOryO%WZjvzFTPTdJker( zXR311DVRQmd2q;m;$v5Uy|Fk+`r&zDUkV}&A&YIN^<4 zA)~I~U0_ogsk+$>4?J*C_F_|*bYmh02p=O3Jq!_Q-^wX73#zILFy)_adt94pJpE-Z z8S-gp3zT*S1>N#=;5sPlE+PvNL`bRtH*>%;fh*}0aGeBY3G!q^&TGvS7flsc%KJuCi8lC3CXk>kwmFHsH@gwu})H)6^{>3S-;(Ak3%d-8g9*g|M)_%b0R{SS#Z1v zy(I%qGjF`J(K1JqYvbz`0TXbVh%a@0yopajyLn%%bPIzzPt6A8_&R{ZkLO($6z!4O z2w#D}NdiTZ>MsP5YkCSlPS>*aLo91A4b~=7(rQh`7h1JTs7Utj)Ffwc!RajZvp%{O zy=E0Pjv;?>9rOqVG4yp;;3P8>u`}W|)0JPR^h;ZOkbIAA?5)RHo1RjvUS?&IEcL6T z&9rsFMQ$W%zNA*<3TUK;M4&k$@GKH;AJJkql5@f@Nd4Z<1XBc^Ko{n^npt1+9}oS_ z_Bor-E52YkgCSJvfY!*F7P7H8@o5bmv>h>Fo#5<`KZ^Z#ioWTM&!N8+)Rg$ALt5YOMVYq4!cznKVrju5OSIoN)=<_%eOCUOh z5#6~|EPII_2+F`WY%g}Sw@;g@s?dfMbwhYvSWnyNu7{#x7S|NCqGUfxeLz zgp@eB6$eU*ZFp|Wk`#@Zy-GsI;{gUr@?HwwB+4x2uuMXI|WJFf0+?iZwL*#Z)L zF%LYM%sFP{Q;aqko3#+sV5BPeX#}yum22#21B{(?-6pxqB$b z1`P|#SDzz?&y;z#p;d=z@f50gS#!-LR%9zmyPFEIPYU&F^&b)PacKd3UOZ+Ldng3H za)SY-m7y*l5IyPr_)1?vP+Z|FO;mmNTIqfZjRU#6S-R?-%RWEr19Vx!Y`kuLoCRNb zh(lgllOYk`-$W%`)_T5C2ZW@}QMq+*v(ZT15VfLs-K%#v21`$InZM9Al!y*CG92$8uUXt@1Z@k;aPwJXe{V$R%Mbni>%zpghI%H4ada3q4Aj79zNV( zmNyHIyXN4(Lu7~TWlXFJ4IM?XgWjReAR1j;Mn=|4^?0dkE~AKXV7VxRtm^Y5RnXd} zOs{eJ`sRAE3G1XCzwNjRvO{+^ZFG}}{&Ggzl@$zcTx*wNO(JECd$Icmp7e0v?S;VG zF&@SChvhHpTcxYcAhzsmf%g7=)cRu8gBm-%mW|W%ZBOccO;%L3*vK)$&SvitPutw| zc@3(6g2_9}MyO!rd)u3+%;1pn?h$nT>yc6o>0VdyS{Kdn!5#^0D<3^C_~uf5JCOa= z06=>|RN*u<>@?458tz!SmV9E* z#>#xr6+9^;_ccO9)wa@uS}?uT!!F|9_nJQ=VqK;ikZpVBDb}tm*GM9kp`_1RZ?xWx(5JpgQ%P9Y$4k z!O*5wzvuyXsn5BWJtPLI+Mu1vzr&!Sfj?bvC|6Mpd=PZb`eS$_8TYF4n~}6gNDYVy3a;&<*+(V_!(|z2Eoh|v{;!|}z6#Prhb+NP4VZ)x| z?;i_(LgQEnxh9aOl(6$bq-&B~oPpLZcTY^~3P+mFl5wLT9|bOZ-T2j%)j?RTPV2w)*!^?f4_6Da5to$7syl~Ll^UFb> zZ?*eYd)=wg@jp17Va4bs5WC^BCZ-@L?wnBbH0xQF^D{G@_xMRUe`eo@RgZcH=oCvM zvtE&M1hhgKKa8y(aaQZ=`0E;S6msmoQ9_dfI>Js4*nhMoez^aVFPPgf`IB)z2#E{G zPkpFrN$QxIRL{e#d-Kk=NvTOnN9QN?{HV_1*-Y8zFG>5pbJ4PMg-hM0AoxX?=ABpT zaE%uN3Msa?$5tyDty~N6+^bu%nqM9(UiNUTDtU8Q(Ycb%jF-1~z57C;b|O%Q{%v%0 z$Mg0l6k3W=v^29Kv}L2VD(E;V4%+0zd{osOmr^bQT{cXwYT$vC?5>I!Z5#G0ptc z0isVyPYAwx0FGgodmg;t3j{KMcV{~yU;xmr~Z^jUkUMYS1G?d2R>}H;A-M)nb7bJDQsz^1Rnt67z z`f0MEuN_Ll0gf(2xzF~UU(tGi;!9qg&T~xImVbK>#oDoPG)->L*chvDRk9lSenTsovKkl!6%!13!1Et&^ zlTXPEdVVtNY#PBIIvU(8HwLJV&v~yY&F9LK(xaNU#e_uRZe>z}K~wv8j%^$;g>F=z zQq*6G?l{*$LikEFFj;;4yFzIksyaNHM;pACj!#JU?2u%D5*|lt3J8F{@6HEN@*TPq zPDizu^Eqsz%CgmVaFCHZwY=`CKXge#l0VdL9=~8&C`a1t zPi57iyT*|EAzr)$CBc)w(pWkFC3(!~CnTj?kga&&gC&Vw-MS&IWBC+yiK!rAGpcs) z-r4=3Y;#D?8-FNSs-1$XjEd4FVM&Zukd%?Ra9zi|+c=3UEn6o%90jAQ4=4!&3HB>% z*@4h4qpN~80y*?2fS10O@7cc4#0HI%L2+G!V&LIc%FkUp+&&4=G=-FhbS?;`?aKWBfAac96enTe4z75PI}k;D=GdneC z=fmX=o9@DG`NN;Wj0S65Tpj6aH3SF;jf#-E(+YW?u$kw-${coozv^$2co;};p9}bL zPlHEEw%%~gawsRF2KoVwqUZ><^@mk9KBJ!QhH{7Oqy&3`k+3iMIx|xpae&vh;sNb z(g~250N8S=9T|J%DRM6h_6GnU)eaE%ineq>6o6yyvRLE}8sgCrb^v(sg+w<%ED{Lh z#uVZR@dg`2RBQPI!jck|5pP%_TImsI0J2B$IdYAt76+=?j$XOwi6&@|P!R`{6B7dd z0r2k!Adv+~D&WHsU)4Ip7i8>s)!vbB!xeMM=DHHG?vv~0S3F9docnTBpeXs6ELBZ} z^@;r38_YjU^AjH1Grbz6S5q5i%AZniygA!?;6X4jA9>vSY;&`qhtT|L{(10TYuWOk zExH(jF`X+I0wcKRg_v^zwrF>8;0QFOVD*ducUlA*4bs|G_5?87nA;DrFm48RfXf|P6M z=GEFA%XEDe*F9GnS&$6e4=^jY7Z<}j6;2;0A3UEpmF@&$n=!@g*RRt2(0ei|ykq@j zqWm_9y@)m!-Pnxu@u}UoJzCf;xHKBIP~n1rAdGV1qu8#=S6cqL-Cvk~PTQl3h0ggs zd3TykWF$a`?-1d)$-ZtEMd)CXsiV!f->S-&4^z9^19C=+R18lK)C z4>|SXcJ$-u@-2{v7 z$Ir-1O}ya3j}1PqDqzBo*#)0*eHcIZn;4<5n9ljHTW@O_BRul<)(xw#)QK3hm_Z-c zj_~{KIhKZ|(${(~$eKnWA{Oa}l%h1|SXZx$sTzx#*=}3n?Tsu`8HN z=!grVuEbn#&Ec`&1sa(MXuySI{vSAAHxaV`yXo+-itXTm9eRtJ2HW2td+;C|YMr?6d+2Y5uBSv)WlSFW zD8D5~jCxZbmng&y2tf!T^93MikSD=#04Dxnut=b=2yl8N2=oXda>QS91P%#tTER%i z|Kmq`#3&c?M+1l{L*_1w7=jUfIK&VRF@!}7VG%?0NSH{79se@|qyw4QsQ;A%FqJI4 zc*}bK)I>_HYKR#!_*e;~6w&yS-lD0oYfBWFwnND1M^dnmiW8rlhD;pGKQnJ@tnM7l4?IM|g^i-Yj?fiW z*IW+iQ>~U3BjHyZuS7!B?Fe29@9%hSpPaBPI0*7llY5^-Y#sz!WN8~}+b8RdN%3s< zfcxz*0_2Sp+*r+{!bnU2LTlW1ka&N?suW<&2i5jO^xc4UQja_|{~~^#>QL>^C-Um* z=MzW};b~W30=>2-Cm;JA8E9)G{#U60ViKgw=i0lO`9yrgc){<}B$RVOgTjMq>4G*~aP zF7$ExG1jEbhYC!*9<@>StA2C&JxS&pE_|{*NU&K={@{^UOD{($dtE8O4QsAExDi1K zIBTGjDyI|qJl*Q|irVJHLqb_>^^wWPxhIBinmmWN)T=Esa6}|d#EavufbS;K=!l58 zAb(Ov1S0`R-~XN_|DKQk2^;<+ojZwqhmV*nMeHLkGDMsIXCMC~JO2~Zxc}uW`tjXe z?&_vr7W9e(*lh0Z4{-5HxByKIe*G-ixnKL6Umbm^97?d(L_$G+NkedIp3n)0N6`;yuqDXVGgN~n#R@(PI@S-q-`wZ> z?0yx62}iU!-3Izi=Oi@YtR`9-Y$1*94F!@~QxsC>DxfD!wyTku*Y7$KrQ$D5JWqg= z8IhW3!G)Kj`C5dbP7eTGpnDj66|!Bu1z*2A2pC6z3OA}2S!84TF%s?Ta|Mw4#Ib+I zH1{W&A;lqX6kN1W-^AFWFL|O5PLM}eyR?bn((%A$! zB4ZF6PN5rCsGyhhF5nJ1>>@L;tABH+x~K}#C73FlA%>LdEo#Vsxh`9=VPtc^e%)ca z+PY|SUk(b{amt;Lm>l`gk%$y;i9--kHh<^lesi|0C{$Ip9~h!aLY7-;w0zkA;-SroZM7OY;$ z!@LRUYSqDBq?*!T<$sr*ai9D=@GqTJBsz2$TA9=AhyRSV+5W4DvG%6!Ju=xp0QHtSeZj=YQ=55xbJ`SHnpqlok$rT7K-iax0$n3IB?4_`ALetY>R&@98n5wx9x z?ynD7Ah~YE#NJW-9n16O&*t6s=<8jTkko1D-ChWfgfRue5+~q$JufJ`$$Iq7_-_7Q zV@ApLqqoar@5bwTzR~r&fT)kOvzu%B)?|*v0$dbXR|+i_ zhJ_ift6rh8@fqgC30AZ((Xj{3dlzG3zhgQBJ{qX}pfhbLfY-&gsv1@U1(EDrX%C4d z_>zRs&?VS{UpDPtgBqARC)FZMhm% zijv{Lh0Li6c=vzCa>Hk6aUx{c+Neu_(%J~PgY9^@M(Kh959_ly$F~ z{vFyak`6pkL&wuBT+tJD&PsK=rgSrbN-9-H0BsPh|2_E6n`}1B_mu6_mn6+z{00m9 z1Rp7v<9*w*bZQlSSTePGS7O`Sv5h~Q@^#0 zbOpQ3sqzzQ5`^cM;U-oB(sbOlo6h*{MC;@q1oE!Go%40(P z{?(1eq5--T{z$@Ia}{}DnHG`R(p9CU4j}}@Lhcu61P|W2KSZJrzP^VK?%(^Z$3uaP zXb|!H9l}pgyh_gv*w;mWN>lBh%+%(+gaHl|IFpEj?#wMOH5d)=B?I04hsH65G@frr zngJe5Mz4jVx8%C4j&cXKv1sxNtcnnR2X_`oe1jf@J{p2u4K5P9qS2jS(wVybv59~K zq)dWriOg{a3wkn;D+k}2e__>xiG^T(+D!Syw_N4VSieB++8|Wts?m$|HrbXm&ef2|@z+3kcA>rb$4l zco3ca3Brfq_6g(*;*k?__j5oDO*{mP(qaQhg|ncbH;ASu9^fhY))++dy38O2f$k23 zRq%WfXoWjXKj(h}+i4!W@lBls=RZwh37G14k}Ac_H-H2MStt96n2DwfnZe$2@7Ts? ztbYJo6fG|L*#nG=|Kv8?Y&s$ZSukbF6dP67t^Zh0v{{9h9--k@+vEjw4vt_`5|I}e z2jOzr2X)G;E;e68=BRBPhPoHEWBK(Y2}})i`T-k+hv0LZ64jUGf_%2RAAzxWYEU|2 zV$4b3>q3HX3FCwlVD8nYktaU(&wf9x7mg0?N_#+$1mhP!y@+t+-KEAP@=oP%04v@I zXGo!DLVru35I%7`;pDTR0R3}h#HY=!iwHB`)ob$AFh!FiF8qdu7NZon@RVhn8W zVMg`7-cw+5Kf)UxRD8wNg5=|Fp0k$|LSuTGOUepTc0K@c6lZOcndFHINCTWW3<&rB zll2Tv=OxrMA%Vd}8&ie%qS->?QjqBfN>8IkLUoeS`Mj@FxhV+%&+fgcQ^ZNTaQFH^ zX8t8#*iozIJJcxxNMy=LvD~B$$0-`j3BTk8h?T(e1W;yKdH4plK1EP`p9q~r zzGm79#EzT&I>sjFa~pk>7Am~vNeMO5;k!01&)5((B({V2;_nU96oQiOSw;LrTc#jD zEVGK6Hy@>i`L0KMoa!5L&qhw1o&AjQ>o#27i{He#7NW?n-Z#iociAB|c8?-gxFl7*}*u++98T zum^0u-EshK{c)a&bnK}sA=@k5>jrWFrqR^oE+0wS#+4AlqOOKJ0P?RX=U+D5^{L`| zpiNOUh6EVs6pK|W|9o_Bu;HtM&=a?d5opkyOfTp9+l9v6uz*SJ}gZKfg{ww1Ds- zkr2dBo=3MoIXoyUd<+dzNI5#A3376ZVoDVxAwwMTqId|jGPidp6*0kjyGo*+x%f@1 zO)(?HO$o~f3qVbS(7P~`6Si-EAs{&G`jwxab}*tw8e(T}2=FLLS5cBZE|;cEzIpm% z<|!nLDd)&yH|Bk|R!TxcbUF*@1x~$wFGCBkHMH1Mq)8F!QsnpA-)o+$**8Oc)1kmE z*wqH`EaA3VW;U1W&5;QXB##4|4~e!HmW4OAJk)4U6Y~QGv^}T;S$TQuLMNE+@gY(i zKU*qKd-GIX?bnbkp~%w3{D&h(1fr^=BSXl-gq%P^{2?x4$e|@9?nj+Bht#n1C3|v#NsR8jN&p?W6MK`ZJ3CmgTC_ zWCo5EoIdShuP!b{eq4`{ckc9&cB^u96-woRf6^mIP+SE-S^HjtOFQcIpL?KHiAq%f zA?$hL^Z2v?Vt)uu-t33Cu|RSe(8JF_Xuz4VGn!oe|;9qmX#Y{#piPE zw{(17M(FGO$^8|_-@hL;xh$%gDH$z$Evc`1|CnLBCK%GKy1Z{TaH;Ab`L5PCg@A&I zpw%=BL#Filo+i}?RhmJ&GAH=VKIk@v(zwO1D=A&PEw&f;)Xv9kR-!a}*Q;JOC4JsY zn{QE+9N&0Iqc3yeoa?dnciR3Tvl4ymj;SIgGZ@*Q4kHazUA zOo-{tdz$yKD=y($sA9FEB`x0g`lmRzxP~0h*B0fc)=LOsG&RX#KNux5!3SCylI~o^Z|+$X@tQVgaeGl}eiyMJA?_6}Eh6sq0ZK z9(fBU*JewrycP99FzMw7+r9w9@8MwYt;Pit=7SzTvFXIKsy!33KW0C9z7%+iwpZ@6 zy2|RcS{Tm(4aWC%Yo=;h*2&CuzIjhyp=sGp)Ab>dgN&Z<;$us-+R??aoV0O??yR2D z{5-QXCvvrTDfk^;d)&-1#*qb|N8%?~`R4FF_{u4cI&#-sTUUH)cd z*j!Jp@Q#pZ%51c#G`S}AY}nKMj#n4UpR3E&4*TvB8F#GKZ2L;H7$VSHMw^wLrPbA6 z1tfKYPO+NpJBotqW?!S^TMT!{_tEz?VL8 z>#pNlSq*Ws9iw#TL};%t(MB~yh%wg_%`}88`Q`VPfD;93{p>fyMv|%Ty&vkA)Q&jS9`kZa>lhjWpA~!3H6v^dc z=Gvz-IKY>L%QH;hEY{{&4d`ssFDg)4ao;%~=k^USwRMwITuz()9$->*eONh%3|1dB z|M@$Hci6oAuiD3k^zfEiG(LO&y8#K7W%2k(JoRm3DHpj%RT$wxi8Ay19>7C-0@F%w z;`Hs_@8c(5D!0l!MJs)T8aOV|0kT%MGZ#*r`LQSeL0Ymz9p;xuQV@CK#8(-HuHHNb zUR;-c?3IPtoX|S7obpDanUaTJ%G*h-)!ZAxo?Fo5A_e{#C4Q-Hm-&l9`AJ=O`q}bM zbEEo#GmMJcHD*??RbP9b|NF8KO9DbgElR)D(R^**vFFJ+`7QWb$1TE-+^vf$H}8_e zF{0`^gUlJsA4#!^F>k(zp5C;r=ZFAGS}(aK>{-d4Z8*Iu`59l;x2>QS@N*M#Ic&2W zF>H1@oV4WPG9||^*c|B7s zy#n$-S$<})0m!q^*ayXAxc{>EZ41b6{S^N%(m$7gb+9_Q|Cw5W2lQ&>{Qud@CF~xg Ywi|FkLMF8iAU~QH^v=Iiv%UA<01{!1T>t<8 literal 0 HcmV?d00001 From e1aa108fe5a0bddd54bfbd5193b6af905979036d Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Wed, 4 Oct 2023 15:20:12 -0400 Subject: [PATCH 27/55] update: render html --- draft-issuance.html | 16 ++++++++++++---- draft-issuance.md | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/draft-issuance.html b/draft-issuance.html index 98bf3cfc7..2ac8a3149 100644 --- a/draft-issuance.html +++ b/draft-issuance.html @@ -28,7 +28,12 @@

    Abstract

    Motivation

    The current Zcash economic model, inherited from Bitcoin, includes a halving mechanism which dictates the issuance of new coins. While this has been foundational, halvings can lead to abrupt changes in the rate of new coins being introduced to the market. Such sudden shifts can potentially disrupt the network's economic model, potentially impacting its security and stability.

    To address this, we propose smoothing out the issuance curve of ZEC, ensuring a more consistent and predictable rate of coin issuance, while still preserving the overall supply cap of 21,000,000 coins. This modification does not seek to change the core aspects of Zcash's issuance policy. Instead, it solely aims to enhance predictability and avoid sudden changes. By making this shift, the average block subsidy over time will remain consistent, and the funds for block subsidies will be available for a similar duration.

    -

    In summary, by introducing a smoother emissions curve, Zcash seeks to maintain its economic viability, provide clarity on reward distribution, and enhance its stability as the network evolves.

    +

    Additionally, the current Bitcoin-style issuance does not take into account the current balance of ZsfBalanceAfter(h) where the new smoothed issuance curve would. If the issuance curve were to never be implemeneted, this creates the risk of funds never being disbursed after they are deposited back into the ZSF. Rather than adding complexity, the smoothed model satisfies this requirement with a simpler implementation.

    +

    In summary, by introducing a smoother emissions curve, we: +- maintain the economic viability of Zcash +- provide clarity on reward distribution +- take into account deposits into the ZSF +- enhance Zcash's stability as the network evolves.

    Requirements

    Smoothing the issuance curve is possible using an exponential decay formula that satisfies the following requirements:

    @@ -49,9 +54,9 @@

    Constants

    Issuance Calculation

    Given the block height h define a function BlockSubsidy(h), such that:

    BlockSubsidy(h) = Block subsidy for a given h, that satisfies above requirements.

    -

    Using an exponential decay function for BlockSubsidy satisfies G1 and G2 above:

    +

    Using an exponential decay function for BlockSubsidy satisfies requirements R1 and R2 above:

    BlockSubsidy(h) = BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1)

    -

    Finally, to satisfy G3 above we need to always round up to at least 1 Zatoshi +

    Finally, to satisfy R3 above we need to always round up to at least 1 Zatoshi if ZsfBalanceAfter(h - 1) > 0:

    BlockSubsidy(h) = ceiling(BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1))

    Rationale

    @@ -59,7 +64,10 @@

    BLOCK_SUBSIDY_FRACTION

    The value 41 / 100_000_000 satisfies the approximation:

    (1 - BLOCK_SUBSIDY_FRACTION)^NUMBER_OF_BLOCKS_IN_4_YEARS ≈ 0.5

    Meaning after a period of 4 years around half of ZSF_BALANCE will be paid out -as block subsidies, thus satisfying G4.

    +as block subsidies, thus satisfying R4.

    +

    Visualization of the Smoothed Curve

    +

    The following graph, taken from the ECC blog post, illustrates the smoothed curve. Note that depending on when the network upgrade takes place the disbursement may temporarily increase.

    +

    A graph showing a comparison of the halving-based step function vs the smoothed curve

    Other Notes

    The suggested implementation avoids using float numbers. Rust and C++ will both round the result of the final division up, satisfying R3 above.

    diff --git a/draft-issuance.md b/draft-issuance.md index 3f0b1d5f8..40425e872 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -107,7 +107,7 @@ as block subsidies, thus satisfying **R4**. The following graph, taken from the ECC blog post, illustrates the smoothed curve. Note that depending on when the network upgrade takes place the disbursement may temporarily _increase_. -![./draft-zip-smoothed-issuance-curve.png](A graph showing a comparison of the halving-based step function vs the smoothed curve) +![A graph showing a comparison of the halving-based step function vs the smoothed curve](./draft-zip-smoothed-issuance-curve.png) ## Other Notes From f60357645fdebb68fbe741434e592923de8dab13 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Wed, 4 Oct 2023 17:41:15 -0400 Subject: [PATCH 28/55] Update draft-issuance.md Co-authored-by: Daira Emma Hopwood --- draft-issuance.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index 40425e872..b8a601804 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -35,8 +35,7 @@ This ZIP proposes a change to how nodes calculate the block subsidy. Instead of following a step function around the 4-year halving intervals inherited from Bitcoin, we propose a slow exponential “smoothing” of the curve. The new issuance -scheme would approximate the current issuance over 4-year intervals, and results in the last -zatoshi being issued in around 114 years. +scheme would approximate the current issuance over 4-year intervals. # Motivation From 5d5bc35c90033dcf13fbb1f75c6f04f1caca722b Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Wed, 4 Oct 2023 17:41:33 -0400 Subject: [PATCH 29/55] Update draft-issuance.md Co-authored-by: Daira Emma Hopwood --- draft-issuance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index b8a601804..c0d2153c7 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -43,7 +43,7 @@ The current Zcash economic model, inherited from Bitcoin, includes a halving mec To address this, we propose smoothing out the issuance curve of ZEC, ensuring a more consistent and predictable rate of coin issuance, while still preserving the overall supply cap of 21,000,000 coins. This modification does not seek to change the core aspects of Zcash's issuance policy. Instead, it solely aims to enhance predictability and avoid sudden changes. By making this shift, the average block subsidy over time will remain consistent, and the funds for block subsidies will be available for a similar duration. -Additionally, the current Bitcoin-style issuance does not take into account the current balance of `ZsfBalanceAfter(h)` where the new smoothed issuance curve would. If the issuance curve were to never be implemeneted, this creates the risk of funds never being disbursed after they are deposited back into the ZSF. Rather than adding complexity, the smoothed model satisfies this requirement with a simpler implementation. +Additionally, the current Bitcoin-style issuance does not take into account the current balance of `ZsfBalanceAfter(h)`. If [#draft-zsf]_ were to activate without a change to the issuance mechanism, then some funds would never be disbursed after they are deposited back into the ZSF. In summary, by introducing a smoother emissions curve, we: - maintain the economic viability of Zcash From 31d05c59217a91d69afb252300c1d349e25c7b3c Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Wed, 4 Oct 2023 17:42:46 -0400 Subject: [PATCH 30/55] Update draft-issuance.md Co-authored-by: Daira Emma Hopwood --- draft-issuance.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index c0d2153c7..e387691e9 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -86,8 +86,7 @@ Using an exponential decay function for **BlockSubsidy** satisfies requirements `BlockSubsidy(h) = BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1)` -Finally, to satisfy **R3** above we need to always round up to at least 1 Zatoshi -if `ZsfBalanceAfter(h - 1) > 0`: +Finally, to satisfy **R3** above we always round up to the next zatoshi. `BlockSubsidy(h) = ceiling(BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1))` From 4b6d62c95447383def29e47e7ca4922f58dfdfc6 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Wed, 4 Oct 2023 18:00:14 -0400 Subject: [PATCH 31/55] Update draft-issuance.md Co-authored-by: Daira Emma Hopwood --- draft-issuance.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index e387691e9..ab8768e01 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -74,8 +74,6 @@ Define constants: “`BLOCK_SUBSIDY_FRACTION`” = 41 / 100,000,000 or `0.00000041` -"`NUMBER_OF_BLOCKS_IN_4_YEARS`" = `(365.25 * 24 * 60 * 60/75 * 4)`, or `1_683_072` - ## Issuance Calculation Given the block height `h` define a function **BlockSubsidy(h)**, such that: From 44d5b95089122ca545a692b1cb6a59d56a459777 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Wed, 4 Oct 2023 18:00:26 -0400 Subject: [PATCH 32/55] Update draft-issuance.md Co-authored-by: Daira Emma Hopwood --- draft-issuance.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/draft-issuance.md b/draft-issuance.md index ab8768e01..44bbb456c 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -28,6 +28,8 @@ and “REQUIRED” in this document are to be interpreted as described in RFC 21 in block `h`, described in ZIP draft-zsf.md. In this ZIP, the Sustainability Fund is used to pay out Block Subsidies from unmined ZEC, and other fund deposits. +Let `PostBlossomHalvingInterval` be as defined in [#protocol-diffadjustment]_. + # Abstract From 3f77205a38a0cbb3150620bee21fc7b2596f8ffd Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Wed, 4 Oct 2023 18:00:51 -0400 Subject: [PATCH 33/55] Update draft-issuance.md Co-authored-by: Daira Emma Hopwood --- draft-issuance.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index 44bbb456c..575849476 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -94,9 +94,11 @@ Finally, to satisfy **R3** above we always round up to the next zatoshi. ## `BLOCK_SUBSIDY_FRACTION` +Let `IntendedZSFFractionRemainingAfterFourYears` = 0.5. + The value `41 / 100_000_000` satisfies the approximation: -`(1 - BLOCK_SUBSIDY_FRACTION)^NUMBER_OF_BLOCKS_IN_4_YEARS ≈ 0.5` +`(1 - BLOCK_SUBSIDY_FRACTION)^PostBlossomHalvingInterval ≈ IntendedZSFFractionRemainingAfterFourYears` Meaning after a period of 4 years around half of `ZSF_BALANCE` will be paid out as block subsidies, thus satisfying **R4**. From 732e65a1520c82cb366f145a6722b1e8cc2fd02e Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Wed, 4 Oct 2023 18:01:37 -0400 Subject: [PATCH 34/55] update: fix issuance clarity points --- draft-issuance.html | 16 +++++++--------- draft-issuance.md | 3 +-- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/draft-issuance.html b/draft-issuance.html index 2ac8a3149..fbe96dabb 100644 --- a/draft-issuance.html +++ b/draft-issuance.html @@ -19,20 +19,19 @@

    Terminology

    ZsfBalanceAfter(h)” is the total ZEC available in the Zcash Sustainability Fund (ZSF) after the transactions in block h, described in ZIP draft-zsf.md. In this ZIP, the Sustainability Fund is used to pay out Block Subsidies from unmined ZEC, and other fund deposits.

    +

    Let PostBlossomHalvingInterval be as defined in [#protocol-diffadjustment]_.

    Abstract

    This ZIP proposes a change to how nodes calculate the block subsidy.

    Instead of following a step function around the 4-year halving intervals inherited from Bitcoin, we propose a slow exponential “smoothing” of the curve. The new issuance -scheme would approximate the current issuance over 4-year intervals, and results in the last -zatoshi being issued in around 114 years.

    +scheme would approximate the current issuance over 4-year intervals.

    Motivation

    The current Zcash economic model, inherited from Bitcoin, includes a halving mechanism which dictates the issuance of new coins. While this has been foundational, halvings can lead to abrupt changes in the rate of new coins being introduced to the market. Such sudden shifts can potentially disrupt the network's economic model, potentially impacting its security and stability.

    To address this, we propose smoothing out the issuance curve of ZEC, ensuring a more consistent and predictable rate of coin issuance, while still preserving the overall supply cap of 21,000,000 coins. This modification does not seek to change the core aspects of Zcash's issuance policy. Instead, it solely aims to enhance predictability and avoid sudden changes. By making this shift, the average block subsidy over time will remain consistent, and the funds for block subsidies will be available for a similar duration.

    -

    Additionally, the current Bitcoin-style issuance does not take into account the current balance of ZsfBalanceAfter(h) where the new smoothed issuance curve would. If the issuance curve were to never be implemeneted, this creates the risk of funds never being disbursed after they are deposited back into the ZSF. Rather than adding complexity, the smoothed model satisfies this requirement with a simpler implementation.

    +

    Additionally, the current Bitcoin-style issuance does not take into account the current balance of ZsfBalanceAfter(h). If [#draft-zsf]_ were to activate without a change to the issuance mechanism, then some funds would never be disbursed after they are deposited back into the ZSF.

    In summary, by introducing a smoother emissions curve, we: - maintain the economic viability of Zcash -- provide clarity on reward distribution -- take into account deposits into the ZSF +- provide clarity on distribution of deposits into the ZSF - enhance Zcash's stability as the network evolves.

    Requirements

    Smoothing the issuance curve is possible using an exponential decay formula that @@ -50,19 +49,18 @@

    Specification

    Constants

    Define constants:

    BLOCK_SUBSIDY_FRACTION” = 41 / 100,000,000 or 0.00000041

    -

    "NUMBER_OF_BLOCKS_IN_4_YEARS" = (365.25 * 24 * 60 * 60/75 * 4), or 1_683_072

    Issuance Calculation

    Given the block height h define a function BlockSubsidy(h), such that:

    BlockSubsidy(h) = Block subsidy for a given h, that satisfies above requirements.

    Using an exponential decay function for BlockSubsidy satisfies requirements R1 and R2 above:

    BlockSubsidy(h) = BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1)

    -

    Finally, to satisfy R3 above we need to always round up to at least 1 Zatoshi -if ZsfBalanceAfter(h - 1) > 0:

    +

    Finally, to satisfy R3 above we always round up to the next zatoshi.

    BlockSubsidy(h) = ceiling(BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1))

    Rationale

    BLOCK_SUBSIDY_FRACTION

    +

    Let IntendedZSFFractionRemainingAfterFourYears = 0.5.

    The value 41 / 100_000_000 satisfies the approximation:

    -

    (1 - BLOCK_SUBSIDY_FRACTION)^NUMBER_OF_BLOCKS_IN_4_YEARS ≈ 0.5

    +

    (1 - BLOCK_SUBSIDY_FRACTION)^PostBlossomHalvingInterval ≈ IntendedZSFFractionRemainingAfterFourYears

    Meaning after a period of 4 years around half of ZSF_BALANCE will be paid out as block subsidies, thus satisfying R4.

    Visualization of the Smoothed Curve

    diff --git a/draft-issuance.md b/draft-issuance.md index 575849476..f82a346ba 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -49,8 +49,7 @@ Additionally, the current Bitcoin-style issuance does not take into account the In summary, by introducing a smoother emissions curve, we: - maintain the economic viability of Zcash -- provide clarity on reward distribution -- take into account deposits into the ZSF +- provide clarity on distribution of deposits into the ZSF - enhance Zcash's stability as the network evolves. # Requirements From d5ea3da0b6bea3c23f8f376589df3cf3a4378d71 Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Fri, 6 Oct 2023 21:41:52 -0400 Subject: [PATCH 35/55] update: deployment block height --- draft-issuance.html | 7 +++++++ draft-issuance.md | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/draft-issuance.html b/draft-issuance.html index fbe96dabb..4fde9ac1b 100644 --- a/draft-issuance.html +++ b/draft-issuance.html @@ -49,13 +49,16 @@

    Specification

    Constants

    Define constants:

    BLOCK_SUBSIDY_FRACTION” = 41 / 100,000,000 or 0.00000041

    +

    "DEPLOYMENT_BLOCK_HEIGHT" = 2726400

    Issuance Calculation

    +

    At the DEPLOYMENT_BLOCK_HEIGHT, nodes should switch from the current issuance calculation, to the following:

    Given the block height h define a function BlockSubsidy(h), such that:

    BlockSubsidy(h) = Block subsidy for a given h, that satisfies above requirements.

    Using an exponential decay function for BlockSubsidy satisfies requirements R1 and R2 above:

    BlockSubsidy(h) = BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1)

    Finally, to satisfy R3 above we always round up to the next zatoshi.

    BlockSubsidy(h) = ceiling(BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1))

    +

    Deployment

    Rationale

    BLOCK_SUBSIDY_FRACTION

    Let IntendedZSFFractionRemainingAfterFourYears = 0.5.

    @@ -63,9 +66,13 @@

    BLOCK_SUBSIDY_FRACTION

    (1 - BLOCK_SUBSIDY_FRACTION)^PostBlossomHalvingInterval ≈ IntendedZSFFractionRemainingAfterFourYears

    Meaning after a period of 4 years around half of ZSF_BALANCE will be paid out as block subsidies, thus satisfying R4.

    +

    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. 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 TARGET_BLOCK_HEIGHT.

    Visualization of the Smoothed Curve

    The following graph, taken from the ECC blog post, illustrates the smoothed curve. Note that depending on when the network upgrade takes place the disbursement may temporarily increase.

    A graph showing a comparison of the halving-based step function vs the smoothed curve

    +

    [TODO: We should update this graph now showing the deployment at 2726400]

    Other Notes

    The suggested implementation avoids using float numbers. Rust and C++ will both round the result of the final division up, satisfying R3 above.

    diff --git a/draft-issuance.md b/draft-issuance.md index f82a346ba..6c959eb8f 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -75,8 +75,12 @@ Define constants: “`BLOCK_SUBSIDY_FRACTION`” = 41 / 100,000,000 or `0.00000041` +"`DEPLOYMENT_BLOCK_HEIGHT`" = 2726400 + ## Issuance Calculation +At the `DEPLOYMENT_BLOCK_HEIGHT`, nodes should switch from the current issuance calculation, to the following: + Given the block height `h` define a function **BlockSubsidy(h)**, such that: **BlockSubsidy(h)** = Block subsidy for a given `h`, that satisfies above requirements. @@ -89,6 +93,8 @@ Finally, to satisfy **R3** above we always round up to the next zatoshi. `BlockSubsidy(h) = ceiling(BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1))` +## Deployment + # Rationale ## `BLOCK_SUBSIDY_FRACTION` @@ -102,12 +108,20 @@ The value `41 / 100_000_000` satisfies the approximation: Meaning after a period of 4 years around half of `ZSF_BALANCE` will be paid out as block subsidies, thus satisfying **R4**. +## `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. 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 `TARGET_BLOCK_HEIGHT`. + ## Visualization of the Smoothed Curve The following graph, taken from the ECC blog post, illustrates the smoothed curve. Note that depending on when the network upgrade takes place the disbursement may temporarily _increase_. ![A graph showing a comparison of the halving-based step function vs the smoothed curve](./draft-zip-smoothed-issuance-curve.png) +[TODO: We should update this graph now showing the deployment at `2726400`] + ## Other Notes The suggested implementation avoids using float numbers. Rust and C++ will both round From 44fc779de9be1a511b0d41f279c9142ae5636cd9 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Mon, 9 Oct 2023 05:50:37 -0400 Subject: [PATCH 36/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index 6c959eb8f..eec2572be 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -112,7 +112,7 @@ as block subsidies, thus satisfying **R4**. 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. 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 `TARGET_BLOCK_HEIGHT`. +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. 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 From 212244f91282d67404b5a61647cfd2f57e720380 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Wed, 11 Oct 2023 12:17:49 -0400 Subject: [PATCH 37/55] Update draft-issuance.md Co-authored-by: Nathan Wilcox --- draft-issuance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index eec2572be..ae29e2c76 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -41,7 +41,7 @@ scheme would approximate the current issuance over 4-year intervals. # Motivation -The current Zcash economic model, inherited from Bitcoin, includes a halving mechanism which dictates the issuance of new coins. While this has been foundational, halvings can lead to abrupt changes in the rate of new coins being introduced to the market. Such sudden shifts can potentially disrupt the network's economic model, potentially impacting its security and stability. +The current Zcash economic model, inherited from Bitcoin, includes a halving mechanism which dictates the issuance of new coins. While this has been foundational, halvings can lead to abrupt changes in the rate of new coins being introduced to the market. Such sudden shifts can potentially disrupt the network's economic model, potentially impacting its security and stability. Furthermore, the halvings schedule is fixed and does not provide any way to "recycle" funds into future issuance. To address this, we propose smoothing out the issuance curve of ZEC, ensuring a more consistent and predictable rate of coin issuance, while still preserving the overall supply cap of 21,000,000 coins. This modification does not seek to change the core aspects of Zcash's issuance policy. Instead, it solely aims to enhance predictability and avoid sudden changes. By making this shift, the average block subsidy over time will remain consistent, and the funds for block subsidies will be available for a similar duration. From fedfd9e3f56925815580acee77d0edfc5d1cef74 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson Date: Wed, 11 Oct 2023 12:19:11 -0400 Subject: [PATCH 38/55] Update draft-issuance.md Co-authored-by: Nathan Wilcox --- draft-issuance.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index ae29e2c76..3fe9f525c 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -43,7 +43,9 @@ scheme would approximate the current issuance over 4-year intervals. The current Zcash economic model, inherited from Bitcoin, includes a halving mechanism which dictates the issuance of new coins. While this has been foundational, halvings can lead to abrupt changes in the rate of new coins being introduced to the market. Such sudden shifts can potentially disrupt the network's economic model, potentially impacting its security and stability. Furthermore, the halvings schedule is fixed and does not provide any way to "recycle" funds into future issuance. -To address this, we propose smoothing out the issuance curve of ZEC, ensuring a more consistent and predictable rate of coin issuance, while still preserving the overall supply cap of 21,000,000 coins. This modification does not seek to change the core aspects of Zcash's issuance policy. Instead, it solely aims to enhance predictability and avoid sudden changes. By making this shift, the average block subsidy over time will remain consistent, and the funds for block subsidies will be available for a similar duration. +To address this, we propose issuing a fixed portion of the pending funds-to-be-issued in each block. This has the effect of smoothing out the issuance curve of ZEC, ensuring a more consistent and predictable rate of coin issuance, while still preserving the overall supply cap of 21,000,000 coins. This mechanism by itself (without other anticipated changes) seeks to preserve the core aspects of Zcash's issuance policy and aims to enhance predictability and avoid sudden changes. By making this shift, the average block subsidy over time will remain predictable with very gradual changes. + +However, we anticipate schemes proposed in [#draft-zsf]_ where the amount of funds-to-be-issued may increase. In that scenario, this issuance mechanism would distribute that increase starting in the immediately following block and subsequent blocks. Because this distribution mechanism has an exponential decay, such increases will be spread out in miniscule amounts to future blocks over a long time period. This issuance mechanism thus provides a way for potential increases or decreases of issuance while constraining those changes to be small on a short time scale to avoid unexpected disruptions. Additionally, the current Bitcoin-style issuance does not take into account the current balance of `ZsfBalanceAfter(h)`. If [#draft-zsf]_ were to activate without a change to the issuance mechanism, then some funds would never be disbursed after they are deposited back into the ZSF. From 54e349d706b0335c27df117a961aae9acd6d53fc Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Wed, 11 Oct 2023 13:36:19 -0400 Subject: [PATCH 39/55] update: provide predictability... bullet point --- draft-issuance.html | 9 +++++---- draft-issuance.md | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/draft-issuance.html b/draft-issuance.html index 4fde9ac1b..5ed6142a0 100644 --- a/draft-issuance.html +++ b/draft-issuance.html @@ -26,12 +26,13 @@

    Abstract

    from Bitcoin, we propose a slow exponential “smoothing” of the curve. The new issuance scheme would approximate the current issuance over 4-year intervals.

    Motivation

    -

    The current Zcash economic model, inherited from Bitcoin, includes a halving mechanism which dictates the issuance of new coins. While this has been foundational, halvings can lead to abrupt changes in the rate of new coins being introduced to the market. Such sudden shifts can potentially disrupt the network's economic model, potentially impacting its security and stability.

    -

    To address this, we propose smoothing out the issuance curve of ZEC, ensuring a more consistent and predictable rate of coin issuance, while still preserving the overall supply cap of 21,000,000 coins. This modification does not seek to change the core aspects of Zcash's issuance policy. Instead, it solely aims to enhance predictability and avoid sudden changes. By making this shift, the average block subsidy over time will remain consistent, and the funds for block subsidies will be available for a similar duration.

    +

    The current Zcash economic model, inherited from Bitcoin, includes a halving mechanism which dictates the issuance of new coins. While this has been foundational, halvings can lead to abrupt changes in the rate of new coins being introduced to the market. Such sudden shifts can potentially disrupt the network's economic model, potentially impacting its security and stability. Furthermore, the halvings schedule is fixed and does not provide any way to "recycle" funds into future issuance.

    +

    To address this, we propose issuing a fixed portion of the pending funds-to-be-issued in each block. This has the effect of smoothing out the issuance curve of ZEC, ensuring a more consistent and predictable rate of coin issuance, while still preserving the overall supply cap of 21,000,000 coins. This mechanism by itself (without other anticipated changes) seeks to preserve the core aspects of Zcash's issuance policy and aims to enhance predictability and avoid sudden changes. By making this shift, the average block subsidy over time will remain predictable with very gradual changes.

    +

    However, we anticipate schemes proposed in [#draft-zsf]_ where the amount of funds-to-be-issued may increase. In that scenario, this issuance mechanism would distribute that increase starting in the immediately following block and subsequent blocks. Because this distribution mechanism has an exponential decay, such increases will be spread out in miniscule amounts to future blocks over a long time period. This issuance mechanism thus provides a way for potential increases or decreases of issuance while constraining those changes to be small on a short time scale to avoid unexpected disruptions.

    Additionally, the current Bitcoin-style issuance does not take into account the current balance of ZsfBalanceAfter(h). If [#draft-zsf]_ were to activate without a change to the issuance mechanism, then some funds would never be disbursed after they are deposited back into the ZSF.

    In summary, by introducing a smoother emissions curve, we: - maintain the economic viability of Zcash -- provide clarity on distribution of deposits into the ZSF +- provide predictability of the issuance rate, allowing only miniscule changes over short time ranges - enhance Zcash's stability as the network evolves.

    Requirements

    Smoothing the issuance curve is possible using an exponential decay formula that @@ -68,7 +69,7 @@

    BLOCK_SUBSIDY_FRACTION

    as block subsidies, thus satisfying R4.

    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. 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 TARGET_BLOCK_HEIGHT.

    +

    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. 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, taken from the ECC blog post, illustrates the smoothed curve. Note that depending on when the network upgrade takes place the disbursement may temporarily increase.

    A graph showing a comparison of the halving-based step function vs the smoothed curve

    diff --git a/draft-issuance.md b/draft-issuance.md index 3fe9f525c..19238edac 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -51,7 +51,7 @@ Additionally, the current Bitcoin-style issuance does not take into account the In summary, by introducing a smoother emissions curve, we: - maintain the economic viability of Zcash -- provide clarity on distribution of deposits into the ZSF +- provide predictability of the issuance rate, allowing only miniscule changes over short time ranges - enhance Zcash's stability as the network evolves. # Requirements From 7c646666582a35afd6f441455f6b67382c2fd15f Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Wed, 11 Oct 2023 13:40:56 -0400 Subject: [PATCH 40/55] update: 4126/100_000_000 --- draft-issuance.html | 10 +++++++--- draft-issuance.md | 16 ++++++++++++---- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/draft-issuance.html b/draft-issuance.html index 5ed6142a0..7bf7da1ef 100644 --- a/draft-issuance.html +++ b/draft-issuance.html @@ -47,9 +47,11 @@

    Issuance Requirements

  11. This functionality MUST be introduced as part of a network upgrade

Specification

+

Goals

+

We want to decrease the short-term impact of the deployment of this ZIP on block reward recipients, and minimise the potential reputational risk to Zcash of changing the block reward amount.

Constants

Define constants:

-

BLOCK_SUBSIDY_FRACTION” = 41 / 100,000,000 or 0.00000041

+

BLOCK_SUBSIDY_FRACTION” = 4126 / 100,000,000 or 0.0000004126

"DEPLOYMENT_BLOCK_HEIGHT" = 2726400

Issuance Calculation

At the DEPLOYMENT_BLOCK_HEIGHT, nodes should switch from the current issuance calculation, to the following:

@@ -60,13 +62,15 @@

Issuance Calculation

Finally, to satisfy R3 above we always round up to the next zatoshi.

BlockSubsidy(h) = ceiling(BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1))

Deployment

+

TBD

Rationale

BLOCK_SUBSIDY_FRACTION

Let IntendedZSFFractionRemainingAfterFourYears = 0.5.

-

The value 41 / 100_000_000 satisfies the approximation:

+

The value 4126 / 100_000_000 satisfies the approximation within +0.002%:

(1 - BLOCK_SUBSIDY_FRACTION)^PostBlossomHalvingInterval ≈ IntendedZSFFractionRemainingAfterFourYears

Meaning after a period of 4 years around half of ZSF_BALANCE will be paid out as block subsidies, thus satisfying R4.

+

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. 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.

@@ -87,7 +91,7 @@

Rust Code

// approximate available subsidies in August of 2023 let mut available_subsidies: i64 = 4671731 * 100_000_000; let mut block: u32 = 0;

-
while available_subsidies > 0 { 
+
while available_subsidies > 0 {
     let block_subsidy = (available_subsidies * 41 + 99_999_999) / 100_000_000;
     available_subsidies -= block_subsidy;
 
diff --git a/draft-issuance.md b/draft-issuance.md
index 19238edac..1f5b3c25c 100644
--- a/draft-issuance.md
+++ b/draft-issuance.md
@@ -71,11 +71,15 @@ TODO daira: add a requirement that makes the initial total issuance match the pr
 
 # Specification
 
+## Goals
+
+We want to decrease the short-term impact of the deployment of this ZIP on block reward recipients, and minimise the potential reputational risk to Zcash of changing the block reward amount.
+
 ## Constants
 
 Define constants:
 
-“`BLOCK_SUBSIDY_FRACTION`” = 41 / 100,000,000 or `0.00000041`
+“`BLOCK_SUBSIDY_FRACTION`” = 4126 / 100,000,000 or `0.0000004126`
 
 "`DEPLOYMENT_BLOCK_HEIGHT`" = 2726400
 
@@ -97,19 +101,23 @@ Finally, to satisfy **R3** above we always round up to the next zatoshi.
 
 ## Deployment
 
+TBD
+
 # Rationale
 
 ## `BLOCK_SUBSIDY_FRACTION`
 
 Let `IntendedZSFFractionRemainingAfterFourYears` = 0.5.
 
-The value `41 / 100_000_000` satisfies the approximation:
+The value `4126 / 100_000_000` satisfies the approximation within +0.002%:
 
 `(1 - BLOCK_SUBSIDY_FRACTION)^PostBlossomHalvingInterval ≈ IntendedZSFFractionRemainingAfterFourYears`
 
 Meaning after a period of 4 years around half of `ZSF_BALANCE` will be paid out
 as block subsidies, thus satisfying **R4**.
 
+TODO for ZIP owners: How many ZEC per day?
+
 ## `DEPLOYMENT_BLOCK_HEIGHT`
 
 The deployment should happen at the next halving, which is block `2726400`.
@@ -143,7 +151,7 @@ fn main() {
     let mut available_subsidies: i64 = 4671731 * 100_000_000;
     let mut block: u32 = 0;
 
-    while available_subsidies > 0 { 
+    while available_subsidies > 0 {
         let block_subsidy = (available_subsidies * 41 + 99_999_999) / 100_000_000;
         available_subsidies -= block_subsidy;
 
@@ -158,7 +166,7 @@ fn main() {
         );
 
         block += 1;
-    }   
+    }
 }
 ```
 

From 900b868e1dfefa24f4b42af998f9fda7a8ebd249 Mon Sep 17 00:00:00 2001
From: Tomek Piotrowski 
Date: Thu, 12 Oct 2023 17:14:12 +0200
Subject: [PATCH 41/55] Update simulation code

---
 draft-issuance.md | 38 ++++++++++++++++++++++++++------------
 1 file changed, 26 insertions(+), 12 deletions(-)

diff --git a/draft-issuance.md b/draft-issuance.md
index 1f5b3c25c..49b6ea070 100644
--- a/draft-issuance.md
+++ b/draft-issuance.md
@@ -146,35 +146,49 @@ last for approximately 113 years:
 ## Rust Code
 
 ```rust
+const BLOCKS_PER_YEAR: u32 = 420_768;
+const ZATOSHIS_PER_ZEC: i64 = 100_000_000;
+// predicted ZEC supply at the next halving (block 2726400)
+const INITIAL_SUPPLY: i64 = 1_574_963_454_129_680;
+const MAX_MONEY: i64 = 21_000_000;
+const INITIAL_SUBSIDIES: i64 = MAX_MONEY * ZATOSHIS_PER_ZEC - INITIAL_SUPPLY;
+
+const BLOCK_SUBSIDY_NUMERATOR: i64 = 4126;
+const BLOCK_SUBSIDY_DENOMINATOR: i64 = 10_000_000_000;
+
 fn main() {
-    // approximate available subsidies in August of 2023
-    let mut available_subsidies: i64 = 4671731 * 100_000_000;
+    let mut available_subsidies: i64 = INITIAL_SUBSIDIES;
     let mut block: u32 = 0;
 
     while available_subsidies > 0 {
-        let block_subsidy = (available_subsidies * 41 + 99_999_999) / 100_000_000;
+        let block_subsidy = (available_subsidies * BLOCK_SUBSIDY_NUMERATOR
+            + (BLOCK_SUBSIDY_DENOMINATOR - 1))
+            / BLOCK_SUBSIDY_DENOMINATOR;
         available_subsidies -= block_subsidy;
 
         println!(
-            "{} ({} years): {}({} ZEC) {}({} ZEC)",
-            block,                             // current block
-            block / 420_768,                   // ~ current year
-            block_subsidy,                     // block subsidy in zatoshis
-            block_subsidy / 100_000_000,       // block subsidy in ZEC
-            available_subsidies,               // available subsidies in zatoshis
-            available_subsidies / 100_000_000  // available subsidies in ZEC
+            "Block {} (~{:.2} years): Subsidy: {} (~{} ZEC), ZSF: {} (~{} ZEC)",
+            block,                                  // current block
+            block as f64 / BLOCKS_PER_YEAR as f64,  // ~ current year
+            block_subsidy,                          // block subsidy in zatoshis
+            block_subsidy / ZATOSHIS_PER_ZEC,       // block subsidy in ZEC
+            available_subsidies,                    // available subsidies in zatoshis
+            available_subsidies / ZATOSHIS_PER_ZEC  // available subsidies in ZEC
         );
 
         block += 1;
     }
 }
+
 ```
 
 Last line of output of the above program is:
 
-`47699804 (113 years): 1(0 ZEC) 0(0 ZEC)`
+`Block 47917869 (~113.88 years): Subsidy: 1 (~0 ZEC), ZSF: 0 (~0 ZEC)`
+
+Meaning that subsidies will last for 47917869 blocks after the next halving, which is approximately 113 years.
 
-Note the addition of 99,999,999 before division to force rounding up of non-zero values.
+Note the addition of `BLOCK_SUBSIDY_DENOMINATOR-1` before division to force rounding up of non-zero values.
 
 
 # References

From 3f6eb5400a219fdcbda3d7acb530c53d264d9c22 Mon Sep 17 00:00:00 2001
From: Tomek Piotrowski 
Date: Thu, 12 Oct 2023 17:26:41 +0200
Subject: [PATCH 42/55] Update the subsidy fraction. Remove Other Notes.

---
 draft-issuance.md | 9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)

diff --git a/draft-issuance.md b/draft-issuance.md
index 49b6ea070..1e93e9578 100644
--- a/draft-issuance.md
+++ b/draft-issuance.md
@@ -79,7 +79,7 @@ We want to decrease the short-term impact of the deployment of this ZIP on block
 
 Define constants:
 
-“`BLOCK_SUBSIDY_FRACTION`” = 4126 / 100,000,000 or `0.0000004126`
+“`BLOCK_SUBSIDY_FRACTION`” = 4126 / 10,000,000,000 or `0.0000004126`
 
 "`DEPLOYMENT_BLOCK_HEIGHT`" = 2726400
 
@@ -109,7 +109,7 @@ TBD
 
 Let `IntendedZSFFractionRemainingAfterFourYears` = 0.5.
 
-The value `4126 / 100_000_000` satisfies the approximation within +0.002%:
+The value `4126 / 10_000_000_000` satisfies the approximation within +0.002%:
 
 `(1 - BLOCK_SUBSIDY_FRACTION)^PostBlossomHalvingInterval ≈ IntendedZSFFractionRemainingAfterFourYears`
 
@@ -132,11 +132,6 @@ The following graph, taken from the ECC blog post, illustrates the smoothed curv
 
 [TODO: We should update this graph now showing the deployment at `2726400`]
 
-## Other Notes
-
-The suggested implementation avoids using float numbers. Rust and C++ will both round
-the result of the final division up, satisfying **R3** above.
-
 # Appendix: Simulation
 
 We encourage readers to run the following Rust code, which simulates block subsidies.

From 776295cef248993ea595f3f73370984b6c6e82bd Mon Sep 17 00:00:00 2001
From: Tomek Piotrowski 
Date: Fri, 13 Oct 2023 17:59:46 +0200
Subject: [PATCH 43/55] Update plots and simulator outputs

---
 draft-issuance.md                     |  66 +++++++-------------------
 draft-zip-smoothed-issuance-curve.png | Bin 16348 -> 0 bytes
 zsf_balance.png                       | Bin 0 -> 102102 bytes
 zsf_block_subsidy.png                 | Bin 0 -> 112788 bytes
 4 files changed, 18 insertions(+), 48 deletions(-)
 delete mode 100644 draft-zip-smoothed-issuance-curve.png
 create mode 100644 zsf_balance.png
 create mode 100644 zsf_block_subsidy.png

diff --git a/draft-issuance.md b/draft-issuance.md
index 1e93e9578..b7b6d5726 100644
--- a/draft-issuance.md
+++ b/draft-issuance.md
@@ -126,65 +126,35 @@ Since there is a planned halving at this point, there will already be a signific
 
 ## Visualization of the Smoothed Curve
 
-The following graph, taken from the ECC blog post, illustrates the smoothed curve. Note that depending on when the network upgrade takes place the disbursement may temporarily _increase_.
+The following graph illustrates compares issuance for the current halving-based step function vs the smoothed curve.
 
-![A graph showing a comparison of the halving-based step function vs the smoothed curve](./draft-zip-smoothed-issuance-curve.png)
+![A graph showing a comparison of the halving-based step function vs the smoothed curve](./zsf_block_subsidy.png)
+
+The graph below shows the balance of the ZSF assuming smooth issuance is implemented.
+
+![A graph showing the balance of the ZSF assuming smooth issuance is implemented](./zsf_balance.png)
 
-[TODO: We should update this graph now showing the deployment at `2726400`]
 
 # Appendix: Simulation
 
-We encourage readers to run the following Rust code, which simulates block subsidies.
-According to this simulation, assuming no deflationary action, block subsidies would
-last for approximately 113 years:
-
-## Rust Code
-
-```rust
-const BLOCKS_PER_YEAR: u32 = 420_768;
-const ZATOSHIS_PER_ZEC: i64 = 100_000_000;
-// predicted ZEC supply at the next halving (block 2726400)
-const INITIAL_SUPPLY: i64 = 1_574_963_454_129_680;
-const MAX_MONEY: i64 = 21_000_000;
-const INITIAL_SUBSIDIES: i64 = MAX_MONEY * ZATOSHIS_PER_ZEC - INITIAL_SUPPLY;
-
-const BLOCK_SUBSIDY_NUMERATOR: i64 = 4126;
-const BLOCK_SUBSIDY_DENOMINATOR: i64 = 10_000_000_000;
-
-fn main() {
-    let mut available_subsidies: i64 = INITIAL_SUBSIDIES;
-    let mut block: u32 = 0;
-
-    while available_subsidies > 0 {
-        let block_subsidy = (available_subsidies * BLOCK_SUBSIDY_NUMERATOR
-            + (BLOCK_SUBSIDY_DENOMINATOR - 1))
-            / BLOCK_SUBSIDY_DENOMINATOR;
-        available_subsidies -= block_subsidy;
-
-        println!(
-            "Block {} (~{:.2} years): Subsidy: {} (~{} ZEC), ZSF: {} (~{} ZEC)",
-            block,                                  // current block
-            block as f64 / BLOCKS_PER_YEAR as f64,  // ~ current year
-            block_subsidy,                          // block subsidy in zatoshis
-            block_subsidy / ZATOSHIS_PER_ZEC,       // block subsidy in ZEC
-            available_subsidies,                    // available subsidies in zatoshis
-            available_subsidies / ZATOSHIS_PER_ZEC  // available subsidies in ZEC
-        );
-
-        block += 1;
-    }
-}
+The [ZSF simulator](https://github.com/eigerco/zsf-simulator) allows us to simulate the effects of this ZIP on the ZSF balance and the block subsidy, as well as generate plots like the one above. It's output:
 
+```
+Last block is 47917869 in ~113.88 years
 ```
 
-Last line of output of the above program is:
-
-`Block 47917869 (~113.88 years): Subsidy: 1 (~0 ZEC), ZSF: 0 (~0 ZEC)`
+indicates that, assuming no ZEC is ever deposited to the ZSF, its balance will be depleted after 113.88 years, and the block subsidy will be 0 ZEC after that point.
 
-Meaning that subsidies will last for 47917869 blocks after the next halving, which is approximately 113 years.
+This fragment of the output 
 
-Note the addition of `BLOCK_SUBSIDY_DENOMINATOR-1` before division to force rounding up of non-zero values.
+```
+Halving  1 at block  1680000:
+  ZSF subsidies:    262523884819889 (~2625238 ZEC)
+  legacy subsidies: 262500000000000 (~2625000 ZEC) (1.56250000 ZEC per block)
+  difference:           23884819889 (~    238 ZEC), ZSF/legacy: 1.0001
+```
 
+shows that the difference between the smoothed out and the current issuance schemes is 238 ZEC after 1680000 blocks (aroound 4 years).
 
 # References
 
diff --git a/draft-zip-smoothed-issuance-curve.png b/draft-zip-smoothed-issuance-curve.png
deleted file mode 100644
index 7bc9a98a8770cd77862ed2e30032126671d94c3e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 16348
zcmch82UJu|lxDqdXmZZE0g+$;CFd4YBqs@i1W^zK$&$k}fQS+#D-sn@5XnISX+;Dj
z=M1e#MnI69_BH>^?9S}&oDJs;9J>2e-MaU?_kMM&`tj4Ikc&`%GcpK>%1Nt0R^1HJDV1efObC>;w7hjC&32JbLm-!Y4Qq}kt7k)Lr
z_~QI`n!nLdn`65pCx?gKHFlxz6rW`{6PTnhQtzoA2sd}Vc;fEByksZkDCBBapONpg
z`_QHQn^ydal9A4cw;9`HkXzll>5xqjgxLMx{e)5^3+Rp-jN7^|6
zARrCY0JsBy!~A~^!$VkNDiEb8#Kymw#~-Hcmt8UnE#Q@r+Yr*$G}`0;*6;Y7ut
zEFQuisxY+(UMO8uRlRhru*q!1CrN34RN-UX3{lfwe^r*^3E)4zd!HPaT17_&>Z{PP
zFMYaSu)sgP7PijPBH%;Z$U2u7)?Ri)%pA0cC!qnRYqdG3m1DZJt3d^Cx1>HnfCHbA
zelC6D!E>#q?IoAS8s1kE8@q1h^WDq4!fwBA-adS!yfnl$uNt@07)IO1#a8rpXm~TE
z%~2}g#G!v%|J3Y(PV~a&#;S=?nOXYfgU#ydOM7|~PR>zXvlbbu1M$MNnLgKi-`Knm
zD%!_v{tj1(zL-2bJ@Rz)!gB@Pw;DHx`E8V9Pju071378Q-D?IszZ9QCtyFmbOXNL#
ze+hZV=6;QAv{)(UF-=ox&tuCIb#MD|zoRgYJjq(*?lL2ms@V{-q<3p|lw}rM`+?a(
zP~A;Q0h~Eq<1?!D^YV15innL#rLSPjaiGfvEAA&!;q`J0FZJa#7$o+f=)1q_|G`q?PP%dwdM)4z7iO-A_|HFT
zG;M_52I#y`Sk9d!Bf%XMXZdz|XJ&cvFaZG)Za`A6T$3Yfm%Ka&D(I6{kA;sQ^KFvM#Xk>ggOFl6Y?U?X*4=+$p#(geaPg+%TSS-?CpU=>kB=E=my0V1A4%oz0*rm$kTI!nd
z;3HcaO1-BSx-KpMv1qXxt_{f%o^Ve6&Ej0e;Qh_58>{{W!XHEJ{X)4{9tON!KSAo7
zRU3&icpa9+s8nspclzbhwh1FQK8^xD&AoJNJpG
zY2qU!_%H1xdDg^CgI6*4NojGp0y$tbVeAiQN9$JJaVs9>H>~lPvq(A65x~Fv-mBzh
zzlJh!lwPuEyQEt&{7F6mg{@cax3~<6ln;}AOeI{eZmLC_-yw@NA<5*@)2eBd6$7Tb
zk2cyl+u~|!6=%SW%EMT+$gs*9-!0XL0aIGm)QjnINa9i=fi~2+UV>mqCQy!GurfQp
z#8Q2LQGuCE=X^G-;M)eC+b3%BEWH>V4|y#IM=Le+xVcSCq<;WXT6J=>%2W%qc>#)P
zaf^;|oox>#3xGvO5|luT<8Iy^8HqP8`V*dS)U>{EF|fAGHBA7Ghj32yRg;;|*%~_n
z(|@fePDX-3F}w%s=tsT;4!D2P%5S*)6f_SM?B8bS%sm>NJ88!J5oOlF2czr
zxd(}t#X{8V`EcTTU2eJDFm++pc#dh#httw%b{$rxIx*jtu92CapS)@xx4?>5gpR+a
z#2K5|JNNPCorUdm9mpj)aP*1A)FNrd!X?>hJqG+0>mHl*IHu9CQsBQpen#fe{pUb*{+Ult(B>VMZ9!#{WptU%;rtH|Saavr}$UEfL`qUoiIg$MwzRc09-#sWFED}d1FUrFzK6Es7a;fwF5^vRr0m6veKwxlVS
z6@cx=A!{Se#i^YI*BAVkNeSKRIH$`mv}9F(w>p4lFT6K9Rp13INUN3Zx1nAA?&H9X
zECr52F2eQg&td{N

T~+Xa!~<;zrRNw)S8|; zK3YE4_|WC{3mZ)j-i7|3F2hiB(3mW@Y*3b~a{y)RxaPNoq-$j?JnLd>9B|uuo+NNH z=D|4{E0#LPbym3!znI#&w@iYElzhIQ>#CYkN`ZbUM6wE7{4~1QSQxgYP`n|{_V)ci z(Qa;?>2?=Z8Y4zEqA9RWbO!O zR?dlLS`Yl))hhViH*dy^;=o_`0aPTmpH$%0o{EKd>0J*$r^XqEvz@LZwmhoUd}W`k z6@&l_8GYPNINh4P!)x?j@}HekbgYY#%2eF&_trfX__pshk6YRGpAvtE?(RX!QMWY|stfQ5&}o0&5l=8GVgG}Ca1ym-+@O@@}u z>7~=&6GJ6_O8kyGExulIw)qh5ITj)v%b93Gf@}wV-JaFZEA0!Z_a^Me&tKUn&#eJ} z*Kp1jN#Yd`j8CmBm;S0f><-JG=rDCTTv-dTp(@Iq;5EG}^ewRd5!+RD*Xag7RTsH; zEn&mS*0t9g6j#cf1L<;0E* z1OEqW5HcTd#J%Nzvh6&)w)`ZZyLm@$FN?P9lEirHkBZ#3ajcecPwM7W2YrMr^K7nz z+tsg5w>B@Z)q8;49yzJjI04Sl)!Itw=3* zae^;jfaxnfw26jFill$XgHNn<0yrf^&SPh{ZZ&nfwL9PQRl|L9dN%ZmY=KX`nH3jU zkMrES!+RdC_67n%>zyRHB3l{D3n+k9!NdmiIR*|1A)ljp;5IO1kuO04BC;U%xKhPQ z`?L@W^ODqk>^F|Zt!vx<$6l}YqNzt9rC~FtH|?5zOPkX6aoAJ)R-%0D*3z6&X;{Wu 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 Ywi|FkLMF8iAU~QH^v=Iiv%UA<01{!1T>t<8 diff --git a/zsf_balance.png b/zsf_balance.png new file mode 100644 index 0000000000000000000000000000000000000000..9f0e8e5a756e2ed3c6cfe0e0e40434906530ad7b GIT binary patch literal 102102 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 literal 0 HcmV?d00001 diff --git a/zsf_block_subsidy.png b/zsf_block_subsidy.png new file mode 100644 index 0000000000000000000000000000000000000000..435d8fcd46df207865e645dee765afa47c9c2949 GIT binary patch literal 112788 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 LeEq=er5pYae`U0l literal 0 HcmV?d00001 From c315670dfbacd169680999fbff61ed613ec125fd Mon Sep 17 00:00:00 2001 From: Tomek Piotrowski Date: Fri, 13 Oct 2023 18:08:02 +0200 Subject: [PATCH 44/55] typos --- draft-issuance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index b7b6d5726..3376ae607 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -137,7 +137,7 @@ The graph below shows the balance of the ZSF assuming smooth issuance is impleme # Appendix: Simulation -The [ZSF simulator](https://github.com/eigerco/zsf-simulator) allows us to simulate the effects of this ZIP on the ZSF balance and the block subsidy, as well as generate plots like the one above. It's output: +The [ZSF simulator](https://github.com/eigerco/zsf-simulator) allows us to simulate the effects of this ZIP on the ZSF balance and the block subsidy, as well as generate plots like the ones above. Its output: ``` Last block is 47917869 in ~113.88 years From 86049bbd5746efdc25da3a2fa022d28017ec6962 Mon Sep 17 00:00:00 2001 From: Tomek Piotrowski Date: Tue, 7 Nov 2023 10:14:36 +0100 Subject: [PATCH 45/55] Expand the BLOCK_SUBSIDY_FRACTION rationale --- draft-issuance.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/draft-issuance.md b/draft-issuance.md index 3376ae607..ba19cd0ef 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -116,6 +116,12 @@ The value `4126 / 10_000_000_000` satisfies the approximation within +0.002%: Meaning after a period of 4 years around half of `ZSF_BALANCE` will be paid out as block subsidies, thus satisfying **R4**. +The largest possible amount in the ZSF is MAX_MONEY, in the theoretically possible case that all issued funds are deposited back into the ZSF. If this happened, the largest interim sum in the block subsidy calculation would be MAX_MONEY * 4126 + 10000000000. + +This uses 62.91 bits, which is just under the 63 bit limit for signed 64-bit integer amount types. + +The numerator could be brought closer to the limit by using a larger denominator, but the difference in the amount issued would be very small. So we chose a power-of-10 denominator for simplicity. + TODO for ZIP owners: How many ZEC per day? ## `DEPLOYMENT_BLOCK_HEIGHT` From b580625943a7fdab30ec9e8cdf3117b0e88dc9c0 Mon Sep 17 00:00:00 2001 From: Tomek Piotrowski Date: Tue, 7 Nov 2023 12:41:23 +0100 Subject: [PATCH 46/55] Add information about deployment after ZSF is deployed --- draft-issuance.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/draft-issuance.md b/draft-issuance.md index ba19cd0ef..e01311555 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -101,6 +101,8 @@ Finally, to satisfy **R3** above we always round up to the next zatoshi. ## Deployment +The implementation of this ZIP MUST be deployed at the same time or after the Zcash Sustainability Fund is established. + TBD # Rationale From 0c42f7ba272115ccf70a9ade8a4f06813b2cdf08 Mon Sep 17 00:00:00 2001 From: Tomek Piotrowski Date: Tue, 7 Nov 2023 12:56:23 +0100 Subject: [PATCH 47/55] Explicitly mention dependency on ZSF --- draft-issuance.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/draft-issuance.md b/draft-issuance.md index e01311555..00e9d8b1a 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -39,6 +39,8 @@ Instead of following a step function around the 4-year halving intervals inherit from Bitcoin, we propose a slow exponential “smoothing” of the curve. The new issuance scheme would approximate the current issuance over 4-year intervals. +This ZIP depends on the ZIP introducing the Zcash Sustainability Fund (ZIP-XXX). + # Motivation The current Zcash economic model, inherited from Bitcoin, includes a halving mechanism which dictates the issuance of new coins. While this has been foundational, halvings can lead to abrupt changes in the rate of new coins being introduced to the market. Such sudden shifts can potentially disrupt the network's economic model, potentially impacting its security and stability. Furthermore, the halvings schedule is fixed and does not provide any way to "recycle" funds into future issuance. From f5224f8107058e48812797c0ecf8f372de7bef8b Mon Sep 17 00:00:00 2001 From: Tomek Piotrowski Date: Tue, 7 Nov 2023 14:08:17 +0100 Subject: [PATCH 48/55] Add information about ZSF subsidies per block --- draft-issuance.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index 00e9d8b1a..3fe4f109b 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -159,9 +159,9 @@ This fragment of the output ``` Halving 1 at block 1680000: - ZSF subsidies: 262523884819889 (~2625238 ZEC) - legacy subsidies: 262500000000000 (~2625000 ZEC) (1.56250000 ZEC per block) - difference: 23884819889 (~ 238 ZEC), ZSF/legacy: 1.0001 + ZSF subsidies: 262523884819889 (~ 2625238.848 ZEC, 1.563 ZEC per block) + legacy subsidies: 262500000000000 (~ 2625000.000 ZEC, 1.562 ZEC per block) + difference: 23884819889 (~ 238 ZEC), ZSF/legacy: 1.0001 ``` shows that the difference between the smoothed out and the current issuance schemes is 238 ZEC after 1680000 blocks (aroound 4 years). From be2140a42aa54dc9627c79acbc8ebac7a6adb70c Mon Sep 17 00:00:00 2001 From: Tomek Piotrowski Date: Mon, 13 Nov 2023 13:49:51 +0100 Subject: [PATCH 49/55] Update draft-issuance.md Co-authored-by: teor --- draft-issuance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index 3fe4f109b..5bec3cec4 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -103,7 +103,7 @@ Finally, to satisfy **R3** above we always round up to the next zatoshi. ## Deployment -The implementation of this ZIP MUST be deployed at the same time or after the Zcash Sustainability Fund is established. +The implementation of this ZIP MUST be deployed at the same time or after the Zcash Sustainability Fund is established (ZIP-XXX). TBD From 7133f29ecce3dc71f36cbe3a2c842c5cafdcfd22 Mon Sep 17 00:00:00 2001 From: Tomek Piotrowski Date: Thu, 16 Nov 2023 09:18:17 +0100 Subject: [PATCH 50/55] remove network upgrade requirement --- draft-issuance.md | 1 - 1 file changed, 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index 5bec3cec4..c3c21f1cf 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -68,7 +68,6 @@ satisfies the following requirements: 3. If there are funds in the ZSF, then the block subsidy must be non-zero, preventing any final “unmined” zatoshis 4. For any 4 year period, all paid out block subsidies are approximately equal to half of the ZSF at the beginning of that 4 year period, if there are no deposits into the ZSF during those 4 years TODO daira: add a requirement that makes the initial total issuance match the previous total issuance -5. This functionality MUST be introduced as part of a network upgrade # Specification From f4d84e92217b3a0523d4c4f4941536e3321aa231 Mon Sep 17 00:00:00 2001 From: Tomek Piotrowski Date: Thu, 16 Nov 2023 09:20:39 +0100 Subject: [PATCH 51/55] Move deployoment to top level and move it closer to the end --- draft-issuance.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index c3c21f1cf..e4e71f33e 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -100,12 +100,6 @@ Finally, to satisfy **R3** above we always round up to the next zatoshi. `BlockSubsidy(h) = ceiling(BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1))` -## Deployment - -The implementation of this ZIP MUST be deployed at the same time or after the Zcash Sustainability Fund is established (ZIP-XXX). - -TBD - # Rationale ## `BLOCK_SUBSIDY_FRACTION` @@ -143,6 +137,9 @@ The graph below shows the balance of the ZSF assuming smooth issuance is impleme ![A graph showing the balance of the ZSF assuming smooth issuance is implemented](./zsf_balance.png) +# Deployment + +The implementation of this ZIP MUST be deployed at the same time or after the Zcash Sustainability Fund is established (ZIP-XXX). # Appendix: Simulation From 20a12da40cdd2df04994fd1b2563de9692fe4ea5 Mon Sep 17 00:00:00 2001 From: Tomek Piotrowski Date: Thu, 16 Nov 2023 09:30:55 +0100 Subject: [PATCH 52/55] remove the summary section from motivation --- draft-issuance.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/draft-issuance.md b/draft-issuance.md index e4e71f33e..e9c6e78b7 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -51,11 +51,6 @@ However, we anticipate schemes proposed in [#draft-zsf]_ where the amount of fun Additionally, the current Bitcoin-style issuance does not take into account the current balance of `ZsfBalanceAfter(h)`. If [#draft-zsf]_ were to activate without a change to the issuance mechanism, then some funds would never be disbursed after they are deposited back into the ZSF. -In summary, by introducing a smoother emissions curve, we: -- maintain the economic viability of Zcash -- provide predictability of the issuance rate, allowing only miniscule changes over short time ranges -- enhance Zcash's stability as the network evolves. - # Requirements Smoothing the issuance curve is possible using an exponential decay formula that From 96169eb2fbff48783d3c3fbdb505e164c112da30 Mon Sep 17 00:00:00 2001 From: Tomek Piotrowski Date: Thu, 16 Nov 2023 09:33:28 +0100 Subject: [PATCH 53/55] Update draft-issuance.md Co-authored-by: str4d --- draft-issuance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/draft-issuance.md b/draft-issuance.md index e9c6e78b7..dcd93c718 100644 --- a/draft-issuance.md +++ b/draft-issuance.md @@ -110,7 +110,7 @@ as block subsidies, thus satisfying **R4**. The largest possible amount in the ZSF is MAX_MONEY, in the theoretically possible case that all issued funds are deposited back into the ZSF. If this happened, the largest interim sum in the block subsidy calculation would be MAX_MONEY * 4126 + 10000000000. -This uses 62.91 bits, which is just under the 63 bit limit for signed 64-bit integer amount types. +This uses 62.91 bits, which is just under the 63 bit limit for 64-bit signed two's-complement integer amount types. The numerator could be brought closer to the limit by using a larger denominator, but the difference in the amount issued would be very small. So we chose a power-of-10 denominator for simplicity. From 6464118b4552244381b280780173750d18e650f3 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Tue, 27 Aug 2024 12:18:29 -0600 Subject: [PATCH 54/55] [ZIP 234] Move issuance zip draft to ZIP 234 --- draft-issuance.html => rendered/zip-0234.html | 0 zsf_balance.png => zips/zip-0234-balance.png | Bin .../zip-0234-block_subsidy.png | Bin draft-issuance.md => zips/zip-0234.md | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename draft-issuance.html => rendered/zip-0234.html (100%) rename zsf_balance.png => zips/zip-0234-balance.png (100%) rename zsf_block_subsidy.png => zips/zip-0234-block_subsidy.png (100%) rename draft-issuance.md => zips/zip-0234.md (100%) diff --git a/draft-issuance.html b/rendered/zip-0234.html similarity index 100% rename from draft-issuance.html rename to rendered/zip-0234.html diff --git a/zsf_balance.png b/zips/zip-0234-balance.png similarity index 100% rename from zsf_balance.png rename to zips/zip-0234-balance.png diff --git a/zsf_block_subsidy.png b/zips/zip-0234-block_subsidy.png similarity index 100% rename from zsf_block_subsidy.png rename to zips/zip-0234-block_subsidy.png diff --git a/draft-issuance.md b/zips/zip-0234.md similarity index 100% rename from draft-issuance.md rename to zips/zip-0234.md From 996f3b470c8ee4499f9b71e133fb27d7f6b0551e Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Tue, 27 Aug 2024 12:29:19 -0600 Subject: [PATCH 55/55] [ZIP 234] Format and re-render --- README.rst | 2 + rendered/index.html | 2 + rendered/zip-0234.html | 274 ++++++++++++++++++++++++++--------------- zips/zip-0234.md | 131 ++++++++++++++------ 4 files changed, 271 insertions(+), 138 deletions(-) diff --git a/README.rst b/README.rst index f8931d930..79183863e 100644 --- a/README.rst +++ b/README.rst @@ -128,6 +128,7 @@ written. 230 Version 6 Transaction Format Draft 231 Decouple Memos from Transaction Outputs Reserved 233 Establish the Zcash Sustainability Fund on the Protocol Level Draft + 234 Smooth Out The Block Subsidy Issuance Draft 236 Blocks should balance exactly Draft 245 Transaction Identifier Digests & Signature Validation for Transparent Zcash Extensions Draft 302 Standardized Memo Field Format Draft @@ -250,6 +251,7 @@ Index of ZIPs 230 Version 6 Transaction Format Draft 231 Decouple Memos from Transaction Outputs Reserved 233 Establish the Zcash Sustainability Fund on the Protocol Level Draft + 234 Smooth Out The Block Subsidy Issuance Draft 236 Blocks should balance exactly Draft 239 Relay of Version 5 Transactions Final 243 Transaction Signature Validation for Sapling Final diff --git a/rendered/index.html b/rendered/index.html index e87b55dce..4837413ba 100644 --- a/rendered/index.html +++ b/rendered/index.html @@ -93,6 +93,7 @@ 230 Version 6 Transaction Format Draft 231 Decouple Memos from Transaction Outputs Reserved 233 Establish the Zcash Sustainability Fund on the Protocol Level Draft + 234 Smooth Out The Block Subsidy Issuance Draft 236 Blocks should balance exactly Draft 245 Transaction Identifier Digests & Signature Validation for Transparent Zcash Extensions Draft 302 Standardized Memo Field Format Draft @@ -196,6 +197,7 @@ 230 Version 6 Transaction Format Draft 231 Decouple Memos from Transaction Outputs Reserved 233 Establish the Zcash Sustainability Fund on the Protocol Level Draft + 234 Smooth Out The Block Subsidy Issuance Draft 236 Blocks should balance exactly Draft 239 Relay of Version 5 Transactions Final 243 Transaction Signature Validation for Sapling Final diff --git a/rendered/zip-0234.html b/rendered/zip-0234.html index 7bf7da1ef..5da8eb546 100644 --- a/rendered/zip-0234.html +++ b/rendered/zip-0234.html @@ -1,4 +1,13 @@ -

ZIP: + + + + ZIP 234: Smooth Out The Block Subsidy Issuance + + + + + +

ZIP: 234
 Title: Smooth Out The Block Subsidy Issuance
 Owners: Jason McGee <jason@shieldedlabs.com>
         Mark Henderson <mark@equilibrium.co>
@@ -9,111 +18,176 @@
 Status: Draft
 Category: Consensus
 Created: 2023-08-23
-License: BSD-2-Clause

-

Terminology

-

The key words “MUST”, “SHOULD”, “SHOULD NOT”, “MAY”, “RECOMMENDED”, “OPTIONAL”, -and “REQUIRED” in this document are to be interpreted as described in RFC 2119. [1]

-

"Network upgrade" - to be interpreted as described in ZIP 200. [2]

-

“Block Subsidy” - to be interpreted as described in the Zcash Protocol Specification (TODO ZIP Editors: link from comment).

-

“Issuance” - the sum of Block Subsidies over time. (TODO ZIP Editors: work out if this definition is correct or can be removed).

-

ZsfBalanceAfter(h)” is the total ZEC available in the Zcash Sustainability Fund (ZSF) after the transactions -in block h, described in ZIP draft-zsf.md. In this ZIP, the Sustainability Fund is used to pay out Block Subsidies -from unmined ZEC, and other fund deposits.

-

Let PostBlossomHalvingInterval be as defined in [#protocol-diffadjustment]_.

-

Abstract

-

This ZIP proposes a change to how nodes calculate the block subsidy.

-

Instead of following a step function around the 4-year halving intervals inherited -from Bitcoin, we propose a slow exponential “smoothing” of the curve. The new issuance -scheme would approximate the current issuance over 4-year intervals.

-

Motivation

-

The current Zcash economic model, inherited from Bitcoin, includes a halving mechanism which dictates the issuance of new coins. While this has been foundational, halvings can lead to abrupt changes in the rate of new coins being introduced to the market. Such sudden shifts can potentially disrupt the network's economic model, potentially impacting its security and stability. Furthermore, the halvings schedule is fixed and does not provide any way to "recycle" funds into future issuance.

-

To address this, we propose issuing a fixed portion of the pending funds-to-be-issued in each block. This has the effect of smoothing out the issuance curve of ZEC, ensuring a more consistent and predictable rate of coin issuance, while still preserving the overall supply cap of 21,000,000 coins. This mechanism by itself (without other anticipated changes) seeks to preserve the core aspects of Zcash's issuance policy and aims to enhance predictability and avoid sudden changes. By making this shift, the average block subsidy over time will remain predictable with very gradual changes.

-

However, we anticipate schemes proposed in [#draft-zsf]_ where the amount of funds-to-be-issued may increase. In that scenario, this issuance mechanism would distribute that increase starting in the immediately following block and subsequent blocks. Because this distribution mechanism has an exponential decay, such increases will be spread out in miniscule amounts to future blocks over a long time period. This issuance mechanism thus provides a way for potential increases or decreases of issuance while constraining those changes to be small on a short time scale to avoid unexpected disruptions.

-

Additionally, the current Bitcoin-style issuance does not take into account the current balance of ZsfBalanceAfter(h). If [#draft-zsf]_ were to activate without a change to the issuance mechanism, then some funds would never be disbursed after they are deposited back into the ZSF.

-

In summary, by introducing a smoother emissions curve, we: -- maintain the economic viability of Zcash -- provide predictability of the issuance rate, allowing only miniscule changes over short time ranges -- enhance Zcash's stability as the network evolves.

-

Requirements

-

Smoothing the issuance curve is possible using an exponential decay formula that -satisfies the following requirements:

-

Issuance Requirements

-
    -
  1. The issuance can be summarised into a reasonably simple explanation
  2. +License: BSD-2-Clause
+

Terminology

+

The key words “MUST”, “SHOULD”, “SHOULD NOT”, “MAY”, “RECOMMENDED”, +“OPTIONAL”, and “REQUIRED” in this document are to be interpreted as +described in RFC 2119. [1]

+

“Network upgrade” - to be interpreted as described in ZIP 200. +[2]

+

“Block Subsidy” - to be interpreted as described in the Zcash +Protocol Specification (TODO ZIP Editors: link from comment).

+

“Issuance” - the sum of Block Subsidies over time. (TODO ZIP Editors: +work out if this definition is correct or can be removed).

+

ZsfBalanceAfter(h)” is the total ZEC available in the +Zcash Sustainability Fund (ZSF) after the transactions in block +h, described in ZIP draft-zsf.md. In this ZIP, the +Sustainability Fund is used to pay out Block Subsidies from unmined ZEC, +and other fund deposits.

+

Let PostBlossomHalvingInterval be as defined in +[#protocol-diffadjustment]_.

+

Abstract

+

This ZIP proposes a change to how nodes calculate the block +subsidy.

+

Instead of following a step function around the 4-year halving +intervals inherited from Bitcoin, we propose a slow exponential +“smoothing” of the curve. The new issuance scheme would approximate the +current issuance over 4-year intervals.

+

This ZIP depends on the ZIP introducing the Zcash Sustainability Fund +(ZIP-XXX).

+

Motivation

+

The current Zcash economic model, inherited from Bitcoin, includes a +halving mechanism which dictates the issuance of new coins. While this +has been foundational, halvings can lead to abrupt changes in the rate +of new coins being introduced to the market. Such sudden shifts can +potentially disrupt the network’s economic model, potentially impacting +its security and stability. Furthermore, the halvings schedule is fixed +and does not provide any way to “recycle” funds into future +issuance.

+

To address this, we propose issuing a fixed portion of the pending +funds-to-be-issued in each block. This has the effect of smoothing out +the issuance curve of ZEC, ensuring a more consistent and predictable +rate of coin issuance, while still preserving the overall supply cap of +21,000,000 coins. This mechanism by itself (without other anticipated +changes) seeks to preserve the core aspects of Zcash’s issuance policy +and aims to enhance predictability and avoid sudden changes. By making +this shift, the average block subsidy over time will remain predictable +with very gradual changes.

+

However, we anticipate schemes proposed in [#draft-zsf]_ where the +amount of funds-to-be-issued may increase. In that scenario, this +issuance mechanism would distribute that increase starting in the +immediately following block and subsequent blocks. Because this +distribution mechanism has an exponential decay, such increases will be +spread out in miniscule amounts to future blocks over a long time +period. This issuance mechanism thus provides a way for potential +increases or decreases of issuance while constraining those changes to +be small on a short time scale to avoid unexpected disruptions.

+

Additionally, the current Bitcoin-style issuance does not take into +account the current balance of ZsfBalanceAfter(h). If +[#draft-zsf]_ were to activate without a change to the issuance +mechanism, then some funds would never be disbursed after they are +deposited back into the ZSF.

+

Requirements

+

Smoothing the issuance curve is possible using an exponential decay +formula that satisfies the following requirements:

+

Issuance Requirements

+
    +
  1. The issuance can be summarised into a reasonably simple +explanation
  2. Block subsidies approximate a continuous function
  3. -
  4. If there are funds in the ZSF, then the block subsidy must be non-zero, preventing any final “unmined” zatoshis
  5. -
  6. For any 4 year period, all paid out block subsidies are approximately equal to half of the ZSF at the beginning of that 4 year period, if there are no deposits into the ZSF during those 4 years -TODO daira: add a requirement that makes the initial total issuance match the previous total issuance
  7. -
  8. This functionality MUST be introduced as part of a network upgrade
  9. +
  10. If there are funds in the ZSF, then the block subsidy must be +non-zero, preventing any final “unmined” zatoshis
  11. +
  12. For any 4 year period, all paid out block subsidies are +approximately equal to half of the ZSF at the beginning of that 4 year +period, if there are no deposits into the ZSF during those 4 years
-

Specification

-

Goals

-

We want to decrease the short-term impact of the deployment of this ZIP on block reward recipients, and minimise the potential reputational risk to Zcash of changing the block reward amount.

-

Constants

+

TODO daira: add a requirement that makes the initial total issuance +match the previous total issuance

+

Specification

+

Goals

+

We want to decrease the short-term impact of the deployment of this +ZIP on block reward recipients, and minimise the potential reputational +risk to Zcash of changing the block reward amount.

+

Constants

Define constants:

-

BLOCK_SUBSIDY_FRACTION” = 4126 / 100,000,000 or 0.0000004126

-

"DEPLOYMENT_BLOCK_HEIGHT" = 2726400

-

Issuance Calculation

-

At the DEPLOYMENT_BLOCK_HEIGHT, nodes should switch from the current issuance calculation, to the following:

-

Given the block height h define a function BlockSubsidy(h), such that:

-

BlockSubsidy(h) = Block subsidy for a given h, that satisfies above requirements.

-

Using an exponential decay function for BlockSubsidy satisfies requirements R1 and R2 above:

+

BLOCK_SUBSIDY_FRACTION” = 4126 / 10,000,000,000 or +0.0000004126

+

DEPLOYMENT_BLOCK_HEIGHT” = 2726400

+

Issuance Calculation

+

At the DEPLOYMENT_BLOCK_HEIGHT, nodes should switch from +the current issuance calculation, to the following:

+

Given the block height h define a function +BlockSubsidy(h), such that:

+

BlockSubsidy(h) = Block subsidy for a given +h, that satisfies above requirements.

+

Using an exponential decay function for BlockSubsidy +satisfies requirements R1 and R2 +above:

BlockSubsidy(h) = BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1)

-

Finally, to satisfy R3 above we always round up to the next zatoshi.

+

Finally, to satisfy R3 above we always round up to +the next zatoshi.

BlockSubsidy(h) = ceiling(BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1))

-

Deployment

-

TBD

-

Rationale

-

BLOCK_SUBSIDY_FRACTION

-

Let IntendedZSFFractionRemainingAfterFourYears = 0.5.

-

The value 4126 / 100_000_000 satisfies the approximation within +0.002%:

+

Rationale

+

BLOCK_SUBSIDY_FRACTION

+

Let IntendedZSFFractionRemainingAfterFourYears = +0.5.

+

The value 4126 / 10_000_000_000 satisfies the +approximation within +0.002%:

(1 - BLOCK_SUBSIDY_FRACTION)^PostBlossomHalvingInterval ≈ IntendedZSFFractionRemainingAfterFourYears

-

Meaning after a period of 4 years around half of ZSF_BALANCE will be paid out -as block subsidies, thus satisfying R4.

+

Meaning after a period of 4 years around half of +ZSF_BALANCE will be paid out as block subsidies, thus +satisfying R4.

+

The largest possible amount in the ZSF is MAX_MONEY, in the +theoretically possible case that all issued funds are deposited back +into the ZSF. If this happened, the largest interim sum in the block +subsidy calculation would be MAX_MONEY * 4126 + 10000000000.

+

This uses 62.91 bits, which is just under the 63 bit limit for 64-bit +signed two’s-complement integer amount types.

+

The numerator could be brought closer to the limit by using a larger +denominator, but the difference in the amount issued would be very +small. So we 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. 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, taken from the ECC blog post, illustrates the smoothed curve. Note that depending on when the network upgrade takes place the disbursement may temporarily increase.

-

A graph showing a comparison of the halving-based step function vs the smoothed curve

-

[TODO: We should update this graph now showing the deployment at 2726400]

-

Other Notes

-

The suggested implementation avoids using float numbers. Rust and C++ will both round -the result of the final division up, satisfying R3 above.

-

Appendix: Simulation

-

We encourage readers to run the following Rust code, which simulates block subsidies. -According to this simulation, assuming no deflationary action, block subsidies would -last for approximately 113 years:

-

Rust Code

-

```rust -fn main() { - // approximate available subsidies in August of 2023 - let mut available_subsidies: i64 = 4671731 * 100_000_000; - let mut block: u32 = 0;

-
while available_subsidies > 0 {
-    let block_subsidy = (available_subsidies * 41 + 99_999_999) / 100_000_000;
-    available_subsidies -= block_subsidy;
-
-    println!(
-        "{} ({} years): {}({} ZEC) {}({} ZEC)",
-        block,                             // current block
-        block / 420_768,                   // ~ current year
-        block_subsidy,                     // block subsidy in zatoshis
-        block_subsidy / 100_000_000,       // block subsidy in ZEC
-        available_subsidies,               // available subsidies in zatoshis
-        available_subsidies / 100_000_000  // available subsidies in ZEC
-    );
-
-    block += 1;
-}
-
-

} -```

-

Last line of output of the above program is:

-

47699804 (113 years): 1(0 ZEC) 0(0 ZEC)

-

Note the addition of 99,999,999 before division to force rounding up of non-zero values.

-

References

+

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. 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 illustrates compares issuance for the current +halving-based step function vs the smoothed curve.

+
+ + +
+

The graph below shows the balance of the ZSF assuming smooth issuance +is implemented.

+
+ + +
+

Deployment

+

The implementation of this ZIP MUST be deployed at the same time or +after the Zcash Sustainability Fund is established (ZIP-XXX).

+

Appendix: Simulation

+

The ZSF +simulator allows us to simulate the effects of this ZIP on the ZSF +balance and the block subsidy, as well as generate plots like the ones +above. Its output:

+
Last block is 47917869 in ~113.88 years
+

indicates that, assuming no ZEC is ever deposited to the ZSF, its +balance will be depleted after 113.88 years, and the block subsidy will +be 0 ZEC after that point.

+

This fragment of the output

+
Halving  1 at block  1680000:
+  ZSF subsidies:    262523884819889 (~ 2625238.848 ZEC,        1.563 ZEC per block)
+  legacy subsidies: 262500000000000 (~ 2625000.000 ZEC,        1.562 ZEC per block)
+  difference:           23884819889 (~         238 ZEC),         ZSF/legacy: 1.0001
+

shows that the difference between the smoothed out and the current +issuance schemes is 238 ZEC after 1680000 blocks (aroound 4 years).

+

References

[1] RFC-2119: https://datatracker.ietf.org/doc/html/rfc2119

[2] ZIP-200: https://zips.z.cash/zip-0200

-

[3] ZIP-XXX: Placeholder for the ZSF ZIP

\ No newline at end of file +

[3] ZIP-XXX: Placeholder for the ZSF ZIP

+ + diff --git a/zips/zip-0234.md b/zips/zip-0234.md index dcd93c718..332baac6d 100644 --- a/zips/zip-0234.md +++ b/zips/zip-0234.md @@ -1,5 +1,5 @@ ``` -ZIP: +ZIP: 234 Title: Smooth Out The Block Subsidy Issuance Owners: Jason McGee Mark Henderson @@ -20,13 +20,16 @@ and “REQUIRED” in this document are to be interpreted as described in RFC 21 "Network upgrade" - to be interpreted as described in ZIP 200. [2] -“Block Subsidy” - to be interpreted as described in the Zcash Protocol Specification (TODO ZIP Editors: link from comment). +“Block Subsidy” - to be interpreted as described in the Zcash Protocol +Specification (TODO ZIP Editors: link from comment). -“Issuance” - the sum of Block Subsidies over time. (TODO ZIP Editors: work out if this definition is correct or can be removed). +“Issuance” - the sum of Block Subsidies over time. (TODO ZIP Editors: work out +if this definition is correct or can be removed). -“`ZsfBalanceAfter(h)`” is the total ZEC available in the Zcash Sustainability Fund (ZSF) after the transactions -in block `h`, described in ZIP draft-zsf.md. In this ZIP, the Sustainability Fund is used to pay out Block Subsidies -from unmined ZEC, and other fund deposits. +“`ZsfBalanceAfter(h)`” is the total ZEC available in the Zcash Sustainability +Fund (ZSF) after the transactions in block `h`, described in ZIP draft-zsf.md. +In this ZIP, the Sustainability Fund is used to pay out Block Subsidies from +unmined ZEC, and other fund deposits. Let `PostBlossomHalvingInterval` be as defined in [#protocol-diffadjustment]_. @@ -35,41 +38,71 @@ Let `PostBlossomHalvingInterval` be as defined in [#protocol-diffadjustment]_. This ZIP proposes a change to how nodes calculate the block subsidy. -Instead of following a step function around the 4-year halving intervals inherited -from Bitcoin, we propose a slow exponential “smoothing” of the curve. The new issuance -scheme would approximate the current issuance over 4-year intervals. +Instead of following a step function around the 4-year halving intervals +inherited from Bitcoin, we propose a slow exponential “smoothing” of the curve. +The new issuance scheme would approximate the current issuance over 4-year +intervals. -This ZIP depends on the ZIP introducing the Zcash Sustainability Fund (ZIP-XXX). +This ZIP depends on the ZIP introducing the Zcash Sustainability Fund +(ZIP-XXX). # Motivation -The current Zcash economic model, inherited from Bitcoin, includes a halving mechanism which dictates the issuance of new coins. While this has been foundational, halvings can lead to abrupt changes in the rate of new coins being introduced to the market. Such sudden shifts can potentially disrupt the network's economic model, potentially impacting its security and stability. Furthermore, the halvings schedule is fixed and does not provide any way to "recycle" funds into future issuance. - -To address this, we propose issuing a fixed portion of the pending funds-to-be-issued in each block. This has the effect of smoothing out the issuance curve of ZEC, ensuring a more consistent and predictable rate of coin issuance, while still preserving the overall supply cap of 21,000,000 coins. This mechanism by itself (without other anticipated changes) seeks to preserve the core aspects of Zcash's issuance policy and aims to enhance predictability and avoid sudden changes. By making this shift, the average block subsidy over time will remain predictable with very gradual changes. - -However, we anticipate schemes proposed in [#draft-zsf]_ where the amount of funds-to-be-issued may increase. In that scenario, this issuance mechanism would distribute that increase starting in the immediately following block and subsequent blocks. Because this distribution mechanism has an exponential decay, such increases will be spread out in miniscule amounts to future blocks over a long time period. This issuance mechanism thus provides a way for potential increases or decreases of issuance while constraining those changes to be small on a short time scale to avoid unexpected disruptions. - -Additionally, the current Bitcoin-style issuance does not take into account the current balance of `ZsfBalanceAfter(h)`. If [#draft-zsf]_ were to activate without a change to the issuance mechanism, then some funds would never be disbursed after they are deposited back into the ZSF. +The current Zcash economic model, inherited from Bitcoin, includes a halving +mechanism which dictates the issuance of new coins. While this has been +foundational, halvings can lead to abrupt changes in the rate of new coins +being introduced to the market. Such sudden shifts can potentially disrupt the +network's economic model, potentially impacting its security and stability. +Furthermore, the halvings schedule is fixed and does not provide any way to +"recycle" funds into future issuance. + +To address this, we propose issuing a fixed portion of the pending +funds-to-be-issued in each block. This has the effect of smoothing out the +issuance curve of ZEC, ensuring a more consistent and predictable rate of coin +issuance, while still preserving the overall supply cap of 21,000,000 coins. +This mechanism by itself (without other anticipated changes) seeks to preserve +the core aspects of Zcash's issuance policy and aims to enhance predictability +and avoid sudden changes. By making this shift, the average block subsidy over +time will remain predictable with very gradual changes. + +However, we anticipate schemes proposed in [#draft-zsf]_ where the amount of +funds-to-be-issued may increase. In that scenario, this issuance mechanism +would distribute that increase starting in the immediately following block and +subsequent blocks. Because this distribution mechanism has an exponential +decay, such increases will be spread out in miniscule amounts to future blocks +over a long time period. This issuance mechanism thus provides a way for +potential increases or decreases of issuance while constraining those changes +to be small on a short time scale to avoid unexpected disruptions. + +Additionally, the current Bitcoin-style issuance does not take into account the +current balance of `ZsfBalanceAfter(h)`. If [#draft-zsf]_ were to activate +without a change to the issuance mechanism, then some funds would never be +disbursed after they are deposited back into the ZSF. # Requirements -Smoothing the issuance curve is possible using an exponential decay formula that -satisfies the following requirements: +Smoothing the issuance curve is possible using an exponential decay formula +that satisfies the following requirements: ## Issuance Requirements 1. The issuance can be summarised into a reasonably simple explanation 2. Block subsidies approximate a continuous function -3. If there are funds in the ZSF, then the block subsidy must be non-zero, preventing any final “unmined” zatoshis -4. For any 4 year period, all paid out block subsidies are approximately equal to half of the ZSF at the beginning of that 4 year period, if there are no deposits into the ZSF during those 4 years -TODO daira: add a requirement that makes the initial total issuance match the previous total issuance +3. If there are funds in the ZSF, then the block subsidy must be non-zero, + preventing any final “unmined” zatoshis +4. For any 4 year period, all paid out block subsidies are approximately equal + to half of the ZSF at the beginning of that 4 year period, if there are no + deposits into the ZSF during those 4 years +TODO daira: add a requirement that makes the initial total issuance match the previous total issuance # Specification ## Goals -We want to decrease the short-term impact of the deployment of this ZIP on block reward recipients, and minimise the potential reputational risk to Zcash of changing the block reward amount. +We want to decrease the short-term impact of the deployment of this ZIP on +block reward recipients, and minimise the potential reputational risk to Zcash +of changing the block reward amount. ## Constants @@ -81,13 +114,16 @@ Define constants: ## Issuance Calculation -At the `DEPLOYMENT_BLOCK_HEIGHT`, nodes should switch from the current issuance calculation, to the following: +At the `DEPLOYMENT_BLOCK_HEIGHT`, nodes should switch from the current issuance +calculation, to the following: Given the block height `h` define a function **BlockSubsidy(h)**, such that: -**BlockSubsidy(h)** = Block subsidy for a given `h`, that satisfies above requirements. +**BlockSubsidy(h)** = Block subsidy for a given `h`, that satisfies above +requirements. -Using an exponential decay function for **BlockSubsidy** satisfies requirements **R1** and **R2** above: +Using an exponential decay function for **BlockSubsidy** satisfies requirements +**R1** and **R2** above: `BlockSubsidy(h) = BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1)` @@ -108,11 +144,17 @@ The value `4126 / 10_000_000_000` satisfies the approximation within +0.002%: Meaning after a period of 4 years around half of `ZSF_BALANCE` will be paid out as block subsidies, thus satisfying **R4**. -The largest possible amount in the ZSF is MAX_MONEY, in the theoretically possible case that all issued funds are deposited back into the ZSF. If this happened, the largest interim sum in the block subsidy calculation would be MAX_MONEY * 4126 + 10000000000. +The largest possible amount in the ZSF is MAX_MONEY, in the theoretically +possible case that all issued funds are deposited back into the ZSF. If this +happened, the largest interim sum in the block subsidy calculation would be +MAX_MONEY * 4126 + 10000000000. -This uses 62.91 bits, which is just under the 63 bit limit for 64-bit signed two's-complement integer amount types. +This uses 62.91 bits, which is just under the 63 bit limit for 64-bit signed +two's-complement integer amount types. -The numerator could be brought closer to the limit by using a larger denominator, but the difference in the amount issued would be very small. So we chose a power-of-10 denominator for simplicity. +The numerator could be brought closer to the limit by using a larger +denominator, but the difference in the amount issued would be very small. So we +chose a power-of-10 denominator for simplicity. TODO for ZIP owners: How many ZEC per day? @@ -120,31 +162,43 @@ TODO for ZIP owners: How many ZEC per day? 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. 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`. +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. 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 illustrates compares issuance for the current halving-based step function vs the smoothed curve. +The following graph illustrates compares issuance for the current halving-based +step function vs the smoothed curve. -![A graph showing a comparison of the halving-based step function vs the smoothed curve](./zsf_block_subsidy.png) +![A graph showing a comparison of the halving-based step function vs the smoothed curve](../rendered/assets/images/zip-0234-block_subsidy.png) -The graph below shows the balance of the ZSF assuming smooth issuance is implemented. +The graph below shows the balance of the ZSF assuming smooth issuance is +implemented. -![A graph showing the balance of the ZSF assuming smooth issuance is implemented](./zsf_balance.png) +![A graph showing the balance of the ZSF assuming smooth issuance is implemented](../rendered/assets/images/zip-0234-balance.png) # Deployment -The implementation of this ZIP MUST be deployed at the same time or after the Zcash Sustainability Fund is established (ZIP-XXX). +The implementation of this ZIP MUST be deployed at the same time or after the +Zcash Sustainability Fund is established (ZIP-XXX). # Appendix: Simulation -The [ZSF simulator](https://github.com/eigerco/zsf-simulator) allows us to simulate the effects of this ZIP on the ZSF balance and the block subsidy, as well as generate plots like the ones above. Its output: +The [ZSF simulator](https://github.com/eigerco/zsf-simulator) allows us to +simulate the effects of this ZIP on the ZSF balance and the block subsidy, as +well as generate plots like the ones above. Its output: ``` Last block is 47917869 in ~113.88 years ``` -indicates that, assuming no ZEC is ever deposited to the ZSF, its balance will be depleted after 113.88 years, and the block subsidy will be 0 ZEC after that point. +indicates that, assuming no ZEC is ever deposited to the ZSF, its balance will +be depleted after 113.88 years, and the block subsidy will be 0 ZEC after that +point. This fragment of the output @@ -155,7 +209,8 @@ Halving 1 at block 1680000: difference: 23884819889 (~ 238 ZEC), ZSF/legacy: 1.0001 ``` -shows that the difference between the smoothed out and the current issuance schemes is 238 ZEC after 1680000 blocks (aroound 4 years). +shows that the difference between the smoothed out and the current issuance +schemes is 238 ZEC after 1680000 blocks (aroound 4 years). # References