mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-26 22:15:52 +00:00
deploy: a8d481c2a5
This commit is contained in:
@@ -891,219 +891,220 @@ $(function() {
|
||||
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>  </div>
|
||||
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  <a class="code" href="classJson_1_1Value.html">Json::Value</a> value(<a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
|
||||
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  </div>
|
||||
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  value[<span class="stringliteral">"manifest"</span>] = iter->second.rawManifest;</div>
|
||||
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  value[<span class="stringliteral">"blob"</span>] = iter->second.rawBlob;</div>
|
||||
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  value[<span class="stringliteral">"signature"</span>] = iter->second.rawSignature;</div>
|
||||
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  value[<span class="stringliteral">"version"</span>] = iter->second.rawVersion;</div>
|
||||
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  </div>
|
||||
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  <span class="keywordflow">return</span> value;</div>
|
||||
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span> }</div>
|
||||
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  </div>
|
||||
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span> <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
|
||||
<div class="line"><a name="l00832"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a79545d89d7c7c5bfef7f15ce0510577b"> 832</a></span> <a class="code" href="classripple_1_1ValidatorList.html#a79545d89d7c7c5bfef7f15ce0510577b">ValidatorList::calculateQuorum</a>(</div>
|
||||
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> unlSize,</div>
|
||||
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> effectiveUnlSize,</div>
|
||||
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> seenSize)</div>
|
||||
<div class="line"><a name="l00836"></a><span class="lineno"> 836</span> {</div>
|
||||
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  <span class="comment">// Do not use achievable quorum until lists from all configured</span></div>
|
||||
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  <span class="comment">// publishers are available</span></div>
|
||||
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& list : <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>)</div>
|
||||
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  {</div>
|
||||
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  <span class="keywordflow">if</span> (!list.second.available)</div>
|
||||
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>  <span class="keywordflow">return</span> <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/numeric_limits/max.html">std::numeric_limits<std::size_t>::max</a>();</div>
|
||||
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  }</div>
|
||||
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>  </div>
|
||||
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  <span class="comment">// Use an 80% quorum to balance fork safety, liveness, and required UNL</span></div>
|
||||
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  <span class="comment">// overlap.</span></div>
|
||||
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  <span class="comment">// Theorem 8 of the Analysis of the XRP Ledger Consensus Protocol</span></div>
|
||||
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  <span class="comment">// (https://arxiv.org/abs/1802.07242) says:</span></div>
|
||||
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  <span class="comment">// XRP LCP guarantees fork safety if Oi,j > nj/2 + ni − qi + ti,j for</span></div>
|
||||
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  <span class="comment">// every pair of nodes Pi, Pj.</span></div>
|
||||
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  <span class="comment">// ni: size of Pi's UNL</span></div>
|
||||
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  <span class="comment">// nj: size of Pj's UNL</span></div>
|
||||
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <span class="comment">// Oi,j: number of validators in both UNLs</span></div>
|
||||
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  <span class="comment">// qi: validation quorum for Pi's UNL</span></div>
|
||||
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  <span class="comment">// ti, tj: maximum number of allowed Byzantine faults in Pi and Pj's UNLs</span></div>
|
||||
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  <span class="comment">// ti,j: min{ti, tj, Oi,j}</span></div>
|
||||
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  <span class="comment">// Assume ni < nj, meaning and ti,j = ti</span></div>
|
||||
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  <span class="comment">// For qi = .8*ni, we make ti <= .2*ni</span></div>
|
||||
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  <span class="comment">// (We could make ti lower and tolerate less UNL overlap. However in order</span></div>
|
||||
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  <span class="comment">// to prioritize safety over liveness, we need ti >= ni - qi)</span></div>
|
||||
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <span class="comment">// An 80% quorum allows two UNLs to safely have < .2*ni unique validators</span></div>
|
||||
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  <span class="comment">// between them:</span></div>
|
||||
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  <span class="comment">// pi = ni - Oi,j</span></div>
|
||||
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  <span class="comment">// pj = nj - Oi,j</span></div>
|
||||
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  <span class="comment">// Oi,j > nj/2 + ni − qi + ti,j</span></div>
|
||||
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <span class="comment">// ni - pi > (ni - pi + pj)/2 + ni − .8*ni + .2*ni</span></div>
|
||||
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  <span class="comment">// pi + pj < .2*ni</span></div>
|
||||
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <span class="comment">// Note that the negative UNL protocol introduced the AbsoluteMinimumQuorum</span></div>
|
||||
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  <span class="comment">// which is 60% of the original UNL size. The effective quorum should</span></div>
|
||||
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <span class="comment">// not be lower than it.</span></div>
|
||||
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  <span class="keyword">auto</span> <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a> = <span class="keyword">static_cast<</span><a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a><span class="keyword">></span>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a>(</div>
|
||||
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/numeric/math/ceil.html">std::ceil</a>(effectiveUnlSize * 0.8f), <a class="codeRef" href="http://en.cppreference.com/w/cpp/numeric/math/ceil.html">std::ceil</a>(unlSize * 0.6f)));</div>
|
||||
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  </div>
|
||||
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>  <span class="comment">// Use lower quorum specified via command line if the normal quorum appears</span></div>
|
||||
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  <span class="comment">// unreachable based on the number of recently received validations.</span></div>
|
||||
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#ac3bef5a420cac0a3c854398d22d79e01">minimumQuorum_</a> && *<a class="code" href="classripple_1_1ValidatorList.html#ac3bef5a420cac0a3c854398d22d79e01">minimumQuorum_</a> < <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a> && seenSize < <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a>)</div>
|
||||
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  {</div>
|
||||
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a> = *<a class="code" href="classripple_1_1ValidatorList.html#ac3bef5a420cac0a3c854398d22d79e01">minimumQuorum_</a>;</div>
|
||||
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  </div>
|
||||
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) << <span class="stringliteral">"Using unsafe quorum of "</span> << <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a></div>
|
||||
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  << <span class="stringliteral">" as specified in the command line"</span>;</div>
|
||||
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  }</div>
|
||||
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  </div>
|
||||
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a>;</div>
|
||||
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span> }</div>
|
||||
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  </div>
|
||||
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span> <a class="code" href="structripple_1_1TrustChanges.html">TrustChanges</a></div>
|
||||
<div class="line"><a name="l00896"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a890fcc8a3569fb40f0492606b2116fd8"> 896</a></span> <a class="code" href="classripple_1_1ValidatorList.html#a890fcc8a3569fb40f0492606b2116fd8">ValidatorList::updateTrusted</a>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set<NodeID></a> <span class="keyword">const</span>& seenValidators)</div>
|
||||
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span> {</div>
|
||||
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/unique_lock.html">std::unique_lock<std::shared_timed_mutex></a> lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
|
||||
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  </div>
|
||||
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  <span class="comment">// Remove any expired published lists</span></div>
|
||||
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& list : <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>)</div>
|
||||
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>  {</div>
|
||||
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  <span class="keywordflow">if</span> (list.second.available &&</div>
|
||||
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>  list.second.expiration <= <a class="code" href="classripple_1_1ValidatorList.html#a390041ee5976df2e6b170a3c6eed5de5">timeKeeper_</a>.<a class="code" href="classripple_1_1TimeKeeper.html#af1b5d38f3ba1bcacfbb7a89979af70e4">now</a>())</div>
|
||||
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  <a class="code" href="classripple_1_1ValidatorList.html#a7204fee0608cd8491a7b1a7fbc611962">removePublisherList</a>(list.first);</div>
|
||||
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  }</div>
|
||||
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  </div>
|
||||
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  <a class="code" href="structripple_1_1TrustChanges.html">TrustChanges</a> trustChanges;</div>
|
||||
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  </div>
|
||||
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  <span class="keyword">auto</span> it = <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.cbegin();</div>
|
||||
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>  <span class="keywordflow">while</span> (it != <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.cend())</div>
|
||||
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  {</div>
|
||||
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  <span class="keywordflow">if</span> (!<a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.count(*it) || <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a6494e744b90cbecd735b460fcd7be82f">revoked</a>(*it))</div>
|
||||
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  {</div>
|
||||
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>  trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">removed</a>.insert(<a class="code" href="namespaceripple.html#a984ddd646f1e1a5032a9a17f96c6fc55">calcNodeID</a>(*it));</div>
|
||||
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>  it = <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.erase(it);</div>
|
||||
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span>  }</div>
|
||||
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>  <span class="keywordflow">else</span></div>
|
||||
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  {</div>
|
||||
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  ++it;</div>
|
||||
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>  }</div>
|
||||
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  }</div>
|
||||
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  </div>
|
||||
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& val : <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>)</div>
|
||||
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  {</div>
|
||||
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  <span class="keywordflow">if</span> (!<a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a6494e744b90cbecd735b460fcd7be82f">revoked</a>(val.first) &&</div>
|
||||
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.emplace(val.first).second)</div>
|
||||
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">added</a>.insert(<a class="code" href="namespaceripple.html#a984ddd646f1e1a5032a9a17f96c6fc55">calcNodeID</a>(val.first));</div>
|
||||
<div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  }</div>
|
||||
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  </div>
|
||||
<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>  <span class="comment">// If there were any changes, we need to update the ephemeral signing keys:</span></div>
|
||||
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  <span class="keywordflow">if</span> (!trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">added</a>.empty() || !trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">removed</a>.empty())</div>
|
||||
<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  {</div>
|
||||
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  <a class="code" href="classripple_1_1ValidatorList.html#ae06a469121f9f99ed9f3049e46d0206c">trustedSigningKeys_</a>.clear();</div>
|
||||
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  </div>
|
||||
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& k : <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>)</div>
|
||||
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  <a class="code" href="classripple_1_1ValidatorList.html#ae06a469121f9f99ed9f3049e46d0206c">trustedSigningKeys_</a>.insert(<a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a8409a7089c3e04f972f1513a54576133">getSigningKey</a>(k));</div>
|
||||
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  }</div>
|
||||
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  </div>
|
||||
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>())</div>
|
||||
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>  << <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() << <span class="stringliteral">" of "</span> << <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.size()</div>
|
||||
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  << <span class="stringliteral">" listed validators eligible for inclusion in the trusted set"</span>;</div>
|
||||
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>  </div>
|
||||
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  <span class="keyword">auto</span> unlSize = <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size();</div>
|
||||
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  <span class="keyword">auto</span> effectiveUnlSize = unlSize;</div>
|
||||
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  <span class="keyword">auto</span> seenSize = seenValidators.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set/size.html">size</a>();</div>
|
||||
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  <span class="keywordflow">if</span> (!<a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>.empty())</div>
|
||||
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  {</div>
|
||||
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& k : <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>)</div>
|
||||
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>  {</div>
|
||||
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>.count(k))</div>
|
||||
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  --effectiveUnlSize;</div>
|
||||
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  }</div>
|
||||
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set<NodeID></a> negUnlNodeIDs;</div>
|
||||
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& k : <a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>)</div>
|
||||
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  {</div>
|
||||
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  negUnlNodeIDs.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set/emplace.html">emplace</a>(<a class="code" href="namespaceripple.html#a984ddd646f1e1a5032a9a17f96c6fc55">calcNodeID</a>(k));</div>
|
||||
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>  }</div>
|
||||
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& nid : seenValidators)</div>
|
||||
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  {</div>
|
||||
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  <span class="keywordflow">if</span> (negUnlNodeIDs.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set/count.html">count</a>(nid))</div>
|
||||
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  --seenSize;</div>
|
||||
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  }</div>
|
||||
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  }</div>
|
||||
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a> = <a class="code" href="classripple_1_1ValidatorList.html#a79545d89d7c7c5bfef7f15ce0510577b">calculateQuorum</a>(unlSize, effectiveUnlSize, seenSize);</div>
|
||||
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  </div>
|
||||
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) << <span class="stringliteral">"Using quorum of "</span> << <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a> << <span class="stringliteral">" for new set of "</span></div>
|
||||
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  << <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() << <span class="stringliteral">" trusted validators ("</span></div>
|
||||
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  << trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">added</a>.size() << <span class="stringliteral">" added, "</span></div>
|
||||
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  << trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">removed</a>.size() << <span class="stringliteral">" removed)"</span>;</div>
|
||||
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  </div>
|
||||
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>  <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() < <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a>)</div>
|
||||
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>  {</div>
|
||||
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>  JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) << <span class="stringliteral">"New quorum of "</span> << <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a></div>
|
||||
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>  << <span class="stringliteral">" exceeds the number of trusted validators ("</span></div>
|
||||
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>  << <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() << <span class="stringliteral">")"</span>;</div>
|
||||
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>  }</div>
|
||||
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>  </div>
|
||||
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>  <span class="keywordflow">return</span> trustChanges;</div>
|
||||
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span> }</div>
|
||||
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  </div>
|
||||
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span> <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set<PublicKey></a></div>
|
||||
<div class="line"><a name="l00983"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a22bb356f3dff23879344acd8121abbe3"> 983</a></span> <a class="code" href="classripple_1_1ValidatorList.html#a22bb356f3dff23879344acd8121abbe3">ValidatorList::getTrustedMasterKeys</a>()<span class="keyword"> const</span></div>
|
||||
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span> <span class="keyword"></span>{</div>
|
||||
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
|
||||
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span>  <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>;</div>
|
||||
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span> }</div>
|
||||
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  </div>
|
||||
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span> <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set<PublicKey></a></div>
|
||||
<div class="line"><a name="l00990"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#afef3dd7af8c40b51da43a945f632b4c5"> 990</a></span> <a class="code" href="classripple_1_1ValidatorList.html#afef3dd7af8c40b51da43a945f632b4c5">ValidatorList::getNegativeUNL</a>()<span class="keyword"> const</span></div>
|
||||
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span> <span class="keyword"></span>{</div>
|
||||
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
|
||||
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>;</div>
|
||||
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span> }</div>
|
||||
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  </div>
|
||||
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span> <span class="keywordtype">void</span></div>
|
||||
<div class="line"><a name="l00997"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a3749eaabef35e6178bc74fc8dfe6f4a2"> 997</a></span> <a class="code" href="classripple_1_1ValidatorList.html#a3749eaabef35e6178bc74fc8dfe6f4a2">ValidatorList::setNegativeUNL</a>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set<PublicKey></a> <span class="keyword">const</span>& negUnl)</div>
|
||||
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span> {</div>
|
||||
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">std::lock_guard</a> lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
|
||||
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  <a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a> = negUnl;</div>
|
||||
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span> }</div>
|
||||
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  </div>
|
||||
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span> <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector<std::shared_ptr<STValidation></a>></div>
|
||||
<div class="line"><a name="l01004"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a0937f06a5eddf696521deaef47192a32"> 1004</a></span> <a class="code" href="classripple_1_1ValidatorList.html#a0937f06a5eddf696521deaef47192a32">ValidatorList::negativeUNLFilter</a>(</div>
|
||||
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector</a><<a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr<STValidation></a>>&& validations)<span class="keyword"> const</span></div>
|
||||
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span> <span class="keyword"></span>{</div>
|
||||
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  <span class="comment">// Remove validations that are from validators on the negative UNL.</span></div>
|
||||
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  <span class="keyword">auto</span> ret = std::move(validations);</div>
|
||||
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  </div>
|
||||
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
|
||||
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  <span class="keywordflow">if</span> (!<a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>.empty())</div>
|
||||
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  {</div>
|
||||
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  ret.erase(</div>
|
||||
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/remove.html">std::remove_if</a>(</div>
|
||||
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>  ret.begin(),</div>
|
||||
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  ret.end(),</div>
|
||||
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  [&](<span class="keyword">auto</span> <span class="keyword">const</span>& v) -> <span class="keywordtype">bool</span> {</div>
|
||||
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  if (auto const masterKey =</div>
|
||||
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  getTrustedKey(v->getSignerPublic());</div>
|
||||
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  masterKey)</div>
|
||||
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  {</div>
|
||||
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  return negativeUNL_.count(*masterKey);</div>
|
||||
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  }</div>
|
||||
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>  <span class="keywordflow">else</span></div>
|
||||
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  {</div>
|
||||
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  return false;</div>
|
||||
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  }</div>
|
||||
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  }),</div>
|
||||
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  ret.end());</div>
|
||||
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  }</div>
|
||||
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  </div>
|
||||
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  <span class="keywordflow">return</span> ret;</div>
|
||||
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span> }</div>
|
||||
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>  </div>
|
||||
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span> } <span class="comment">// namespace ripple</span></div>
|
||||
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  value[jss::public_key] = <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a>{pubKey};</div>
|
||||
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  value[jss::manifest] = iter->second.rawManifest;</div>
|
||||
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  value[jss::blob] = iter->second.rawBlob;</div>
|
||||
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  value[jss::signature] = iter->second.rawSignature;</div>
|
||||
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  value[jss::version] = iter->second.rawVersion;</div>
|
||||
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  </div>
|
||||
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  <span class="keywordflow">return</span> value;</div>
|
||||
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span> }</div>
|
||||
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  </div>
|
||||
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span> <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
|
||||
<div class="line"><a name="l00833"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a79545d89d7c7c5bfef7f15ce0510577b"> 833</a></span> <a class="code" href="classripple_1_1ValidatorList.html#a79545d89d7c7c5bfef7f15ce0510577b">ValidatorList::calculateQuorum</a>(</div>
|
||||
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> unlSize,</div>
|
||||
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> effectiveUnlSize,</div>
|
||||
<div class="line"><a name="l00836"></a><span class="lineno"> 836</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> seenSize)</div>
|
||||
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span> {</div>
|
||||
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  <span class="comment">// Do not use achievable quorum until lists from all configured</span></div>
|
||||
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  <span class="comment">// publishers are available</span></div>
|
||||
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& list : <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>)</div>
|
||||
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  {</div>
|
||||
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>  <span class="keywordflow">if</span> (!list.second.available)</div>
|
||||
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  <span class="keywordflow">return</span> <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/numeric_limits/max.html">std::numeric_limits<std::size_t>::max</a>();</div>
|
||||
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>  }</div>
|
||||
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  </div>
|
||||
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  <span class="comment">// Use an 80% quorum to balance fork safety, liveness, and required UNL</span></div>
|
||||
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  <span class="comment">// overlap.</span></div>
|
||||
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  <span class="comment">// Theorem 8 of the Analysis of the XRP Ledger Consensus Protocol</span></div>
|
||||
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  <span class="comment">// (https://arxiv.org/abs/1802.07242) says:</span></div>
|
||||
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  <span class="comment">// XRP LCP guarantees fork safety if Oi,j > nj/2 + ni − qi + ti,j for</span></div>
|
||||
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  <span class="comment">// every pair of nodes Pi, Pj.</span></div>
|
||||
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  <span class="comment">// ni: size of Pi's UNL</span></div>
|
||||
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <span class="comment">// nj: size of Pj's UNL</span></div>
|
||||
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  <span class="comment">// Oi,j: number of validators in both UNLs</span></div>
|
||||
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  <span class="comment">// qi: validation quorum for Pi's UNL</span></div>
|
||||
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  <span class="comment">// ti, tj: maximum number of allowed Byzantine faults in Pi and Pj's UNLs</span></div>
|
||||
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  <span class="comment">// ti,j: min{ti, tj, Oi,j}</span></div>
|
||||
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  <span class="comment">// Assume ni < nj, meaning and ti,j = ti</span></div>
|
||||
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  <span class="comment">// For qi = .8*ni, we make ti <= .2*ni</span></div>
|
||||
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  <span class="comment">// (We could make ti lower and tolerate less UNL overlap. However in order</span></div>
|
||||
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  <span class="comment">// to prioritize safety over liveness, we need ti >= ni - qi)</span></div>
|
||||
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  <span class="comment">// An 80% quorum allows two UNLs to safely have < .2*ni unique validators</span></div>
|
||||
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  <span class="comment">// between them:</span></div>
|
||||
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  <span class="comment">// pi = ni - Oi,j</span></div>
|
||||
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  <span class="comment">// pj = nj - Oi,j</span></div>
|
||||
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <span class="comment">// Oi,j > nj/2 + ni − qi + ti,j</span></div>
|
||||
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  <span class="comment">// ni - pi > (ni - pi + pj)/2 + ni − .8*ni + .2*ni</span></div>
|
||||
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  <span class="comment">// pi + pj < .2*ni</span></div>
|
||||
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <span class="comment">//</span></div>
|
||||
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  <span class="comment">// Note that the negative UNL protocol introduced the AbsoluteMinimumQuorum</span></div>
|
||||
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <span class="comment">// which is 60% of the original UNL size. The effective quorum should</span></div>
|
||||
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  <span class="comment">// not be lower than it.</span></div>
|
||||
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  <span class="keyword">auto</span> <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a> = <span class="keyword">static_cast<</span><a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a><span class="keyword">></span>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a>(</div>
|
||||
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/numeric/math/ceil.html">std::ceil</a>(effectiveUnlSize * 0.8f), <a class="codeRef" href="http://en.cppreference.com/w/cpp/numeric/math/ceil.html">std::ceil</a>(unlSize * 0.6f)));</div>
|
||||
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>  </div>
|
||||
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  <span class="comment">// Use lower quorum specified via command line if the normal quorum appears</span></div>
|
||||
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  <span class="comment">// unreachable based on the number of recently received validations.</span></div>
|
||||
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#ac3bef5a420cac0a3c854398d22d79e01">minimumQuorum_</a> && *<a class="code" href="classripple_1_1ValidatorList.html#ac3bef5a420cac0a3c854398d22d79e01">minimumQuorum_</a> < <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a> && seenSize < <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a>)</div>
|
||||
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  {</div>
|
||||
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a> = *<a class="code" href="classripple_1_1ValidatorList.html#ac3bef5a420cac0a3c854398d22d79e01">minimumQuorum_</a>;</div>
|
||||
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  </div>
|
||||
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) << <span class="stringliteral">"Using unsafe quorum of "</span> << <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a></div>
|
||||
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  << <span class="stringliteral">" as specified in the command line"</span>;</div>
|
||||
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  }</div>
|
||||
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  </div>
|
||||
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a>;</div>
|
||||
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span> }</div>
|
||||
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  </div>
|
||||
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span> <a class="code" href="structripple_1_1TrustChanges.html">TrustChanges</a></div>
|
||||
<div class="line"><a name="l00897"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a890fcc8a3569fb40f0492606b2116fd8"> 897</a></span> <a class="code" href="classripple_1_1ValidatorList.html#a890fcc8a3569fb40f0492606b2116fd8">ValidatorList::updateTrusted</a>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set<NodeID></a> <span class="keyword">const</span>& seenValidators)</div>
|
||||
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span> {</div>
|
||||
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/unique_lock.html">std::unique_lock<std::shared_timed_mutex></a> lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
|
||||
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  </div>
|
||||
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  <span class="comment">// Remove any expired published lists</span></div>
|
||||
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& list : <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>)</div>
|
||||
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  {</div>
|
||||
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>  <span class="keywordflow">if</span> (list.second.available &&</div>
|
||||
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  list.second.expiration <= <a class="code" href="classripple_1_1ValidatorList.html#a390041ee5976df2e6b170a3c6eed5de5">timeKeeper_</a>.<a class="code" href="classripple_1_1TimeKeeper.html#af1b5d38f3ba1bcacfbb7a89979af70e4">now</a>())</div>
|
||||
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  <a class="code" href="classripple_1_1ValidatorList.html#a7204fee0608cd8491a7b1a7fbc611962">removePublisherList</a>(list.first);</div>
|
||||
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  }</div>
|
||||
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  </div>
|
||||
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  <a class="code" href="structripple_1_1TrustChanges.html">TrustChanges</a> trustChanges;</div>
|
||||
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  </div>
|
||||
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>  <span class="keyword">auto</span> it = <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.cbegin();</div>
|
||||
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  <span class="keywordflow">while</span> (it != <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.cend())</div>
|
||||
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  {</div>
|
||||
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  <span class="keywordflow">if</span> (!<a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.count(*it) || <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a6494e744b90cbecd735b460fcd7be82f">revoked</a>(*it))</div>
|
||||
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>  {</div>
|
||||
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>  trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">removed</a>.insert(<a class="code" href="namespaceripple.html#a984ddd646f1e1a5032a9a17f96c6fc55">calcNodeID</a>(*it));</div>
|
||||
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span>  it = <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.erase(it);</div>
|
||||
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>  }</div>
|
||||
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  <span class="keywordflow">else</span></div>
|
||||
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  {</div>
|
||||
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>  ++it;</div>
|
||||
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  }</div>
|
||||
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  }</div>
|
||||
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  </div>
|
||||
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& val : <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>)</div>
|
||||
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  {</div>
|
||||
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  <span class="keywordflow">if</span> (!<a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a6494e744b90cbecd735b460fcd7be82f">revoked</a>(val.first) &&</div>
|
||||
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.emplace(val.first).second)</div>
|
||||
<div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">added</a>.insert(<a class="code" href="namespaceripple.html#a984ddd646f1e1a5032a9a17f96c6fc55">calcNodeID</a>(val.first));</div>
|
||||
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  }</div>
|
||||
<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>  </div>
|
||||
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  <span class="comment">// If there were any changes, we need to update the ephemeral signing keys:</span></div>
|
||||
<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  <span class="keywordflow">if</span> (!trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">added</a>.empty() || !trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">removed</a>.empty())</div>
|
||||
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  {</div>
|
||||
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  <a class="code" href="classripple_1_1ValidatorList.html#ae06a469121f9f99ed9f3049e46d0206c">trustedSigningKeys_</a>.clear();</div>
|
||||
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  </div>
|
||||
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& k : <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>)</div>
|
||||
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  <a class="code" href="classripple_1_1ValidatorList.html#ae06a469121f9f99ed9f3049e46d0206c">trustedSigningKeys_</a>.insert(<a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a8409a7089c3e04f972f1513a54576133">getSigningKey</a>(k));</div>
|
||||
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  }</div>
|
||||
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  </div>
|
||||
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>  JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>())</div>
|
||||
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  << <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() << <span class="stringliteral">" of "</span> << <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.size()</div>
|
||||
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>  << <span class="stringliteral">" listed validators eligible for inclusion in the trusted set"</span>;</div>
|
||||
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  </div>
|
||||
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  <span class="keyword">auto</span> unlSize = <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size();</div>
|
||||
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  <span class="keyword">auto</span> effectiveUnlSize = unlSize;</div>
|
||||
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  <span class="keyword">auto</span> seenSize = seenValidators.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set/size.html">size</a>();</div>
|
||||
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  <span class="keywordflow">if</span> (!<a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>.empty())</div>
|
||||
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  {</div>
|
||||
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& k : <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>)</div>
|
||||
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  {</div>
|
||||
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>.count(k))</div>
|
||||
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  --effectiveUnlSize;</div>
|
||||
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  }</div>
|
||||
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set<NodeID></a> negUnlNodeIDs;</div>
|
||||
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& k : <a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>)</div>
|
||||
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  {</div>
|
||||
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>  negUnlNodeIDs.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set/emplace.html">emplace</a>(<a class="code" href="namespaceripple.html#a984ddd646f1e1a5032a9a17f96c6fc55">calcNodeID</a>(k));</div>
|
||||
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  }</div>
|
||||
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>& nid : seenValidators)</div>
|
||||
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  {</div>
|
||||
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  <span class="keywordflow">if</span> (negUnlNodeIDs.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set/count.html">count</a>(nid))</div>
|
||||
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  --seenSize;</div>
|
||||
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  }</div>
|
||||
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  }</div>
|
||||
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a> = <a class="code" href="classripple_1_1ValidatorList.html#a79545d89d7c7c5bfef7f15ce0510577b">calculateQuorum</a>(unlSize, effectiveUnlSize, seenSize);</div>
|
||||
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  </div>
|
||||
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) << <span class="stringliteral">"Using quorum of "</span> << <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a> << <span class="stringliteral">" for new set of "</span></div>
|
||||
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  << <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() << <span class="stringliteral">" trusted validators ("</span></div>
|
||||
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  << trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">added</a>.size() << <span class="stringliteral">" added, "</span></div>
|
||||
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  << trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">removed</a>.size() << <span class="stringliteral">" removed)"</span>;</div>
|
||||
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>  </div>
|
||||
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>  <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() < <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a>)</div>
|
||||
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>  {</div>
|
||||
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>  JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) << <span class="stringliteral">"New quorum of "</span> << <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a></div>
|
||||
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>  << <span class="stringliteral">" exceeds the number of trusted validators ("</span></div>
|
||||
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>  << <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() << <span class="stringliteral">")"</span>;</div>
|
||||
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>  }</div>
|
||||
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>  </div>
|
||||
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>  <span class="keywordflow">return</span> trustChanges;</div>
|
||||
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span> }</div>
|
||||
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  </div>
|
||||
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span> <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set<PublicKey></a></div>
|
||||
<div class="line"><a name="l00984"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a22bb356f3dff23879344acd8121abbe3"> 984</a></span> <a class="code" href="classripple_1_1ValidatorList.html#a22bb356f3dff23879344acd8121abbe3">ValidatorList::getTrustedMasterKeys</a>()<span class="keyword"> const</span></div>
|
||||
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span> <span class="keyword"></span>{</div>
|
||||
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
|
||||
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>;</div>
|
||||
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span> }</div>
|
||||
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  </div>
|
||||
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span> <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set<PublicKey></a></div>
|
||||
<div class="line"><a name="l00991"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#afef3dd7af8c40b51da43a945f632b4c5"> 991</a></span> <a class="code" href="classripple_1_1ValidatorList.html#afef3dd7af8c40b51da43a945f632b4c5">ValidatorList::getNegativeUNL</a>()<span class="keyword"> const</span></div>
|
||||
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span> <span class="keyword"></span>{</div>
|
||||
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
|
||||
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>;</div>
|
||||
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span> }</div>
|
||||
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>  </div>
|
||||
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span> <span class="keywordtype">void</span></div>
|
||||
<div class="line"><a name="l00998"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a3749eaabef35e6178bc74fc8dfe6f4a2"> 998</a></span> <a class="code" href="classripple_1_1ValidatorList.html#a3749eaabef35e6178bc74fc8dfe6f4a2">ValidatorList::setNegativeUNL</a>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set<PublicKey></a> <span class="keyword">const</span>& negUnl)</div>
|
||||
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span> {</div>
|
||||
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">std::lock_guard</a> lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
|
||||
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>  <a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a> = negUnl;</div>
|
||||
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span> }</div>
|
||||
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  </div>
|
||||
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span> <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector<std::shared_ptr<STValidation></a>></div>
|
||||
<div class="line"><a name="l01005"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a0937f06a5eddf696521deaef47192a32"> 1005</a></span> <a class="code" href="classripple_1_1ValidatorList.html#a0937f06a5eddf696521deaef47192a32">ValidatorList::negativeUNLFilter</a>(</div>
|
||||
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector</a><<a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr<STValidation></a>>&& validations)<span class="keyword"> const</span></div>
|
||||
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span> <span class="keyword"></span>{</div>
|
||||
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  <span class="comment">// Remove validations that are from validators on the negative UNL.</span></div>
|
||||
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  <span class="keyword">auto</span> ret = std::move(validations);</div>
|
||||
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  </div>
|
||||
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
|
||||
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  <span class="keywordflow">if</span> (!<a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>.empty())</div>
|
||||
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  {</div>
|
||||
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  ret.erase(</div>
|
||||
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>  <a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/remove.html">std::remove_if</a>(</div>
|
||||
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  ret.begin(),</div>
|
||||
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  ret.end(),</div>
|
||||
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  [&](<span class="keyword">auto</span> <span class="keyword">const</span>& v) -> <span class="keywordtype">bool</span> {</div>
|
||||
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  if (auto const masterKey =</div>
|
||||
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  getTrustedKey(v->getSignerPublic());</div>
|
||||
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  masterKey)</div>
|
||||
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  {</div>
|
||||
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  return negativeUNL_.count(*masterKey);</div>
|
||||
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>  }</div>
|
||||
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  <span class="keywordflow">else</span></div>
|
||||
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  {</div>
|
||||
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  return false;</div>
|
||||
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  }</div>
|
||||
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  }),</div>
|
||||
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  ret.end());</div>
|
||||
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  }</div>
|
||||
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  </div>
|
||||
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  <span class="keywordflow">return</span> ret;</div>
|
||||
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span> }</div>
|
||||
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>  </div>
|
||||
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span> } <span class="comment">// namespace ripple</span></div>
|
||||
</div><!-- fragment --></div><!-- contents -->
|
||||
<div class="ttc" id="aclassJson_1_1Value_html_aff51d8b52979ca06cf9d909accd5f695"><div class="ttname"><a href="classJson_1_1Value.html#aff51d8b52979ca06cf9d909accd5f695">Json::Value::isInt</a></div><div class="ttdeci">bool isInt() const</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l00979">json_value.cpp:979</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a9213779419ea7bb7e56f43512eedd68f"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a9213779419ea7bb7e56f43512eedd68f">ripple::ValidatorList::getListedKey</a></div><div class="ttdeci">boost::optional< PublicKey > getListedKey(PublicKey const &identity) const</div><div class="ttdoc">Returns listed master public if public key is included on any lists.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00570">ValidatorList.cpp:570</a></div></div>
|
||||
@@ -1136,15 +1137,15 @@ $(function() {
|
||||
<div class="ttc" id="asize_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/unordered_set/size.html">std::unordered_set::size</a></div><div class="ttdeci">T size(T... args)</div></div>
|
||||
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html_abe3ca53e334710876f40ecc72907d4e6"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html#abe3ca53e334710876f40ecc72907d4e6">ripple::ValidatorList::PublisherList::rawManifest</a></div><div class="ttdeci">std::string rawManifest</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00130">ValidatorList.h:130</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a90d8cf623e6011f148956964d0e09b9c"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a90d8cf623e6011f148956964d0e09b9c">ripple::ValidatorList::trustedPublisher</a></div><div class="ttdeci">bool trustedPublisher(PublicKey const &identity) const</div><div class="ttdoc">Returns true if public key is a trusted publisher.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00592">ValidatorList.cpp:592</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a3749eaabef35e6178bc74fc8dfe6f4a2"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a3749eaabef35e6178bc74fc8dfe6f4a2">ripple::ValidatorList::setNegativeUNL</a></div><div class="ttdeci">void setNegativeUNL(hash_set< PublicKey > const &negUnl)</div><div class="ttdoc">set the Negative UNL with validators' master public keys</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00997">ValidatorList.cpp:997</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a3749eaabef35e6178bc74fc8dfe6f4a2"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a3749eaabef35e6178bc74fc8dfe6f4a2">ripple::ValidatorList::setNegativeUNL</a></div><div class="ttdeci">void setNegativeUNL(hash_set< PublicKey > const &negUnl)</div><div class="ttdoc">set the Negative UNL with validators' master public keys</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00998">ValidatorList.cpp:998</a></div></div>
|
||||
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html">ripple::ValidatorList::PublisherListStats</a></div><div class="ttdoc">Describes the result of processing a Validator List (UNL), including some of the information from the...</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00185">ValidatorList.h:185</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a6aed606d8af8e7d638308232efd15f11"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">ripple::ValidatorList::negativeUNL_</a></div><div class="ttdeci">hash_set< PublicKey > negativeUNL_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00164">ValidatorList.h:164</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_af3c12788fe36cb6f48201d3c5a688d06"><div class="ttname"><a href="classripple_1_1ValidatorList.html#af3c12788fe36cb6f48201d3c5a688d06">ripple::ValidatorList::filePrefix_</a></div><div class="ttdeci">static const std::string filePrefix_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00168">ValidatorList.h:168</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a08a13b62b18272366f788632359e8793"><div class="ttname"><a href="namespaceripple.html#a08a13b62b18272366f788632359e8793">ripple::toBase58</a></div><div class="ttdeci">std::string toBase58(AccountID const &v)</div><div class="ttdoc">Convert AccountID to base58 checked string.</div><div class="ttdef"><b>Definition:</b> <a href="AccountID_8cpp_source.html#l00029">AccountID.cpp:29</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a890fcc8a3569fb40f0492606b2116fd8"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a890fcc8a3569fb40f0492606b2116fd8">ripple::ValidatorList::updateTrusted</a></div><div class="ttdeci">TrustChanges updateTrusted(hash_set< NodeID > const &seenValidators)</div><div class="ttdoc">Update trusted nodes.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00896">ValidatorList.cpp:896</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a890fcc8a3569fb40f0492606b2116fd8"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a890fcc8a3569fb40f0492606b2116fd8">ripple::ValidatorList::updateTrusted</a></div><div class="ttdeci">TrustChanges updateTrusted(hash_set< NodeID > const &seenValidators)</div><div class="ttdoc">Update trusted nodes.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00897">ValidatorList.cpp:897</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_acedaeedad936d4e850ade479e3de91cf"><div class="ttname"><a href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">ripple::ValidatorList::j_</a></div><div class="ttdeci">const beast::Journal j_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00141">ValidatorList.h:141</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1Slice_html_a9d49708cd15d24841b78dc0a9ecaac26"><div class="ttname"><a href="classripple_1_1Slice.html#a9d49708cd15d24841b78dc0a9ecaac26">ripple::Slice::data</a></div><div class="ttdeci">std::uint8_t const * data() const noexcept</div><div class="ttdoc">Return a pointer to beginning of the storage.</div><div class="ttdef"><b>Definition:</b> <a href="Slice_8h_source.html#l00096">Slice.h:96</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a22bb356f3dff23879344acd8121abbe3"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a22bb356f3dff23879344acd8121abbe3">ripple::ValidatorList::getTrustedMasterKeys</a></div><div class="ttdeci">hash_set< PublicKey > getTrustedMasterKeys() const</div><div class="ttdoc">get the trusted master public keys</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00983">ValidatorList.cpp:983</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a22bb356f3dff23879344acd8121abbe3"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a22bb356f3dff23879344acd8121abbe3">ripple::ValidatorList::getTrustedMasterKeys</a></div><div class="ttdeci">hash_set< PublicKey > getTrustedMasterKeys() const</div><div class="ttdoc">get the trusted master public keys</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00984">ValidatorList.cpp:984</a></div></div>
|
||||
<div class="ttc" id="aemplace_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/unordered_set/emplace.html">std::unordered_set::emplace</a></div><div class="ttdeci">T emplace(T... args)</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#l00327">Journal.h:327</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_ab2a2e3c9e0ca9a49469fd9298ae42bf7"><div class="ttname"><a href="classripple_1_1ValidatorList.html#ab2a2e3c9e0ca9a49469fd9298ae42bf7">ripple::ValidatorList::verify</a></div><div class="ttdeci">ListDisposition verify(Json::Value &list, PublicKey &pubKey, std::string const &manifest, std::string const &blob, std::string const &signature)</div><div class="ttdoc">Check response for trusted valid published list.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00491">ValidatorList.cpp:491</a></div></div>
|
||||
@@ -1193,17 +1194,17 @@ $(function() {
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_af8c342923da977e84631fd4c54380c6d"><div class="ttname"><a href="classripple_1_1ValidatorList.html#af8c342923da977e84631fd4c54380c6d">ripple::ValidatorList::requiredListVersion</a></div><div class="ttdeci">static constexpr std::uint32_t requiredListVersion</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00167">ValidatorList.h:167</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_afa2abec0b9e9eb4e96e4a4d948466cbd"><div class="ttname"><a href="classripple_1_1ValidatorList.html#afa2abec0b9e9eb4e96e4a4d948466cbd">ripple::ValidatorList::applyListAndBroadcast</a></div><div class="ttdeci">PublisherListStats applyListAndBroadcast(std::string const &manifest, std::string const &blob, std::string const &signature, std::uint32_t version, std::string siteUri, uint256 const &hash, Overlay &overlay, HashRouter &hashRouter)</div><div class="ttdoc">Apply published list of public keys, then broadcast it to all peers that have not seen it or sent it.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00233">ValidatorList.cpp:233</a></div></div>
|
||||
<div class="ttc" id="ainteger_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1HashRouter_html_a29980c0f77dcc002ef322c23080f3266"><div class="ttname"><a href="classripple_1_1HashRouter.html#a29980c0f77dcc002ef322c23080f3266">ripple::HashRouter::shouldRelay</a></div><div class="ttdeci">boost::optional< std::set< PeerShortID > > shouldRelay(uint256 const &key)</div><div class="ttdoc">Determines whether the hashed item should be relayed.</div><div class="ttdef"><b>Definition:</b> <a href="HashRouter_8cpp_source.html#l00112">HashRouter.cpp:112</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1HashRouter_html_a29980c0f77dcc002ef322c23080f3266"><div class="ttname"><a href="classripple_1_1HashRouter.html#a29980c0f77dcc002ef322c23080f3266">ripple::HashRouter::shouldRelay</a></div><div class="ttdeci">std::optional< std::set< PeerShortID > > shouldRelay(uint256 const &key)</div><div class="ttdoc">Determines whether the hashed item should be relayed.</div><div class="ttdef"><b>Definition:</b> <a href="HashRouter_8cpp_source.html#l00118">HashRouter.cpp:118</a></div></div>
|
||||
<div class="ttc" id="aforward_as_tuple_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/tuple/forward_as_tuple.html">std::forward_as_tuple</a></div><div class="ttdeci">T forward_as_tuple(T... args)</div></div>
|
||||
<div class="ttc" id="aremove_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/remove.html">std::remove_if</a></div><div class="ttdeci">T remove_if(T... args)</div></div>
|
||||
<div class="ttc" id="aclassripple_1_1TimeKeeper_html"><div class="ttname"><a href="classripple_1_1TimeKeeper.html">ripple::TimeKeeper</a></div><div class="ttdoc">Manages various times used by the server.</div><div class="ttdef"><b>Definition:</b> <a href="TimeKeeper_8h_source.html#l00032">TimeKeeper.h:32</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a2af01f2c39c66a1641045dd660e839b5"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a2af01f2c39c66a1641045dd660e839b5">ripple::ListDisposition::unsupported_version</a></div><div class="ttdeci">@ unsupported_version</div><div class="ttdoc">List version is not supported.</div></div>
|
||||
<div class="ttc" id="aceil_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/numeric/math/ceil.html">std::ceil</a></div><div class="ttdeci">T ceil(T... args)</div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a8a16d6f665a032453ec4cbfca01929b6afedb2d84cafe20862cb4399751a8a7e3"><div class="ttname"><a href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6afedb2d84cafe20862cb4399751a8a7e3">ripple::ManifestDisposition::invalid</a></div><div class="ttdeci">@ invalid</div><div class="ttdoc">Timely, but invalid signature.</div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a0937f06a5eddf696521deaef47192a32"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a0937f06a5eddf696521deaef47192a32">ripple::ValidatorList::negativeUNLFilter</a></div><div class="ttdeci">std::vector< std::shared_ptr< STValidation > > negativeUNLFilter(std::vector< std::shared_ptr< STValidation >> &&validations) const</div><div class="ttdoc">Remove validations that are from validators on the negative UNL.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01004">ValidatorList.cpp:1004</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a0937f06a5eddf696521deaef47192a32"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a0937f06a5eddf696521deaef47192a32">ripple::ValidatorList::negativeUNLFilter</a></div><div class="ttdeci">std::vector< std::shared_ptr< STValidation > > negativeUNLFilter(std::vector< std::shared_ptr< STValidation >> &&validations) const</div><div class="ttdoc">Remove validations that are from validators on the negative UNL.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01005">ValidatorList.cpp:1005</a></div></div>
|
||||
<div class="ttc" id="aclassJson_1_1Value_html_a1627eb9d6568d6d0252fa8bb711c0a59"><div class="ttname"><a href="classJson_1_1Value.html#a1627eb9d6568d6d0252fa8bb711c0a59">Json::Value::isArray</a></div><div class="ttdeci">bool isArray() const</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l01015">json_value.cpp:1015</a></div></div>
|
||||
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html_a6995e4adf4fc3157d5333f659d409b4a"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html#a6995e4adf4fc3157d5333f659d409b4a">ripple::ValidatorList::PublisherList::rawBlob</a></div><div class="ttdeci">std::string rawBlob</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00131">ValidatorList.h:131</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a79545d89d7c7c5bfef7f15ce0510577b"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a79545d89d7c7c5bfef7f15ce0510577b">ripple::ValidatorList::calculateQuorum</a></div><div class="ttdeci">std::size_t calculateQuorum(std::size_t unlSize, std::size_t effectiveUnlSize, std::size_t seenSize)</div><div class="ttdoc">Return quorum for trusted validator set.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00832">ValidatorList.cpp:832</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a79545d89d7c7c5bfef7f15ce0510577b"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a79545d89d7c7c5bfef7f15ce0510577b">ripple::ValidatorList::calculateQuorum</a></div><div class="ttdeci">std::size_t calculateQuorum(std::size_t unlSize, std::size_t effectiveUnlSize, std::size_t seenSize)</div><div class="ttdoc">Return quorum for trusted validator set.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00833">ValidatorList.cpp:833</a></div></div>
|
||||
<div class="ttc" id="anamespaceripple_html_a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470"><div class="ttname"><a href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470">ripple::ManifestDisposition::accepted</a></div><div class="ttdeci">@ accepted</div><div class="ttdoc">Manifest is valid.</div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_ae572133b799990fc68d8071e6b835b39"><div class="ttname"><a href="classripple_1_1ValidatorList.html#ae572133b799990fc68d8071e6b835b39">ripple::ValidatorList::localPubKey_</a></div><div class="ttdeci">PublicKey localPubKey_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00161">ValidatorList.h:161</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ManifestCache_html"><div class="ttname"><a href="classripple_1_1ManifestCache.html">ripple::ManifestCache</a></div><div class="ttdoc">Remembers manifests with the highest sequence number.</div><div class="ttdef"><b>Definition:</b> <a href="Manifest_8h_source.html#l00209">Manifest.h:209</a></div></div>
|
||||
@@ -1237,7 +1238,7 @@ $(function() {
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a608e1393a7167c3eab922c3842c17f0d"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a608e1393a7167c3eab922c3842c17f0d">ripple::ValidatorList::expires</a></div><div class="ttdeci">boost::optional< TimeKeeper::time_point > expires() const</div><div class="ttdoc">Return the time when the validator list will expire.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00641">ValidatorList.cpp:641</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a9de7a870beb3104dc8320d6367b7f7e8"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8">ripple::ValidatorList::trusted</a></div><div class="ttdeci">bool trusted(PublicKey const &identity) const</div><div class="ttdoc">Returns true if public key is trusted.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00561">ValidatorList.cpp:561</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a623a1124f621b9ee5745bd22094b4acb"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">ripple::ValidatorList::trustedMasterKeys_</a></div><div class="ttdeci">hash_set< PublicKey > trustedMasterKeys_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00154">ValidatorList.h:154</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_afef3dd7af8c40b51da43a945f632b4c5"><div class="ttname"><a href="classripple_1_1ValidatorList.html#afef3dd7af8c40b51da43a945f632b4c5">ripple::ValidatorList::getNegativeUNL</a></div><div class="ttdeci">hash_set< PublicKey > getNegativeUNL() const</div><div class="ttdoc">get the master public keys of Negative UNL validators</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00990">ValidatorList.cpp:990</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_afef3dd7af8c40b51da43a945f632b4c5"><div class="ttname"><a href="classripple_1_1ValidatorList.html#afef3dd7af8c40b51da43a945f632b4c5">ripple::ValidatorList::getNegativeUNL</a></div><div class="ttdeci">hash_set< PublicKey > getNegativeUNL() const</div><div class="ttdoc">get the master public keys of Negative UNL validators</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00991">ValidatorList.cpp:991</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a002fda13878b813249f3fd49e64577fd"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">ripple::ValidatorList::count</a></div><div class="ttdeci">std::size_t count() const</div><div class="ttdoc">Return the number of configured validator list sites.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00634">ValidatorList.cpp:634</a></div></div>
|
||||
<div class="ttc" id="aclassripple_1_1ManifestCache_html_a882c588d2f26d7d61ae3ffe4212cbae0"><div class="ttname"><a href="classripple_1_1ManifestCache.html#a882c588d2f26d7d61ae3ffe4212cbae0">ripple::ManifestCache::applyManifest</a></div><div class="ttdeci">ManifestDisposition applyManifest(Manifest m)</div><div class="ttdoc">Add manifest to cache.</div><div class="ttdef"><b>Definition:</b> <a href="app_2misc_2impl_2Manifest_8cpp_source.html#l00361">app/misc/impl/Manifest.cpp:361</a></div></div>
|
||||
<div class="ttc" id="ashared_mutex_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/shared_mutex.html">shared_mutex</a></div></div>
|
||||
|
||||
Reference in New Issue
Block a user