mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-26 22:15:52 +00:00
deploy: 8ce85a9750
This commit is contained in:
@@ -1425,297 +1425,409 @@ $(function() {
|
||||
<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>  <span class="keywordflow">else</span></div>
|
||||
<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>  {</div>
|
||||
<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>  <span class="keywordtype">int</span> neededWeight;</div>
|
||||
<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>  </div>
|
||||
<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>  <span class="keywordflow">if</span> (convergePercent_ < 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>  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>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (convergePercent_ < 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>  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>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (convergePercent_ < 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>  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>  <span class="keywordflow">else</span></div>
|
||||
<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>  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>  </div>
|
||||
<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>  <span class="keywordtype">int</span> participants = currPeerPositions_.size();</div>
|
||||
<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>  <span class="keywordflow">if</span> (mode_.get() == ConsensusMode::proposing)</div>
|
||||
<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>  {</div>
|
||||
<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>  ++closeTimeVotes[asCloseTime(result_->position.closeTime())];</div>
|
||||
<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>  ++participants;</div>
|
||||
<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>  <span class="comment">// It'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>  <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>  <span class="keywordtype">bool</span> stuck = <span class="keyword">false</span>;</div>
|
||||
<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>  </div>
|
||||
<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>  <span class="keywordflow">if</span> (convergePercent_ < 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>  {</div>
|
||||
<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>  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>  }</div>
|
||||
<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (convergePercent_ < 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>  {</div>
|
||||
<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>  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>  }</div>
|
||||
<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (convergePercent_ < 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>  {</div>
|
||||
<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>  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>  }</div>
|
||||
<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>  </div>
|
||||
<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>  <span class="comment">// Threshold for non-zero vote</span></div>
|
||||
<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>  <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>  </div>
|
||||
<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>  <span class="comment">// Threshold to declare consensus</span></div>
|
||||
<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>  <span class="keywordtype">int</span> <span class="keyword">const</span> threshConsensus =</div>
|
||||
<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>  <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>  </div>
|
||||
<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) << <span class="stringliteral">"Proposers:"</span> << currPeerPositions_.size()</div>
|
||||
<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>  << <span class="stringliteral">" nw:"</span> << neededWeight << <span class="stringliteral">" thrV:"</span> << threshVote</div>
|
||||
<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>  << <span class="stringliteral">" thrC:"</span> << threshConsensus;</div>
|
||||
<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>  </div>
|
||||
<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>  <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>  <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>  <span class="comment">// for close time t1, and 2 with t2. That's an impasse because</span></div>
|
||||
<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>  <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>  <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>  <span class="comment">// to break the impasse. It's also OK for those agreeing</span></div>
|
||||
<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>  <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>  <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>  <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>  <span class="keywordflow">for</span> (<span class="keyword">auto</span>& [t, v] : closeTimeVotes)</div>
|
||||
<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>  {</div>
|
||||
<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>  <span class="keywordflow">if</span> (adaptor_.validating() &&</div>
|
||||
<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>  t != asCloseTime(result_->position.closeTime()))</div>
|
||||
<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>  {</div>
|
||||
<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) << <span class="stringliteral">"Others have voted for a close time "</span></div>
|
||||
<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>  <span class="stringliteral">"different than ours. Adding our vote "</span></div>
|
||||
<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>  <span class="stringliteral">"to this one in case it is necessary "</span></div>
|
||||
<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>  <span class="stringliteral">"to break an impasse."</span>;</div>
|
||||
<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>  ++v;</div>
|
||||
<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>  }</div>
|
||||
<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>  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>  << <span class="stringliteral">"CCTime: seq "</span></div>
|
||||
<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>  << <span class="keyword">static_cast<</span><a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a><span class="keyword">></span>(previousLedger_.seq()) + 1 << <span class="stringliteral">": "</span></div>
|
||||
<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>  << t.time_since_epoch().count() << <span class="stringliteral">" has "</span> << v << <span class="stringliteral">", "</span></div>
|
||||
<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>  << threshVote << <span class="stringliteral">" required"</span>;</div>
|
||||
<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>  </div>
|
||||
<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>  <span class="keywordflow">if</span> (v >= threshVote)</div>
|
||||
<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>  {</div>
|
||||
<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>  <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>  consensusCloseTime = t;</div>
|
||||
<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>  threshVote = v;</div>
|
||||
<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>  </div>
|
||||
<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>  <span class="keywordflow">if</span> (threshVote >= threshConsensus)</div>
|
||||
<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>  {</div>
|
||||
<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>  haveCloseTimeConsensus_ = <span class="keyword">true</span>;</div>
|
||||
<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>  <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>  <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>  <span class="keywordflow">break</span>;</div>
|
||||
<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>  }</div>
|
||||
<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>  }</div>
|
||||
<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>  }</div>
|
||||
<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>  </div>
|
||||
<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>  <span class="keywordflow">if</span> (!haveCloseTimeConsensus_)</div>
|
||||
<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>  {</div>
|
||||
<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>  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>  << <span class="stringliteral">"No CT consensus:"</span></div>
|
||||
<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>  << <span class="stringliteral">" Proposers:"</span> << currPeerPositions_.size()</div>
|
||||
<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>  << <span class="stringliteral">" Mode:"</span> << to_string(mode_.get())</div>
|
||||
<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>  << <span class="stringliteral">" Thresh:"</span> << threshConsensus</div>
|
||||
<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>  << <span class="stringliteral">" Pos:"</span> << 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>  }</div>
|
||||
<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>  }</div>
|
||||
<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>  </div>
|
||||
<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>  <span class="keywordflow">if</span> (!ourNewSet &&</div>
|
||||
<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>  ((consensusCloseTime != asCloseTime(result_->position.closeTime())) ||</div>
|
||||
<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>  result_->position.isStale(ourCutoff)))</div>
|
||||
<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>  {</div>
|
||||
<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>  <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>  ourNewSet.<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional/emplace.html">emplace</a>(result_->txns);</div>
|
||||
<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>  }</div>
|
||||
<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>  </div>
|
||||
<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>  <span class="keywordflow">if</span> (ourNewSet)</div>
|
||||
<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>  {</div>
|
||||
<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>  <span class="keyword">auto</span> newID = ourNewSet->id();</div>
|
||||
<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>  <span class="keywordflow">else</span></div>
|
||||
<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>  {</div>
|
||||
<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>  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>  stuck = <span class="keyword">true</span>;</div>
|
||||
<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>  }</div>
|
||||
<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>  </div>
|
||||
<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>  <span class="keywordtype">int</span> participants = currPeerPositions_.size();</div>
|
||||
<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>  <span class="keywordflow">if</span> (mode_.get() == ConsensusMode::proposing)</div>
|
||||
<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>  {</div>
|
||||
<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>  ++closeTimeVotes[asCloseTime(result_->position.closeTime())];</div>
|
||||
<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>  ++participants;</div>
|
||||
<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>  }</div>
|
||||
<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>  </div>
|
||||
<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>  <span class="comment">// Threshold for non-zero vote</span></div>
|
||||
<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>  <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>  </div>
|
||||
<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>  <span class="comment">// Threshold to declare consensus</span></div>
|
||||
<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>  <span class="keywordtype">int</span> <span class="keyword">const</span> threshConsensus =</div>
|
||||
<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>  <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>  </div>
|
||||
<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) << <span class="stringliteral">"Proposers:"</span> << currPeerPositions_.size()</div>
|
||||
<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>  << <span class="stringliteral">" nw:"</span> << neededWeight << <span class="stringliteral">" thrV:"</span> << threshVote</div>
|
||||
<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>  << <span class="stringliteral">" thrC:"</span> << threshConsensus;</div>
|
||||
<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>  </div>
|
||||
<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>  <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>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>  <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>  <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>  <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>  <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>  <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>  <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>  <span class="comment">// changes.</span></div>
|
||||
<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>  <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>  <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>  <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>  <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>  <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>  <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>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>  <span class="comment">// Here's how the impasse could occur:</span></div>
|
||||
<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>  <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>  <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>  <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>  <span class="comment">// will change their close times.</span></div>
|
||||
<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>  <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>  <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>  <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>  <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>  <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>  <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>  <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>  <span class="comment">// assuming that the peer messages propagate successfully.</span></div>
|
||||
<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>  <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>  <span class="comment">// those in t2 switch to t1.</span></div>
|
||||
<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>  <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>  <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>  <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>  <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>  <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>  <span class="comment">// of gratuitous change of position.</span></div>
|
||||
<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>  <span class="comment">// The solution for validators is to first track whether it's</span></div>
|
||||
<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>  <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>  <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>  <span class="comment">// in the "stuck" boolean. When stuck, validators perform the</span></div>
|
||||
<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>  <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>  <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>  <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>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>  <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>  <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>  <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>  </div>
|
||||
<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>  result_->txns = std::move(*ourNewSet);</div>
|
||||
<div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>  </div>
|
||||
<div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) << <span class="stringliteral">"Position change: CTime "</span></div>
|
||||
<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>  << 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>  << <span class="stringliteral">", tx "</span> << newID;</div>
|
||||
<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>  </div>
|
||||
<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>  result_->position.changePosition(newID, consensusCloseTime, now_);</div>
|
||||
<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>  </div>
|
||||
<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>  <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>  <span class="comment">// if we haven't already received it. Unless we have already</span></div>
|
||||
<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>  <span class="comment">// accepted a position, but are recalculating because it didn't</span></div>
|
||||
<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>  <span class="comment">// validate.</span></div>
|
||||
<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>  <span class="keywordflow">if</span> (acquired_.emplace(newID, result_->txns).second && share)</div>
|
||||
<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>  {</div>
|
||||
<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>  <span class="keywordflow">if</span> (!result_->position.isBowOut())</div>
|
||||
<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>  adaptor_.share(result_->txns);</div>
|
||||
<div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>  </div>
|
||||
<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& [nodeId, peerPos] : currPeerPositions_)</div>
|
||||
<div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>  {</div>
|
||||
<div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>  <a class="code" href="classripple_1_1ConsensusProposal.html">Proposal_t</a> <span class="keyword">const</span>& p = peerPos.proposal();</div>
|
||||
<div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>  <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>  updateDisputes(nodeId, result_->txns);</div>
|
||||
<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>  }</div>
|
||||
<div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>  }</div>
|
||||
<div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>  </div>
|
||||
<div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>  <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>  <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>  <span class="comment">// because it didn't validate.</span></div>
|
||||
<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>  <span class="keywordflow">if</span> (!result_->position.isBowOut() &&</div>
|
||||
<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>  (mode_.get() == ConsensusMode::proposing) && share)</div>
|
||||
<div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>  adaptor_.propose(result_->position);</div>
|
||||
<div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>  }</div>
|
||||
<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span> }</div>
|
||||
<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>  </div>
|
||||
<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span> <span class="keyword">template</span> <<span class="keyword">class</span> Adaptor></div>
|
||||
<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span> <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> <a class="code" href="classripple_1_1Consensus.html">Consensus<Adaptor>::haveConsensus</a>()</div>
|
||||
<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span> {</div>
|
||||
<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>  <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>  assert(result_);</div>
|
||||
<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>  </div>
|
||||
<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>  <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>  <span class="keywordtype">int</span> agree = 0, disagree = 0;</div>
|
||||
<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>  <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>  <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>  <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>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/multimap.html">std::multimap<int, NetClock::time_point></a> votesByCloseTime;</div>
|
||||
<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>  <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>  ss << <span class="stringliteral">"Close time calculation for ledger sequence "</span></div>
|
||||
<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>  << <span class="keyword">static_cast<</span><a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a><span class="keyword">></span>(previousLedger_.seq()) + 1</div>
|
||||
<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>  << <span class="stringliteral">" Close times and vote count are as follows: "</span>;</div>
|
||||
<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>  <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div>
|
||||
<div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& [closeTime, voteCount] : closeTimeVotes)</div>
|
||||
<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>  {</div>
|
||||
<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>  <span class="keywordflow">if</span> (first)</div>
|
||||
<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>  first = <span class="keyword">false</span>;</div>
|
||||
<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>  <span class="keywordflow">else</span></div>
|
||||
<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>  ss << <span class="charliteral">','</span>;</div>
|
||||
<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>  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>  ss << closeTime.time_since_epoch().count() << <span class="charliteral">':'</span> << voteCount;</div>
|
||||
<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>  }</div>
|
||||
<div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>  <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>  <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>  assert(!currPeerPositions_.empty());</div>
|
||||
<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional<int></a> maxVote;</div>
|
||||
<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/set.html">std::set<NetClock::time_point></a> maxCloseTimes;</div>
|
||||
<div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>  <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>  <span class="comment">// with the highest.</span></div>
|
||||
<div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>  <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>  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>  ++rit)</div>
|
||||
<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>  {</div>
|
||||
<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>  <span class="keywordtype">int</span> <span class="keyword">const</span> voteCount = rit->first;</div>
|
||||
<div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>  <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>  maxVote = voteCount;</div>
|
||||
<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (voteCount < *maxVote)</div>
|
||||
<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>  <span class="keywordflow">break</span>;</div>
|
||||
<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>  maxCloseTimes.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/set/insert.html">insert</a>(rit->second);</div>
|
||||
<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>  }</div>
|
||||
<div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>  <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>  <span class="comment">// the maximum number of votes.</span></div>
|
||||
<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>  <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>  ss << <span class="stringliteral">". The best close time has the most votes. If there is a tie, "</span></div>
|
||||
<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>  <span class="stringliteral">"choose the latest. This is "</span></div>
|
||||
<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>  << bestCloseTime.<a class="codeRef" href="http://en.cppreference.com/w/cpp/chrono/time_point/time_since_epoch.html">time_since_epoch</a>().count() << <span class="stringliteral">"with "</span> << *maxVote</div>
|
||||
<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>  << <span class="stringliteral">" votes. "</span>;</div>
|
||||
<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>  </div>
|
||||
<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>  <span class="keyword">auto</span> ourPosition = result_->position.position();</div>
|
||||
<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>  </div>
|
||||
<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>  <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>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& [nodeId, peerPos] : currPeerPositions_)</div>
|
||||
<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>  {</div>
|
||||
<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>  <a class="code" href="classripple_1_1ConsensusProposal.html">Proposal_t</a> <span class="keyword">const</span>& peerProp = peerPos.proposal();</div>
|
||||
<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>  <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>  ++agree;</div>
|
||||
<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>  <span class="keywordflow">else</span></div>
|
||||
<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>  ++disagree;</div>
|
||||
<div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>  }</div>
|
||||
<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>  <span class="keyword">auto</span> currentFinished =</div>
|
||||
<div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>  adaptor_.proposersFinished(previousLedger_, prevLedgerID_);</div>
|
||||
<div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>  </div>
|
||||
<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) << <span class="stringliteral">"Checking for TX consensus: agree="</span> << agree</div>
|
||||
<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>  << <span class="stringliteral">", disagree="</span> << disagree;</div>
|
||||
<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>  </div>
|
||||
<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>  <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>  result_->state = <a class="code" href="namespaceripple.html#a2e640e92bd561e94c1800ea388975d94">checkConsensus</a>(</div>
|
||||
<div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>  prevProposers_,</div>
|
||||
<div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>  agree + disagree,</div>
|
||||
<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>  agree,</div>
|
||||
<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>  currentFinished,</div>
|
||||
<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>  prevRoundTime_,</div>
|
||||
<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>  result_->roundTime.read(),</div>
|
||||
<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>  adaptor_.parms(),</div>
|
||||
<div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>  mode_.get() == ConsensusMode::proposing,</div>
|
||||
<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>  j_);</div>
|
||||
<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>  </div>
|
||||
<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>  <span class="keywordflow">if</span> (result_->state == ConsensusState::No)</div>
|
||||
<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
||||
<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>  </div>
|
||||
<div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>  <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>  <span class="comment">// without us.</span></div>
|
||||
<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>  <span class="keywordflow">if</span> (result_->state == ConsensusState::MovedOn)</div>
|
||||
<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>  {</div>
|
||||
<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) << <span class="stringliteral">"Unable to reach consensus MovedOn: "</span></div>
|
||||
<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>  << <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>  }</div>
|
||||
<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>  </div>
|
||||
<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
||||
<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span> }</div>
|
||||
<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>  </div>
|
||||
<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span> <span class="keyword">template</span> <<span class="keyword">class</span> Adaptor></div>
|
||||
<div class="line"><a name="l01943"></a><span class="lineno"> 1943</span> <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> <a class="code" href="classripple_1_1Consensus.html">Consensus<Adaptor>::leaveConsensus</a>()</div>
|
||||
<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span> {</div>
|
||||
<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>  <span class="keywordflow">if</span> (mode_.get() == ConsensusMode::proposing)</div>
|
||||
<div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>  {</div>
|
||||
<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>  <span class="keywordflow">if</span> (result_ && !result_->position.isBowOut())</div>
|
||||
<div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>  {</div>
|
||||
<div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>  result_->position.bowOut(now_);</div>
|
||||
<div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>  adaptor_.propose(result_->position);</div>
|
||||
<div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>  }</div>
|
||||
<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>  <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>  <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>  <span class="comment">// tally another vote for it.</span></div>
|
||||
<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>  <span class="keywordflow">if</span> (adaptor_.validating() && stuck &&</div>
|
||||
<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>  consensusCloseTime != bestCloseTime)</div>
|
||||
<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>  {</div>
|
||||
<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>  consensusCloseTime = bestCloseTime;</div>
|
||||
<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>  ++*maxVote;</div>
|
||||
<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>  ss << <span class="stringliteral">" We are a validator. Consensus has taken "</span></div>
|
||||
<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>  << result_->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>  << <span class="stringliteral">"ms. Previous round "</span></div>
|
||||
<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>  <span class="stringliteral">"took "</span></div>
|
||||
<div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>  << prevRoundTime_.count()</div>
|
||||
<div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>  << <span class="stringliteral">"ms. Now changing our "</span></div>
|
||||
<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>  <span class="stringliteral">"close time to "</span></div>
|
||||
<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>  << 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>  << <span class="stringliteral">" that "</span></div>
|
||||
<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>  <span class="stringliteral">"now has "</span></div>
|
||||
<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>  << *maxVote << <span class="stringliteral">" votes."</span>;</div>
|
||||
<div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>  }</div>
|
||||
<div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>  <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>  <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>  <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>  <span class="comment">// time consensus.</span></div>
|
||||
<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>  <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>  <span class="comment">// It's possible that this can be optimized by doing the</span></div>
|
||||
<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>  <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>  <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>  <span class="keywordflow">if</span> (*maxVote >= threshVote)</div>
|
||||
<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>  {</div>
|
||||
<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>  consensusCloseTime = bestCloseTime;</div>
|
||||
<div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>  ss << <span class="stringliteral">"Close time "</span> << 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>  << <span class="stringliteral">" has "</span> << *maxVote << <span class="stringliteral">" votes, which is >= the threshold ("</span></div>
|
||||
<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>  << threshVote</div>
|
||||
<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>  << <span class="stringliteral">" to make that our position if it isn't already."</span>;</div>
|
||||
<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>  <span class="keywordflow">if</span> (*maxVote >= threshConsensus)</div>
|
||||
<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>  {</div>
|
||||
<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>  haveCloseTimeConsensus_ = <span class="keyword">true</span>;</div>
|
||||
<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>  ss << <span class="stringliteral">" The maximum votes also >= the threshold ("</span></div>
|
||||
<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>  << threshConsensus << <span class="stringliteral">") for consensus."</span>;</div>
|
||||
<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>  }</div>
|
||||
<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>  }</div>
|
||||
<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>  </div>
|
||||
<div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>  <span class="keywordflow">if</span> (!haveCloseTimeConsensus_)</div>
|
||||
<div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>  {</div>
|
||||
<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>  ss << <span class="stringliteral">" No CT consensus:"</span></div>
|
||||
<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>  << <span class="stringliteral">" Proposers:"</span> << currPeerPositions_.size()</div>
|
||||
<div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>  << <span class="stringliteral">" Mode:"</span> << to_string(mode_.get())</div>
|
||||
<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>  << <span class="stringliteral">" Thresh:"</span> << threshConsensus</div>
|
||||
<div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>  << <span class="stringliteral">" Pos:"</span> << 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>  }</div>
|
||||
<div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) << 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>  }</div>
|
||||
<div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>  </div>
|
||||
<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>  mode_.set(ConsensusMode::observing, adaptor_);</div>
|
||||
<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) << <span class="stringliteral">"Bowing out of consensus"</span>;</div>
|
||||
<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>  }</div>
|
||||
<div class="line"><a name="l01957"></a><span class="lineno"> 1957</span> }</div>
|
||||
<div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>  </div>
|
||||
<div class="line"><a name="l01959"></a><span class="lineno"> 1959</span> <span class="keyword">template</span> <<span class="keyword">class</span> Adaptor></div>
|
||||
<div class="line"><a name="l01960"></a><span class="lineno"> 1960</span> <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> <a class="code" href="classripple_1_1Consensus.html">Consensus<Adaptor>::createDisputes</a>(<a class="code" href="classripple_1_1Consensus.html#a524b889667609917d080a6ec775ab2e4">TxSet_t</a> <span class="keyword">const</span>& o)</div>
|
||||
<div class="line"><a name="l01962"></a><span class="lineno"> 1962</span> {</div>
|
||||
<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>  <span class="comment">// Cannot create disputes without our stance</span></div>
|
||||
<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>  assert(result_);</div>
|
||||
<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>  <span class="keywordflow">if</span> (!ourNewSet &&</div>
|
||||
<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>  ((consensusCloseTime != asCloseTime(result_->position.closeTime())) ||</div>
|
||||
<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>  result_->position.isStale(ourCutoff)))</div>
|
||||
<div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>  {</div>
|
||||
<div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>  <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>  ourNewSet.<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional/emplace.html">emplace</a>(result_->txns);</div>
|
||||
<div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>  }</div>
|
||||
<div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>  </div>
|
||||
<div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>  <span class="keywordflow">if</span> (ourNewSet)</div>
|
||||
<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>  {</div>
|
||||
<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>  <span class="keyword">auto</span> newID = ourNewSet->id();</div>
|
||||
<div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>  </div>
|
||||
<div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>  <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>  <span class="keywordflow">if</span> (!result_->compares.emplace(o.id()).second)</div>
|
||||
<div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>  <span class="keywordflow">return</span>;</div>
|
||||
<div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>  </div>
|
||||
<div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>  <span class="comment">// Nothing to dispute if we agree</span></div>
|
||||
<div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>  <span class="keywordflow">if</span> (result_->txns.id() == o.id())</div>
|
||||
<div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>  <span class="keywordflow">return</span>;</div>
|
||||
<div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>  result_->txns = std::move(*ourNewSet);</div>
|
||||
<div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>  </div>
|
||||
<div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) << <span class="stringliteral">"Position change: CTime "</span></div>
|
||||
<div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>  << 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>  << <span class="stringliteral">", tx "</span> << newID;</div>
|
||||
<div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>  </div>
|
||||
<div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>  result_->position.changePosition(newID, consensusCloseTime, now_);</div>
|
||||
<div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>  </div>
|
||||
<div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) << <span class="stringliteral">"createDisputes "</span> << result_->txns.id() << <span class="stringliteral">" to "</span></div>
|
||||
<div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>  << o.id();</div>
|
||||
<div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>  </div>
|
||||
<div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>  <span class="keyword">auto</span> differences = result_->txns.compare(o);</div>
|
||||
<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>  </div>
|
||||
<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>  <span class="keywordtype">int</span> dc = 0;</div>
|
||||
<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>  </div>
|
||||
<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& [txId, inThisSet] : differences)</div>
|
||||
<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>  {</div>
|
||||
<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>  ++dc;</div>
|
||||
<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>  <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>  assert(</div>
|
||||
<div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>  (inThisSet && result_->txns.find(txId) && !o.find(txId)) ||</div>
|
||||
<div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>  (!inThisSet && !result_->txns.find(txId) && o.find(txId)));</div>
|
||||
<div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>  </div>
|
||||
<div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>  <a class="code" href="classripple_1_1Consensus.html#a756a605e09b99b2a7d49a941a3055433">Tx_t</a> tx = inThisSet ? result_->txns.find(txId) : o.find(txId);</div>
|
||||
<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>  <span class="keyword">auto</span> txID = tx.id();</div>
|
||||
<div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>  </div>
|
||||
<div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>  <span class="keywordflow">if</span> (result_->disputes.find(txID) != result_->disputes.end())</div>
|
||||
<div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>  <span class="keywordflow">continue</span>;</div>
|
||||
<div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>  </div>
|
||||
<div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>()) << <span class="stringliteral">"Transaction "</span> << txID << <span class="stringliteral">" is disputed"</span>;</div>
|
||||
<div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>  </div>
|
||||
<div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>  <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>  tx,</div>
|
||||
<div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>  result_->txns.exists(txID),</div>
|
||||
<div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>  <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>  j_};</div>
|
||||
<div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>  </div>
|
||||
<div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>  <span class="comment">// Update all of the available peer's votes on the disputed transaction</span></div>
|
||||
<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& [nodeId, peerPos] : currPeerPositions_)</div>
|
||||
<div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>  {</div>
|
||||
<div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>  <a class="code" href="classripple_1_1ConsensusProposal.html">Proposal_t</a> <span class="keyword">const</span>& peerProp = peerPos.proposal();</div>
|
||||
<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>  <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>  <span class="keywordflow">if</span> (cit != acquired_.end())</div>
|
||||
<div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>  dtx.setVote(nodeId, cit->second.exists(txID));</div>
|
||||
<div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>  }</div>
|
||||
<div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>  adaptor_.share(dtx.tx());</div>
|
||||
<div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>  </div>
|
||||
<div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>  result_->disputes.emplace(txID, std::move(dtx));</div>
|
||||
<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>  }</div>
|
||||
<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>()) << dc << <span class="stringliteral">" differences found"</span>;</div>
|
||||
<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span> }</div>
|
||||
<div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>  </div>
|
||||
<div class="line"><a name="l02018"></a><span class="lineno"> 2018</span> <span class="keyword">template</span> <<span class="keyword">class</span> Adaptor></div>
|
||||
<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span> <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> <a class="code" href="classripple_1_1Consensus.html">Consensus<Adaptor>::updateDisputes</a>(<a class="code" href="classripple_1_1Consensus.html#ac0595ebca5fc6577d86cb4b4dddaef3e">NodeID_t</a> <span class="keyword">const</span>& node, <a class="code" href="classripple_1_1Consensus.html#a524b889667609917d080a6ec775ab2e4">TxSet_t</a> <span class="keyword">const</span>& other)</div>
|
||||
<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span> {</div>
|
||||
<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>  <span class="comment">// Cannot updateDisputes without our stance</span></div>
|
||||
<div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>  assert(result_);</div>
|
||||
<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>  </div>
|
||||
<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>  <span class="comment">// Ensure we have created disputes against this set if we haven't seen</span></div>
|
||||
<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>  <span class="comment">// it before</span></div>
|
||||
<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>  <span class="keywordflow">if</span> (result_->compares.find(other.id()) == result_->compares.end())</div>
|
||||
<div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>  createDisputes(other);</div>
|
||||
<div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>  </div>
|
||||
<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span>& it : result_->disputes)</div>
|
||||
<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>  {</div>
|
||||
<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>  <span class="keyword">auto</span>& d = it.second;</div>
|
||||
<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>  d.setVote(node, other.exists(d.tx().id()));</div>
|
||||
<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>  }</div>
|
||||
<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span> }</div>
|
||||
<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>  </div>
|
||||
<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span> <span class="keyword">template</span> <<span class="keyword">class</span> Adaptor></div>
|
||||
<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span> <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> <a class="code" href="classripple_1_1Consensus.html">Consensus<Adaptor>::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> <span class="keyword"></span>{</div>
|
||||
<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>  <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> }</div>
|
||||
<div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>  </div>
|
||||
<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span> } <span class="comment">// namespace ripple</span></div>
|
||||
<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>  </div>
|
||||
<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span> <span class="preprocessor">#endif</span></div>
|
||||
<div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>  <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>  <span class="comment">// if we haven't already received it. Unless we have already</span></div>
|
||||
<div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>  <span class="comment">// accepted a position, but are recalculating because it didn't</span></div>
|
||||
<div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>  <span class="comment">// validate.</span></div>
|
||||
<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>  <span class="keywordflow">if</span> (acquired_.emplace(newID, result_->txns).second && share)</div>
|
||||
<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>  {</div>
|
||||
<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>  <span class="keywordflow">if</span> (!result_->position.isBowOut())</div>
|
||||
<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>  adaptor_.share(result_->txns);</div>
|
||||
<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>  </div>
|
||||
<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& [nodeId, peerPos] : currPeerPositions_)</div>
|
||||
<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>  {</div>
|
||||
<div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>  <a class="code" href="classripple_1_1ConsensusProposal.html">Proposal_t</a> <span class="keyword">const</span>& p = peerPos.proposal();</div>
|
||||
<div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>  <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>  updateDisputes(nodeId, result_->txns);</div>
|
||||
<div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>  }</div>
|
||||
<div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>  }</div>
|
||||
<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>  </div>
|
||||
<div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>  <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>  <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>  <span class="comment">// because it didn't validate.</span></div>
|
||||
<div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>  <span class="keywordflow">if</span> (!result_->position.isBowOut() &&</div>
|
||||
<div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>  (mode_.get() == ConsensusMode::proposing) && share)</div>
|
||||
<div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>  adaptor_.propose(result_->position);</div>
|
||||
<div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>  }</div>
|
||||
<div class="line"><a name="l01998"></a><span class="lineno"> 1998</span> }</div>
|
||||
<div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>  </div>
|
||||
<div class="line"><a name="l02000"></a><span class="lineno"> 2000</span> <span class="keyword">template</span> <<span class="keyword">class</span> Adaptor></div>
|
||||
<div class="line"><a name="l02001"></a><span class="lineno"> 2001</span> <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> <a class="code" href="classripple_1_1Consensus.html">Consensus<Adaptor>::haveConsensus</a>()</div>
|
||||
<div class="line"><a name="l02003"></a><span class="lineno"> 2003</span> {</div>
|
||||
<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>  <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>  assert(result_);</div>
|
||||
<div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>  </div>
|
||||
<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>  <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>  <span class="keywordtype">int</span> agree = 0, disagree = 0;</div>
|
||||
<div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>  </div>
|
||||
<div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>  <span class="keyword">auto</span> ourPosition = result_->position.position();</div>
|
||||
<div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>  </div>
|
||||
<div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>  <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>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& [nodeId, peerPos] : currPeerPositions_)</div>
|
||||
<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>  {</div>
|
||||
<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>  <a class="code" href="classripple_1_1ConsensusProposal.html">Proposal_t</a> <span class="keyword">const</span>& peerProp = peerPos.proposal();</div>
|
||||
<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>  <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>  ++agree;</div>
|
||||
<div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>  <span class="keywordflow">else</span></div>
|
||||
<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>  ++disagree;</div>
|
||||
<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>  }</div>
|
||||
<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>  <span class="keyword">auto</span> currentFinished =</div>
|
||||
<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>  adaptor_.proposersFinished(previousLedger_, prevLedgerID_);</div>
|
||||
<div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>  </div>
|
||||
<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) << <span class="stringliteral">"Checking for TX consensus: agree="</span> << agree</div>
|
||||
<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>  << <span class="stringliteral">", disagree="</span> << disagree;</div>
|
||||
<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>  </div>
|
||||
<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>  <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>  result_->state = <a class="code" href="namespaceripple.html#a2e640e92bd561e94c1800ea388975d94">checkConsensus</a>(</div>
|
||||
<div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>  prevProposers_,</div>
|
||||
<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>  agree + disagree,</div>
|
||||
<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>  agree,</div>
|
||||
<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>  currentFinished,</div>
|
||||
<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>  prevRoundTime_,</div>
|
||||
<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>  result_->roundTime.read(),</div>
|
||||
<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>  adaptor_.parms(),</div>
|
||||
<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>  mode_.get() == ConsensusMode::proposing,</div>
|
||||
<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>  j_);</div>
|
||||
<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>  </div>
|
||||
<div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>  <span class="keywordflow">if</span> (result_->state == ConsensusState::No)</div>
|
||||
<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
||||
<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>  </div>
|
||||
<div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>  <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>  <span class="comment">// without us.</span></div>
|
||||
<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>  <span class="keywordflow">if</span> (result_->state == ConsensusState::MovedOn)</div>
|
||||
<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>  {</div>
|
||||
<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) << <span class="stringliteral">"Unable to reach consensus MovedOn: "</span></div>
|
||||
<div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>  << <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>  }</div>
|
||||
<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>  </div>
|
||||
<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
||||
<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span> }</div>
|
||||
<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>  </div>
|
||||
<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span> <span class="keyword">template</span> <<span class="keyword">class</span> Adaptor></div>
|
||||
<div class="line"><a name="l02054"></a><span class="lineno"> 2054</span> <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> <a class="code" href="classripple_1_1Consensus.html">Consensus<Adaptor>::leaveConsensus</a>()</div>
|
||||
<div class="line"><a name="l02056"></a><span class="lineno"> 2056</span> {</div>
|
||||
<div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>  <span class="keywordflow">if</span> (mode_.get() == ConsensusMode::proposing)</div>
|
||||
<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>  {</div>
|
||||
<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>  <span class="keywordflow">if</span> (result_ && !result_->position.isBowOut())</div>
|
||||
<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>  {</div>
|
||||
<div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>  result_->position.bowOut(now_);</div>
|
||||
<div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>  adaptor_.propose(result_->position);</div>
|
||||
<div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>  }</div>
|
||||
<div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>  </div>
|
||||
<div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>  mode_.set(ConsensusMode::observing, adaptor_);</div>
|
||||
<div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) << <span class="stringliteral">"Bowing out of consensus"</span>;</div>
|
||||
<div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>  }</div>
|
||||
<div class="line"><a name="l02068"></a><span class="lineno"> 2068</span> }</div>
|
||||
<div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>  </div>
|
||||
<div class="line"><a name="l02070"></a><span class="lineno"> 2070</span> <span class="keyword">template</span> <<span class="keyword">class</span> Adaptor></div>
|
||||
<div class="line"><a name="l02071"></a><span class="lineno"> 2071</span> <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> <a class="code" href="classripple_1_1Consensus.html">Consensus<Adaptor>::createDisputes</a>(<a class="code" href="classripple_1_1Consensus.html#a524b889667609917d080a6ec775ab2e4">TxSet_t</a> <span class="keyword">const</span>& o)</div>
|
||||
<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span> {</div>
|
||||
<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>  <span class="comment">// Cannot create disputes without our stance</span></div>
|
||||
<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>  assert(result_);</div>
|
||||
<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>  </div>
|
||||
<div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>  <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>  <span class="keywordflow">if</span> (!result_->compares.emplace(o.id()).second)</div>
|
||||
<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>  <span class="keywordflow">return</span>;</div>
|
||||
<div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>  </div>
|
||||
<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>  <span class="comment">// Nothing to dispute if we agree</span></div>
|
||||
<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>  <span class="keywordflow">if</span> (result_->txns.id() == o.id())</div>
|
||||
<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>  <span class="keywordflow">return</span>;</div>
|
||||
<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>  </div>
|
||||
<div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) << <span class="stringliteral">"createDisputes "</span> << result_->txns.id() << <span class="stringliteral">" to "</span></div>
|
||||
<div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>  << o.id();</div>
|
||||
<div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>  </div>
|
||||
<div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>  <span class="keyword">auto</span> differences = result_->txns.compare(o);</div>
|
||||
<div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>  </div>
|
||||
<div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>  <span class="keywordtype">int</span> dc = 0;</div>
|
||||
<div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>  </div>
|
||||
<div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& [txId, inThisSet] : differences)</div>
|
||||
<div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>  {</div>
|
||||
<div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>  ++dc;</div>
|
||||
<div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>  <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>  assert(</div>
|
||||
<div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>  (inThisSet && result_->txns.find(txId) && !o.find(txId)) ||</div>
|
||||
<div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>  (!inThisSet && !result_->txns.find(txId) && o.find(txId)));</div>
|
||||
<div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>  </div>
|
||||
<div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>  <a class="code" href="classripple_1_1Consensus.html#a756a605e09b99b2a7d49a941a3055433">Tx_t</a> tx = inThisSet ? result_->txns.find(txId) : o.find(txId);</div>
|
||||
<div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>  <span class="keyword">auto</span> txID = tx.id();</div>
|
||||
<div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>  </div>
|
||||
<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>  <span class="keywordflow">if</span> (result_->disputes.find(txID) != result_->disputes.end())</div>
|
||||
<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>  <span class="keywordflow">continue</span>;</div>
|
||||
<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>  </div>
|
||||
<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>()) << <span class="stringliteral">"Transaction "</span> << txID << <span class="stringliteral">" is disputed"</span>;</div>
|
||||
<div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>  </div>
|
||||
<div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>  <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>  tx,</div>
|
||||
<div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>  result_->txns.exists(txID),</div>
|
||||
<div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>  <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>  j_};</div>
|
||||
<div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>  </div>
|
||||
<div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>  <span class="comment">// Update all of the available peer's votes on the disputed transaction</span></div>
|
||||
<div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& [nodeId, peerPos] : currPeerPositions_)</div>
|
||||
<div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>  {</div>
|
||||
<div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>  <a class="code" href="classripple_1_1ConsensusProposal.html">Proposal_t</a> <span class="keyword">const</span>& peerProp = peerPos.proposal();</div>
|
||||
<div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>  <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>  <span class="keywordflow">if</span> (cit != acquired_.end())</div>
|
||||
<div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>  dtx.setVote(nodeId, cit->second.exists(txID));</div>
|
||||
<div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>  }</div>
|
||||
<div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>  adaptor_.share(dtx.tx());</div>
|
||||
<div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>  </div>
|
||||
<div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>  result_->disputes.emplace(txID, std::move(dtx));</div>
|
||||
<div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>  }</div>
|
||||
<div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>  JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>()) << dc << <span class="stringliteral">" differences found"</span>;</div>
|
||||
<div class="line"><a name="l02127"></a><span class="lineno"> 2127</span> }</div>
|
||||
<div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>  </div>
|
||||
<div class="line"><a name="l02129"></a><span class="lineno"> 2129</span> <span class="keyword">template</span> <<span class="keyword">class</span> Adaptor></div>
|
||||
<div class="line"><a name="l02130"></a><span class="lineno"> 2130</span> <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> <a class="code" href="classripple_1_1Consensus.html">Consensus<Adaptor>::updateDisputes</a>(<a class="code" href="classripple_1_1Consensus.html#ac0595ebca5fc6577d86cb4b4dddaef3e">NodeID_t</a> <span class="keyword">const</span>& node, <a class="code" href="classripple_1_1Consensus.html#a524b889667609917d080a6ec775ab2e4">TxSet_t</a> <span class="keyword">const</span>& other)</div>
|
||||
<div class="line"><a name="l02132"></a><span class="lineno"> 2132</span> {</div>
|
||||
<div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>  <span class="comment">// Cannot updateDisputes without our stance</span></div>
|
||||
<div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>  assert(result_);</div>
|
||||
<div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>  </div>
|
||||
<div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>  <span class="comment">// Ensure we have created disputes against this set if we haven't seen</span></div>
|
||||
<div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>  <span class="comment">// it before</span></div>
|
||||
<div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>  <span class="keywordflow">if</span> (result_->compares.find(other.id()) == result_->compares.end())</div>
|
||||
<div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>  createDisputes(other);</div>
|
||||
<div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>  </div>
|
||||
<div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span>& it : result_->disputes)</div>
|
||||
<div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>  {</div>
|
||||
<div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>  <span class="keyword">auto</span>& d = it.second;</div>
|
||||
<div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>  d.setVote(node, other.exists(d.tx().id()));</div>
|
||||
<div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>  }</div>
|
||||
<div class="line"><a name="l02146"></a><span class="lineno"> 2146</span> }</div>
|
||||
<div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>  </div>
|
||||
<div class="line"><a name="l02148"></a><span class="lineno"> 2148</span> <span class="keyword">template</span> <<span class="keyword">class</span> Adaptor></div>
|
||||
<div class="line"><a name="l02149"></a><span class="lineno"> 2149</span> <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> <a class="code" href="classripple_1_1Consensus.html">Consensus<Adaptor>::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> <span class="keyword"></span>{</div>
|
||||
<div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>  <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> }</div>
|
||||
<div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>  </div>
|
||||
<div class="line"><a name="l02155"></a><span class="lineno"> 2155</span> } <span class="comment">// namespace ripple</span></div>
|
||||
<div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>  </div>
|
||||
<div class="line"><a name="l02157"></a><span class="lineno"> 2157</span> <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< NodeID_t > 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 &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< Result > 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 &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 &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 &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< NodeID_t, std::deque< PeerPosition_t > > 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 &node, TxSet_t const &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 &node, TxSet_t const &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< ripple::test::csf::Peer >::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< std::chrono::steady_clock ></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 &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 &now, PeerPosition_t const &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< ripple::test::csf::Peer >::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<></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< Rep, Period > getNextLedgerTimeResolution(std::chrono::duration< Rep, Period > 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< std::chrono::milliseconds > validationDelay, std::chrono::milliseconds idleInterval, ConsensusParms const &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 &now, typename Ledger_t::ID const &prevLedgerID, Ledger_t prevLedger, hash_set< NodeID_t > const &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>
|
||||
|
||||
Reference in New Issue
Block a user