From 3e4ca01c90c4f04570b4b8fafc2dcbd155613bb0 Mon Sep 17 00:00:00 2001
From: Tomek Piotrowski 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 “ “ 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. 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. Smoothing the issuance curve is possible using an exponential decay
+formula that satisfies the following requirements: The above requirements assume no deflationary action, i.e. that no
+ZEC is added to Given the block height S(h) = Block subsidy for a given Please note that An exponential decay function S satisfies
+R1 and R2 above: Finally, to satisfy R3 above we need to always round
+up to at least 1 Zatoshi if
+ That value of Meaning after a period of 4 years around half of
+ The suggested implementation avoids using float numbers. Rust and C++
+will both round the result of the final division up, satisfying
+R3 above. 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: Last line of output of the above program is: Note the addition of 99,999,999 before division to force rounding up
+of non-zero values. 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
+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-ClauseTerminology
+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.00000041Abstract
+Motivation
+Specification
+Requirements
+
+
+AVAILABLE_SUBSIDIES(h) > 0 then block subsidies
+for block h MUST always be > 0, preventing
+a final “unmined” zatoshiAVAILABLE_SUBSIDIES at the beginning
+of that 4 year periodAVAILABLE_SUBSIDIES. They are referenced
+below as Rn.Solution
+h define a function
+S, such that:h,
+that satisfies above requirements.AVAILABLE_SUBSIDIES(h+1) = AVAILABLE_SUBSIDIES(h) - S(h)
+assuming no deflationary action.S(h) = BLOCK_SUBSIDY_FRACTION * AVAILABLE_SUBSIDIES(h)AVAILABLE_SUBSIDIES(h) > 0:S(h) = ROUND_UP(BLOCK_SUBSIDY_FRACTION * AVAILABLE_SUBSIDIES(h))Rationale
+
+BLOCK_SUBSIDY_FRACTION41 / 100_000_000 was selected so that it
+satisfies the equation:(1 - BLOCK_SUBSIDY_FRACTION)^NUMBER_OF_BLOCKS_IN_4_YEARS ~ ½AVAILABLE_SUBSIDIES will be paid out as block subsidies,
+thus satisfying R4.Other Notes
+Appendix: Simulation
+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;
+ }
+}47699804 (113 years): 1(0 ZEC) 0(0 ZEC)
-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-ClauseTerminology
-
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
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.
-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.
-Smoothing the issuance curve is possible using an exponential decay -formula that satisfies the following requirements:
-AVAILABLE_SUBSIDIES(h) > 0 then block subsidies
-for block h MUST always be > 0, preventing
-a final “unmined” zatoshiAVAILABLE_SUBSIDIES at the beginning
-of that 4 year period“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
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.
+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.
+Smoothing the issuance curve is possible using an exponential decay formula that +satisfies the following requirements:
+ZsfBalanceAfter(h) is monotonically decreasingZSF_BALANCE(h) > 0 then block subsidies for block h
+MUST always be > 0, preventing a final “unmined” zatoshiZSF_BALANCE at the beginning of that 4 year periodThe above requirements assume no deflationary action, i.e. that no
-ZEC is added to AVAILABLE_SUBSIDIES. They are referenced
-below as Rn.
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))
BLOCK_SUBSIDY_FRACTIONThat 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.
The suggested implementation avoids using float numbers. Rust and C++ -will both round the result of the final division up, satisfying -R3 above.
-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:
-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.
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))
BLOCK_SUBSIDY_FRACTIONThe 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.
The suggested implementation avoids using float numbers. Rust and C++ will both round +the result of the final division up, satisfying R3 above.
+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 +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.
+[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 HendersonThe 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
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.
Zcash’s economic model is inherited from Bitcoin and includes the concept of a halving @@ -55,21 +50,23 @@
Smoothing the issuance curve is possible using an exponential decay formula that satisfies the following requirements:
-ZsfBalanceAfter(h) is monotonically decreasingZSF_BALANCE(h) > 0 then block subsidies for block h
-MUST always be > 0, preventing a final “unmined” zatoshiZSF_BALANCE at the beginning of that 4 year periodThe above requirements assume no deflationary action, i.e. that no ZEC is added
-to ZSF_BALANCE. They are referenced below as Rn.
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
Given the block height h define a function S, such that:
S(h) = Block subsidy for a given h, that satisfies above requirements.
“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
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.
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.
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_. + + ## 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&`tjT~+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?=Z8Y4zEqA9 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 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. Smoothing the issuance curve is possible using an exponential decay formula that
satisfies the following requirements: Given the block height BlockSubsidy(h) = Block subsidy for a given 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: 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 The value Meaning after a period of 4 years around half of #+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`$In
++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^
zX8
Abstract
Motivation
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.Requirements
Constants
Issuance Calculation
h define a function BlockSubsidy(h), such that:h, that satisfies above requirements.BlockSubsidy(h) = BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1)ZsfBalanceAfter(h - 1) > 0:BlockSubsidy(h) = ceiling(BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1))Rationale
@@ -59,7 +64,10 @@ BLOCK_SUBSIDY_FRACTION41 / 100_000_000 satisfies the approximation:(1 - BLOCK_SUBSIDY_FRACTION)^NUMBER_OF_BLOCKS_IN_4_YEARS ≈ 0.5ZSF_BALANCE will be paid out
-as block subsidies, thus satisfying G4.
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 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_. - + ## Other Notes From f60357645fdebb68fbe741434e592923de8dab13 Mon Sep 17 00:00:00 2001 From: Mark Robert Henderson“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]_.
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.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.
Smoothing the issuance curve is possible using an exponential decay formula that @@ -50,19 +49,18 @@
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
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))
BLOCK_SUBSIDY_FRACTIONLet 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.
Define constants:
“BLOCK_SUBSIDY_FRACTION” = 41 / 100,000,000 or 0.00000041
"DEPLOYMENT_BLOCK_HEIGHT" = 2726400
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))
BLOCK_SUBSIDY_FRACTIONLet IntendedZSFFractionRemainingAfterFourYears = 0.5.
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_HEIGHTThe 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.
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.

[TODO: We should update this graph now showing the deployment at 2726400]
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_.  +[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 HendersonThe 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.
Smoothing the issuance curve is possible using an exponential decay formula that @@ -68,7 +69,7 @@
BLOCK_SUBSIDY_FRACTIONDEPLOYMENT_BLOCK_HEIGHTThe 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.
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.

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.
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
At the DEPLOYMENT_BLOCK_HEIGHT, nodes should switch from the current issuance calculation, to the following:
Finally, to satisfy R3 above we always round up to the next zatoshi.
BlockSubsidy(h) = ceiling(BLOCK_SUBSIDY_FRACTION * ZsfBalanceAfter(h - 1))
TBD
BLOCK_SUBSIDY_FRACTIONLet 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_HEIGHTThe 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.
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.
-
+
+
+The graph below shows the balance of the ZSF assuming smooth issuance is implemented.
+
+
-[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
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%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
zcmeEv3s{t8+W(*#TV{OL7M2QSn%i39W{L-3zP5vFu2NdrdSEhB*HA}9%wcU*2Up{
zpZ9s6=e~dU@BZEQv*Gn=lltBN`29Q{uixaqygZ%9yNCYToA~D!y9Lc?*2iA$hU(#x3Y?R&L#C*BIEf+PFSF
z1L>KO&SluMMqInbIq6DSnN6m)1@ofyz7oB6@U<81KC4Yvqqtgub6AqBYJ|LM`{+ex
zuCh5>>nv2*r|_bW&x}7ldeK>(dXZ45HHo#R%*Nva`*Hu)ue|kI9bLuOR37Q`v&k_q
zCvTu`r_pGn?}&YPVRri3i$1ac)nNnL6ul3T#c)i@Tv`86z&mQw#^dXJOX*629DAW6
zh!^iDkvI}WmlO2-%Zc`ri8+ReiqT09yOOgf%Sw~=Tz=(OtstdP
z?rcyv^Ftc*%~8?G88OLHXT9{^Y0?mpvGH#y#UAbyaWQhjgb9xqd@hj|6&1}I5s>@B
zREZ%_V!%^HsYRyd=KW3dFX8*M>b~|7U7PP`_-6v&UTL2)a_-S%idUam5FWmftuyW_
z44LGk{QUgtf<(igSIv#Ox~fE0Geut0Aa8DvH)P8jR+Y>xpl#VExiDLHakj&n#!cWt
z)SN@jEz=s81tm^w&a9^SA0aozDNH|o+&71}ciOJli!((R14YGwqJ0^$`x?>|DVm7r
z=xDn+!a2szacvUcsZZ1}dngH9N5(Mi`OVc$8ER)=g|4r^DZ=0M6}{xGA@y6|-uDQ5
z5!~ZyL$KOVMbjp5Toi~Zf9ex2fowr1{d17&eJUiGt_oaAf?;GRzkHXcl@sVI!Ec+vcUJSowx$fjkjq!DSoQu~gmc*J*|VAZ
za->bdXm)R#9@bnNwppWTQZ+Y)*beh;^l}{-|7V4A{Xm7DrmHwDtL|}{EcK$eINK)G
zwN2)LgEE=pRblI^bK2I)$_r(KxYzt!p7dWq+cL70wv*C+MmdNt-sx@rG1T_s;vKw-
zRRYs0iBlsHAACm_wD53gc+QFTPm;uv#GRpE*fS-`oOEH9`r0PdC+!Q=_jhzt#ijQS
zn)hq1`@Q+*yg8R<*=UQtf;Y#hl6&mn=+nsmY61a869JNVkJ0i4g6IizKbgg^&ySOJ7DN|%7Rh-X*
z4`LrW+De4WmbD1CZKt1UOAjxipC37LWZBXBZ?_H)ZQ(1Mo11qM+UB&o
zoUQf6_5f3Y#GK%-@9&@I2&o<&Qk_a`GG>~DGf5O-X<3ci!s@rt6<&3!%V9TXVM3IHqJyWc8-NFQ=QMXhq`T
zXzD_Dj*BRKF5}rp`(o}NCd6aaE-#)M7@^3|f5|CIF&`T)E-HyHf_V(7eoR>*-tz^P
zhXj_E5qw-Og`)iQigHt6SkHQ^>Nj3wzHY)0JkJkY=EFc|_Ruw(#Pr!Q9i5
zmf@0?EU7JP`+a}0Vj<3qOP^US&^{9yb2?C59q4SOy;>}Fu1qPWHCu>NNq2Q$rE2o5MRSu$1CNJ_Ij5V+fuc0DVqx{UrSO@
z?K7d4PZG_)RD2AQfs
z|L0)*?g^p&1RRjqS}Z*qc}1lXXC=jDmBgln>VC-}x4^sSa8(|d1#vAEPQhL>}Z
z{K6uMagia2yl+S|JcwR#%vW^I*U_wXj!c3VDE`pj{;qQvtxt(LMrw+gV;re%8L73T
zXir7Po}Q7?vPo^;#OyLQpyo$1Eh_>{E7IC#rL{e%)jdeoIN*dLbfNQSAIHy~57OK`
z(q}mw*4c)fvzTi+jpeP9RY7}&)^CN@QmNx_BW?6D>PwfL=xh95YW-f)HdE4P=lIAv
z@>Ov$(-gLBh3yqV>nn4NSR-k=`_p*#Yl+Tlrg){vem%{3{e`JK9l4_j80QD=^gPXY
zu!vHPxLG6rX+%yh-EOkN%s1^*Soamb;FVh-DlZVxiXE@~KHW&DMFtz}ETe@wY0{)}
z?d5~>(>U^?Pm;AvGsUJA^fl5TvS|>4dw4VmsqKCmM=mx1txs`vn*DUzUyF||I9%F@
zMH13f9MUvKU>FnQr?sEe#@C7IWMKSC{S(3-X}As=->dy~r
zjmzp<7&9KGQ<63sk3THcnmgsPSEnQ%ns&1Vsw0tQ%rKrgeH)Mp=ycANi
zAvAu7Qb~r$KzpwJ17pnB_2%a)RIu|o01C9Mel|HWL}eMWEBj=RbFl*B0)g={ss6Es
zwjG*95(!89qy6J8uJBH=*9JZGcQ*+`J8WNq@YqZ@ql21k|a
z>x9la0G#~DD_5^N&eC)HTfg?V!k5D&X!_U=1=tQL&7UgC&;;>qHXE!0`(Ti|n&JHI
znw2zDc#Cz1*skb9eqE%A5^HGR2r9=9_VW`1E%?}Ted4Qzi>vUO^?#mwbY(rvk5>iT
zf?v~=h#P21UV@=&2_ihz`Y>PL{`r#T4VTC`d^q1=phsUok1jnJmKGy6noO=o&yZBm
z)1L|zKhN#^cS!?TwG1+tahZ+exEf8gvkmr@a|;~JSsFiQQuMW#{H<8GbJ#+XTDD8+
z#W0IR3v7F#yrQpsji&WB?)9LeZMLEfYc4dt>fsnMT|b3QBF*F1QKFJ42Z0Q)l;Uc7
zA?>rYc*nxSj|E(oI%pdK^ubE&gPP^G=JtQb%=0BqdztKN8Q#f*%4bGjApm|>S|ZSq~a2B%1~
zwQ^hg%;)p%`7`%j1jfb-8?Ia|3*)di@e#um`^M+_>UOf-LXasaSM9jUK7*C@=Mu#)
z5GoWhq%+ZeCC%};DUM9qc<0ph^P*wW@PM^mXUQno&3fFmqJqaG`?en|*@2~pw?bLC#LN<7wW2^=l+dy%!$#$
z8sY=zE{JPNProFS$tG%Z3_9Is+=JxPnOVTR6fVoE{c^_MX;%sKk)t2Zdp4;s(fmo`
zfc2I0`NsJ%VmXB#c3eDW4ZQ!A@U+zQ=BB2rgfL4Q
z^E}#Yg4YWbU7z7^JV4Qs3QIvs->N#kF&6r}dD5!@269y=$nIx_mx4As+ixt+^dJ1Q>TCJKU
z5GHxl1NNEYCrpSXgrBdVxvPnJ|7m6QwQJY;7;#cR*_JI?t#e%u?}M4K$`
z{MM8oGcruDV``<<6a|H&hBy4%-XNq>DbOOM0;2eL`n~1L^ZPOXN1NMfZ@4NlU4?zQk2i4OKtane
z0f4-kfaLW`eBNQz#Ews!_X+kD)MGTp8K}s>rfdl_A=g7f>`e8ILh_7jbU{Yq{y%}l4Mv!kKCs~D8Dx;WY
z{ZQvj%Z@b54uT8Xd)G`qO`ydGv74q3BQR*+d|7xRA|A1E0foZ$#K7btRsAm2hQbu<
zg}qLvmJ12EKrkeccGZefU=;%oH^zoqQF`LUiKO^bNti@{EdWs%>C%Vk)sQ_J9-`ks
z-d$jNJWc=j7ITIb2nb8(v4YPF8NGpBs@yd(ihO!d<$a-<6bl59C&R?hO7UM+cjhr?
zUlAS-roI=mOI!JttrY$U!<%T4DPUX(n#~GIByX)`luHFobsGZ{6h$merOP)1U=w5s
z+h}u~CKzL*H}GJ7?gDrNJ7N`zc|zl^6yur0$kF2IFup-NCv2^V-hd@3zL}sFktxba
z#{iSKJb!y$tSp2a&j;yNxQ3FLT_u%bSh{$pJ;tvhA~CKUSOu1{TpKR03x}_x;HB$-
zVAg4ON+uHB+a_2*_5{x&ubwEcCY+s+`R_~C=hQ9F?fJd4%~|2&tN&ZmLlW7w+o8WtCh6MiogL3H&VqomUmMI0a
zeF6^68=wNs#qQpSKtNodB(ASZ7S^e2fY6c(hw}0HLWw+@v7h
zBD3w%Y>R1poUt)Zu8CXtG@(M8J|8(Dfx%$hFnW0&@or@~MP-C;?f2_O^9`dJj#@1=
ztuEJgJZuten_E1rx|%^$Lf0uaJX+;I*|~xGKZ_7#z$o!@@c{55#{ijd|ErkukeVlb
zD%BctyS_hYZTlO{C2@$4Xvqod4k0Fqp{>0t>;V4iwPt^Vir~a9Z}TZyW3?+zEnpZJ
zU@vI+3HGc;&b%Q!RzS+wX|9X
z=^hd2AMv*x^e=Qw+clx>XqxS45T90Y^%@51FDE+QX^y&n;d|yW#1x;4$W1BF++&rq
z-H;KNol)&&l}qUD6$VCs7|2*ez*;Z3)H(vQ!zor%ZT4-%KC;Og*oKE$+(M4`Iod1!8!A8>H8nShLzVj@(LL>X(M>C!momMsDEbTj`004*kobfF+w|LLNj>cMLL;Ju5h4pA@?
zxBCOk<7;tdA=)q4VR-#ZwMEkjP@XK&HZY=(!}zVfkt#f(rN8=yMDlbj06hDY5Un9ZOI&GFjNhIwXcweai-`|bfOMVtR3-tb
zdk7_W`LplhKWs~vEQvoqTy!2r7egX*Ne16SNFZk9#K^icFeipy7iPgY{nI9*7tmK(
zuhZ#(t+JMcNI|JS%)PiQyXgq%AsY>0>Bu-19FlJhUfno=dysH7F^|=f6vB1^HGORB
z0?fUdO&Dy@UZSpee^1p*D{xm9{lGZt5mwdqiT?RRzt$K1TVJ%>DBf!~G6g|(e}Z-R
zsqbpqHY|oc1eQSFbfhd(U0L~LQu-yc;=Qanazt%ek($iL1z~jy4lM3!0%8iWQPag)JvHzObnxQv}2WX|)cJA^>7cKlolD|pMD
zc8kB|bN@>I6&R#xM7mIhLwllco1a$iXSdl2ouB)-uWx1}9N{qipJg-~<4s`8Ma@y}
zH+z_YVIZfh#xvVTgW8h4^KA4vV#MtL)8N6K7sHw^Mthxzumimz{Ede(86I3e+3urD
zp*NNO_DCE3uOGcO0#DV4iuZ;pj?d2NqpT;AS#t>a4+=Ja$K59;Mvx(L+vJsV%
zEpP?nh=>k2)cLo|h%n}6E?-*+pEmcQfD51#BNa5SYE7Rw;L-gJ(RpFkJ%SyDXLn7^
zAl{g^-Eo>!Jk7~pWz5=?>F^17@U=S4^
zFj3sP+v3xLw^6Retzy2WJr=f*SXG)y$v%LbYB7tw6g6)o#{S+!F4?cZ!A4IRvMHI3
z#GA@kW`{_o-u?u&42nw#A=q0BMk)$#
zm9c9?s0=jY?U3vGn&l=GCn(W()&ZcuQ*sJHzMUpvT+&raQvvUsbif@&DhT-|)v23o
z3eF}W-sHVOlioe}4k2uNE?}e1zXodv3&sH`yS6RXLGHKxLvGu?DonGAt%osT)noje
zx&(u|=1+++4{%$MVJp{?sfr`$e5(C*;`P&2B>qGox~}q;kHnlWpsQ#IBE3ad39F{;
z+c@q)W%P;BnQF?a4hZ|hWUL~NV8J@cK5X1_EjhS-2qHc#ToSo`Depi(UjNUx=fZ5L
zLAVo1tgr%K^=@dhvhTtr(uK{$VK>lg&pFME6QV_RfsxR8Xv;d5_xnC6_8I3>c2F>2
zQi$>;>>N+T{BzD!KkLs4;?_wL_UX-{LYiMYl3fUDC?X845&H&g`G7f)UT6bW(KQ
z2dP+-CnVnjurl86t8^o*th9Bq^jM@7wx`*Is{|!t;V~`%#=`qjLmOpy+dl-Zbcn)Y
zw#|&$Rua9bB-)(se^#MHTBX?pme%fLAO`9a$tI-kb6$t($W*gmE{KZvPAaW?zKr+o
zK;Docqu2KJ9jRNli&A2~9~^vVx#Hpn$I1IA{R_#~+Axq&EJ`GBJAU+9@I(v?&o9`l
zA3|BJTJiAElp4W`mYT`UQTnP^{3<9RU9LrTESv2llMN38(zTL*0YnzdUchTaD)u6I
zf(#8In|_&=x@0x-F}*`7dLxK32pS0K+NTiI&2x}_iJ8XY6?j^*c#<=Yl$I~p6)cp0
z8e2g@n;2fo$GpZTx^=gIkwQh;3e&`hs(ZLC1ekT&<&?s1Hc_(muswXv(Ulv#LCbF-
z3!H%nbAGd_{cGp4iinTIC1vug8>)V=D<2_Nh3yhSl9u%Hsx_jI-#rY4?dr_P?WS!(xe27LpPa=^@_MIV)^foWRy-6tx
z$QERj$XtMJZATu)u8F2iwF|y3hU6@-G@Fo3I${xyaj``p*Ej+XkNN1pBhppo7_q=}
zc$9lBB8TE14{tg}(K^Ktv`pbJGLr#p3a%n(!h|XTJ?RPs<;S^EM0AXK?U|g{=_>Zw
z3!bJxPw@z{N5U4^Z`iHV3&>I
zV+44|6Pu*OX+|h6U4h{UCVr2e*t`ie$2hTloT;p=jFP_txV=rkcw9nxk`Z9T)HQ@z
z%e7Fi2&!514+2epVqnbIlmJ@R994DfKEH|!-_Ky*fvvQdwihjAs0^wg2vhD4qHIGn
za`~8YW&&1$eTZs#DpKfNa72VM86L>
zL`HYH0yN;4vzJwV4Bdh`3h>xecI8SeaSw%(k8VA>e-yfpPO?d^rF79U=V;NTMWRcv
zU%hfEHiH?5;)#17`Q+twXSN?+ME?TPm;me+djU4<#Ds
z1G2SiYfe!NXgXY^H~~P@YywQTPeF3+A52+P>lJo=PuM?ffRFca{Xa-$^cR8?-f~Kf
zFb0$YM|F#o+rJ34{Jzk^bb6lL3)(^H_4wz~>BEYD|!vvH;I>!zk64?;zy@*E^>qPUg$oNm)#!
z^D`S^hDJZk!~RQ_$SD6@k5Cf%p_UmTwKFo+Fe!$#*69Il)62DhX6B45WGlo(4&=N}
zbMDPeCDu0VQyUUF{b?g{eewvt1X^f?&u)%tN-t?i(<53f*AiXn8~rr_30Ns{hF`r#&QJVS)bbSJ^u6#JjL6aP;tT*ec
z%eA!Q?hUw{nxTrNlw8XYWc1U|)bt_u2qRmtz$fP9OO&}RQk+N56f-x+h=;O==a7PL
zhzZ2Pg0S!4;ufcpPBNB)t#U15I*YQ^{f^w$pk@jS5RDO=2Mi)X%EY;k7>O@!Adb2O
zu_J-K!bVOMSzBl49G|Vz>bhL;HOiQzopLbxPqL3W5@N?5%Xya`r-1}krzBhHg_Tr`
zfi=!@14Qab#ihqVNPY@Ja$;k1Gwng=v!*y$Rp%H6|H(+rF~R|6TwOgd;4*9?(s>lB
z#EniV#y{|{zmZsVh;iNIsOCDW