This commit is contained in:
manojsdoshi
2023-11-17 04:41:06 +00:00
parent d438ec7571
commit 8a54587104
2 changed files with 404 additions and 289 deletions

View File

@@ -1425,297 +1425,409 @@ $(function() {
<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160; {</div>
<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160; <span class="keywordtype">int</span> neededWeight;</div>
<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>&#160; </div>
<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160; <span class="keywordflow">if</span> (convergePercent_ &lt; parms.<a class="code" href="structripple_1_1ConsensusParms.html#afd06939a6c18d834a0e35c537390b863">avMID_CONSENSUS_TIME</a>)</div>
<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160; neededWeight = parms.<a class="code" href="structripple_1_1ConsensusParms.html#a004108774cadaf48b592ab0c5805b865">avINIT_CONSENSUS_PCT</a>;</div>
<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (convergePercent_ &lt; parms.<a class="code" href="structripple_1_1ConsensusParms.html#a755e41d0905719463a7964d728b1d435">avLATE_CONSENSUS_TIME</a>)</div>
<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>&#160; neededWeight = parms.<a class="code" href="structripple_1_1ConsensusParms.html#acc255d46ba3f6c893013ca5b79ba838e">avMID_CONSENSUS_PCT</a>;</div>
<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (convergePercent_ &lt; parms.<a class="code" href="structripple_1_1ConsensusParms.html#ad02cd693fc6dffda8c60be0ca778d00b">avSTUCK_CONSENSUS_TIME</a>)</div>
<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160; neededWeight = parms.<a class="code" href="structripple_1_1ConsensusParms.html#a2a87c13cce111e3e3e9797bdaa9fdd6c">avLATE_CONSENSUS_PCT</a>;</div>
<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160; neededWeight = parms.<a class="code" href="structripple_1_1ConsensusParms.html#a5c07d50213acde142cb02e9a8a1045a6">avSTUCK_CONSENSUS_PCT</a>;</div>
<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160; </div>
<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>&#160; <span class="keywordtype">int</span> participants = currPeerPositions_.size();</div>
<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160; <span class="keywordflow">if</span> (mode_.get() == ConsensusMode::proposing)</div>
<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160; {</div>
<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160; ++closeTimeVotes[asCloseTime(result_-&gt;position.closeTime())];</div>
<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160; ++participants;</div>
<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>&#160; <span class="comment">// It&#39;s possible to be at a close time impasse (described below), so</span></div>
<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160; <span class="comment">// keep track of whether this round has taken a long time.</span></div>
<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160; <span class="keywordtype">bool</span> stuck = <span class="keyword">false</span>;</div>
<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160; </div>
<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>&#160; <span class="keywordflow">if</span> (convergePercent_ &lt; parms.<a class="code" href="structripple_1_1ConsensusParms.html#afd06939a6c18d834a0e35c537390b863">avMID_CONSENSUS_TIME</a>)</div>
<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160; {</div>
<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160; neededWeight = parms.<a class="code" href="structripple_1_1ConsensusParms.html#a004108774cadaf48b592ab0c5805b865">avINIT_CONSENSUS_PCT</a>;</div>
<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160; }</div>
<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (convergePercent_ &lt; parms.<a class="code" href="structripple_1_1ConsensusParms.html#a755e41d0905719463a7964d728b1d435">avLATE_CONSENSUS_TIME</a>)</div>
<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160; {</div>
<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>&#160; neededWeight = parms.<a class="code" href="structripple_1_1ConsensusParms.html#acc255d46ba3f6c893013ca5b79ba838e">avMID_CONSENSUS_PCT</a>;</div>
<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160; }</div>
<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (convergePercent_ &lt; parms.<a class="code" href="structripple_1_1ConsensusParms.html#ad02cd693fc6dffda8c60be0ca778d00b">avSTUCK_CONSENSUS_TIME</a>)</div>
<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160; {</div>
<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160; neededWeight = parms.<a class="code" href="structripple_1_1ConsensusParms.html#a2a87c13cce111e3e3e9797bdaa9fdd6c">avLATE_CONSENSUS_PCT</a>;</div>
<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>&#160; }</div>
<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>&#160; </div>
<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>&#160; <span class="comment">// Threshold for non-zero vote</span></div>
<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160; <span class="keywordtype">int</span> threshVote = <a class="code" href="namespaceripple.html#aeb66127505ef68a84f565f5a84927229">participantsNeeded</a>(participants, neededWeight);</div>
<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>&#160; </div>
<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>&#160; <span class="comment">// Threshold to declare consensus</span></div>
<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>&#160; <span class="keywordtype">int</span> <span class="keyword">const</span> threshConsensus =</div>
<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160; <a class="code" href="namespaceripple.html#aeb66127505ef68a84f565f5a84927229">participantsNeeded</a>(participants, parms.<a class="code" href="structripple_1_1ConsensusParms.html#ab293aad447acb327c2d38c91e71084c4">avCT_CONSENSUS_PCT</a>);</div>
<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160; </div>
<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) &lt;&lt; <span class="stringliteral">&quot;Proposers:&quot;</span> &lt;&lt; currPeerPositions_.size()</div>
<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160; &lt;&lt; <span class="stringliteral">&quot; nw:&quot;</span> &lt;&lt; neededWeight &lt;&lt; <span class="stringliteral">&quot; thrV:&quot;</span> &lt;&lt; threshVote</div>
<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>&#160; &lt;&lt; <span class="stringliteral">&quot; thrC:&quot;</span> &lt;&lt; threshConsensus;</div>
<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160; </div>
<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160; <span class="comment">// An impasse is possible unless a validator pretends to change</span></div>
<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160; <span class="comment">// its close time vote. Imagine 5 validators. 3 have positions</span></div>
<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160; <span class="comment">// for close time t1, and 2 with t2. That&#39;s an impasse because</span></div>
<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160; <span class="comment">// 75% will never be met. However, if one of the validators voting</span></div>
<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160; <span class="comment">// for t2 switches to t1, then that will be 80% and sufficient</span></div>
<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160; <span class="comment">// to break the impasse. It&#39;s also OK for those agreeing</span></div>
<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160; <span class="comment">// with the 3 to pretend to vote for the one with 2, because</span></div>
<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160; <span class="comment">// that will never exceed the threshold of 75%, even with as</span></div>
<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160; <span class="comment">// few as 3 validators. The most it can achieve is 2/3.</span></div>
<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; [t, v] : closeTimeVotes)</div>
<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160; {</div>
<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160; <span class="keywordflow">if</span> (adaptor_.validating() &amp;&amp;</div>
<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160; t != asCloseTime(result_-&gt;position.closeTime()))</div>
<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160; {</div>
<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Others have voted for a close time &quot;</span></div>
<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>&#160; <span class="stringliteral">&quot;different than ours. Adding our vote &quot;</span></div>
<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160; <span class="stringliteral">&quot;to this one in case it is necessary &quot;</span></div>
<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160; <span class="stringliteral">&quot;to break an impasse.&quot;</span>;</div>
<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160; ++v;</div>
<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160; }</div>
<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>())</div>
<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160; &lt;&lt; <span class="stringliteral">&quot;CCTime: seq &quot;</span></div>
<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160; &lt;&lt; <span class="keyword">static_cast&lt;</span><a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a><span class="keyword">&gt;</span>(previousLedger_.seq()) + 1 &lt;&lt; <span class="stringliteral">&quot;: &quot;</span></div>
<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160; &lt;&lt; t.time_since_epoch().count() &lt;&lt; <span class="stringliteral">&quot; has &quot;</span> &lt;&lt; v &lt;&lt; <span class="stringliteral">&quot;, &quot;</span></div>
<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160; &lt;&lt; threshVote &lt;&lt; <span class="stringliteral">&quot; required&quot;</span>;</div>
<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160; </div>
<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>&#160; <span class="keywordflow">if</span> (v &gt;= threshVote)</div>
<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>&#160; {</div>
<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>&#160; <span class="comment">// A close time has enough votes for us to try to agree</span></div>
<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>&#160; consensusCloseTime = t;</div>
<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160; threshVote = v;</div>
<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160; </div>
<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>&#160; <span class="keywordflow">if</span> (threshVote &gt;= threshConsensus)</div>
<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>&#160; {</div>
<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>&#160; haveCloseTimeConsensus_ = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160; <span class="comment">// Make sure that the winning close time is the one</span></div>
<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>&#160; <span class="comment">// that propagates to the rest of the function.</span></div>
<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160; }</div>
<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160; }</div>
<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>&#160; }</div>
<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160; </div>
<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160; <span class="keywordflow">if</span> (!haveCloseTimeConsensus_)</div>
<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160; {</div>
<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>())</div>
<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160; &lt;&lt; <span class="stringliteral">&quot;No CT consensus:&quot;</span></div>
<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>&#160; &lt;&lt; <span class="stringliteral">&quot; Proposers:&quot;</span> &lt;&lt; currPeerPositions_.size()</div>
<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>&#160; &lt;&lt; <span class="stringliteral">&quot; Mode:&quot;</span> &lt;&lt; to_string(mode_.get())</div>
<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>&#160; &lt;&lt; <span class="stringliteral">&quot; Thresh:&quot;</span> &lt;&lt; threshConsensus</div>
<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>&#160; &lt;&lt; <span class="stringliteral">&quot; Pos:&quot;</span> &lt;&lt; consensusCloseTime.<a class="codeRef" href="http://en.cppreference.com/w/cpp/chrono/time_point/time_since_epoch.html">time_since_epoch</a>().count();</div>
<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>&#160; }</div>
<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>&#160; }</div>
<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>&#160; </div>
<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>&#160; <span class="keywordflow">if</span> (!ourNewSet &amp;&amp;</div>
<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>&#160; ((consensusCloseTime != asCloseTime(result_-&gt;position.closeTime())) ||</div>
<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>&#160; result_-&gt;position.isStale(ourCutoff)))</div>
<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>&#160; {</div>
<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>&#160; <span class="comment">// close time changed or our position is stale</span></div>
<div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160; ourNewSet.<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional/emplace.html">emplace</a>(result_-&gt;txns);</div>
<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>&#160; }</div>
<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>&#160; </div>
<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160; <span class="keywordflow">if</span> (ourNewSet)</div>
<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>&#160; {</div>
<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160; <span class="keyword">auto</span> newID = ourNewSet-&gt;id();</div>
<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>&#160; {</div>
<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160; neededWeight = parms.<a class="code" href="structripple_1_1ConsensusParms.html#a5c07d50213acde142cb02e9a8a1045a6">avSTUCK_CONSENSUS_PCT</a>;</div>
<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>&#160; stuck = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>&#160; }</div>
<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>&#160; </div>
<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160; <span class="keywordtype">int</span> participants = currPeerPositions_.size();</div>
<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160; <span class="keywordflow">if</span> (mode_.get() == ConsensusMode::proposing)</div>
<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>&#160; {</div>
<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160; ++closeTimeVotes[asCloseTime(result_-&gt;position.closeTime())];</div>
<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>&#160; ++participants;</div>
<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160; }</div>
<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160; </div>
<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160; <span class="comment">// Threshold for non-zero vote</span></div>
<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160; <span class="keywordtype">int</span> threshVote = <a class="code" href="namespaceripple.html#aeb66127505ef68a84f565f5a84927229">participantsNeeded</a>(participants, neededWeight);</div>
<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160; </div>
<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160; <span class="comment">// Threshold to declare consensus</span></div>
<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160; <span class="keywordtype">int</span> <span class="keyword">const</span> threshConsensus =</div>
<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160; <a class="code" href="namespaceripple.html#aeb66127505ef68a84f565f5a84927229">participantsNeeded</a>(participants, parms.<a class="code" href="structripple_1_1ConsensusParms.html#ab293aad447acb327c2d38c91e71084c4">avCT_CONSENSUS_PCT</a>);</div>
<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160; </div>
<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) &lt;&lt; <span class="stringliteral">&quot;Proposers:&quot;</span> &lt;&lt; currPeerPositions_.size()</div>
<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160; &lt;&lt; <span class="stringliteral">&quot; nw:&quot;</span> &lt;&lt; neededWeight &lt;&lt; <span class="stringliteral">&quot; thrV:&quot;</span> &lt;&lt; threshVote</div>
<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160; &lt;&lt; <span class="stringliteral">&quot; thrC:&quot;</span> &lt;&lt; threshConsensus;</div>
<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160; </div>
<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160; <span class="comment">// Choose a close time and decide whether there is consensus for it.</span></div>
<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160; <span class="comment">// Close time is chosen based on the threshVote threshold</span></div>
<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>&#160; <span class="comment">// calculated above. If a close time has votes equal to or greater than</span></div>
<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160; <span class="comment">// that threshold, then that is the best close time. If multiple</span></div>
<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160; <span class="comment">// close times have an equal number of votes, then choose the greatest</span></div>
<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160; <span class="comment">// of them. Ensure that our close time then matches that which meets</span></div>
<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160; <span class="comment">// the criteria. But if no close time meet the criteria, make no</span></div>
<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160; <span class="comment">// changes.</span></div>
<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160; <span class="comment">// This is implemented slightly differently for validators vs</span></div>
<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160; <span class="comment">// non-validators. For non-validators, it is sufficient to merely</span></div>
<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160; <span class="comment">// count the close times from all peer positions to determine</span></div>
<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160; <span class="comment">// the best. Validators, however, risk putting the network into an</span></div>
<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>&#160; <span class="comment">// impasse unless they are able to change their own position without</span></div>
<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>&#160; <span class="comment">// first having counted it towards the close time totals.</span></div>
<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>&#160; <span class="comment">// Here&#39;s how the impasse could occur:</span></div>
<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160; <span class="comment">// Imagine 5 validators. 3 have close time t1, and 2 have t2.</span></div>
<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160; <span class="comment">// As consensus time increases, the threshVote threshold also increases.</span></div>
<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>&#160; <span class="comment">// Once threshVote exceeds 60%, no members of either set of validators</span></div>
<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>&#160; <span class="comment">// will change their close times.</span></div>
<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160; <span class="comment">// Avoiding the impasse means that validators should identify</span></div>
<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>&#160; <span class="comment">// whether they currently have the best close time. First, choose</span></div>
<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>&#160; <span class="comment">// the close time with the most votes. However, if multiple close times</span></div>
<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160; <span class="comment">// have the same number of votes, pick the latest of them.</span></div>
<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160; <span class="comment">// If the validator does not currently have the best close time,</span></div>
<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>&#160; <span class="comment">// switch to it and increase the local vote tally for that better</span></div>
<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160; <span class="comment">// close time. This will result in consensus in the next iteration</span></div>
<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160; <span class="comment">// assuming that the peer messages propagate successfully.</span></div>
<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160; <span class="comment">// In this case the validators in set t1 will remain the same but</span></div>
<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160; <span class="comment">// those in t2 switch to t1.</span></div>
<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>&#160; <span class="comment">// Another wrinkle, however, is that too many position changes</span></div>
<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>&#160; <span class="comment">// from validators also has a destabilizing affect. Consensus can</span></div>
<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>&#160; <span class="comment">// take longer if peers have to keep re-calculating positions,</span></div>
<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>&#160; <span class="comment">// and mistakes can be made if peers settle on the wrong position.</span></div>
<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>&#160; <span class="comment">// Therefore, avoiding an impasse should also minimize the likelihood</span></div>
<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>&#160; <span class="comment">// of gratuitous change of position.</span></div>
<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>&#160; <span class="comment">// The solution for validators is to first track whether it&#39;s</span></div>
<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>&#160; <span class="comment">// possible that the network is at an impasse based on how much</span></div>
<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>&#160; <span class="comment">// time this current consensus round has taken. This is reflected</span></div>
<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>&#160; <span class="comment">// in the &quot;stuck&quot; boolean. When stuck, validators perform the</span></div>
<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>&#160; <span class="comment">// above-described position change based solely on whether or not</span></div>
<div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160; <span class="comment">// they agree with the best position, and ignore the threshVote</span></div>
<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>&#160; <span class="comment">// criteria used for the earlier part of the phase.</span></div>
<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160; <span class="comment">// Determining whether there is close time consensus is very simple</span></div>
<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>&#160; <span class="comment">// in comparison: if votes for the best close time meet or exceed</span></div>
<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160; <span class="comment">// threshConsensus, then we have close time consensus. Otherwise, not.</span></div>
<div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>&#160; </div>
<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>&#160; result_-&gt;txns = std::move(*ourNewSet);</div>
<div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>&#160; </div>
<div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) &lt;&lt; <span class="stringliteral">&quot;Position change: CTime &quot;</span></div>
<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>&#160; &lt;&lt; consensusCloseTime.<a class="codeRef" href="http://en.cppreference.com/w/cpp/chrono/time_point/time_since_epoch.html">time_since_epoch</a>().count()</div>
<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>&#160; &lt;&lt; <span class="stringliteral">&quot;, tx &quot;</span> &lt;&lt; newID;</div>
<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>&#160; </div>
<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>&#160; result_-&gt;position.changePosition(newID, consensusCloseTime, now_);</div>
<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>&#160; </div>
<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>&#160; <span class="comment">// Share our new transaction set and update disputes</span></div>
<div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>&#160; <span class="comment">// if we haven&#39;t already received it. Unless we have already</span></div>
<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>&#160; <span class="comment">// accepted a position, but are recalculating because it didn&#39;t</span></div>
<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>&#160; <span class="comment">// validate.</span></div>
<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>&#160; <span class="keywordflow">if</span> (acquired_.emplace(newID, result_-&gt;txns).second &amp;&amp; share)</div>
<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>&#160; {</div>
<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>&#160; <span class="keywordflow">if</span> (!result_-&gt;position.isBowOut())</div>
<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>&#160; adaptor_.share(result_-&gt;txns);</div>
<div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>&#160; </div>
<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [nodeId, peerPos] : currPeerPositions_)</div>
<div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>&#160; {</div>
<div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>&#160; <a class="code" href="classripple_1_1ConsensusProposal.html">Proposal_t</a> <span class="keyword">const</span>&amp; p = peerPos.proposal();</div>
<div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>&#160; <span class="keywordflow">if</span> (p.<a class="code" href="classripple_1_1ConsensusProposal.html#a734bd07cbd45bcef6f394aba56cbf1e3">position</a>() == newID)</div>
<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>&#160; updateDisputes(nodeId, result_-&gt;txns);</div>
<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>&#160; }</div>
<div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>&#160; }</div>
<div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>&#160; </div>
<div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>&#160; <span class="comment">// Share our new position if we are still participating this round,</span></div>
<div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>&#160; <span class="comment">// unless we have already accepted a position but are recalculating</span></div>
<div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>&#160; <span class="comment">// because it didn&#39;t validate.</span></div>
<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>&#160; <span class="keywordflow">if</span> (!result_-&gt;position.isBowOut() &amp;&amp;</div>
<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>&#160; (mode_.get() == ConsensusMode::proposing) &amp;&amp; share)</div>
<div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>&#160; adaptor_.propose(result_-&gt;position);</div>
<div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>&#160; }</div>
<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>&#160;}</div>
<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>&#160; </div>
<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Adaptor&gt;</div>
<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l01891"></a><span class="lineno"><a class="line" href="classripple_1_1Consensus.html#a498092766e111e7e2ac715d572318a27"> 1891</a></span>&#160;<a class="code" href="classripple_1_1Consensus.html">Consensus&lt;Adaptor&gt;::haveConsensus</a>()</div>
<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>&#160;{</div>
<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>&#160; <span class="comment">// Must have a stance if we are checking for consensus</span></div>
<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>&#160; assert(result_);</div>
<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>&#160; </div>
<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>&#160; <span class="comment">// CHECKME: should possibly count unacquired TX sets as disagreeing</span></div>
<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>&#160; <span class="keywordtype">int</span> agree = 0, disagree = 0;</div>
<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>&#160; <span class="comment">// First, find the best close time with which to agree: first criteria</span></div>
<div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>&#160; <span class="comment">// is the close time with the most votes. If a tie, the latest</span></div>
<div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>&#160; <span class="comment">// close time of those tied for the maximum number of votes.</span></div>
<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/multimap.html">std::multimap&lt;int, NetClock::time_point&gt;</a> votesByCloseTime;</div>
<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/io/basic_stringstream.html">std::stringstream</a> ss;</div>
<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;Close time calculation for ledger sequence &quot;</span></div>
<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>&#160; &lt;&lt; <span class="keyword">static_cast&lt;</span><a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a><span class="keyword">&gt;</span>(previousLedger_.seq()) + 1</div>
<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>&#160; &lt;&lt; <span class="stringliteral">&quot; Close times and vote count are as follows: &quot;</span>;</div>
<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>&#160; <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [closeTime, voteCount] : closeTimeVotes)</div>
<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>&#160; {</div>
<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>&#160; <span class="keywordflow">if</span> (first)</div>
<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>&#160; first = <span class="keyword">false</span>;</div>
<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>&#160; ss &lt;&lt; <span class="charliteral">&#39;,&#39;</span>;</div>
<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>&#160; votesByCloseTime.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/multimap/insert.html">insert</a>({voteCount, closeTime});</div>
<div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>&#160; ss &lt;&lt; closeTime.time_since_epoch().count() &lt;&lt; <span class="charliteral">&#39;:&#39;</span> &lt;&lt; voteCount;</div>
<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>&#160; }</div>
<div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>&#160; <span class="comment">// These always gets populated because currPeerPositions_ is not</span></div>
<div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>&#160; <span class="comment">// empty to end up here, so at least 1 close time has at least 1 vote.</span></div>
<div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>&#160; assert(!currPeerPositions_.empty());</div>
<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;int&gt;</a> maxVote;</div>
<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/set.html">std::set&lt;NetClock::time_point&gt;</a> maxCloseTimes;</div>
<div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>&#160; <span class="comment">// Highest vote getter is last. Track each close time that is tied</span></div>
<div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>&#160; <span class="comment">// with the highest.</span></div>
<div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> rit = votesByCloseTime.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/multimap/rbegin.html">crbegin</a>();</div>
<div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>&#160; rit != votesByCloseTime.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/multimap/rend.html">crend</a>();</div>
<div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>&#160; ++rit)</div>
<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>&#160; {</div>
<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>&#160; <span class="keywordtype">int</span> <span class="keyword">const</span> voteCount = rit-&gt;first;</div>
<div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>&#160; <span class="keywordflow">if</span> (!maxVote.<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional/operator_bool.html">has_value</a>())</div>
<div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>&#160; maxVote = voteCount;</div>
<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (voteCount &lt; *maxVote)</div>
<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>&#160; maxCloseTimes.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/set/insert.html">insert</a>(rit-&gt;second);</div>
<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>&#160; }</div>
<div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>&#160; <span class="comment">// The best close time is the latest close time of those that have</span></div>
<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>&#160; <span class="comment">// the maximum number of votes.</span></div>
<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/chrono/time_point.html">NetClock::time_point</a> <span class="keyword">const</span> bestCloseTime = *maxCloseTimes.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/set/rbegin.html">crbegin</a>();</div>
<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;. The best close time has the most votes. If there is a tie, &quot;</span></div>
<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>&#160; <span class="stringliteral">&quot;choose the latest. This is &quot;</span></div>
<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>&#160; &lt;&lt; bestCloseTime.<a class="codeRef" href="http://en.cppreference.com/w/cpp/chrono/time_point/time_since_epoch.html">time_since_epoch</a>().count() &lt;&lt; <span class="stringliteral">&quot;with &quot;</span> &lt;&lt; *maxVote</div>
<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>&#160; &lt;&lt; <span class="stringliteral">&quot; votes. &quot;</span>;</div>
<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>&#160; </div>
<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>&#160; <span class="keyword">auto</span> ourPosition = result_-&gt;position.position();</div>
<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>&#160; </div>
<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160; <span class="comment">// Count number of agreements/disagreements with our position</span></div>
<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [nodeId, peerPos] : currPeerPositions_)</div>
<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>&#160; {</div>
<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>&#160; <a class="code" href="classripple_1_1ConsensusProposal.html">Proposal_t</a> <span class="keyword">const</span>&amp; peerProp = peerPos.proposal();</div>
<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>&#160; <span class="keywordflow">if</span> (peerProp.<a class="code" href="classripple_1_1ConsensusProposal.html#a734bd07cbd45bcef6f394aba56cbf1e3">position</a>() == ourPosition)</div>
<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>&#160; ++agree;</div>
<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>&#160; ++disagree;</div>
<div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>&#160; }</div>
<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>&#160; <span class="keyword">auto</span> currentFinished =</div>
<div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>&#160; adaptor_.proposersFinished(previousLedger_, prevLedgerID_);</div>
<div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>&#160; </div>
<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Checking for TX consensus: agree=&quot;</span> &lt;&lt; agree</div>
<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>&#160; &lt;&lt; <span class="stringliteral">&quot;, disagree=&quot;</span> &lt;&lt; disagree;</div>
<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>&#160; </div>
<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>&#160; <span class="comment">// Determine if we actually have consensus or not</span></div>
<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>&#160; result_-&gt;state = <a class="code" href="namespaceripple.html#a2e640e92bd561e94c1800ea388975d94">checkConsensus</a>(</div>
<div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>&#160; prevProposers_,</div>
<div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>&#160; agree + disagree,</div>
<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>&#160; agree,</div>
<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>&#160; currentFinished,</div>
<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>&#160; prevRoundTime_,</div>
<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>&#160; result_-&gt;roundTime.read(),</div>
<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160; adaptor_.parms(),</div>
<div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>&#160; mode_.get() == ConsensusMode::proposing,</div>
<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>&#160; j_);</div>
<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>&#160; </div>
<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160; <span class="keywordflow">if</span> (result_-&gt;state == ConsensusState::No)</div>
<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>&#160; </div>
<div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160; <span class="comment">// There is consensus, but we need to track if the network moved on</span></div>
<div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160; <span class="comment">// without us.</span></div>
<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>&#160; <span class="keywordflow">if</span> (result_-&gt;state == ConsensusState::MovedOn)</div>
<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160; {</div>
<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) &lt;&lt; <span class="stringliteral">&quot;Unable to reach consensus MovedOn: &quot;</span></div>
<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>&#160; &lt;&lt; <a class="code" href="classJson_1_1Compact.html">Json::Compact</a>{<a class="code" href="namespaceripple.html#ad30131b5a5b7cf60d9b392ab868b8c0e">getJson</a>(<span class="keyword">true</span>)};</div>
<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>&#160; }</div>
<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160; </div>
<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>&#160;}</div>
<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160; </div>
<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Adaptor&gt;</div>
<div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l01944"></a><span class="lineno"><a class="line" href="classripple_1_1Consensus.html#a8910d52e827ffa8f0a5f2418855d596d"> 1944</a></span>&#160;<a class="code" href="classripple_1_1Consensus.html">Consensus&lt;Adaptor&gt;::leaveConsensus</a>()</div>
<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160;{</div>
<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160; <span class="keywordflow">if</span> (mode_.get() == ConsensusMode::proposing)</div>
<div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>&#160; {</div>
<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>&#160; <span class="keywordflow">if</span> (result_ &amp;&amp; !result_-&gt;position.isBowOut())</div>
<div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>&#160; {</div>
<div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>&#160; result_-&gt;position.bowOut(now_);</div>
<div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>&#160; adaptor_.propose(result_-&gt;position);</div>
<div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>&#160; }</div>
<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>&#160; <span class="comment">// If we are a validator potentially at an impasse and our own close</span></div>
<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>&#160; <span class="comment">// time is not the best, change our close time to match it and</span></div>
<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160; <span class="comment">// tally another vote for it.</span></div>
<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>&#160; <span class="keywordflow">if</span> (adaptor_.validating() &amp;&amp; stuck &amp;&amp;</div>
<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>&#160; consensusCloseTime != bestCloseTime)</div>
<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>&#160; {</div>
<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>&#160; consensusCloseTime = bestCloseTime;</div>
<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>&#160; ++*maxVote;</div>
<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot; We are a validator. Consensus has taken &quot;</span></div>
<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>&#160; &lt;&lt; result_-&gt;roundTime.<a class="codeRef" href="http://en.cppreference.com/w/cpp/io/basic_istream/read.html">read</a>().count()</div>
<div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>&#160; &lt;&lt; <span class="stringliteral">&quot;ms. Previous round &quot;</span></div>
<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>&#160; <span class="stringliteral">&quot;took &quot;</span></div>
<div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>&#160; &lt;&lt; prevRoundTime_.count()</div>
<div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>&#160; &lt;&lt; <span class="stringliteral">&quot;ms. Now changing our &quot;</span></div>
<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>&#160; <span class="stringliteral">&quot;close time to &quot;</span></div>
<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>&#160; &lt;&lt; bestCloseTime.<a class="codeRef" href="http://en.cppreference.com/w/cpp/chrono/time_point/time_since_epoch.html">time_since_epoch</a>().count()</div>
<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>&#160; &lt;&lt; <span class="stringliteral">&quot; that &quot;</span></div>
<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>&#160; <span class="stringliteral">&quot;now has &quot;</span></div>
<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>&#160; &lt;&lt; *maxVote &lt;&lt; <span class="stringliteral">&quot; votes.&quot;</span>;</div>
<div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>&#160; }</div>
<div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>&#160; <span class="comment">// If the close time with the most votes also meets or exceeds the</span></div>
<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>&#160; <span class="comment">// threshold to change our position, then change our position.</span></div>
<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>&#160; <span class="comment">// Then check if we have met or exceeded the threshold for close</span></div>
<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>&#160; <span class="comment">// time consensus.</span></div>
<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160; <span class="comment">// The 2nd check has been nested within the first historically.</span></div>
<div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>&#160; <span class="comment">// It&#39;s possible that this can be optimized by doing the</span></div>
<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>&#160; <span class="comment">// 2nd check independently--this may make consensus happen faster in</span></div>
<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>&#160; <span class="comment">// some cases. Then again, the trade-offs have not been modelled.</span></div>
<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160; <span class="keywordflow">if</span> (*maxVote &gt;= threshVote)</div>
<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>&#160; {</div>
<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>&#160; consensusCloseTime = bestCloseTime;</div>
<div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;Close time &quot;</span> &lt;&lt; bestCloseTime.<a class="codeRef" href="http://en.cppreference.com/w/cpp/chrono/time_point/time_since_epoch.html">time_since_epoch</a>().count()</div>
<div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160; &lt;&lt; <span class="stringliteral">&quot; has &quot;</span> &lt;&lt; *maxVote &lt;&lt; <span class="stringliteral">&quot; votes, which is &gt;= the threshold (&quot;</span></div>
<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>&#160; &lt;&lt; threshVote</div>
<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160; &lt;&lt; <span class="stringliteral">&quot; to make that our position if it isn&#39;t already.&quot;</span>;</div>
<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>&#160; <span class="keywordflow">if</span> (*maxVote &gt;= threshConsensus)</div>
<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>&#160; {</div>
<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>&#160; haveCloseTimeConsensus_ = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot; The maximum votes also &gt;= the threshold (&quot;</span></div>
<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160; &lt;&lt; threshConsensus &lt;&lt; <span class="stringliteral">&quot;) for consensus.&quot;</span>;</div>
<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>&#160; }</div>
<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160; }</div>
<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160; </div>
<div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160; <span class="keywordflow">if</span> (!haveCloseTimeConsensus_)</div>
<div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>&#160; {</div>
<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot; No CT consensus:&quot;</span></div>
<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160; &lt;&lt; <span class="stringliteral">&quot; Proposers:&quot;</span> &lt;&lt; currPeerPositions_.size()</div>
<div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>&#160; &lt;&lt; <span class="stringliteral">&quot; Mode:&quot;</span> &lt;&lt; to_string(mode_.get())</div>
<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>&#160; &lt;&lt; <span class="stringliteral">&quot; Thresh:&quot;</span> &lt;&lt; threshConsensus</div>
<div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>&#160; &lt;&lt; <span class="stringliteral">&quot; Pos:&quot;</span> &lt;&lt; consensusCloseTime.<a class="codeRef" href="http://en.cppreference.com/w/cpp/chrono/time_point/time_since_epoch.html">time_since_epoch</a>().count();</div>
<div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>&#160; }</div>
<div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; ss.<a class="codeRef" href="http://en.cppreference.com/w/cpp/io/basic_stringstream/str.html">str</a>();</div>
<div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>&#160; }</div>
<div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>&#160; </div>
<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>&#160; mode_.set(ConsensusMode::observing, adaptor_);</div>
<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) &lt;&lt; <span class="stringliteral">&quot;Bowing out of consensus&quot;</span>;</div>
<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>&#160; }</div>
<div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>&#160;}</div>
<div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>&#160; </div>
<div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Adaptor&gt;</div>
<div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l01961"></a><span class="lineno"><a class="line" href="classripple_1_1Consensus.html#a7cb6b51c2126cd4637c0e14cf39638f4"> 1961</a></span>&#160;<a class="code" href="classripple_1_1Consensus.html">Consensus&lt;Adaptor&gt;::createDisputes</a>(<a class="code" href="classripple_1_1Consensus.html#a524b889667609917d080a6ec775ab2e4">TxSet_t</a> <span class="keyword">const</span>&amp; o)</div>
<div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>&#160;{</div>
<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>&#160; <span class="comment">// Cannot create disputes without our stance</span></div>
<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>&#160; assert(result_);</div>
<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>&#160; <span class="keywordflow">if</span> (!ourNewSet &amp;&amp;</div>
<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>&#160; ((consensusCloseTime != asCloseTime(result_-&gt;position.closeTime())) ||</div>
<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>&#160; result_-&gt;position.isStale(ourCutoff)))</div>
<div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>&#160; {</div>
<div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>&#160; <span class="comment">// close time changed or our position is stale</span></div>
<div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>&#160; ourNewSet.<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional/emplace.html">emplace</a>(result_-&gt;txns);</div>
<div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>&#160; }</div>
<div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>&#160; </div>
<div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>&#160; <span class="keywordflow">if</span> (ourNewSet)</div>
<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>&#160; {</div>
<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>&#160; <span class="keyword">auto</span> newID = ourNewSet-&gt;id();</div>
<div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>&#160; </div>
<div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>&#160; <span class="comment">// Only create disputes if this is a new set</span></div>
<div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>&#160; <span class="keywordflow">if</span> (!result_-&gt;compares.emplace(o.id()).second)</div>
<div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160; </div>
<div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>&#160; <span class="comment">// Nothing to dispute if we agree</span></div>
<div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>&#160; <span class="keywordflow">if</span> (result_-&gt;txns.id() == o.id())</div>
<div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>&#160; result_-&gt;txns = std::move(*ourNewSet);</div>
<div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>&#160; </div>
<div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) &lt;&lt; <span class="stringliteral">&quot;Position change: CTime &quot;</span></div>
<div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160; &lt;&lt; consensusCloseTime.<a class="codeRef" href="http://en.cppreference.com/w/cpp/chrono/time_point/time_since_epoch.html">time_since_epoch</a>().count()</div>
<div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>&#160; &lt;&lt; <span class="stringliteral">&quot;, tx &quot;</span> &lt;&lt; newID;</div>
<div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>&#160; </div>
<div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>&#160; result_-&gt;position.changePosition(newID, consensusCloseTime, now_);</div>
<div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>&#160; </div>
<div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;createDisputes &quot;</span> &lt;&lt; result_-&gt;txns.id() &lt;&lt; <span class="stringliteral">&quot; to &quot;</span></div>
<div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>&#160; &lt;&lt; o.id();</div>
<div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160; </div>
<div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>&#160; <span class="keyword">auto</span> differences = result_-&gt;txns.compare(o);</div>
<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>&#160; </div>
<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>&#160; <span class="keywordtype">int</span> dc = 0;</div>
<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>&#160; </div>
<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [txId, inThisSet] : differences)</div>
<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>&#160; {</div>
<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>&#160; ++dc;</div>
<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160; <span class="comment">// create disputed transactions (from the ledger that has them)</span></div>
<div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>&#160; assert(</div>
<div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160; (inThisSet &amp;&amp; result_-&gt;txns.find(txId) &amp;&amp; !o.find(txId)) ||</div>
<div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160; (!inThisSet &amp;&amp; !result_-&gt;txns.find(txId) &amp;&amp; o.find(txId)));</div>
<div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160; </div>
<div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160; <a class="code" href="classripple_1_1Consensus.html#a756a605e09b99b2a7d49a941a3055433">Tx_t</a> tx = inThisSet ? result_-&gt;txns.find(txId) : o.find(txId);</div>
<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160; <span class="keyword">auto</span> txID = tx.id();</div>
<div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160; </div>
<div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>&#160; <span class="keywordflow">if</span> (result_-&gt;disputes.find(txID) != result_-&gt;disputes.end())</div>
<div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>&#160; </div>
<div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>()) &lt;&lt; <span class="stringliteral">&quot;Transaction &quot;</span> &lt;&lt; txID &lt;&lt; <span class="stringliteral">&quot; is disputed&quot;</span>;</div>
<div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>&#160; </div>
<div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>&#160; <span class="keyword">typename</span> <a class="code" href="classripple_1_1DisputedTx.html">Result::Dispute_t</a> dtx{</div>
<div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>&#160; tx,</div>
<div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>&#160; result_-&gt;txns.exists(txID),</div>
<div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a>(prevProposers_, currPeerPositions_.size()),</div>
<div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>&#160; j_};</div>
<div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>&#160; </div>
<div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>&#160; <span class="comment">// Update all of the available peer&#39;s votes on the disputed transaction</span></div>
<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [nodeId, peerPos] : currPeerPositions_)</div>
<div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>&#160; {</div>
<div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>&#160; <a class="code" href="classripple_1_1ConsensusProposal.html">Proposal_t</a> <span class="keyword">const</span>&amp; peerProp = peerPos.proposal();</div>
<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> cit = acquired_.find(peerProp.<a class="code" href="classripple_1_1ConsensusProposal.html#a734bd07cbd45bcef6f394aba56cbf1e3">position</a>());</div>
<div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>&#160; <span class="keywordflow">if</span> (cit != acquired_.end())</div>
<div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>&#160; dtx.setVote(nodeId, cit-&gt;second.exists(txID));</div>
<div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>&#160; }</div>
<div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>&#160; adaptor_.share(dtx.tx());</div>
<div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>&#160; </div>
<div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>&#160; result_-&gt;disputes.emplace(txID, std::move(dtx));</div>
<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>&#160; }</div>
<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>()) &lt;&lt; dc &lt;&lt; <span class="stringliteral">&quot; differences found&quot;</span>;</div>
<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>&#160;}</div>
<div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>&#160; </div>
<div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Adaptor&gt;</div>
<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l02020"></a><span class="lineno"><a class="line" href="classripple_1_1Consensus.html#a4e782139b66fec214ed2b12adef662ac"> 2020</a></span>&#160;<a class="code" href="classripple_1_1Consensus.html">Consensus&lt;Adaptor&gt;::updateDisputes</a>(<a class="code" href="classripple_1_1Consensus.html#ac0595ebca5fc6577d86cb4b4dddaef3e">NodeID_t</a> <span class="keyword">const</span>&amp; node, <a class="code" href="classripple_1_1Consensus.html#a524b889667609917d080a6ec775ab2e4">TxSet_t</a> <span class="keyword">const</span>&amp; other)</div>
<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>&#160;{</div>
<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>&#160; <span class="comment">// Cannot updateDisputes without our stance</span></div>
<div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>&#160; assert(result_);</div>
<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>&#160; </div>
<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>&#160; <span class="comment">// Ensure we have created disputes against this set if we haven&#39;t seen</span></div>
<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>&#160; <span class="comment">// it before</span></div>
<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>&#160; <span class="keywordflow">if</span> (result_-&gt;compares.find(other.id()) == result_-&gt;compares.end())</div>
<div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>&#160; createDisputes(other);</div>
<div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>&#160; </div>
<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; it : result_-&gt;disputes)</div>
<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>&#160; {</div>
<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>&#160; <span class="keyword">auto</span>&amp; d = it.second;</div>
<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>&#160; d.setVote(node, other.exists(d.tx().id()));</div>
<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>&#160; }</div>
<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>&#160;}</div>
<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>&#160; </div>
<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Adaptor&gt;</div>
<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/chrono/time_point.html">NetClock::time_point</a></div>
<div class="line"><a name="l02039"></a><span class="lineno"><a class="line" href="classripple_1_1Consensus.html#a9639282cdda2fcd103490c15c08b9af7"> 2039</a></span>&#160;<a class="code" href="classripple_1_1Consensus.html">Consensus&lt;Adaptor&gt;::asCloseTime</a>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/chrono/time_point.html">NetClock::time_point</a> raw)<span class="keyword"> const</span></div>
<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#aebcad336ac983e05caf01c53d1cacde7">roundCloseTime</a>(raw, closeResolution_);</div>
<div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;}</div>
<div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160; </div>
<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>&#160;} <span class="comment">// namespace ripple</span></div>
<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160; </div>
<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>&#160; <span class="comment">// Share our new transaction set and update disputes</span></div>
<div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>&#160; <span class="comment">// if we haven&#39;t already received it. Unless we have already</span></div>
<div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160; <span class="comment">// accepted a position, but are recalculating because it didn&#39;t</span></div>
<div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>&#160; <span class="comment">// validate.</span></div>
<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>&#160; <span class="keywordflow">if</span> (acquired_.emplace(newID, result_-&gt;txns).second &amp;&amp; share)</div>
<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>&#160; {</div>
<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>&#160; <span class="keywordflow">if</span> (!result_-&gt;position.isBowOut())</div>
<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>&#160; adaptor_.share(result_-&gt;txns);</div>
<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>&#160; </div>
<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [nodeId, peerPos] : currPeerPositions_)</div>
<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160; {</div>
<div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>&#160; <a class="code" href="classripple_1_1ConsensusProposal.html">Proposal_t</a> <span class="keyword">const</span>&amp; p = peerPos.proposal();</div>
<div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160; <span class="keywordflow">if</span> (p.<a class="code" href="classripple_1_1ConsensusProposal.html#a734bd07cbd45bcef6f394aba56cbf1e3">position</a>() == newID)</div>
<div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160; updateDisputes(nodeId, result_-&gt;txns);</div>
<div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160; }</div>
<div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160; }</div>
<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160; </div>
<div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160; <span class="comment">// Share our new position if we are still participating this round,</span></div>
<div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>&#160; <span class="comment">// unless we have already accepted a position but are recalculating</span></div>
<div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>&#160; <span class="comment">// because it didn&#39;t validate.</span></div>
<div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>&#160; <span class="keywordflow">if</span> (!result_-&gt;position.isBowOut() &amp;&amp;</div>
<div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>&#160; (mode_.get() == ConsensusMode::proposing) &amp;&amp; share)</div>
<div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>&#160; adaptor_.propose(result_-&gt;position);</div>
<div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>&#160; }</div>
<div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>&#160;}</div>
<div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>&#160; </div>
<div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Adaptor&gt;</div>
<div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l02002"></a><span class="lineno"><a class="line" href="classripple_1_1Consensus.html#a498092766e111e7e2ac715d572318a27"> 2002</a></span>&#160;<a class="code" href="classripple_1_1Consensus.html">Consensus&lt;Adaptor&gt;::haveConsensus</a>()</div>
<div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>&#160;{</div>
<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>&#160; <span class="comment">// Must have a stance if we are checking for consensus</span></div>
<div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>&#160; assert(result_);</div>
<div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>&#160; </div>
<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>&#160; <span class="comment">// CHECKME: should possibly count unacquired TX sets as disagreeing</span></div>
<div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>&#160; <span class="keywordtype">int</span> agree = 0, disagree = 0;</div>
<div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>&#160; </div>
<div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>&#160; <span class="keyword">auto</span> ourPosition = result_-&gt;position.position();</div>
<div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>&#160; </div>
<div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>&#160; <span class="comment">// Count number of agreements/disagreements with our position</span></div>
<div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [nodeId, peerPos] : currPeerPositions_)</div>
<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>&#160; {</div>
<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>&#160; <a class="code" href="classripple_1_1ConsensusProposal.html">Proposal_t</a> <span class="keyword">const</span>&amp; peerProp = peerPos.proposal();</div>
<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>&#160; <span class="keywordflow">if</span> (peerProp.<a class="code" href="classripple_1_1ConsensusProposal.html#a734bd07cbd45bcef6f394aba56cbf1e3">position</a>() == ourPosition)</div>
<div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>&#160; ++agree;</div>
<div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>&#160; ++disagree;</div>
<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>&#160; }</div>
<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>&#160; <span class="keyword">auto</span> currentFinished =</div>
<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>&#160; adaptor_.proposersFinished(previousLedger_, prevLedgerID_);</div>
<div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>&#160; </div>
<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Checking for TX consensus: agree=&quot;</span> &lt;&lt; agree</div>
<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>&#160; &lt;&lt; <span class="stringliteral">&quot;, disagree=&quot;</span> &lt;&lt; disagree;</div>
<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>&#160; </div>
<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>&#160; <span class="comment">// Determine if we actually have consensus or not</span></div>
<div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>&#160; result_-&gt;state = <a class="code" href="namespaceripple.html#a2e640e92bd561e94c1800ea388975d94">checkConsensus</a>(</div>
<div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>&#160; prevProposers_,</div>
<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>&#160; agree + disagree,</div>
<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>&#160; agree,</div>
<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>&#160; currentFinished,</div>
<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>&#160; prevRoundTime_,</div>
<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>&#160; result_-&gt;roundTime.read(),</div>
<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>&#160; adaptor_.parms(),</div>
<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>&#160; mode_.get() == ConsensusMode::proposing,</div>
<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>&#160; j_);</div>
<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>&#160; </div>
<div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>&#160; <span class="keywordflow">if</span> (result_-&gt;state == ConsensusState::No)</div>
<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160; </div>
<div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160; <span class="comment">// There is consensus, but we need to track if the network moved on</span></div>
<div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160; <span class="comment">// without us.</span></div>
<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>&#160; <span class="keywordflow">if</span> (result_-&gt;state == ConsensusState::MovedOn)</div>
<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160; {</div>
<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) &lt;&lt; <span class="stringliteral">&quot;Unable to reach consensus MovedOn: &quot;</span></div>
<div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160; &lt;&lt; <a class="code" href="classJson_1_1Compact.html">Json::Compact</a>{<a class="code" href="namespaceripple.html#ad30131b5a5b7cf60d9b392ab868b8c0e">getJson</a>(<span class="keyword">true</span>)};</div>
<div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>&#160; }</div>
<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>&#160; </div>
<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>&#160;}</div>
<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>&#160; </div>
<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Adaptor&gt;</div>
<div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l02055"></a><span class="lineno"><a class="line" href="classripple_1_1Consensus.html#a8910d52e827ffa8f0a5f2418855d596d"> 2055</a></span>&#160;<a class="code" href="classripple_1_1Consensus.html">Consensus&lt;Adaptor&gt;::leaveConsensus</a>()</div>
<div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>&#160;{</div>
<div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>&#160; <span class="keywordflow">if</span> (mode_.get() == ConsensusMode::proposing)</div>
<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160; {</div>
<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160; <span class="keywordflow">if</span> (result_ &amp;&amp; !result_-&gt;position.isBowOut())</div>
<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160; {</div>
<div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>&#160; result_-&gt;position.bowOut(now_);</div>
<div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>&#160; adaptor_.propose(result_-&gt;position);</div>
<div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>&#160; }</div>
<div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>&#160; </div>
<div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>&#160; mode_.set(ConsensusMode::observing, adaptor_);</div>
<div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) &lt;&lt; <span class="stringliteral">&quot;Bowing out of consensus&quot;</span>;</div>
<div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>&#160; }</div>
<div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>&#160;}</div>
<div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>&#160; </div>
<div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Adaptor&gt;</div>
<div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l02072"></a><span class="lineno"><a class="line" href="classripple_1_1Consensus.html#a7cb6b51c2126cd4637c0e14cf39638f4"> 2072</a></span>&#160;<a class="code" href="classripple_1_1Consensus.html">Consensus&lt;Adaptor&gt;::createDisputes</a>(<a class="code" href="classripple_1_1Consensus.html#a524b889667609917d080a6ec775ab2e4">TxSet_t</a> <span class="keyword">const</span>&amp; o)</div>
<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>&#160;{</div>
<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>&#160; <span class="comment">// Cannot create disputes without our stance</span></div>
<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>&#160; assert(result_);</div>
<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>&#160; </div>
<div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>&#160; <span class="comment">// Only create disputes if this is a new set</span></div>
<div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>&#160; <span class="keywordflow">if</span> (!result_-&gt;compares.emplace(o.id()).second)</div>
<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>&#160; </div>
<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>&#160; <span class="comment">// Nothing to dispute if we agree</span></div>
<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>&#160; <span class="keywordflow">if</span> (result_-&gt;txns.id() == o.id())</div>
<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160; </div>
<div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;createDisputes &quot;</span> &lt;&lt; result_-&gt;txns.id() &lt;&lt; <span class="stringliteral">&quot; to &quot;</span></div>
<div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>&#160; &lt;&lt; o.id();</div>
<div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>&#160; </div>
<div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>&#160; <span class="keyword">auto</span> differences = result_-&gt;txns.compare(o);</div>
<div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>&#160; </div>
<div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>&#160; <span class="keywordtype">int</span> dc = 0;</div>
<div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>&#160; </div>
<div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [txId, inThisSet] : differences)</div>
<div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>&#160; {</div>
<div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>&#160; ++dc;</div>
<div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>&#160; <span class="comment">// create disputed transactions (from the ledger that has them)</span></div>
<div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>&#160; assert(</div>
<div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>&#160; (inThisSet &amp;&amp; result_-&gt;txns.find(txId) &amp;&amp; !o.find(txId)) ||</div>
<div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>&#160; (!inThisSet &amp;&amp; !result_-&gt;txns.find(txId) &amp;&amp; o.find(txId)));</div>
<div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>&#160; </div>
<div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>&#160; <a class="code" href="classripple_1_1Consensus.html#a756a605e09b99b2a7d49a941a3055433">Tx_t</a> tx = inThisSet ? result_-&gt;txns.find(txId) : o.find(txId);</div>
<div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>&#160; <span class="keyword">auto</span> txID = tx.id();</div>
<div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>&#160; </div>
<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>&#160; <span class="keywordflow">if</span> (result_-&gt;disputes.find(txID) != result_-&gt;disputes.end())</div>
<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>&#160; </div>
<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>()) &lt;&lt; <span class="stringliteral">&quot;Transaction &quot;</span> &lt;&lt; txID &lt;&lt; <span class="stringliteral">&quot; is disputed&quot;</span>;</div>
<div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>&#160; </div>
<div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>&#160; <span class="keyword">typename</span> <a class="code" href="classripple_1_1DisputedTx.html">Result::Dispute_t</a> dtx{</div>
<div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>&#160; tx,</div>
<div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>&#160; result_-&gt;txns.exists(txID),</div>
<div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a>(prevProposers_, currPeerPositions_.size()),</div>
<div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>&#160; j_};</div>
<div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>&#160; </div>
<div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>&#160; <span class="comment">// Update all of the available peer&#39;s votes on the disputed transaction</span></div>
<div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [nodeId, peerPos] : currPeerPositions_)</div>
<div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>&#160; {</div>
<div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>&#160; <a class="code" href="classripple_1_1ConsensusProposal.html">Proposal_t</a> <span class="keyword">const</span>&amp; peerProp = peerPos.proposal();</div>
<div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> cit = acquired_.find(peerProp.<a class="code" href="classripple_1_1ConsensusProposal.html#a734bd07cbd45bcef6f394aba56cbf1e3">position</a>());</div>
<div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>&#160; <span class="keywordflow">if</span> (cit != acquired_.end())</div>
<div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>&#160; dtx.setVote(nodeId, cit-&gt;second.exists(txID));</div>
<div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>&#160; }</div>
<div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>&#160; adaptor_.share(dtx.tx());</div>
<div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>&#160; </div>
<div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>&#160; result_-&gt;disputes.emplace(txID, std::move(dtx));</div>
<div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>&#160; }</div>
<div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>()) &lt;&lt; dc &lt;&lt; <span class="stringliteral">&quot; differences found&quot;</span>;</div>
<div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>&#160;}</div>
<div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>&#160; </div>
<div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Adaptor&gt;</div>
<div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l02131"></a><span class="lineno"><a class="line" href="classripple_1_1Consensus.html#a4e782139b66fec214ed2b12adef662ac"> 2131</a></span>&#160;<a class="code" href="classripple_1_1Consensus.html">Consensus&lt;Adaptor&gt;::updateDisputes</a>(<a class="code" href="classripple_1_1Consensus.html#ac0595ebca5fc6577d86cb4b4dddaef3e">NodeID_t</a> <span class="keyword">const</span>&amp; node, <a class="code" href="classripple_1_1Consensus.html#a524b889667609917d080a6ec775ab2e4">TxSet_t</a> <span class="keyword">const</span>&amp; other)</div>
<div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>&#160;{</div>
<div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>&#160; <span class="comment">// Cannot updateDisputes without our stance</span></div>
<div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>&#160; assert(result_);</div>
<div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>&#160; </div>
<div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>&#160; <span class="comment">// Ensure we have created disputes against this set if we haven&#39;t seen</span></div>
<div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>&#160; <span class="comment">// it before</span></div>
<div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>&#160; <span class="keywordflow">if</span> (result_-&gt;compares.find(other.id()) == result_-&gt;compares.end())</div>
<div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>&#160; createDisputes(other);</div>
<div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>&#160; </div>
<div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; it : result_-&gt;disputes)</div>
<div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>&#160; {</div>
<div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>&#160; <span class="keyword">auto</span>&amp; d = it.second;</div>
<div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>&#160; d.setVote(node, other.exists(d.tx().id()));</div>
<div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>&#160; }</div>
<div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>&#160;}</div>
<div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>&#160; </div>
<div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Adaptor&gt;</div>
<div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/chrono/time_point.html">NetClock::time_point</a></div>
<div class="line"><a name="l02150"></a><span class="lineno"><a class="line" href="classripple_1_1Consensus.html#a9639282cdda2fcd103490c15c08b9af7"> 2150</a></span>&#160;<a class="code" href="classripple_1_1Consensus.html">Consensus&lt;Adaptor&gt;::asCloseTime</a>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/chrono/time_point.html">NetClock::time_point</a> raw)<span class="keyword"> const</span></div>
<div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#aebcad336ac983e05caf01c53d1cacde7">roundCloseTime</a>(raw, closeResolution_);</div>
<div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>&#160;}</div>
<div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>&#160; </div>
<div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>&#160;} <span class="comment">// namespace ripple</span></div>
<div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>&#160; </div>
<div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>&#160;<span class="preprocessor">#endif</span></div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="astructripple_1_1ConsensusParms_html_ab293aad447acb327c2d38c91e71084c4"><div class="ttname"><a href="structripple_1_1ConsensusParms.html#ab293aad447acb327c2d38c91e71084c4">ripple::ConsensusParms::avCT_CONSENSUS_PCT</a></div><div class="ttdeci">std::size_t avCT_CONSENSUS_PCT</div><div class="ttdoc">Percentage of nodes required to reach agreement on ledger close time.</div><div class="ttdef"><b>Definition:</b> <a href="ConsensusParms_8h_source.html#l00145">ConsensusParms.h:145</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_aae5fc7132fb1d6d53a7ca5aab74cd49c"><div class="ttname"><a href="classJson_1_1Value.html#aae5fc7132fb1d6d53a7ca5aab74cd49c">Json::Value::Int</a></div><div class="ttdeci">Json::Int Int</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8h_source.html#l00154">json_value.h:154</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_afddcd72ee9347a65b160636404308df9"><div class="ttname"><a href="classripple_1_1Consensus.html#afddcd72ee9347a65b160636404308df9">ripple::Consensus::deadNodes_</a></div><div class="ttdeci">hash_set&lt; NodeID_t &gt; deadNodes_</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l00653">Consensus.h:653</a></div></div>
<div class="ttc" id="anamespaceripple_html_a2e640e92bd561e94c1800ea388975d94"><div class="ttname"><a href="namespaceripple.html#a2e640e92bd561e94c1800ea388975d94">ripple::checkConsensus</a></div><div class="ttdeci">ConsensusState checkConsensus(std::size_t prevProposers, std::size_t currentProposers, std::size_t currentAgree, std::size_t currentFinished, std::chrono::milliseconds previousAgreeTime, std::chrono::milliseconds currentAgreeTime, ConsensusParms const &amp;parms, bool proposing, beast::Journal j)</div><div class="ttdoc">Determine whether the network reached consensus and whether we joined.</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8cpp_source.html#l00115">Consensus.cpp:115</a></div></div>
<div class="ttc" id="asstream_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/sstream.html">sstream</a></div></div>
<div class="ttc" id="aoperator_bool_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/optional/operator_bool.html">std::optional::has_value</a></div><div class="ttdeci">T has_value(T... args)</div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_aa918eecfee1d4f424a17a7e8b6211cc1"><div class="ttname"><a href="classripple_1_1Consensus.html#aa918eecfee1d4f424a17a7e8b6211cc1">ripple::Consensus::checkLedger</a></div><div class="ttdeci">void checkLedger()</div><div class="ttdoc">Check if our previous ledger matches the network's.</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l01213">Consensus.h:1213</a></div></div>
<div class="ttc" id="anamespaceripple_html_a79cc3b590c118bd551b693bb333fb9d1"><div class="ttname"><a href="namespaceripple.html#a79cc3b590c118bd551b693bb333fb9d1">ripple::ConsensusState</a></div><div class="ttdeci">ConsensusState</div><div class="ttdoc">Whether we have or don't have a consensus.</div><div class="ttdef"><b>Definition:</b> <a href="ConsensusTypes_8h_source.html#l00185">ConsensusTypes.h:185</a></div></div>
<div class="ttc" id="alock_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/thread/lock.html">std::lock</a></div><div class="ttdeci">T lock(T... args)</div></div>
@@ -1725,9 +1837,9 @@ $(function() {
<div class="ttc" id="anamespaceripple_html_a33f8b6e68b5f63faf2e9755cc251563ea80dcf57f5ecd4be3cbfa37eccbcb6f44"><div class="ttname"><a href="namespaceripple.html#a33f8b6e68b5f63faf2e9755cc251563ea80dcf57f5ecd4be3cbfa37eccbcb6f44">ripple::ConsensusMode::proposing</a></div><div class="ttdeci">@ proposing</div><div class="ttdoc">We are normal participant in consensus and propose our position.</div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_afa98029589f3d8025211f44f70484b3e"><div class="ttname"><a href="classripple_1_1Consensus.html#afa98029589f3d8025211f44f70484b3e">ripple::Consensus::result_</a></div><div class="ttdeci">std::optional&lt; Result &gt; result_</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l00626">Consensus.h:626</a></div></div>
<div class="ttc" id="aclassripple_1_1ConsensusTimer_html"><div class="ttname"><a href="classripple_1_1ConsensusTimer.html">ripple::ConsensusTimer</a></div><div class="ttdoc">Measures the duration of phases of consensus.</div><div class="ttdef"><b>Definition:</b> <a href="ConsensusTypes_8h_source.html#l00133">ConsensusTypes.h:133</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_a9639282cdda2fcd103490c15c08b9af7"><div class="ttname"><a href="classripple_1_1Consensus.html#a9639282cdda2fcd103490c15c08b9af7">ripple::Consensus::asCloseTime</a></div><div class="ttdeci">NetClock::time_point asCloseTime(NetClock::time_point raw) const</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l02039">Consensus.h:2039</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_a9639282cdda2fcd103490c15c08b9af7"><div class="ttname"><a href="classripple_1_1Consensus.html#a9639282cdda2fcd103490c15c08b9af7">ripple::Consensus::asCloseTime</a></div><div class="ttdeci">NetClock::time_point asCloseTime(NetClock::time_point raw) const</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l02150">Consensus.h:2150</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_abbe082bd27ca0f1d1365af2824e4f85b"><div class="ttname"><a href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">beast::Journal::trace</a></div><div class="ttdeci">Stream trace() const</div><div class="ttdoc">Severity stream access functions.</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00308">Journal.h:308</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_a7cb6b51c2126cd4637c0e14cf39638f4"><div class="ttname"><a href="classripple_1_1Consensus.html#a7cb6b51c2126cd4637c0e14cf39638f4">ripple::Consensus::createDisputes</a></div><div class="ttdeci">void createDisputes(TxSet_t const &amp;o)</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l01961">Consensus.h:1961</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_a7cb6b51c2126cd4637c0e14cf39638f4"><div class="ttname"><a href="classripple_1_1Consensus.html#a7cb6b51c2126cd4637c0e14cf39638f4">ripple::Consensus::createDisputes</a></div><div class="ttdeci">void createDisputes(TxSet_t const &amp;o)</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l02072">Consensus.h:2072</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_a91c38c78ada592aae6c3b8b67085c6e4"><div class="ttname"><a href="classripple_1_1Consensus.html#a91c38c78ada592aae6c3b8b67085c6e4">ripple::Consensus::handleWrongLedger</a></div><div class="ttdeci">void handleWrongLedger(typename Ledger_t::ID const &amp;lgrId)</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l01157">Consensus.h:1157</a></div></div>
<div class="ttc" id="astructripple_1_1ConsensusParms_html_afd06939a6c18d834a0e35c537390b863"><div class="ttname"><a href="structripple_1_1ConsensusParms.html#afd06939a6c18d834a0e35c537390b863">ripple::ConsensusParms::avMID_CONSENSUS_TIME</a></div><div class="ttdeci">std::size_t avMID_CONSENSUS_TIME</div><div class="ttdoc">Percentage of previous round duration before we advance.</div><div class="ttdef"><b>Definition:</b> <a href="ConsensusParms_8h_source.html#l00127">ConsensusParms.h:127</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_ac277e949a79266c8073af837324d4f07"><div class="ttname"><a href="classripple_1_1Consensus.html#ac277e949a79266c8073af837324d4f07">ripple::Consensus::closeResolution_</a></div><div class="ttdeci">NetClock::duration closeResolution_</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l00594">Consensus.h:594</a></div></div>
@@ -1751,7 +1863,7 @@ $(function() {
<div class="ttc" id="aemplace_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/optional/emplace.html">std::optional::emplace</a></div><div class="ttdeci">T emplace(T... args)</div></div>
<div class="ttc" id="abasic_stringstream_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/io/basic_stringstream.html">std::stringstream</a></div><div class="ttdoc">STL class.</div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_ad8fefe3e8ad583e1ed1bf02094ac3d8f"><div class="ttname"><a href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">beast::Journal::warn</a></div><div class="ttdeci">Stream warn() const</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00326">Journal.h:326</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_a8910d52e827ffa8f0a5f2418855d596d"><div class="ttname"><a href="classripple_1_1Consensus.html#a8910d52e827ffa8f0a5f2418855d596d">ripple::Consensus::leaveConsensus</a></div><div class="ttdeci">void leaveConsensus()</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l01944">Consensus.h:1944</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_a8910d52e827ffa8f0a5f2418855d596d"><div class="ttname"><a href="classripple_1_1Consensus.html#a8910d52e827ffa8f0a5f2418855d596d">ripple::Consensus::leaveConsensus</a></div><div class="ttdeci">void leaveConsensus()</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l02055">Consensus.h:2055</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_a663db7293df51bbf460073cd22be7c50"><div class="ttname"><a href="classripple_1_1Consensus.html#a663db7293df51bbf460073cd22be7c50">ripple::Consensus::recentPeerPositionsLegacy_</a></div><div class="ttdeci">hash_map&lt; NodeID_t, std::deque&lt; PeerPosition_t &gt; &gt; recentPeerPositionsLegacy_</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l00647">Consensus.h:647</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_ab3d8f48bde5fac064433c5fb02187ec4"><div class="ttname"><a href="classripple_1_1Consensus.html#ab3d8f48bde5fac064433c5fb02187ec4">ripple::Consensus::phase</a></div><div class="ttdeci">ConsensusPhase phase() const</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l00449">Consensus.h:449</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_a0e680e53d4bb507d9d2c69f6ee1d65b8"><div class="ttname"><a href="classripple_1_1Consensus.html#a0e680e53d4bb507d9d2c69f6ee1d65b8">ripple::Consensus::j_</a></div><div class="ttdeci">const beast::Journal j_</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l00656">Consensus.h:656</a></div></div>
@@ -1792,7 +1904,7 @@ $(function() {
<div class="ttc" id="aclassbeast_1_1Journal_html_a49b0713e65bb8e2c51b76fbf16252afe"><div class="ttname"><a href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">beast::Journal::error</a></div><div class="ttdeci">Stream error() const</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00332">Journal.h:332</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_a87d6bd59020d94110027dcab3d9e3357"><div class="ttname"><a href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">beast::Journal::info</a></div><div class="ttdeci">Stream info() const</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00320">Journal.h:320</a></div></div>
<div class="ttc" id="atime_point_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/chrono/time_point.html">std::chrono::time_point</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_a4e782139b66fec214ed2b12adef662ac"><div class="ttname"><a href="classripple_1_1Consensus.html#a4e782139b66fec214ed2b12adef662ac">ripple::Consensus::updateDisputes</a></div><div class="ttdeci">void updateDisputes(NodeID_t const &amp;node, TxSet_t const &amp;other)</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l02020">Consensus.h:2020</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_a4e782139b66fec214ed2b12adef662ac"><div class="ttname"><a href="classripple_1_1Consensus.html#a4e782139b66fec214ed2b12adef662ac">ripple::Consensus::updateDisputes</a></div><div class="ttdeci">void updateDisputes(NodeID_t const &amp;node, TxSet_t const &amp;other)</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l02131">Consensus.h:2131</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_ac0595ebca5fc6577d86cb4b4dddaef3e"><div class="ttname"><a href="classripple_1_1Consensus.html#ac0595ebca5fc6577d86cb4b4dddaef3e">ripple::Consensus&lt; ripple::test::csf::Peer &gt;::NodeID_t</a></div><div class="ttdeci">typename ripple::test::csf::Peer ::NodeID_t NodeID_t</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l00318">Consensus.h:318</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_aff1c99a173d5d811e14738a48ffe7f74"><div class="ttname"><a href="classripple_1_1Consensus.html#aff1c99a173d5d811e14738a48ffe7f74">ripple::Consensus::haveCloseTimeConsensus_</a></div><div class="ttdeci">bool haveCloseTimeConsensus_</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l00583">Consensus.h:583</a></div></div>
<div class="ttc" id="adeque_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/deque.html">deque</a></div></div>
@@ -1809,6 +1921,7 @@ $(function() {
<div class="ttc" id="aclassbeast_1_1abstract__clock_html"><div class="ttname"><a href="classbeast_1_1abstract__clock.html">beast::abstract_clock&lt; std::chrono::steady_clock &gt;</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_abd84b31f54fb4fa5d27475a1f9df86ee"><div class="ttname"><a href="classripple_1_1Consensus.html#abd84b31f54fb4fa5d27475a1f9df86ee">ripple::Consensus::phaseEstablish</a></div><div class="ttdeci">void phaseEstablish()</div><div class="ttdoc">Handle establish phase.</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l01445">Consensus.h:1445</a></div></div>
<div class="ttc" id="aadvance_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/iterator/advance.html">std::advance</a></div><div class="ttdeci">T advance(T... args)</div></div>
<div class="ttc" id="arend_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/multimap/rend.html">std::multimap::crend</a></div><div class="ttdeci">T crend(T... args)</div></div>
<div class="ttc" id="amin_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/min.html">std::min</a></div><div class="ttdeci">T min(T... args)</div></div>
<div class="ttc" id="anamespaceripple_html_ad30131b5a5b7cf60d9b392ab868b8c0e"><div class="ttname"><a href="namespaceripple.html#ad30131b5a5b7cf60d9b392ab868b8c0e">ripple::getJson</a></div><div class="ttdeci">Json::Value getJson(LedgerFill const &amp;fill)</div><div class="ttdoc">Return a new Json::Value representing the ledger with given options.</div><div class="ttdef"><b>Definition:</b> <a href="LedgerToJson_8cpp_source.html#l00340">LedgerToJson.cpp:340</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_1_1MonitoredMode_html_ac539b5917463521b680d9a4a81008725"><div class="ttname"><a href="classripple_1_1Consensus_1_1MonitoredMode.html#ac539b5917463521b680d9a4a81008725">ripple::Consensus::MonitoredMode::get</a></div><div class="ttdeci">ConsensusMode get() const</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l00340">Consensus.h:340</a></div></div>
@@ -1827,6 +1940,7 @@ $(function() {
<div class="ttc" id="astructripple_1_1ConsensusParms_html_ad02cd693fc6dffda8c60be0ca778d00b"><div class="ttname"><a href="structripple_1_1ConsensusParms.html#ad02cd693fc6dffda8c60be0ca778d00b">ripple::ConsensusParms::avSTUCK_CONSENSUS_TIME</a></div><div class="ttdeci">std::size_t avSTUCK_CONSENSUS_TIME</div><div class="ttdoc">Percentage of previous round duration before we are stuck.</div><div class="ttdef"><b>Definition:</b> <a href="ConsensusParms_8h_source.html#l00139">ConsensusParms.h:139</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_afe9ffe7340cdb8c89133cb8e9c362996"><div class="ttname"><a href="classripple_1_1Consensus.html#afe9ffe7340cdb8c89133cb8e9c362996">ripple::Consensus::prevLedgerID_</a></div><div class="ttdeci">Ledger_t::ID prevLedgerID_</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l00611">Consensus.h:611</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_a24fad80b40d58dac52455f01b3d2e43a"><div class="ttname"><a href="classripple_1_1Consensus.html#a24fad80b40d58dac52455f01b3d2e43a">ripple::Consensus::openTime_</a></div><div class="ttdeci">ConsensusTimer openTime_</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l00592">Consensus.h:592</a></div></div>
<div class="ttc" id="amultimap_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/multimap.html">std::multimap</a></div><div class="ttdoc">STL class.</div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_ac847edb496ffd3e8cecf636c56ccb0b0"><div class="ttname"><a href="classripple_1_1Consensus.html#ac847edb496ffd3e8cecf636c56ccb0b0">ripple::Consensus::peerProposal</a></div><div class="ttdeci">bool peerProposal(NetClock::time_point const &amp;now, PeerPosition_t const &amp;newProposal)</div><div class="ttdoc">A peer has proposed a new position, adjust our tracking.</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l00789">Consensus.h:789</a></div></div>
<div class="ttc" id="aoptional_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/optional.html">optional</a></div></div>
<div class="ttc" id="astr_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/io/basic_stringstream/str.html">std::stringstream::str</a></div><div class="ttdeci">T str(T... args)</div></div>
@@ -1836,7 +1950,7 @@ $(function() {
<div class="ttc" id="astructripple_1_1ConsensusParms_html_a755e41d0905719463a7964d728b1d435"><div class="ttname"><a href="structripple_1_1ConsensusParms.html#a755e41d0905719463a7964d728b1d435">ripple::ConsensusParms::avLATE_CONSENSUS_TIME</a></div><div class="ttdeci">std::size_t avLATE_CONSENSUS_TIME</div><div class="ttdoc">Percentage of previous round duration before we advance.</div><div class="ttdef"><b>Definition:</b> <a href="ConsensusParms_8h_source.html#l00133">ConsensusParms.h:133</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_a524b889667609917d080a6ec775ab2e4"><div class="ttname"><a href="classripple_1_1Consensus.html#a524b889667609917d080a6ec775ab2e4">ripple::Consensus&lt; ripple::test::csf::Peer &gt;::TxSet_t</a></div><div class="ttdeci">typename ripple::test::csf::Peer ::TxSet_t TxSet_t</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l00317">Consensus.h:317</a></div></div>
<div class="ttc" id="astructbeast_1_1uhash_html"><div class="ttname"><a href="structbeast_1_1uhash.html">beast::uhash&lt;&gt;</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_a498092766e111e7e2ac715d572318a27"><div class="ttname"><a href="classripple_1_1Consensus.html#a498092766e111e7e2ac715d572318a27">ripple::Consensus::haveConsensus</a></div><div class="ttdeci">bool haveConsensus()</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l01891">Consensus.h:1891</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_a498092766e111e7e2ac715d572318a27"><div class="ttname"><a href="classripple_1_1Consensus.html#a498092766e111e7e2ac715d572318a27">ripple::Consensus::haveConsensus</a></div><div class="ttdeci">bool haveConsensus()</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l02002">Consensus.h:2002</a></div></div>
<div class="ttc" id="amax_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a></div><div class="ttdeci">T max(T... args)</div></div>
<div class="ttc" id="anamespaceripple_html_a769291ba9f7a5f5ba7a389c395e83a3c"><div class="ttname"><a href="namespaceripple.html#a769291ba9f7a5f5ba7a389c395e83a3c">ripple::getNextLedgerTimeResolution</a></div><div class="ttdeci">std::chrono::duration&lt; Rep, Period &gt; getNextLedgerTimeResolution(std::chrono::duration&lt; Rep, Period &gt; previousResolution, bool previousAgree, Seq ledgerSeq)</div><div class="ttdoc">Calculates the close time resolution for the specified ledger.</div><div class="ttdef"><b>Definition:</b> <a href="LedgerTiming_8h_source.html#l00080">LedgerTiming.h:80</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_a4598700d99a01a00a32535173117ae12"><div class="ttname"><a href="classripple_1_1Consensus.html#a4598700d99a01a00a32535173117ae12">ripple::Consensus::closeLedger</a></div><div class="ttdeci">void closeLedger()</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l01617">Consensus.h:1617</a></div></div>
@@ -1849,6 +1963,7 @@ $(function() {
<div class="ttc" id="astructripple_1_1ConsensusParms_html_a21638a3d3caa47a696b645f8e6f007d6"><div class="ttname"><a href="structripple_1_1ConsensusParms.html#a21638a3d3caa47a696b645f8e6f007d6">ripple::ConsensusParms::avMIN_CONSENSUS_TIME</a></div><div class="ttdeci">std::chrono::milliseconds avMIN_CONSENSUS_TIME</div><div class="ttdoc">The minimum amount of time to consider the previous round to have taken.</div><div class="ttdef"><b>Definition:</b> <a href="ConsensusParms_8h_source.html#l00115">ConsensusParms.h:115</a></div></div>
<div class="ttc" id="aunordered_map_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/unordered_map.html">std::unordered_map</a></div><div class="ttdoc">STL class.</div></div>
<div class="ttc" id="anamespaceripple_html_a216564c8f7b3d3c62ceb75d04097a8c3"><div class="ttname"><a href="namespaceripple.html#a216564c8f7b3d3c62ceb75d04097a8c3">ripple::shouldCloseLedger</a></div><div class="ttdeci">bool shouldCloseLedger(bool anyTransactions, std::size_t prevProposers, std::size_t proposersClosed, std::size_t proposersValidated, std::chrono::milliseconds prevRoundTime, std::chrono::milliseconds timeSincePrevClose, std::chrono::milliseconds openTime, std::optional&lt; std::chrono::milliseconds &gt; validationDelay, std::chrono::milliseconds idleInterval, ConsensusParms const &amp;parms, beast::Journal j)</div><div class="ttdoc">Determines whether the current ledger should close at this time.</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8cpp_source.html#l00026">Consensus.cpp:26</a></div></div>
<div class="ttc" id="aset_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/set.html">std::set</a></div><div class="ttdoc">STL class.</div></div>
<div class="ttc" id="anamespaceripple_html_aeb66127505ef68a84f565f5a84927229"><div class="ttname"><a href="namespaceripple.html#aeb66127505ef68a84f565f5a84927229">ripple::participantsNeeded</a></div><div class="ttdeci">int participantsNeeded(int participants, int percent)</div><div class="ttdoc">How many of the participants must agree to reach a given threshold?</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l01663">Consensus.h:1663</a></div></div>
<div class="ttc" id="aclassripple_1_1Consensus_html_ae860970b8a78fda5497221c1a8bf1b98"><div class="ttname"><a href="classripple_1_1Consensus.html#ae860970b8a78fda5497221c1a8bf1b98">ripple::Consensus::startRound</a></div><div class="ttdeci">void startRound(NetClock::time_point const &amp;now, typename Ledger_t::ID const &amp;prevLedgerID, Ledger_t prevLedger, hash_set&lt; NodeID_t &gt; const &amp;nowUntrusted, bool proposing)</div><div class="ttdoc">Kick-off the next round of consensus.</div><div class="ttdef"><b>Definition:</b> <a href="Consensus_8h_source.html#l00671">Consensus.h:671</a></div></div>
<div class="ttc" id="arbegin_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/multiset/rbegin.html">std::multiset::rbegin</a></div><div class="ttdeci">T rbegin(T... args)</div></div>