This commit is contained in:
nbougalis
2020-09-08 17:09:25 +00:00
parent 624d5a38ad
commit 2682e5845e
2596 changed files with 124385 additions and 94582 deletions

View File

@@ -891,219 +891,220 @@ $(function() {
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; </div>
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; <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>&#160; </div>
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; value[<span class="stringliteral">&quot;manifest&quot;</span>] = iter-&gt;second.rawManifest;</div>
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; value[<span class="stringliteral">&quot;blob&quot;</span>] = iter-&gt;second.rawBlob;</div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; value[<span class="stringliteral">&quot;signature&quot;</span>] = iter-&gt;second.rawSignature;</div>
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; value[<span class="stringliteral">&quot;version&quot;</span>] = iter-&gt;second.rawVersion;</div>
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; </div>
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; <span class="keywordflow">return</span> value;</div>
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160;}</div>
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; </div>
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160;<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>&#160;<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>&#160; <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>&#160; <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>&#160; <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>&#160;{</div>
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>&#160; <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>&#160; <span class="comment">// publishers are available</span></div>
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; 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>&#160; {</div>
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; <span class="keywordflow">if</span> (!list.second.available)</div>
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160; <span class="keywordflow">return</span> <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/numeric_limits/max.html">std::numeric_limits&lt;std::size_t&gt;::max</a>();</div>
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; }</div>
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160; </div>
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; <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>&#160; <span class="comment">// overlap.</span></div>
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160; <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>&#160; <span class="comment">// (https://arxiv.org/abs/1802.07242) says:</span></div>
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160; <span class="comment">// XRP LCP guarantees fork safety if Oi,j &gt; nj/2 + ni qi + ti,j for</span></div>
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160; <span class="comment">// every pair of nodes Pi, Pj.</span></div>
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160; <span class="comment">// ni: size of Pi&#39;s UNL</span></div>
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; <span class="comment">// nj: size of Pj&#39;s UNL</span></div>
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; <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>&#160; <span class="comment">// qi: validation quorum for Pi&#39;s UNL</span></div>
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160; <span class="comment">// ti, tj: maximum number of allowed Byzantine faults in Pi and Pj&#39;s UNLs</span></div>
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160; <span class="comment">// ti,j: min{ti, tj, Oi,j}</span></div>
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; <span class="comment">// Assume ni &lt; nj, meaning and ti,j = ti</span></div>
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; <span class="comment">// For qi = .8*ni, we make ti &lt;= .2*ni</span></div>
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; <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>&#160; <span class="comment">// to prioritize safety over liveness, we need ti &gt;= ni - qi)</span></div>
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; <span class="comment">// An 80% quorum allows two UNLs to safely have &lt; .2*ni unique validators</span></div>
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; <span class="comment">// between them:</span></div>
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160; <span class="comment">// pi = ni - Oi,j</span></div>
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160; <span class="comment">// pj = nj - Oi,j</span></div>
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160; <span class="comment">// Oi,j &gt; nj/2 + ni qi + ti,j</span></div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; <span class="comment">// ni - pi &gt; (ni - pi + pj)/2 + ni .8*ni + .2*ni</span></div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; <span class="comment">// pi + pj &lt; .2*ni</span></div>
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160; <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>&#160; <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>&#160; <span class="comment">// not be lower than it.</span></div>
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; <span class="keyword">auto</span> <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a> = <span class="keyword">static_cast&lt;</span><a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a><span class="keyword">&gt;</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>&#160; <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>&#160; </div>
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160; <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>&#160; <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>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#ac3bef5a420cac0a3c854398d22d79e01">minimumQuorum_</a> &amp;&amp; *<a class="code" href="classripple_1_1ValidatorList.html#ac3bef5a420cac0a3c854398d22d79e01">minimumQuorum_</a> &lt; <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a> &amp;&amp; seenSize &lt; <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a>)</div>
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; {</div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; <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>&#160; </div>
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;Using unsafe quorum of &quot;</span> &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a></div>
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160; &lt;&lt; <span class="stringliteral">&quot; as specified in the command line&quot;</span>;</div>
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160; }</div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160; </div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; <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>&#160;}</div>
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>&#160; </div>
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>&#160;<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>&#160;<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&lt;NodeID&gt;</a> <span class="keyword">const</span>&amp; seenValidators)</div>
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>&#160;{</div>
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/unique_lock.html">std::unique_lock&lt;std::shared_timed_mutex&gt;</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>&#160; </div>
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>&#160; <span class="comment">// Remove any expired published lists</span></div>
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; 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>&#160; {</div>
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>&#160; <span class="keywordflow">if</span> (list.second.available &amp;&amp;</div>
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160; list.second.expiration &lt;= <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>&#160; <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>&#160; }</div>
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160; </div>
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; <a class="code" href="structripple_1_1TrustChanges.html">TrustChanges</a> trustChanges;</div>
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; </div>
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>&#160; <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>&#160; <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>&#160; {</div>
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160; <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>&#160; {</div>
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; 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>&#160; 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>&#160; }</div>
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; {</div>
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160; ++it;</div>
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160; }</div>
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; }</div>
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160; </div>
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; 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>&#160; {</div>
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160; <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) &amp;&amp;</div>
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; <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>&#160; 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>&#160; }</div>
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>&#160; </div>
<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>&#160; <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>&#160; <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>&#160; {</div>
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>&#160; <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>&#160; </div>
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; 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>&#160; <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>&#160; }</div>
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160; </div>
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; 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>&#160; &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() &lt;&lt; <span class="stringliteral">&quot; of &quot;</span> &lt;&lt; <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>&#160; &lt;&lt; <span class="stringliteral">&quot; listed validators eligible for inclusion in the trusted set&quot;</span>;</div>
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160; </div>
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160; <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>&#160; <span class="keyword">auto</span> effectiveUnlSize = unlSize;</div>
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>&#160; <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>&#160; <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>&#160; {</div>
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; 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>&#160; {</div>
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>&#160; <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>&#160; --effectiveUnlSize;</div>
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>&#160; }</div>
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set&lt;NodeID&gt;</a> negUnlNodeIDs;</div>
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; 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>&#160; {</div>
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160; 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>&#160; }</div>
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; nid : seenValidators)</div>
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160; {</div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; <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>&#160; --seenSize;</div>
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>&#160; }</div>
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160; }</div>
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; <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>&#160; </div>
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Using quorum of &quot;</span> &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a> &lt;&lt; <span class="stringliteral">&quot; for new set of &quot;</span></div>
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160; &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() &lt;&lt; <span class="stringliteral">&quot; trusted validators (&quot;</span></div>
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; &lt;&lt; trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">added</a>.size() &lt;&lt; <span class="stringliteral">&quot; added, &quot;</span></div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; &lt;&lt; trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">removed</a>.size() &lt;&lt; <span class="stringliteral">&quot; removed)&quot;</span>;</div>
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; </div>
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() &lt; <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a>)</div>
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160; {</div>
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;New quorum of &quot;</span> &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a></div>
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>&#160; &lt;&lt; <span class="stringliteral">&quot; exceeds the number of trusted validators (&quot;</span></div>
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>&#160; &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() &lt;&lt; <span class="stringliteral">&quot;)&quot;</span>;</div>
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>&#160; }</div>
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; </div>
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160; <span class="keywordflow">return</span> trustChanges;</div>
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160;}</div>
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160; </div>
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set&lt;PublicKey&gt;</a></div>
<div class="line"><a name="l00983"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a22bb356f3dff23879344acd8121abbe3"> 983</a></span>&#160;<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>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>&#160; <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>&#160; <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>&#160;}</div>
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>&#160; </div>
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set&lt;PublicKey&gt;</a></div>
<div class="line"><a name="l00990"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#afef3dd7af8c40b51da43a945f632b4c5"> 990</a></span>&#160;<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>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160; <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>&#160; <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>&#160;}</div>
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>&#160; </div>
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>&#160;<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>&#160;<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&lt;PublicKey&gt;</a> <span class="keyword">const</span>&amp; negUnl)</div>
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span>&#160;{</div>
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>&#160; <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>&#160; <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>&#160;}</div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160; </div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::shared_ptr&lt;STValidation&gt;</a>&gt;</div>
<div class="line"><a name="l01004"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a0937f06a5eddf696521deaef47192a32"> 1004</a></span>&#160;<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>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector</a>&lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;STValidation&gt;</a>&gt;&amp;&amp; validations)<span class="keyword"> const</span></div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160; <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>&#160; <span class="keyword">auto</span> ret = std::move(validations);</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160; </div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160; <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>&#160; <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>&#160; {</div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; ret.erase(</div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; <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>&#160; ret.begin(),</div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; ret.end(),</div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; [&amp;](<span class="keyword">auto</span> <span class="keyword">const</span>&amp; v) -&gt; <span class="keywordtype">bool</span> {</div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160; if (auto const masterKey =</div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; getTrustedKey(v-&gt;getSignerPublic());</div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160; masterKey)</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160; {</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; return negativeUNL_.count(*masterKey);</div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160; }</div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160; {</div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160; return false;</div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; }</div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160; }),</div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160; ret.end());</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160; }</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160; </div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160; <span class="keywordflow">return</span> ret;</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;}</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160; </div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;} <span class="comment">// namespace ripple</span></div>
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; 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>&#160; value[jss::manifest] = iter-&gt;second.rawManifest;</div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; value[jss::blob] = iter-&gt;second.rawBlob;</div>
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; value[jss::signature] = iter-&gt;second.rawSignature;</div>
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; value[jss::version] = iter-&gt;second.rawVersion;</div>
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; </div>
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; <span class="keywordflow">return</span> value;</div>
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160;}</div>
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; </div>
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160;<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>&#160;<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>&#160; <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>&#160; <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>&#160; <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>&#160;{</div>
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>&#160; <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>&#160; <span class="comment">// publishers are available</span></div>
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; 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>&#160; {</div>
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160; <span class="keywordflow">if</span> (!list.second.available)</div>
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; <span class="keywordflow">return</span> <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/numeric_limits/max.html">std::numeric_limits&lt;std::size_t&gt;::max</a>();</div>
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160; }</div>
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; </div>
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160; <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>&#160; <span class="comment">// overlap.</span></div>
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; <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>&#160; <span class="comment">// (https://arxiv.org/abs/1802.07242) says:</span></div>
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160; <span class="comment">// XRP LCP guarantees fork safety if Oi,j &gt; nj/2 + ni qi + ti,j for</span></div>
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; <span class="comment">// every pair of nodes Pi, Pj.</span></div>
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; <span class="comment">// ni: size of Pi&#39;s UNL</span></div>
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; <span class="comment">// nj: size of Pj&#39;s UNL</span></div>
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160; <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>&#160; <span class="comment">// qi: validation quorum for Pi&#39;s UNL</span></div>
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160; <span class="comment">// ti, tj: maximum number of allowed Byzantine faults in Pi and Pj&#39;s UNLs</span></div>
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; <span class="comment">// ti,j: min{ti, tj, Oi,j}</span></div>
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; <span class="comment">// Assume ni &lt; nj, meaning and ti,j = ti</span></div>
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; <span class="comment">// For qi = .8*ni, we make ti &lt;= .2*ni</span></div>
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; <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>&#160; <span class="comment">// to prioritize safety over liveness, we need ti &gt;= ni - qi)</span></div>
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; <span class="comment">// An 80% quorum allows two UNLs to safely have &lt; .2*ni unique validators</span></div>
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160; <span class="comment">// between them:</span></div>
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160; <span class="comment">// pi = ni - Oi,j</span></div>
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; <span class="comment">// pj = nj - Oi,j</span></div>
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; <span class="comment">// Oi,j &gt; nj/2 + ni qi + ti,j</span></div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; <span class="comment">// ni - pi &gt; (ni - pi + pj)/2 + ni .8*ni + .2*ni</span></div>
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; <span class="comment">// pi + pj &lt; .2*ni</span></div>
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>&#160; <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>&#160; <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>&#160; <span class="comment">// not be lower than it.</span></div>
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; <span class="keyword">auto</span> <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a> = <span class="keyword">static_cast&lt;</span><a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a><span class="keyword">&gt;</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>&#160; <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>&#160; </div>
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160; <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>&#160; <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>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#ac3bef5a420cac0a3c854398d22d79e01">minimumQuorum_</a> &amp;&amp; *<a class="code" href="classripple_1_1ValidatorList.html#ac3bef5a420cac0a3c854398d22d79e01">minimumQuorum_</a> &lt; <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a> &amp;&amp; seenSize &lt; <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a>)</div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; {</div>
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; <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>&#160; </div>
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;Using unsafe quorum of &quot;</span> &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a></div>
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160; &lt;&lt; <span class="stringliteral">&quot; as specified in the command line&quot;</span>;</div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160; }</div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; </div>
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160; <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>&#160;}</div>
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>&#160; </div>
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>&#160;<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>&#160;<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&lt;NodeID&gt;</a> <span class="keyword">const</span>&amp; seenValidators)</div>
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160;{</div>
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/unique_lock.html">std::unique_lock&lt;std::shared_timed_mutex&gt;</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>&#160; </div>
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160; <span class="comment">// Remove any expired published lists</span></div>
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; 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>&#160; {</div>
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160; <span class="keywordflow">if</span> (list.second.available &amp;&amp;</div>
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>&#160; list.second.expiration &lt;= <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>&#160; <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>&#160; }</div>
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; </div>
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; <a class="code" href="structripple_1_1TrustChanges.html">TrustChanges</a> trustChanges;</div>
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>&#160; </div>
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160; <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>&#160; <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>&#160; {</div>
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; <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>&#160; {</div>
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160; 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>&#160; 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>&#160; }</div>
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160; {</div>
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160; ++it;</div>
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; }</div>
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160; }</div>
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160; </div>
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; 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>&#160; {</div>
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; <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) &amp;&amp;</div>
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>&#160; <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>&#160; 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>&#160; }</div>
<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>&#160; </div>
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>&#160; <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>&#160; <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>&#160; {</div>
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>&#160; <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>&#160; </div>
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; 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>&#160; <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>&#160; }</div>
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; </div>
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160; 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>&#160; &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() &lt;&lt; <span class="stringliteral">&quot; of &quot;</span> &lt;&lt; <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>&#160; &lt;&lt; <span class="stringliteral">&quot; listed validators eligible for inclusion in the trusted set&quot;</span>;</div>
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160; </div>
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; <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>&#160; <span class="keyword">auto</span> effectiveUnlSize = unlSize;</div>
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; <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>&#160; <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>&#160; {</div>
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; 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>&#160; {</div>
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>&#160; <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>&#160; --effectiveUnlSize;</div>
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160; }</div>
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set&lt;NodeID&gt;</a> negUnlNodeIDs;</div>
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; 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>&#160; {</div>
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160; 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>&#160; }</div>
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; nid : seenValidators)</div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; {</div>
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160; <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>&#160; --seenSize;</div>
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160; }</div>
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; }</div>
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>&#160; <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>&#160; </div>
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Using quorum of &quot;</span> &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a> &lt;&lt; <span class="stringliteral">&quot; for new set of &quot;</span></div>
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() &lt;&lt; <span class="stringliteral">&quot; trusted validators (&quot;</span></div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; &lt;&lt; trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">added</a>.size() &lt;&lt; <span class="stringliteral">&quot; added, &quot;</span></div>
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; &lt;&lt; trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">removed</a>.size() &lt;&lt; <span class="stringliteral">&quot; removed)&quot;</span>;</div>
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160; </div>
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() &lt; <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a>)</div>
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160; {</div>
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;New quorum of &quot;</span> &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a></div>
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>&#160; &lt;&lt; <span class="stringliteral">&quot; exceeds the number of trusted validators (&quot;</span></div>
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>&#160; &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() &lt;&lt; <span class="stringliteral">&quot;)&quot;</span>;</div>
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; }</div>
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160; </div>
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160; <span class="keywordflow">return</span> trustChanges;</div>
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160;}</div>
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160; </div>
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set&lt;PublicKey&gt;</a></div>
<div class="line"><a name="l00984"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a22bb356f3dff23879344acd8121abbe3"> 984</a></span>&#160;<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>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span>&#160; <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>&#160; <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>&#160;}</div>
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160; </div>
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set&lt;PublicKey&gt;</a></div>
<div class="line"><a name="l00991"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#afef3dd7af8c40b51da43a945f632b4c5"> 991</a></span>&#160;<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>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>&#160; <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>&#160; <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>&#160;}</div>
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>&#160; </div>
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span>&#160;<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>&#160;<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&lt;PublicKey&gt;</a> <span class="keyword">const</span>&amp; negUnl)</div>
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>&#160;{</div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160; <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>&#160; <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>&#160;}</div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160; </div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::shared_ptr&lt;STValidation&gt;</a>&gt;</div>
<div class="line"><a name="l01005"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a0937f06a5eddf696521deaef47192a32"> 1005</a></span>&#160;<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>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector</a>&lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;STValidation&gt;</a>&gt;&amp;&amp; validations)<span class="keyword"> const</span></div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160; <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>&#160; <span class="keyword">auto</span> ret = std::move(validations);</div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160; </div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160; <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>&#160; <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>&#160; {</div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; ret.erase(</div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160; <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>&#160; ret.begin(),</div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; ret.end(),</div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160; [&amp;](<span class="keyword">auto</span> <span class="keyword">const</span>&amp; v) -&gt; <span class="keywordtype">bool</span> {</div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; if (auto const masterKey =</div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160; getTrustedKey(v-&gt;getSignerPublic());</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160; masterKey)</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; {</div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160; return negativeUNL_.count(*masterKey);</div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160; }</div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160; {</div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; return false;</div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160; }</div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160; }),</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160; ret.end());</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160; }</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160; </div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160; <span class="keywordflow">return</span> ret;</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160;}</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160; </div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160;} <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&lt; PublicKey &gt; getListedKey(PublicKey const &amp;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 &amp;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&lt; PublicKey &gt; const &amp;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&lt; PublicKey &gt; const &amp;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&lt; PublicKey &gt; 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 &amp;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&lt; NodeID &gt; const &amp;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&lt; NodeID &gt; const &amp;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&lt; PublicKey &gt; 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&lt; PublicKey &gt; 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 &amp;list, PublicKey &amp;pubKey, std::string const &amp;manifest, std::string const &amp;blob, std::string const &amp;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 &amp;manifest, std::string const &amp;blob, std::string const &amp;signature, std::uint32_t version, std::string siteUri, uint256 const &amp;hash, Overlay &amp;overlay, HashRouter &amp;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&lt; std::set&lt; PeerShortID &gt; &gt; shouldRelay(uint256 const &amp;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&lt; std::set&lt; PeerShortID &gt; &gt; shouldRelay(uint256 const &amp;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&lt; std::shared_ptr&lt; STValidation &gt; &gt; negativeUNLFilter(std::vector&lt; std::shared_ptr&lt; STValidation &gt;&gt; &amp;&amp;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&lt; std::shared_ptr&lt; STValidation &gt; &gt; negativeUNLFilter(std::vector&lt; std::shared_ptr&lt; STValidation &gt;&gt; &amp;&amp;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&lt; TimeKeeper::time_point &gt; 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 &amp;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&lt; PublicKey &gt; 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&lt; PublicKey &gt; 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&lt; PublicKey &gt; 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>