zips/zip-0207.html

598 lines
55 KiB
HTML
Raw Normal View History

<!DOCTYPE html>
<html>
<head>
<title>ZIP 207: Split Founders' Reward</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="css/style.css"></head>
<body>
<section>
<pre>ZIP: 207
Title: Split Founders' Reward
Owners: Jack Grigg &lt;str4d@electriccoin.co&gt;
Category: Consensus
Status: Withdrawn
Created: 2019-01-04
License: MIT</pre>
<section id="terminology"><h2><span class="section-heading">Terminology</span><span class="section-anchor"> <a href="#terminology"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h2>
<p>The key words "MUST", "SHOULD", "SHOULD NOT", and "MAY" in this document are to be interpreted as described in RFC 2119. <a id="id1" class="footnote_reference" href="#rfc2119">1</a></p>
</section>
<section id="abstract"><h2><span class="section-heading">Abstract</span><span class="section-anchor"> <a href="#abstract"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h2>
<p>This Withdrawn proposal would have altered consensus rules to split the original Founders' Reward across several recipient addresses per block instead of one, corresponding to the several funding streams contained within it.</p>
</section>
<section id="motivation"><h2><span class="section-heading">Motivation</span><span class="section-anchor"> <a href="#motivation"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h2>
<p>Since the launch of the Zcash network, the consensus rules have required that until the first block reward halving (at block 850,000), each block must send 20% of the block subsidy to a hard-coded transparent address. <a id="id2" class="footnote_reference" href="#block-subsidy">2</a> This funding stream is referred to as the Founders' Reward.</p>
<p>This stream of 2.5-ZEC outputs (the value after the mining slow-start was completed) can be split into several logical funding streams (for background, see <a id="id3" class="footnote_reference" href="#continued-funding">3</a>). Modifying the consensus rules to allocate the 2.5 ZEC across separate recipient addresses decouples these funding streams organizationally, legally, and operationally. It further reinforces transparency as to the structure of the original Founders' Reward.</p>
</section>
<section id="specification"><h2><span class="section-heading">Specification</span><span class="section-anchor"> <a href="#specification"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h2>
<section id="definitions"><h3><span class="section-heading">Definitions</span><span class="section-anchor"> <a href="#definitions"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h3>
<p>We use the following constants and functions defined in <a id="id4" class="footnote_reference" href="#zip-0208">4</a>:</p>
<ul>
<li><code>BlossomActivationHeight</code></li>
<li><code>PostBlossomHalvingInterval</code></li>
<li><code>Halving(height)</code></li>
</ul>
<p>We also define the following constants and functions:</p>
<ul>
<li><code>SlowStartShift</code> as-defined in <a id="id5" class="footnote_reference" href="#block-subsidy">2</a>.</li>
<li><code>HeightForHalving(halving)</code>: Smallest <code>height</code> such that <code>Halving(height) = halving</code></li>
</ul>
</section>
<section id="funding-streams"><h3><span class="section-heading">Funding streams</span><span class="section-anchor"> <a href="#funding-streams"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h3>
<p>A funding stream is defined by a block reward fraction (represented as a numerator and a denominator), a start height (inclusive), and an end height (exclusive).</p>
<p>By defining the issuance as a proportion of the total block issuance, rather than absolute zatoshis, this ZIP dovetails with any changes to both block target times and issuance-per-block rates while maintaining an unchanged target-time-based issuance schedule. We anticipate such target-time / issuance rate changes in other ZIPs (for example, <a id="id6" class="footnote_reference" href="#zip-0208">4</a>).</p>
<p>The value of a funding stream at a given block height is defined as:</p>
<pre>FundingStream[FUND].Value(height) =
floor((
BlockReward(height) * FundingStream[FUND].ValueNumerator
) / FundingStream[FUND].ValueDenominator)</pre>
<p>An active funding stream at a given block height is defined as a funding stream for which the block height is less than its end height, but not less than its start height.</p>
<p>Each funding stream has an associated set of recipient addresses. Each address is used for at most 1/48th of a halving interval, creating a roughly-monthly sequence of funding periods. The address to be used for a given block height is defined as follows:</p>
<pre>AddressChangeInterval = PostBlossomHalvingInterval / 48
AddressPeriod(height) =
floor((
height + PostBlossomHalvingInterval - HeightForHalving(1)
) / AddressChangeInterval)
FundingStream[FUND].AddressIndex(height) =
AddressPeriod(height) - AddressPeriod(FundingStream[FUND].StartHeight)
Address(height) = FundingStream[FUND].Addresses[FundingStream[FUND].AddressIndex(height)]</pre>
<p>This has the property that all active funding streams change the address they are using on the same block height schedule, aligned to the height of the first halving so that 48 funding periods fit cleanly within a halving interval. This can be leveraged to simplify implementations, by batching the necessary outputs for each funding period.</p>
<p>Below is a visual representation of how stream addresses align with funding periods:</p>
<table>
<thead>
<tr>
<th>Example height</th>
<th>Stream A</th>
<th>Stream B</th>
<th>Stream C</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>AddressChangeInterval - 2</code></td>
<td>A0</td>
<td></td>
<td></td>
</tr>
<tr>
<td><code>AddressChangeInterval - 1</code></td>
<td>A0</td>
<td></td>
<td></td>
</tr>
<tr>
<td><code>AddressChangeInterval</code></td>
<td>A1</td>
<td>B0</td>
<td>C0</td>
</tr>
<tr>
<td><code>AddressChangeInterval + 1</code></td>
<td>A1</td>
<td>B0</td>
<td>C0</td>
</tr>
<tr>
<td>...</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><code>2*AddressChangeInterval - 2</code></td>
<td>A1</td>
<td>B0</td>
<td>C0</td>
</tr>
<tr>
<td><code>2*AddressChangeInterval - 1</code></td>
<td>A1</td>
<td>B0</td>
<td>C0</td>
</tr>
<tr>
<td><code>2*AddressChangeInterval</code></td>
<td>A2</td>
<td></td>
<td>C1</td>
</tr>
<tr>
<td><code>2*AddressChangeInterval + 1</code></td>
<td>A2</td>
<td></td>
<td>C1</td>
</tr>
<tr>
<td>...</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><code>PostBlossomHalvingInterval - 2</code></td>
<td>A2</td>
<td></td>
<td>C1</td>
</tr>
<tr>
<td><code>PostBlossomHalvingInterval - 1</code></td>
<td>A2</td>
<td></td>
<td>C1</td>
</tr>
<tr>
<td><code>PostBlossomHalvingInterval</code></td>
<td></td>
<td></td>
<td>C2</td>
</tr>
<tr>
<td><code>PostBlossomHalvingInterval + 1</code></td>
<td></td>
<td></td>
<td>C2</td>
</tr>
</tbody>
</table>
<p>Note that this is not intended to align with the end of a pre-Blossom Founders' Reward address period (as defined by <code>FounderAddressChangeInterval</code> in <a id="id7" class="footnote_reference" href="#original-fr-consensus-rule">5</a>). There will be a shortened Founders' Reward address period prior to Blossom activation.</p>
</section>
<section id="consensus-rules"><h3><span class="section-heading">Consensus rules</span><span class="section-anchor"> <a href="#consensus-rules"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h3>
<p>Prior to activation of the Blossom network upgrade, the existing consensus rule for payment of the original Founders' Reward is enforced. <a id="id8" class="footnote_reference" href="#original-fr-consensus-rule">5</a></p>
<p>Once the Blossom network upgrade activates:</p>
<ul>
<li>The existing consensus rule <a id="id9" class="footnote_reference" href="#original-fr-consensus-rule">5</a> is no longer active.</li>
<li>The coinbase transaction in each block MUST contain at least one output per active funding stream that pays the stream's value to the stream's recipient address for the block's height.</li>
</ul>
</section>
<section id="stream-definitions"><h3><span class="section-heading">Stream definitions</span><span class="section-anchor"> <a href="#stream-definitions"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h3>
<p>The consensus-defined funding streams described above each start at the Blossom activation height, and end at the first block reward halving. They are defined as follows:</p>
<table>
<thead>
<tr>
<th>Stream</th>
<th>Value numerator</th>
<th>Value denominator</th>
<th>Start height</th>
<th>End height</th>
</tr>
</thead>
<tbody>
<tr>
<td>FS 1</td>
<td>3</td>
<td>40</td>
<td><code>BlossomActivationHeight</code></td>
<td><code>HeightForHalving(1)</code></td>
</tr>
<tr>
<td>FS 2</td>
<td>1</td>
<td>25</td>
<td><code>BlossomActivationHeight</code></td>
<td><code>HeightForHalving(1)</code></td>
</tr>
<tr>
<td>FS 3</td>
<td>1</td>
<td>40</td>
<td><code>BlossomActivationHeight</code></td>
<td><code>HeightForHalving(1)</code></td>
</tr>
<tr>
<td>FS 4</td>
<td>1</td>
<td>50</td>
<td><code>BlossomActivationHeight</code></td>
<td><code>HeightForHalving(1)</code></td>
</tr>
<tr>
<td>FS 5</td>
<td>1</td>
<td>80</td>
<td><code>BlossomActivationHeight</code></td>
<td><code>HeightForHalving(1)</code></td>
</tr>
<tr>
<td>FS 6</td>
<td>1</td>
<td>80</td>
<td><code>BlossomActivationHeight</code></td>
<td><code>HeightForHalving(1)</code></td>
</tr>
<tr>
<td>FS 7</td>
<td>1</td>
<td>100</td>
<td><code>BlossomActivationHeight</code></td>
<td><code>HeightForHalving(1)</code></td>
</tr>
<tr>
<td>FS 8</td>
<td>1</td>
<td>200</td>
<td><code>BlossomActivationHeight</code></td>
<td><code>HeightForHalving(1)</code></td>
</tr>
</tbody>
</table>
<ul>
<li>To-do: specify the correct values.</li>
</ul>
<p>The sum of the block reward fractions for the above funding streams is <code>1/5</code>, equal to the original Founders' Reward (as-defined by <code>FoundersFraction</code> in <a id="id10" class="footnote_reference" href="#protocol-constants">6</a>).</p>
<p>The sets of recipient addresses are defined as follows:</p>
<pre data-language="cpp"><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">FS_1_ADDRESSES</span> <span class="o">=</span> <span class="p">[</span>
<span class="s">&quot;tFS1INVALIDADDRESS00&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS1INVALIDADDRESS01&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS1INVALIDADDRESS02&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS1INVALIDADDRESS03&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS1INVALIDADDRESS04&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS1INVALIDADDRESS05&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS1INVALIDADDRESS06&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS1INVALIDADDRESS07&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS1INVALIDADDRESS08&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS1INVALIDADDRESS09&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS1INVALIDADDRESS10&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS1INVALIDADDRESS11&quot;</span><span class="p">,</span>
<span class="p">];</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">FS_2_ADDRESSES</span> <span class="o">=</span> <span class="p">[</span>
<span class="s">&quot;tFS2INVALIDADDRESS00&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS2INVALIDADDRESS01&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS2INVALIDADDRESS02&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS2INVALIDADDRESS03&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS2INVALIDADDRESS04&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS2INVALIDADDRESS05&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS2INVALIDADDRESS06&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS2INVALIDADDRESS07&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS2INVALIDADDRESS08&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS2INVALIDADDRESS09&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS2INVALIDADDRESS10&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS2INVALIDADDRESS11&quot;</span><span class="p">,</span>
<span class="p">];</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">FS_3_ADDRESSES</span> <span class="o">=</span> <span class="p">[</span>
<span class="s">&quot;tFS3INVALIDADDRESS00&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS3INVALIDADDRESS01&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS3INVALIDADDRESS02&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS3INVALIDADDRESS03&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS3INVALIDADDRESS04&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS3INVALIDADDRESS05&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS3INVALIDADDRESS06&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS3INVALIDADDRESS07&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS3INVALIDADDRESS08&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS3INVALIDADDRESS09&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS3INVALIDADDRESS10&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS3INVALIDADDRESS11&quot;</span><span class="p">,</span>
<span class="p">];</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">FS_4_ADDRESSES</span> <span class="o">=</span> <span class="p">[</span>
<span class="s">&quot;tFS4INVALIDADDRESS00&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS4INVALIDADDRESS01&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS4INVALIDADDRESS02&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS4INVALIDADDRESS03&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS4INVALIDADDRESS04&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS4INVALIDADDRESS05&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS4INVALIDADDRESS06&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS4INVALIDADDRESS07&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS4INVALIDADDRESS08&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS4INVALIDADDRESS09&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS4INVALIDADDRESS10&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS4INVALIDADDRESS11&quot;</span><span class="p">,</span>
<span class="p">];</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">FS_5_ADDRESSES</span> <span class="o">=</span> <span class="p">[</span>
<span class="s">&quot;tFS5INVALIDADDRESS00&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS5INVALIDADDRESS01&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS5INVALIDADDRESS02&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS5INVALIDADDRESS03&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS5INVALIDADDRESS04&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS5INVALIDADDRESS05&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS5INVALIDADDRESS06&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS5INVALIDADDRESS07&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS5INVALIDADDRESS08&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS5INVALIDADDRESS09&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS5INVALIDADDRESS10&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS5INVALIDADDRESS11&quot;</span><span class="p">,</span>
<span class="p">];</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">FS_6_ADDRESSES</span> <span class="o">=</span> <span class="p">[</span>
<span class="s">&quot;tFS6INVALIDADDRESS00&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS6INVALIDADDRESS01&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS6INVALIDADDRESS02&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS6INVALIDADDRESS03&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS6INVALIDADDRESS04&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS6INVALIDADDRESS05&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS6INVALIDADDRESS06&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS6INVALIDADDRESS07&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS6INVALIDADDRESS08&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS6INVALIDADDRESS09&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS6INVALIDADDRESS10&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS6INVALIDADDRESS11&quot;</span><span class="p">,</span>
<span class="p">];</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">FS_7_ADDRESSES</span> <span class="o">=</span> <span class="p">[</span>
<span class="s">&quot;tFS7INVALIDADDRESS00&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS7INVALIDADDRESS01&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS7INVALIDADDRESS02&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS7INVALIDADDRESS03&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS7INVALIDADDRESS04&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS7INVALIDADDRESS05&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS7INVALIDADDRESS06&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS7INVALIDADDRESS07&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS7INVALIDADDRESS08&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS7INVALIDADDRESS09&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS7INVALIDADDRESS10&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS7INVALIDADDRESS11&quot;</span><span class="p">,</span>
<span class="p">];</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">FS_8_ADDRESSES</span> <span class="o">=</span> <span class="p">[</span>
<span class="s">&quot;tFS8INVALIDADDRESS00&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS8INVALIDADDRESS01&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS8INVALIDADDRESS02&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS8INVALIDADDRESS03&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS8INVALIDADDRESS04&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS8INVALIDADDRESS05&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS8INVALIDADDRESS06&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS8INVALIDADDRESS07&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS8INVALIDADDRESS08&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS8INVALIDADDRESS09&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS8INVALIDADDRESS10&quot;</span><span class="p">,</span>
<span class="s">&quot;tFS8INVALIDADDRESS11&quot;</span><span class="p">,</span>
<span class="p">];</span></pre>
<ul>
<li>To-do: specify the correct sets of FR addresses.</li>
<li>To-do: require that the FR address sets are PGP-signed with appropriate keys.</li>
</ul>
</section>
<section id="example-implementation"><h3><span class="section-heading">Example implementation</span><span class="section-anchor"> <a href="#example-implementation"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h3>
<pre data-language="cpp"><span class="k">struct</span> <span class="n">FundingPeriod</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">addresses</span><span class="p">,</span>
<span class="kt">uint64_t</span> <span class="n">valueNumerator</span><span class="p">,</span>
<span class="kt">uint64_t</span> <span class="n">valueDenominator</span><span class="p">,</span>
<span class="kt">int</span> <span class="n">startHeight</span><span class="p">,</span>
<span class="kt">int</span> <span class="n">endHeight</span><span class="p">,</span>
<span class="p">};</span>
<span class="k">enum</span> <span class="n">FundingStream</span> <span class="p">{</span>
<span class="n">FS_1</span><span class="p">,</span>
<span class="n">FS_2</span><span class="p">,</span>
<span class="n">FS_3</span><span class="p">,</span>
<span class="n">FS_4</span><span class="p">,</span>
<span class="n">FS_5</span><span class="p">,</span>
<span class="n">FS_6</span><span class="p">,</span>
<span class="n">FS_7</span><span class="p">,</span>
<span class="n">FS_8</span><span class="p">,</span>
<span class="n">MAX_FUNDING_STREAMS</span><span class="p">,</span>
<span class="p">};</span>
<span class="k">struct</span> <span class="n">Params</span> <span class="p">{</span>
<span class="p">...</span>
<span class="kt">int</span> <span class="n">nFundingPeriodLength</span><span class="p">;</span>
<span class="n">FundingPeriod</span> <span class="n">vFundingPeriods</span><span class="p">[</span><span class="n">MAX_FUNDING_STREAMS</span><span class="p">];</span>
<span class="p">...</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="n">AddZIP207FundingStream</span><span class="p">(</span>
<span class="n">Consensus</span><span class="o">::</span><span class="n">Params</span><span class="o">&amp;</span> <span class="n">params</span><span class="p">,</span>
<span class="n">Consensus</span><span class="o">::</span><span class="n">FundingStream</span> <span class="n">idx</span><span class="p">,</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">addresses</span><span class="p">,</span>
<span class="kt">uint64_t</span> <span class="n">valueNumerator</span><span class="p">,</span>
<span class="kt">uint64_t</span> <span class="n">valueDenominator</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">assert</span><span class="p">(</span><span class="n">valueNumerator</span> <span class="o">&lt;</span> <span class="n">valueDenominator</span><span class="p">);</span>
<span class="n">params</span><span class="p">.</span><span class="n">vFundingPeriods</span><span class="p">[</span><span class="n">idx</span><span class="p">].</span><span class="n">addresses</span> <span class="o">=</span> <span class="n">addresses</span><span class="p">;</span>
<span class="n">params</span><span class="p">.</span><span class="n">vFundingPeriods</span><span class="p">[</span><span class="n">idx</span><span class="p">].</span><span class="n">valueNumerator</span> <span class="o">=</span> <span class="n">valueNumerator</span><span class="p">;</span>
<span class="n">params</span><span class="p">.</span><span class="n">vFundingPeriods</span><span class="p">[</span><span class="n">idx</span><span class="p">].</span><span class="n">valueDenominator</span> <span class="o">=</span> <span class="n">valueDenominator</span><span class="p">;</span>
<span class="n">params</span><span class="p">.</span><span class="n">vFundingPeriods</span><span class="p">[</span><span class="n">idx</span><span class="p">].</span><span class="n">startHeight</span> <span class="o">=</span>
<span class="n">params</span><span class="p">.</span><span class="n">vUpgrades</span><span class="p">[</span><span class="n">Consensus</span><span class="o">::</span><span class="n">UPGRADE_BLOSSOM</span><span class="p">].</span><span class="n">nActivationHeight</span><span class="p">;</span>
<span class="n">params</span><span class="p">.</span><span class="n">vFundingPeriods</span><span class="p">[</span><span class="n">idx</span><span class="p">].</span><span class="n">endHeight</span> <span class="o">=</span> <span class="n">HeightForHalving</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="n">assert</span><span class="p">(</span><span class="n">params</span><span class="p">.</span><span class="n">vFundingPeriods</span><span class="p">[</span><span class="n">idx</span><span class="p">].</span><span class="n">startHeight</span> <span class="o">&lt;</span> <span class="n">params</span><span class="p">.</span><span class="n">vFundingPeriods</span><span class="p">[</span><span class="n">idx</span><span class="p">].</span><span class="n">endHeight</span><span class="p">);</span>
<span class="p">};</span>
<span class="n">CMainParams</span><span class="p">()</span> <span class="p">{</span>
<span class="p">...</span>
<span class="n">consensus</span><span class="p">.</span><span class="n">nFundingPeriodLength</span> <span class="o">=</span> <span class="n">consensus</span><span class="p">.</span><span class="n">nSubsidyPostBlossomHalvingInterval</span> <span class="o">/</span> <span class="mi">48</span><span class="p">;</span>
<span class="n">AddZIP207FundingStream</span><span class="p">(</span><span class="n">consensus</span><span class="p">,</span> <span class="n">Consensus</span><span class="o">::</span><span class="n">FS_1</span><span class="p">,</span> <span class="n">FS_1_ADDRESSES</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">40</span><span class="p">);</span>
<span class="n">AddZIP207FundingStream</span><span class="p">(</span><span class="n">consensus</span><span class="p">,</span> <span class="n">Consensus</span><span class="o">::</span><span class="n">FS_2</span><span class="p">,</span> <span class="n">FS_2_ADDRESSES</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">25</span><span class="p">);</span>
<span class="n">AddZIP207FundingStream</span><span class="p">(</span><span class="n">consensus</span><span class="p">,</span> <span class="n">Consensus</span><span class="o">::</span><span class="n">FS_3</span><span class="p">,</span> <span class="n">FS_3_ADDRESSES</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">40</span><span class="p">);</span>
<span class="n">AddZIP207FundingStream</span><span class="p">(</span><span class="n">consensus</span><span class="p">,</span> <span class="n">Consensus</span><span class="o">::</span><span class="n">FS_4</span><span class="p">,</span> <span class="n">FS_4_ADDRESSES</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">50</span><span class="p">);</span>
<span class="n">AddZIP207FundingStream</span><span class="p">(</span><span class="n">consensus</span><span class="p">,</span> <span class="n">Consensus</span><span class="o">::</span><span class="n">FS_5</span><span class="p">,</span> <span class="n">FS_5_ADDRESSES</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">80</span><span class="p">);</span>
<span class="n">AddZIP207FundingStream</span><span class="p">(</span><span class="n">consensus</span><span class="p">,</span> <span class="n">Consensus</span><span class="o">::</span><span class="n">FS_6</span><span class="p">,</span> <span class="n">FS_6_ADDRESSES</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">80</span><span class="p">);</span>
<span class="n">AddZIP207FundingStream</span><span class="p">(</span><span class="n">consensus</span><span class="p">,</span> <span class="n">Consensus</span><span class="o">::</span><span class="n">FS_7</span><span class="p">,</span> <span class="n">FS_7_ADDRESSES</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">);</span>
<span class="n">AddZIP207FundingStream</span><span class="p">(</span><span class="n">consensus</span><span class="p">,</span> <span class="n">Consensus</span><span class="o">::</span><span class="n">FS_8</span><span class="p">,</span> <span class="n">FS_8_ADDRESSES</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">200</span><span class="p">);</span>
<span class="p">...</span>
<span class="p">}</span>
<span class="n">CScript</span> <span class="n">FundingStreamRecipientAddress</span><span class="p">(</span>
<span class="kt">int</span> <span class="n">nHeight</span><span class="p">,</span>
<span class="k">const</span> <span class="n">Consensus</span><span class="o">::</span><span class="n">Params</span><span class="o">&amp;</span> <span class="n">params</span><span class="p">,</span>
<span class="n">Consensus</span><span class="o">::</span><span class="n">FundingStream</span> <span class="n">idx</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">// Integer division is floor division in C++</span>
<span class="k">auto</span> <span class="n">curPeriod</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">nHeight</span> <span class="o">+</span> <span class="n">params</span><span class="p">.</span><span class="n">nSubsidyPostBlossomHalvingInterval</span> <span class="o">-</span> <span class="n">HeightForHalving</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="p">)</span> <span class="o">/</span> <span class="n">params</span><span class="p">.</span><span class="n">nFundingPeriodLength</span><span class="p">;</span>
<span class="k">auto</span> <span class="n">startPeriod</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">params</span><span class="p">.</span><span class="n">vFundingPeriods</span><span class="p">[</span><span class="n">idx</span><span class="p">].</span><span class="n">startHeight</span>
<span class="o">+</span> <span class="n">params</span><span class="p">.</span><span class="n">nSubsidyPostBlossomHalvingInterval</span>
<span class="o">-</span> <span class="n">HeightForHalving</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="p">)</span> <span class="o">/</span> <span class="n">params</span><span class="p">.</span><span class="n">nFundingPeriodLength</span><span class="p">;</span>
<span class="k">auto</span> <span class="n">addressIndex</span> <span class="o">=</span> <span class="n">curPeriod</span> <span class="o">-</span> <span class="n">startPeriod</span><span class="p">;</span>
<span class="k">return</span> <span class="n">params</span><span class="p">.</span><span class="n">vFundingPeriods</span><span class="p">[</span><span class="n">idx</span><span class="p">].</span><span class="n">addresses</span><span class="p">[</span><span class="n">addressIndex</span><span class="p">];</span>
<span class="p">};</span>
<span class="n">CAmount</span> <span class="nf">FundingStreamValue</span><span class="p">(</span>
<span class="kt">int</span> <span class="n">nHeight</span><span class="p">,</span>
<span class="k">const</span> <span class="n">Consensus</span><span class="o">::</span><span class="n">Params</span><span class="o">&amp;</span> <span class="n">params</span><span class="p">,</span>
<span class="n">Consensus</span><span class="o">::</span><span class="n">FundingStream</span> <span class="n">idx</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">// Integer division is floor division in C++</span>
<span class="k">return</span> <span class="n">CAmount</span><span class="p">((</span>
<span class="n">GetBlockSubsidy</span><span class="p">(</span><span class="n">nHeight</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span> <span class="o">*</span> <span class="n">params</span><span class="p">.</span><span class="n">vFundingPeriods</span><span class="p">[</span><span class="n">idx</span><span class="p">].</span><span class="n">valueNumerator</span>
<span class="p">)</span> <span class="o">/</span> <span class="n">params</span><span class="p">.</span><span class="n">vFundingPeriods</span><span class="p">[</span><span class="n">idx</span><span class="p">].</span><span class="n">valueDenominator</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">std</span><span class="o">::</span><span class="n">set</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o">&lt;</span><span class="n">CScript</span><span class="p">,</span> <span class="n">CAmount</span><span class="o">&gt;&gt;</span> <span class="n">GetActiveFundingStreams</span><span class="p">(</span>
<span class="kt">int</span> <span class="n">nHeight</span><span class="p">,</span>
<span class="k">const</span> <span class="n">Consensus</span><span class="o">::</span><span class="n">Params</span><span class="o">&amp;</span> <span class="n">params</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">set</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o">&lt;</span><span class="n">CScript</span><span class="p">,</span> <span class="n">CAmount</span><span class="o">&gt;&gt;</span> <span class="n">requiredStreams</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">idx</span> <span class="o">=</span> <span class="n">Consensus</span><span class="o">::</span><span class="n">FS_ZECC_EF</span><span class="p">;</span> <span class="n">idx</span> <span class="o">&lt;</span> <span class="n">Consensus</span><span class="o">::</span><span class="n">MAX_FUNDING_STREAMS</span><span class="p">;</span> <span class="n">idx</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// Funding period is [startHeight, endHeight)</span>
<span class="k">if</span> <span class="p">(</span><span class="n">nHeight</span> <span class="o">&gt;=</span> <span class="n">params</span><span class="p">.</span><span class="n">vFundingPeriods</span><span class="p">[</span><span class="n">idx</span><span class="p">].</span><span class="n">startHeight</span> <span class="o">&amp;&amp;</span>
<span class="n">nHeight</span> <span class="o">&lt;</span> <span class="n">params</span><span class="p">.</span><span class="n">vFundingPeriods</span><span class="p">[</span><span class="n">idx</span><span class="p">].</span><span class="n">endHeight</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">requiredStreams</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">make_pair</span><span class="p">(</span>
<span class="n">FundingStreamRecipientAddress</span><span class="p">(</span><span class="n">nHeight</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">idx</span><span class="p">),</span>
<span class="n">FundingStreamValue</span><span class="p">(</span><span class="n">nHeight</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">idx</span><span class="p">));</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">return</span> <span class="n">requiredStreams</span><span class="p">;</span>
<span class="p">};</span>
<span class="kt">bool</span> <span class="nf">ContextualCheckBlock</span><span class="p">(...)</span>
<span class="p">{</span>
<span class="p">...</span>
<span class="k">if</span> <span class="p">(</span><span class="n">NetworkUpgradeActive</span><span class="p">(</span><span class="n">nHeight</span><span class="p">,</span> <span class="n">consensusParams</span><span class="p">,</span> <span class="n">Consensus</span><span class="o">::</span><span class="n">UPGRADE_BLOSSOM</span><span class="p">))</span> <span class="p">{</span>
<span class="c1">// Coinbase transaction must include outputs corresponding to the consensus</span>
<span class="c1">// funding streams active at the current block height.</span>
<span class="k">auto</span> <span class="n">requiredStreams</span> <span class="o">=</span> <span class="n">GetActiveFundingStreams</span><span class="p">(</span><span class="n">nHeight</span><span class="p">,</span> <span class="n">consensusParams</span><span class="p">);</span>
<span class="k">for</span> <span class="p">(</span><span class="k">const</span> <span class="n">CTxOut</span><span class="o">&amp;</span> <span class="nl">output</span> <span class="p">:</span> <span class="n">block</span><span class="p">.</span><span class="n">vtx</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">vout</span><span class="p">)</span> <span class="p">{</span>
<span class="k">for</span> <span class="p">(</span><span class="k">auto</span> <span class="n">it</span> <span class="o">=</span> <span class="n">requiredStreams</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">it</span> <span class="o">!=</span> <span class="n">requiredStreams</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="o">++</span><span class="n">it</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">output</span><span class="p">.</span><span class="n">scriptPubKey</span> <span class="o">==</span> <span class="n">it</span><span class="o">-&gt;</span><span class="n">first</span> <span class="o">&amp;&amp;</span> <span class="n">output</span><span class="p">.</span><span class="n">nValue</span> <span class="o">==</span> <span class="n">it</span><span class="o">-&gt;</span><span class="n">second</span><span class="p">)</span> <span class="p">{</span>
<span class="n">requiredStreams</span><span class="p">.</span><span class="n">erase</span><span class="p">(</span><span class="n">it</span><span class="p">);</span>
<span class="k">break</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">requiredStreams</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">state</span><span class="p">.</span><span class="n">DoS</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="n">error</span><span class="p">(</span><span class="s">&quot;%s: funding stream missing&quot;</span><span class="p">,</span> <span class="n">__func__</span><span class="p">),</span> <span class="n">REJECT_INVALID</span><span class="p">,</span> <span class="s">&quot;cb-funding-stream-missing&quot;</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="c1">// Coinbase transaction must include an output sending 20% of</span>
<span class="c1">// the block reward to a founders reward script, until the last founders</span>
<span class="c1">// reward block is reached, with exception of the genesis block.</span>
<span class="c1">// The last founders reward block is defined as the block just before the</span>
<span class="c1">// first subsidy halving block, which occurs at halving_interval + slow_start_shift</span>
<span class="k">if</span> <span class="p">((</span><span class="n">nHeight</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">nHeight</span> <span class="o">&lt;=</span> <span class="n">consensusParams</span><span class="p">.</span><span class="n">GetLastFoundersRewardBlockHeight</span><span class="p">()))</span> <span class="p">{</span>
<span class="kt">bool</span> <span class="n">found</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="k">const</span> <span class="n">CTxOut</span><span class="o">&amp;</span> <span class="nl">output</span> <span class="p">:</span> <span class="n">block</span><span class="p">.</span><span class="n">vtx</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">vout</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">output</span><span class="p">.</span><span class="n">scriptPubKey</span> <span class="o">==</span> <span class="n">Params</span><span class="p">().</span><span class="n">GetFoundersRewardScriptAtHeight</span><span class="p">(</span><span class="n">nHeight</span><span class="p">))</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">output</span><span class="p">.</span><span class="n">nValue</span> <span class="o">==</span> <span class="p">(</span><span class="n">GetBlockSubsidy</span><span class="p">(</span><span class="n">nHeight</span><span class="p">,</span> <span class="n">consensusParams</span><span class="p">)</span> <span class="o">/</span> <span class="mi">5</span><span class="p">))</span> <span class="p">{</span>
<span class="n">found</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
<span class="k">break</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">found</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">state</span><span class="p">.</span><span class="n">DoS</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="n">error</span><span class="p">(</span><span class="s">&quot;%s: founders reward missing&quot;</span><span class="p">,</span> <span class="n">__func__</span><span class="p">),</span> <span class="n">REJECT_INVALID</span><span class="p">,</span> <span class="s">&quot;cb-no-founders-reward&quot;</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">...</span>
<span class="p">}</span></pre>
</section>
</section>
<section id="deployment"><h2><span class="section-heading">Deployment</span><span class="section-anchor"> <a href="#deployment"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h2>
<p>This proposal was originally intended to be deployed with the Blossom network upgrade. <a id="id11" class="footnote_reference" href="#zip-0206">7</a></p>
</section>
<section id="backward-compatibility"><h2><span class="section-heading">Backward compatibility</span><span class="section-anchor"> <a href="#backward-compatibility"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h2>
<p>This proposal intentionally creates what is known as a "bilateral consensus rule change". Use of this mechanism requires that all network participants upgrade their software to a compatible version within the upgrade window. Older software will treat post-upgrade blocks as invalid, and will follow any pre-upgrade branch that persists.</p>
<p>This proposal is designed with the explicit requirement of not altering the overall issuance schedule (based on time), nor does it alter the proportion or timeline of the overall Founders' Reward. As a result, no users outside of the Zerocoin Electric Coin Company and Zcash Foundation should experience any UX or economic change outside of the upgrade due to this proposal itself.</p>
<section id="interactions-with-other-zips"><h3><span class="section-heading">Interactions with other ZIPs</span><span class="section-anchor"> <a href="#interactions-with-other-zips"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h3>
<p><a id="id12" class="footnote_reference" href="#zip-0208">4</a> (Shorter Block Target Spacing) specifies a change to the block target spacing. It is planned to take effect in the Blossom network upgrade <a id="id13" class="footnote_reference" href="#zip-0206">7</a>. This ZIP was originally written to take effect at the same time, but was Withdrawn from consideration for Blossom.</p>
<p>ZIP 208 modifies the payment of the original Founders' Reward to take account of the block target spacing change. It does this by specifying a FounderAddressAdjustedHeight function and related changes, which would need to be revisited to take into account funding streams.</p>
</section>
</section>
<section id="reference-implementation"><h2><span class="section-heading">Reference Implementation</span><span class="section-anchor"> <a href="#reference-implementation"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h2>
<p>TBC</p>
</section>
<section id="references"><h2><span class="section-heading">References</span><span class="section-anchor"> <a href="#references"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h2>
<table id="rfc2119" class="footnote">
<tbody>
<tr>
<th>1</th>
<td><a href="https://www.rfc-editor.org/rfc/rfc2119.html">Key words for use in RFCs to Indicate Requirement Levels</a></td>
</tr>
</tbody>
</table>
<table id="block-subsidy" class="footnote">
<tbody>
<tr>
<th>2</th>
<td><a href="protocol/protocol.pdf">Section 7.7: Calculation of Block Subsidy and Founders' Reward. Zcash Protocol Specification, Version 2018.0-beta-33 or later [Overwinter+Sapling]</a></td>
</tr>
</tbody>
</table>
<table id="continued-funding" class="footnote">
<tbody>
<tr>
<th>3</th>
<td><a href="https://electriccoin.co/blog/continued-funding-and-transparency/">Continued Funding and Transparency</a></td>
</tr>
</tbody>
</table>
<table id="zip-0208" class="footnote">
<tbody>
<tr>
<th>4</th>
<td><a href="zip-0208">ZIP 208: Shorter Block Target Spacing</a></td>
</tr>
</tbody>
</table>
<table id="original-fr-consensus-rule" class="footnote">
<tbody>
<tr>
<th>5</th>
<td><a href="protocol/protocol.pdf">Section 7.8: Payment of Founders' Reward. Zcash Protocol Specification, Version 2018.0-beta-33 or later [Overwinter+Sapling]</a></td>
</tr>
</tbody>
</table>
<table id="protocol-constants" class="footnote">
<tbody>
<tr>
<th>6</th>
<td><a href="protocol/protocol.pdf">Section 5.3: Constants. Zcash Protocol Specification, Version 2018.0-beta-33 or later [Overwinter+Sapling]</a></td>
</tr>
</tbody>
</table>
<table id="zip-0206" class="footnote">
<tbody>
<tr>
<th>7</th>
<td><a href="zip-0206">ZIP 206: Blossom Network Upgrade</a></td>
</tr>
</tbody>
</table>
</section>
</section>
</body>
</html>