mirror of https://github.com/zcash/zips.git
ZIP 221: change the pseudocode so that CONSENSUS_BRANCH_ID doesn't look as though it's a constant.
Signed-off-by: Daira Hopwood <daira@jacaranda.org>
This commit is contained in:
parent
7196ab330c
commit
e0c2123b05
|
@ -334,11 +334,8 @@ License: MIT</pre>
|
||||||
<p>Once the MMR has been generated, we produce <code>hashChainHistoryRoot</code>, which we define as the BLAKE2b-256 digest of the serialization of the root node.</p>
|
<p>Once the MMR has been generated, we produce <code>hashChainHistoryRoot</code>, which we define as the BLAKE2b-256 digest of the serialization of the root node.</p>
|
||||||
</section>
|
</section>
|
||||||
<section id="tree-nodes-and-hashing-pseudocode"><h3><span class="section-heading">Tree nodes and hashing (pseudocode)</span><span class="section-anchor"> <a href="#tree-nodes-and-hashing-pseudocode"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h3>
|
<section id="tree-nodes-and-hashing-pseudocode"><h3><span class="section-heading">Tree nodes and hashing (pseudocode)</span><span class="section-anchor"> <a href="#tree-nodes-and-hashing-pseudocode"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h3>
|
||||||
<pre data-language="python"><span class="n">CONSENSUS_BRANCH_ID</span><span class="p">:</span> <span class="nb">bytes</span> <span class="o">=</span> <span class="n">b</span><span class="s">''</span>
|
<pre data-language="python"><span class="k">def</span> <span class="nf">H</span><span class="p">(</span><span class="n">msg</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">,</span> <span class="n">consensusBranchId</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bytes</span><span class="p">:</span>
|
||||||
|
<span class="k">return</span> <span class="n">blake2b256</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">personalization</span><span class="o">=</span><span class="n">b</span><span class="s">'ZcashHistory'</span> <span class="o">+</span> <span class="n">consensusBranchId</span><span class="p">)</span>
|
||||||
|
|
||||||
<span class="k">def</span> <span class="nf">H</span><span class="p">(</span><span class="n">msg</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bytes</span><span class="p">:</span>
|
|
||||||
<span class="k">return</span> <span class="n">blake2b256</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">personalization</span><span class="o">=</span><span class="n">b</span><span class="s">'ZcashHistory'</span> <span class="o">+</span> <span class="n">CONSENSUS_BRANCH_ID</span><span class="p">)</span>
|
|
||||||
|
|
||||||
<span class="k">class</span> <span class="nc">ZcashMMRNode</span><span class="p">():</span>
|
<span class="k">class</span> <span class="nc">ZcashMMRNode</span><span class="p">():</span>
|
||||||
<span class="c"># leaf nodes have no children</span>
|
<span class="c"># leaf nodes have no children</span>
|
||||||
|
@ -358,6 +355,8 @@ License: MIT</pre>
|
||||||
<span class="n">nLatestHeight</span><span class="p">:</span> <span class="nb">int</span>
|
<span class="n">nLatestHeight</span><span class="p">:</span> <span class="nb">int</span>
|
||||||
<span class="n">nSaplingTxCount</span><span class="p">:</span> <span class="nb">int</span> <span class="c"># number of Sapling transactions in block</span>
|
<span class="n">nSaplingTxCount</span><span class="p">:</span> <span class="nb">int</span> <span class="c"># number of Sapling transactions in block</span>
|
||||||
|
|
||||||
|
<span class="n">consensusBranchId</span><span class="p">:</span> <span class="nb">bytes</span>
|
||||||
|
|
||||||
<span class="nd">@classmethod</span>
|
<span class="nd">@classmethod</span>
|
||||||
<span class="k">def</span> <span class="nf">from_block</span><span class="p">(</span><span class="n">Z</span><span class="p">,</span> <span class="n">block</span><span class="p">:</span> <span class="n">ZcashBlock</span><span class="p">)</span> <span class="o">-></span> <span class="n">ZcashMMRNode</span><span class="p">:</span>
|
<span class="k">def</span> <span class="nf">from_block</span><span class="p">(</span><span class="n">Z</span><span class="p">,</span> <span class="n">block</span><span class="p">:</span> <span class="n">ZcashBlock</span><span class="p">)</span> <span class="o">-></span> <span class="n">ZcashMMRNode</span><span class="p">:</span>
|
||||||
<span class="sd">'''Create a leaf node from a block'''</span>
|
<span class="sd">'''Create a leaf node from a block'''</span>
|
||||||
|
@ -374,7 +373,8 @@ License: MIT</pre>
|
||||||
<span class="n">nSubTreeTotalWork</span><span class="o">=</span><span class="n">calculate_work</span><span class="p">(</span><span class="n">block</span><span class="o">.</span><span class="n">nBits</span><span class="p">),</span>
|
<span class="n">nSubTreeTotalWork</span><span class="o">=</span><span class="n">calculate_work</span><span class="p">(</span><span class="n">block</span><span class="o">.</span><span class="n">nBits</span><span class="p">),</span>
|
||||||
<span class="n">nEarliestHeight</span><span class="o">=</span><span class="n">block</span><span class="o">.</span><span class="n">height</span><span class="p">,</span>
|
<span class="n">nEarliestHeight</span><span class="o">=</span><span class="n">block</span><span class="o">.</span><span class="n">height</span><span class="p">,</span>
|
||||||
<span class="n">nLatestHeight</span><span class="o">=</span><span class="n">block</span><span class="o">.</span><span class="n">height</span><span class="p">,</span>
|
<span class="n">nLatestHeight</span><span class="o">=</span><span class="n">block</span><span class="o">.</span><span class="n">height</span><span class="p">,</span>
|
||||||
<span class="n">nSaplingTxCount</span><span class="o">=</span><span class="n">block</span><span class="o">.</span><span class="n">sapling_tx_count</span><span class="p">)</span>
|
<span class="n">nSaplingTxCount</span><span class="o">=</span><span class="n">block</span><span class="o">.</span><span class="n">sapling_tx_count</span><span class="p">,</span>
|
||||||
|
<span class="n">consensusBranchId</span><span class="o">=</span><span class="n">block</span><span class="o">.</span><span class="n">consensusBranchId</span><span class="p">)</span>
|
||||||
|
|
||||||
<span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bytes</span><span class="p">:</span>
|
<span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bytes</span><span class="p">:</span>
|
||||||
<span class="sd">'''serializes a node'''</span>
|
<span class="sd">'''serializes a node'''</span>
|
||||||
|
@ -408,11 +408,12 @@ License: MIT</pre>
|
||||||
<span class="n">nSubTreeTotalWork</span><span class="o">=</span><span class="n">left_child</span><span class="o">.</span><span class="n">nSubTreeTotalWork</span> <span class="o">+</span> <span class="n">right_child</span><span class="o">.</span><span class="n">nSubTreeTotalWork</span><span class="p">,</span>
|
<span class="n">nSubTreeTotalWork</span><span class="o">=</span><span class="n">left_child</span><span class="o">.</span><span class="n">nSubTreeTotalWork</span> <span class="o">+</span> <span class="n">right_child</span><span class="o">.</span><span class="n">nSubTreeTotalWork</span><span class="p">,</span>
|
||||||
<span class="n">nEarliestHeight</span><span class="o">=</span><span class="n">left_child</span><span class="o">.</span><span class="n">nEarliestHeight</span><span class="p">,</span>
|
<span class="n">nEarliestHeight</span><span class="o">=</span><span class="n">left_child</span><span class="o">.</span><span class="n">nEarliestHeight</span><span class="p">,</span>
|
||||||
<span class="n">nLatestHeight</span><span class="o">=</span><span class="n">right_child</span><span class="o">.</span><span class="n">nLatestHeight</span><span class="p">,</span>
|
<span class="n">nLatestHeight</span><span class="o">=</span><span class="n">right_child</span><span class="o">.</span><span class="n">nLatestHeight</span><span class="p">,</span>
|
||||||
<span class="n">nSaplingTxCount</span><span class="o">=</span><span class="n">left_child</span><span class="o">.</span><span class="n">nSaplingTxCount</span> <span class="o">+</span> <span class="n">right_child</span><span class="o">.</span><span class="n">nSaplingTxCount</span><span class="p">)</span>
|
<span class="n">nSaplingTxCount</span><span class="o">=</span><span class="n">left_child</span><span class="o">.</span><span class="n">nSaplingTxCount</span> <span class="o">+</span> <span class="n">right_child</span><span class="o">.</span><span class="n">nSaplingTxCount</span><span class="p">,</span>
|
||||||
|
<span class="n">consensusBranchId</span><span class="o">=</span><span class="n">left_child</span><span class="o">.</span><span class="n">consensusBranchId</span><span class="p">)</span>
|
||||||
|
|
||||||
<span class="k">def</span> <span class="nf">make_root_commitment</span><span class="p">(</span><span class="n">root</span><span class="p">:</span> <span class="n">ZcashMMRNode</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bytes</span><span class="p">:</span>
|
<span class="k">def</span> <span class="nf">make_root_commitment</span><span class="p">(</span><span class="n">root</span><span class="p">:</span> <span class="n">ZcashMMRNode</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bytes</span><span class="p">:</span>
|
||||||
<span class="sd">'''Makes the root commitment for a blockheader'''</span>
|
<span class="sd">'''Makes the root commitment for a blockheader'''</span>
|
||||||
<span class="k">return</span> <span class="n">H</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">serialize</span><span class="p">())</span></pre>
|
<span class="k">return</span> <span class="n">H</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">serialize</span><span class="p">(),</span> <span class="n">root</span><span class="o">.</span><span class="n">consensusBranchId</span><span class="p">)</span></pre>
|
||||||
</section>
|
</section>
|
||||||
<section id="incremental-push-and-pop-pseudocode"><h3><span class="section-heading">Incremental push and pop (pseudocode)</span><span class="section-anchor"> <a href="#incremental-push-and-pop-pseudocode"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h3>
|
<section id="incremental-push-and-pop-pseudocode"><h3><span class="section-heading">Incremental push and pop (pseudocode)</span><span class="section-anchor"> <a href="#incremental-push-and-pop-pseudocode"><img width="24" height="24" src="assets/images/section-anchor.png" alt=""></a></span></h3>
|
||||||
<p>With each new block
|
<p>With each new block
|
||||||
|
|
17
zip-0221.rst
17
zip-0221.rst
|
@ -341,11 +341,8 @@ Tree nodes and hashing (pseudocode)
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
CONSENSUS_BRANCH_ID: bytes = b''
|
def H(msg: bytes, consensusBranchId: bytes) -> bytes:
|
||||||
|
return blake2b256(msg, personalization=b'ZcashHistory' + consensusBranchId)
|
||||||
|
|
||||||
def H(msg: bytes) -> bytes:
|
|
||||||
return blake2b256(msg, personalization=b'ZcashHistory' + CONSENSUS_BRANCH_ID)
|
|
||||||
|
|
||||||
class ZcashMMRNode():
|
class ZcashMMRNode():
|
||||||
# leaf nodes have no children
|
# leaf nodes have no children
|
||||||
|
@ -365,6 +362,8 @@ Tree nodes and hashing (pseudocode)
|
||||||
nLatestHeight: int
|
nLatestHeight: int
|
||||||
nSaplingTxCount: int # number of Sapling transactions in block
|
nSaplingTxCount: int # number of Sapling transactions in block
|
||||||
|
|
||||||
|
consensusBranchId: bytes
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_block(Z, block: ZcashBlock) -> ZcashMMRNode:
|
def from_block(Z, block: ZcashBlock) -> ZcashMMRNode:
|
||||||
'''Create a leaf node from a block'''
|
'''Create a leaf node from a block'''
|
||||||
|
@ -381,7 +380,8 @@ Tree nodes and hashing (pseudocode)
|
||||||
nSubTreeTotalWork=calculate_work(block.nBits),
|
nSubTreeTotalWork=calculate_work(block.nBits),
|
||||||
nEarliestHeight=block.height,
|
nEarliestHeight=block.height,
|
||||||
nLatestHeight=block.height,
|
nLatestHeight=block.height,
|
||||||
nSaplingTxCount=block.sapling_tx_count)
|
nSaplingTxCount=block.sapling_tx_count,
|
||||||
|
consensusBranchId=block.consensusBranchId)
|
||||||
|
|
||||||
def serialize(self) -> bytes:
|
def serialize(self) -> bytes:
|
||||||
'''serializes a node'''
|
'''serializes a node'''
|
||||||
|
@ -415,11 +415,12 @@ Tree nodes and hashing (pseudocode)
|
||||||
nSubTreeTotalWork=left_child.nSubTreeTotalWork + right_child.nSubTreeTotalWork,
|
nSubTreeTotalWork=left_child.nSubTreeTotalWork + right_child.nSubTreeTotalWork,
|
||||||
nEarliestHeight=left_child.nEarliestHeight,
|
nEarliestHeight=left_child.nEarliestHeight,
|
||||||
nLatestHeight=right_child.nLatestHeight,
|
nLatestHeight=right_child.nLatestHeight,
|
||||||
nSaplingTxCount=left_child.nSaplingTxCount + right_child.nSaplingTxCount)
|
nSaplingTxCount=left_child.nSaplingTxCount + right_child.nSaplingTxCount,
|
||||||
|
consensusBranchId=left_child.consensusBranchId)
|
||||||
|
|
||||||
def make_root_commitment(root: ZcashMMRNode) -> bytes:
|
def make_root_commitment(root: ZcashMMRNode) -> bytes:
|
||||||
'''Makes the root commitment for a blockheader'''
|
'''Makes the root commitment for a blockheader'''
|
||||||
return H(root.serialize())
|
return H(root.serialize(), root.consensusBranchId)
|
||||||
|
|
||||||
Incremental push and pop (pseudocode)
|
Incremental push and pop (pseudocode)
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue