This commit is contained in:
seelabs
2021-11-19 13:45:43 +00:00
parent e4e2fce0b3
commit ef77e7e117
3534 changed files with 54687 additions and 52679 deletions

View File

@@ -158,139 +158,140 @@ $(function() {
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; </div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; JLOG(j_.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;Unable to determine hash of ancestor seq=&quot;</span> &lt;&lt; s</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; &lt;&lt; <span class="stringliteral">&quot; from ledger hash=&quot;</span> &lt;&lt; ledgerID_</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; &lt;&lt; <span class="stringliteral">&quot; seq=&quot;</span> &lt;&lt; ledgerSeq_;</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="comment">// Default ID that is less than all others</span></div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1base__uint.html">ID</a>{0};</div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;}</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; </div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160;<span class="comment">// Return the sequence number of the earliest possible mismatching ancestor</span></div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">RCLValidatedLedger::Seq</a></div>
<div class="line"><a name="l00097"></a><span class="lineno"><a class="line" href="namespaceripple.html#a509e1a7f41988fd7a09eb0bf94795967"> 97</a></span>&#160;<a class="code" href="namespaceripple.html#a509e1a7f41988fd7a09eb0bf94795967">mismatch</a>(<a class="code" href="classripple_1_1RCLValidatedLedger.html">RCLValidatedLedger</a> <span class="keyword">const</span>&amp; a, <a class="code" href="classripple_1_1RCLValidatedLedger.html">RCLValidatedLedger</a> <span class="keyword">const</span>&amp; b)</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;{</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keyword">using</span> Seq = <a class="code" href="classripple_1_1RCLValidatedLedger.html#a000286029eaff7f1f18cf602c33a05f3">RCLValidatedLedger::Seq</a>;</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; </div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="comment">// Find overlapping interval for known sequence for the ledgers</span></div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; Seq <span class="keyword">const</span> lower = <a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a>(a.<a class="code" href="classripple_1_1RCLValidatedLedger.html#a747d2543e7058fdc2ef7c2f2f75340b8">minSeq</a>(), b.<a class="code" href="classripple_1_1RCLValidatedLedger.html#a747d2543e7058fdc2ef7c2f2f75340b8">minSeq</a>());</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; Seq <span class="keyword">const</span> upper = <a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/min.html">std::min</a>(a.<a class="code" href="classripple_1_1RCLValidatedLedger.html#ac390ca267febb71a61e9fcdbaca0f3c2">seq</a>(), b.<a class="code" href="classripple_1_1RCLValidatedLedger.html#ac390ca267febb71a61e9fcdbaca0f3c2">seq</a>());</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; </div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; Seq curr = upper;</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordflow">while</span> (curr != Seq{0} &amp;&amp; a[curr] != b[curr] &amp;&amp; curr &gt;= lower)</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; --curr;</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; </div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="comment">// If the searchable interval mismatches entirely, then we have to</span></div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="comment">// assume the ledgers mismatch starting post genesis ledger</span></div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keywordflow">return</span> (curr &lt; lower) ? Seq{1} : (curr + Seq{1});</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160;}</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; </div>
<div class="line"><a name="l00114"></a><span class="lineno"><a class="line" href="classripple_1_1RCLValidationsAdaptor.html#a642615a5ff0015b5cd42b215018f316f"> 114</a></span>&#160;<a class="code" href="classripple_1_1RCLValidationsAdaptor.html#a642615a5ff0015b5cd42b215018f316f">RCLValidationsAdaptor::RCLValidationsAdaptor</a>(<a class="code" href="classripple_1_1Application.html">Application</a>&amp; app, <a class="code" href="classbeast_1_1Journal.html">beast::Journal</a> j)</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; : app_(app), j_(j)</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;{</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160;}</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; </div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/chrono/time_point.html">NetClock::time_point</a></div>
<div class="line"><a name="l00120"></a><span class="lineno"><a class="line" href="classripple_1_1RCLValidationsAdaptor.html#a71524d4aa1389ba9021de51a375b5e82"> 120</a></span>&#160;<a class="code" href="classripple_1_1RCLValidationsAdaptor.html#a71524d4aa1389ba9021de51a375b5e82">RCLValidationsAdaptor::now</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1RCLValidationsAdaptor.html#a9d4064e21779edb561efd60fc7ad92af">app_</a>.<a class="code" href="classripple_1_1Application.html#a280004d4cce56d8f1ec4664950aa58d4">timeKeeper</a>().<a class="code" href="classripple_1_1TimeKeeper.html#a106491f0751b8c2c75978a4d1f7aa0e6">closeTime</a>();</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;}</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; </div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;RCLValidatedLedger&gt;</a></div>
<div class="line"><a name="l00126"></a><span class="lineno"><a class="line" href="classripple_1_1RCLValidationsAdaptor.html#a1165a5474d2df3d127171a8ff7af3659"> 126</a></span>&#160;<a class="code" href="classripple_1_1RCLValidationsAdaptor.html#a1165a5474d2df3d127171a8ff7af3659">RCLValidationsAdaptor::acquire</a>(<a class="code" href="classripple_1_1base__uint.html">LedgerHash</a> <span class="keyword">const</span>&amp; hash)</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;{</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keyword">auto</span> ledger = <a class="code" href="classripple_1_1RCLValidationsAdaptor.html#a9d4064e21779edb561efd60fc7ad92af">app_</a>.<a class="code" href="classripple_1_1Application.html#a57929fa83c551514e364fe6981b0c104">getLedgerMaster</a>().<a class="code" href="classripple_1_1LedgerMaster.html#a5f99fb5737062937149e4e33a95ffd06">getLedgerByHash</a>(hash);</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keywordflow">if</span> (!ledger)</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; {</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; JLOG(<a class="code" href="classripple_1_1RCLValidationsAdaptor.html#abe09a632ad7bb4fb77c1ce0cce5fd580">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>())</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Need validated ledger for preferred ledger analysis &quot;</span> &lt;&lt; hash;</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; </div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <a class="code" href="classripple_1_1Application.html">Application</a>* pApp = &amp;<a class="code" href="classripple_1_1RCLValidationsAdaptor.html#a9d4064e21779edb561efd60fc7ad92af">app_</a>;</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; </div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <a class="code" href="classripple_1_1RCLValidationsAdaptor.html#a9d4064e21779edb561efd60fc7ad92af">app_</a>.<a class="code" href="classripple_1_1Application.html#a860be08979e27d8c6f37f722f996ba6c">getJobQueue</a>().<a class="code" href="classripple_1_1JobQueue.html#af5e34187d55aa58e551dc196aaf1ec25">addJob</a>(</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <a class="code" href="namespaceripple.html#ae0f54f8ce649d639bf3e2b295347e17aac6876ad6800d8cd0a4c9a306baf35204">jtADVANCE</a>, <span class="stringliteral">&quot;getConsensusLedger&quot;</span>, [pApp, hash](<a class="code" href="classripple_1_1Job.html">Job</a>&amp;) {</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; pApp-&gt;<a class="code" href="classripple_1_1Application.html#a6d349a4ada03689eae062c0399762dad">getInboundLedgers</a>().<a class="code" href="classripple_1_1RCLValidationsAdaptor.html#a1165a5474d2df3d127171a8ff7af3659">acquire</a>(</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; hash, 0, <a class="code" href="classripple_1_1InboundLedger.html#a3e8d7f8b5fa089a184dcc9b00b6e0da7a6ea28b46407abd2931a73c789ecdd944">InboundLedger::Reason::CONSENSUS</a>);</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; });</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <span class="keywordflow">return</span> std::nullopt;</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; }</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; </div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; assert(!ledger-&gt;open() &amp;&amp; ledger-&gt;isImmutable());</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; assert(ledger-&gt;info().hash == hash);</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; </div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1RCLValidatedLedger.html">RCLValidatedLedger</a>(std::move(ledger), <a class="code" href="classripple_1_1RCLValidationsAdaptor.html#abe09a632ad7bb4fb77c1ce0cce5fd580">j_</a>);</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160;}</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; </div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00151"></a><span class="lineno"><a class="line" href="namespaceripple.html#a5be750120b2129bbf4ec4fccb592de4c"> 151</a></span>&#160;<a class="code" href="namespaceripple.html#a5be750120b2129bbf4ec4fccb592de4c">handleNewValidation</a>(</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <a class="code" href="classripple_1_1Application.html">Application</a>&amp; app,</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;STValidation&gt;</a> <span class="keyword">const</span>&amp; val,</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; source)</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160;{</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; signingKey = val-&gt;<a class="code" href="classripple_1_1STValidation.html#a97202fcb263c9f938f4782d73626309c">getSignerPublic</a>();</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; hash = val-&gt;<a class="code" href="classripple_1_1STValidation.html#abdf587b8dd5331ad1517f4e1969a8662">getLedgerHash</a>();</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> seq = val-&gt;<a class="code" href="classripple_1_1STObject.html#a55d1b6946f96a770f3b2195eb5a5a943">getFieldU32</a>(<a class="code" href="namespaceripple.html#a4a189668d64758cfcac4022778e496f5">sfLedgerSequence</a>);</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; </div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="comment">// Ensure validation is marked as trusted if signer currently trusted</span></div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="keyword">auto</span> masterKey = app.<a class="code" href="classripple_1_1Application.html#ae209b3dfe3f3427b569c2414c9a79686">validators</a>().<a class="code" href="classripple_1_1ValidatorList.html#a0056ded6793baf9fda1c2f1fcffc535b">getTrustedKey</a>(signingKey);</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; </div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keywordflow">if</span> (!val-&gt;<a class="code" href="classripple_1_1STValidation.html#a6b9786a473556f9d3730a17c09fa6c8f">isTrusted</a>() &amp;&amp; masterKey)</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; val-&gt;<a class="code" href="classripple_1_1STValidation.html#aa74bbce4c07518d33fc25b60f841e22e">setTrusted</a>();</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; </div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <span class="comment">// If not currently trusted, see if signer is currently listed</span></div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="keywordflow">if</span> (!masterKey)</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; masterKey = app.<a class="code" href="classripple_1_1Application.html#ae209b3dfe3f3427b569c2414c9a79686">validators</a>().<a class="code" href="classripple_1_1ValidatorList.html#a923f3aa3898a824b4b6947abd88502c5">getListedKey</a>(signingKey);</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; </div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="keyword">auto</span>&amp; validations = app.<a class="code" href="classripple_1_1Application.html#a25d75bee07390413c8131c79ebeb3dfd">getValidations</a>();</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; </div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="comment">// masterKey is seated only if validator is trusted or listed</span></div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> outcome =</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; validations.<a class="code" href="classripple_1_1Validations.html#ae4f22dbf9bd39859dc6c43e4d6713888">add</a>(<a class="code" href="namespaceripple.html#a984ddd646f1e1a5032a9a17f96c6fc55">calcNodeID</a>(masterKey.value_or(signingKey)), val);</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; </div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; <span class="keywordflow">if</span> (outcome == <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">ValStatus::current</a>)</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; {</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="keywordflow">if</span> (val-&gt;<a class="code" href="classripple_1_1STValidation.html#a6b9786a473556f9d3730a17c09fa6c8f">isTrusted</a>())</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; app.<a class="code" href="classripple_1_1Application.html#a57929fa83c551514e364fe6981b0c104">getLedgerMaster</a>().<a class="code" href="classripple_1_1LedgerMaster.html#a168ff9afab04a717a7dacbca1927566c">checkAccept</a>(hash, seq);</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; }</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; </div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="comment">// Ensure that problematic validations from validators we trust are</span></div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="comment">// logged at the highest possible level.</span></div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; <span class="comment">// One might think that we should more than just log: we ought to also</span></div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="comment">// not relay validations that fail these checks. Alas, and somewhat</span></div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="comment">// counterintuitively, we *especially* want to forward such validations,</span></div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="comment">// so that our peers will also observe them and take independent notice of</span></div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="comment">// such validators, informing their operators.</span></div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">auto</span> <span class="keyword">const</span> ls = val-&gt;<a class="code" href="classripple_1_1STValidation.html#a6b9786a473556f9d3730a17c09fa6c8f">isTrusted</a>()</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; ? validations.adaptor().journal().fatal()</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; : validations.adaptor().journal().warn();</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; ls.active())</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; {</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> <span class="keywordtype">id</span> = [&amp;masterKey, &amp;signingKey]() {</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="keyword">auto</span> ret = <a class="code" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(<a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, signingKey);</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; </div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="keywordflow">if</span> (masterKey &amp;&amp; masterKey != signingKey)</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; ret += <span class="stringliteral">&quot;:&quot;</span> + <a class="code" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(<a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, *masterKey);</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; </div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keywordflow">return</span> ret;</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; }();</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; </div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keywordflow">if</span> (outcome == <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba5b8a0d83771a323104af923d207d8a2e">ValStatus::conflicting</a>)</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; ls &lt;&lt; <span class="stringliteral">&quot;Byzantine Behavior Detector: &quot;</span></div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; &lt;&lt; (val-&gt;<a class="code" href="classripple_1_1STValidation.html#a6b9786a473556f9d3730a17c09fa6c8f">isTrusted</a>() ? <span class="stringliteral">&quot;trusted &quot;</span> : <span class="stringliteral">&quot;untrusted &quot;</span>) &lt;&lt; <span class="keywordtype">id</span></div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; &lt;&lt; <span class="stringliteral">&quot;: Conflicting validation for &quot;</span> &lt;&lt; seq &lt;&lt; <span class="stringliteral">&quot;!\n[&quot;</span></div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; &lt;&lt; val-&gt;<a class="code" href="classripple_1_1STObject.html#a6ae7e459a83bc46c3cfd9025753af1cb">getSerializer</a>().<a class="code" href="classripple_1_1Serializer.html#a394c3299f6cfcebdaa4bc98ec0c602d6">slice</a>() &lt;&lt; <span class="stringliteral">&quot;]&quot;</span>;</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; </div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <span class="keywordflow">if</span> (outcome == <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79ebace495ab8d79db0d37413d8e95b54e606">ValStatus::multiple</a>)</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; ls &lt;&lt; <span class="stringliteral">&quot;Byzantine Behavior Detector: &quot;</span></div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; &lt;&lt; (val-&gt;<a class="code" href="classripple_1_1STValidation.html#a6b9786a473556f9d3730a17c09fa6c8f">isTrusted</a>() ? <span class="stringliteral">&quot;trusted &quot;</span> : <span class="stringliteral">&quot;untrusted &quot;</span>) &lt;&lt; <span class="keywordtype">id</span></div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; &lt;&lt; <span class="stringliteral">&quot;: Multiple validations for &quot;</span> &lt;&lt; seq &lt;&lt; <span class="stringliteral">&quot;/&quot;</span> &lt;&lt; hash &lt;&lt; <span class="stringliteral">&quot;!\n[&quot;</span></div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; &lt;&lt; val-&gt;<a class="code" href="classripple_1_1STObject.html#a6ae7e459a83bc46c3cfd9025753af1cb">getSerializer</a>().<a class="code" href="classripple_1_1Serializer.html#a394c3299f6cfcebdaa4bc98ec0c602d6">slice</a>() &lt;&lt; <span class="stringliteral">&quot;]&quot;</span>;</div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; }</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160;}</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; </div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160;} <span class="comment">// namespace ripple</span></div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; &lt;&lt; <span class="stringliteral">&quot; seq=&quot;</span> &lt;&lt; ledgerSeq_ &lt;&lt; <span class="stringliteral">&quot; (available: &quot;</span> &lt;&lt; minSeq()</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; &lt;&lt; <span class="stringliteral">&quot;-&quot;</span> &lt;&lt; seq() &lt;&lt; <span class="stringliteral">&quot;)&quot;</span>;</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="comment">// Default ID that is less than all others</span></div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1base__uint.html">ID</a>{0};</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;}</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; </div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;<span class="comment">// Return the sequence number of the earliest possible mismatching ancestor</span></div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">RCLValidatedLedger::Seq</a></div>
<div class="line"><a name="l00098"></a><span class="lineno"><a class="line" href="namespaceripple.html#a509e1a7f41988fd7a09eb0bf94795967"> 98</a></span>&#160;<a class="code" href="namespaceripple.html#a509e1a7f41988fd7a09eb0bf94795967">mismatch</a>(<a class="code" href="classripple_1_1RCLValidatedLedger.html">RCLValidatedLedger</a> <span class="keyword">const</span>&amp; a, <a class="code" href="classripple_1_1RCLValidatedLedger.html">RCLValidatedLedger</a> <span class="keyword">const</span>&amp; b)</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;{</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="keyword">using</span> Seq = <a class="code" href="classripple_1_1RCLValidatedLedger.html#a000286029eaff7f1f18cf602c33a05f3">RCLValidatedLedger::Seq</a>;</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; </div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="comment">// Find overlapping interval for known sequence for the ledgers</span></div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; Seq <span class="keyword">const</span> lower = <a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a>(a.<a class="code" href="classripple_1_1RCLValidatedLedger.html#a747d2543e7058fdc2ef7c2f2f75340b8">minSeq</a>(), b.<a class="code" href="classripple_1_1RCLValidatedLedger.html#a747d2543e7058fdc2ef7c2f2f75340b8">minSeq</a>());</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; Seq <span class="keyword">const</span> upper = <a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/min.html">std::min</a>(a.<a class="code" href="classripple_1_1RCLValidatedLedger.html#ac390ca267febb71a61e9fcdbaca0f3c2">seq</a>(), b.<a class="code" href="classripple_1_1RCLValidatedLedger.html#ac390ca267febb71a61e9fcdbaca0f3c2">seq</a>());</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; </div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; Seq curr = upper;</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordflow">while</span> (curr != Seq{0} &amp;&amp; a[curr] != b[curr] &amp;&amp; curr &gt;= lower)</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; --curr;</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; </div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="comment">// If the searchable interval mismatches entirely, then we have to</span></div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="comment">// assume the ledgers mismatch starting post genesis ledger</span></div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keywordflow">return</span> (curr &lt; lower) ? Seq{1} : (curr + Seq{1});</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;}</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; </div>
<div class="line"><a name="l00115"></a><span class="lineno"><a class="line" href="classripple_1_1RCLValidationsAdaptor.html#a642615a5ff0015b5cd42b215018f316f"> 115</a></span>&#160;<a class="code" href="classripple_1_1RCLValidationsAdaptor.html#a642615a5ff0015b5cd42b215018f316f">RCLValidationsAdaptor::RCLValidationsAdaptor</a>(<a class="code" href="classripple_1_1Application.html">Application</a>&amp; app, <a class="code" href="classbeast_1_1Journal.html">beast::Journal</a> j)</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; : app_(app), j_(j)</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160;{</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;}</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; </div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/chrono/time_point.html">NetClock::time_point</a></div>
<div class="line"><a name="l00121"></a><span class="lineno"><a class="line" href="classripple_1_1RCLValidationsAdaptor.html#a71524d4aa1389ba9021de51a375b5e82"> 121</a></span>&#160;<a class="code" href="classripple_1_1RCLValidationsAdaptor.html#a71524d4aa1389ba9021de51a375b5e82">RCLValidationsAdaptor::now</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1RCLValidationsAdaptor.html#a9d4064e21779edb561efd60fc7ad92af">app_</a>.<a class="code" href="classripple_1_1Application.html#a280004d4cce56d8f1ec4664950aa58d4">timeKeeper</a>().<a class="code" href="classripple_1_1TimeKeeper.html#a106491f0751b8c2c75978a4d1f7aa0e6">closeTime</a>();</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;}</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; </div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;RCLValidatedLedger&gt;</a></div>
<div class="line"><a name="l00127"></a><span class="lineno"><a class="line" href="classripple_1_1RCLValidationsAdaptor.html#a1165a5474d2df3d127171a8ff7af3659"> 127</a></span>&#160;<a class="code" href="classripple_1_1RCLValidationsAdaptor.html#a1165a5474d2df3d127171a8ff7af3659">RCLValidationsAdaptor::acquire</a>(<a class="code" href="classripple_1_1base__uint.html">LedgerHash</a> <span class="keyword">const</span>&amp; hash)</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160;{</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keyword">auto</span> ledger = <a class="code" href="classripple_1_1RCLValidationsAdaptor.html#a9d4064e21779edb561efd60fc7ad92af">app_</a>.<a class="code" href="classripple_1_1Application.html#a57929fa83c551514e364fe6981b0c104">getLedgerMaster</a>().<a class="code" href="classripple_1_1LedgerMaster.html#a5f99fb5737062937149e4e33a95ffd06">getLedgerByHash</a>(hash);</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="keywordflow">if</span> (!ledger)</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; {</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; JLOG(<a class="code" href="classripple_1_1RCLValidationsAdaptor.html#abe09a632ad7bb4fb77c1ce0cce5fd580">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>())</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Need validated ledger for preferred ledger analysis &quot;</span> &lt;&lt; hash;</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; </div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <a class="code" href="classripple_1_1Application.html">Application</a>* pApp = &amp;<a class="code" href="classripple_1_1RCLValidationsAdaptor.html#a9d4064e21779edb561efd60fc7ad92af">app_</a>;</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; </div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <a class="code" href="classripple_1_1RCLValidationsAdaptor.html#a9d4064e21779edb561efd60fc7ad92af">app_</a>.<a class="code" href="classripple_1_1Application.html#a860be08979e27d8c6f37f722f996ba6c">getJobQueue</a>().<a class="code" href="classripple_1_1JobQueue.html#af5e34187d55aa58e551dc196aaf1ec25">addJob</a>(</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; <a class="code" href="namespaceripple.html#ae0f54f8ce649d639bf3e2b295347e17aac6876ad6800d8cd0a4c9a306baf35204">jtADVANCE</a>, <span class="stringliteral">&quot;getConsensusLedger&quot;</span>, [pApp, hash](<a class="code" href="classripple_1_1Job.html">Job</a>&amp;) {</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; pApp-&gt;<a class="code" href="classripple_1_1Application.html#a6d349a4ada03689eae062c0399762dad">getInboundLedgers</a>().<a class="code" href="classripple_1_1RCLValidationsAdaptor.html#a1165a5474d2df3d127171a8ff7af3659">acquire</a>(</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; hash, 0, <a class="code" href="classripple_1_1InboundLedger.html#a3e8d7f8b5fa089a184dcc9b00b6e0da7a6ea28b46407abd2931a73c789ecdd944">InboundLedger::Reason::CONSENSUS</a>);</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; });</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="keywordflow">return</span> std::nullopt;</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; }</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; </div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; assert(!ledger-&gt;open() &amp;&amp; ledger-&gt;isImmutable());</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; assert(ledger-&gt;info().hash == hash);</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; </div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1RCLValidatedLedger.html">RCLValidatedLedger</a>(std::move(ledger), <a class="code" href="classripple_1_1RCLValidationsAdaptor.html#abe09a632ad7bb4fb77c1ce0cce5fd580">j_</a>);</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160;}</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; </div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00152"></a><span class="lineno"><a class="line" href="namespaceripple.html#a5be750120b2129bbf4ec4fccb592de4c"> 152</a></span>&#160;<a class="code" href="namespaceripple.html#a5be750120b2129bbf4ec4fccb592de4c">handleNewValidation</a>(</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <a class="code" href="classripple_1_1Application.html">Application</a>&amp; app,</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;STValidation&gt;</a> <span class="keyword">const</span>&amp; val,</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; source)</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;{</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; signingKey = val-&gt;<a class="code" href="classripple_1_1STValidation.html#a97202fcb263c9f938f4782d73626309c">getSignerPublic</a>();</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; hash = val-&gt;<a class="code" href="classripple_1_1STValidation.html#abdf587b8dd5331ad1517f4e1969a8662">getLedgerHash</a>();</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> seq = val-&gt;<a class="code" href="classripple_1_1STObject.html#a55d1b6946f96a770f3b2195eb5a5a943">getFieldU32</a>(<a class="code" href="namespaceripple.html#a4a189668d64758cfcac4022778e496f5">sfLedgerSequence</a>);</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; </div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="comment">// Ensure validation is marked as trusted if signer currently trusted</span></div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="keyword">auto</span> masterKey = app.<a class="code" href="classripple_1_1Application.html#ae209b3dfe3f3427b569c2414c9a79686">validators</a>().<a class="code" href="classripple_1_1ValidatorList.html#a0056ded6793baf9fda1c2f1fcffc535b">getTrustedKey</a>(signingKey);</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; </div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; <span class="keywordflow">if</span> (!val-&gt;<a class="code" href="classripple_1_1STValidation.html#a6b9786a473556f9d3730a17c09fa6c8f">isTrusted</a>() &amp;&amp; masterKey)</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; val-&gt;<a class="code" href="classripple_1_1STValidation.html#aa74bbce4c07518d33fc25b60f841e22e">setTrusted</a>();</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; </div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="comment">// If not currently trusted, see if signer is currently listed</span></div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="keywordflow">if</span> (!masterKey)</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; masterKey = app.<a class="code" href="classripple_1_1Application.html#ae209b3dfe3f3427b569c2414c9a79686">validators</a>().<a class="code" href="classripple_1_1ValidatorList.html#a923f3aa3898a824b4b6947abd88502c5">getListedKey</a>(signingKey);</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; </div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="keyword">auto</span>&amp; validations = app.<a class="code" href="classripple_1_1Application.html#a25d75bee07390413c8131c79ebeb3dfd">getValidations</a>();</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; </div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="comment">// masterKey is seated only if validator is trusted or listed</span></div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> outcome =</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; validations.<a class="code" href="classripple_1_1Validations.html#ae4f22dbf9bd39859dc6c43e4d6713888">add</a>(<a class="code" href="namespaceripple.html#a984ddd646f1e1a5032a9a17f96c6fc55">calcNodeID</a>(masterKey.value_or(signingKey)), val);</div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; </div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keywordflow">if</span> (outcome == <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">ValStatus::current</a>)</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; {</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="keywordflow">if</span> (val-&gt;<a class="code" href="classripple_1_1STValidation.html#a6b9786a473556f9d3730a17c09fa6c8f">isTrusted</a>())</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; app.<a class="code" href="classripple_1_1Application.html#a57929fa83c551514e364fe6981b0c104">getLedgerMaster</a>().<a class="code" href="classripple_1_1LedgerMaster.html#a168ff9afab04a717a7dacbca1927566c">checkAccept</a>(hash, seq);</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; }</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; </div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="comment">// Ensure that problematic validations from validators we trust are</span></div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="comment">// logged at the highest possible level.</span></div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="comment">// One might think that we should more than just log: we ought to also</span></div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="comment">// not relay validations that fail these checks. Alas, and somewhat</span></div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="comment">// counterintuitively, we *especially* want to forward such validations,</span></div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="comment">// so that our peers will also observe them and take independent notice of</span></div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="comment">// such validators, informing their operators.</span></div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">auto</span> <span class="keyword">const</span> ls = val-&gt;<a class="code" href="classripple_1_1STValidation.html#a6b9786a473556f9d3730a17c09fa6c8f">isTrusted</a>()</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; ? validations.adaptor().journal().error()</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; : validations.adaptor().journal().info();</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; ls.active())</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; {</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> <span class="keywordtype">id</span> = [&amp;masterKey, &amp;signingKey]() {</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keyword">auto</span> ret = <a class="code" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(<a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, signingKey);</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; </div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="keywordflow">if</span> (masterKey &amp;&amp; masterKey != signingKey)</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; ret += <span class="stringliteral">&quot;:&quot;</span> + <a class="code" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(<a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, *masterKey);</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; </div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keywordflow">return</span> ret;</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; }();</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; </div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <span class="keywordflow">if</span> (outcome == <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba5b8a0d83771a323104af923d207d8a2e">ValStatus::conflicting</a>)</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; ls &lt;&lt; <span class="stringliteral">&quot;Byzantine Behavior Detector: &quot;</span></div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; &lt;&lt; (val-&gt;<a class="code" href="classripple_1_1STValidation.html#a6b9786a473556f9d3730a17c09fa6c8f">isTrusted</a>() ? <span class="stringliteral">&quot;trusted &quot;</span> : <span class="stringliteral">&quot;untrusted &quot;</span>) &lt;&lt; <span class="keywordtype">id</span></div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; &lt;&lt; <span class="stringliteral">&quot;: Conflicting validation for &quot;</span> &lt;&lt; seq &lt;&lt; <span class="stringliteral">&quot;!\n[&quot;</span></div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; &lt;&lt; val-&gt;<a class="code" href="classripple_1_1STObject.html#a6ae7e459a83bc46c3cfd9025753af1cb">getSerializer</a>().<a class="code" href="classripple_1_1Serializer.html#a394c3299f6cfcebdaa4bc98ec0c602d6">slice</a>() &lt;&lt; <span class="stringliteral">&quot;]&quot;</span>;</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; </div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; <span class="keywordflow">if</span> (outcome == <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79ebace495ab8d79db0d37413d8e95b54e606">ValStatus::multiple</a>)</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; ls &lt;&lt; <span class="stringliteral">&quot;Byzantine Behavior Detector: &quot;</span></div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; &lt;&lt; (val-&gt;<a class="code" href="classripple_1_1STValidation.html#a6b9786a473556f9d3730a17c09fa6c8f">isTrusted</a>() ? <span class="stringliteral">&quot;trusted &quot;</span> : <span class="stringliteral">&quot;untrusted &quot;</span>) &lt;&lt; <span class="keywordtype">id</span></div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; &lt;&lt; <span class="stringliteral">&quot;: Multiple validations for &quot;</span> &lt;&lt; seq &lt;&lt; <span class="stringliteral">&quot;/&quot;</span> &lt;&lt; hash &lt;&lt; <span class="stringliteral">&quot;!\n[&quot;</span></div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; &lt;&lt; val-&gt;<a class="code" href="classripple_1_1STObject.html#a6ae7e459a83bc46c3cfd9025753af1cb">getSerializer</a>().<a class="code" href="classripple_1_1Serializer.html#a394c3299f6cfcebdaa4bc98ec0c602d6">slice</a>() &lt;&lt; <span class="stringliteral">&quot;]&quot;</span>;</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; }</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160;}</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; </div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160;} <span class="comment">// namespace ripple</span></div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="anamespaceripple_html_a509e1a7f41988fd7a09eb0bf94795967"><div class="ttname"><a href="namespaceripple.html#a509e1a7f41988fd7a09eb0bf94795967">ripple::mismatch</a></div><div class="ttdeci">RCLValidatedLedger::Seq mismatch(RCLValidatedLedger const &amp;a, RCLValidatedLedger const &amp;b)</div><div class="ttdef"><b>Definition:</b> <a href="RCLValidations_8cpp_source.html#l00097">RCLValidations.cpp:97</a></div></div>
<div class="ttc" id="aclassripple_1_1Application_html"><div class="ttname"><a href="classripple_1_1Application.html">ripple::Application</a></div><div class="ttdef"><b>Definition:</b> <a href="Application_8h_source.html#l00103">Application.h:103</a></div></div>
<div class="ttc" id="anamespaceripple_html_a509e1a7f41988fd7a09eb0bf94795967"><div class="ttname"><a href="namespaceripple.html#a509e1a7f41988fd7a09eb0bf94795967">ripple::mismatch</a></div><div class="ttdeci">RCLValidatedLedger::Seq mismatch(RCLValidatedLedger const &amp;a, RCLValidatedLedger const &amp;b)</div><div class="ttdef"><b>Definition:</b> <a href="RCLValidations_8cpp_source.html#l00098">RCLValidations.cpp:98</a></div></div>
<div class="ttc" id="aclassripple_1_1Application_html"><div class="ttname"><a href="classripple_1_1Application.html">ripple::Application</a></div><div class="ttdef"><b>Definition:</b> <a href="Application_8h_source.html#l00115">Application.h:115</a></div></div>
<div class="ttc" id="abasic_string_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a></div><div class="ttdoc">STL class.</div></div>
<div class="ttc" id="aclassripple_1_1InboundLedger_html_a3e8d7f8b5fa089a184dcc9b00b6e0da7a6ea28b46407abd2931a73c789ecdd944"><div class="ttname"><a href="classripple_1_1InboundLedger.html#a3e8d7f8b5fa089a184dcc9b00b6e0da7a6ea28b46407abd2931a73c789ecdd944">ripple::InboundLedger::Reason::CONSENSUS</a></div><div class="ttdeci">@ CONSENSUS</div></div>
<div class="ttc" id="ashared_ptr_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr</a></div><div class="ttdoc">STL class.</div></div>
@@ -306,11 +307,11 @@ $(function() {
<div class="ttc" id="aclassripple_1_1STObject_html_a6ae7e459a83bc46c3cfd9025753af1cb"><div class="ttname"><a href="classripple_1_1STObject.html#a6ae7e459a83bc46c3cfd9025753af1cb">ripple::STObject::getSerializer</a></div><div class="ttdeci">Serializer getSerializer() const</div><div class="ttdef"><b>Definition:</b> <a href="STObject_8h_source.html#l00367">STObject.h:367</a></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_1LedgerMaster_html_a5f99fb5737062937149e4e33a95ffd06"><div class="ttname"><a href="classripple_1_1LedgerMaster.html#a5f99fb5737062937149e4e33a95ffd06">ripple::LedgerMaster::getLedgerByHash</a></div><div class="ttdeci">std::shared_ptr&lt; Ledger const &gt; getLedgerByHash(uint256 const &amp;hash)</div><div class="ttdef"><b>Definition:</b> <a href="LedgerMaster_8cpp_source.html#l01803">LedgerMaster.cpp:1803</a></div></div>
<div class="ttc" id="aclassripple_1_1RCLValidationsAdaptor_html_a71524d4aa1389ba9021de51a375b5e82"><div class="ttname"><a href="classripple_1_1RCLValidationsAdaptor.html#a71524d4aa1389ba9021de51a375b5e82">ripple::RCLValidationsAdaptor::now</a></div><div class="ttdeci">NetClock::time_point now() const</div><div class="ttdoc">Current time used to determine if validations are stale.</div><div class="ttdef"><b>Definition:</b> <a href="RCLValidations_8cpp_source.html#l00120">RCLValidations.cpp:120</a></div></div>
<div class="ttc" id="aclassripple_1_1JobQueue_html_af5e34187d55aa58e551dc196aaf1ec25"><div class="ttname"><a href="classripple_1_1JobQueue.html#af5e34187d55aa58e551dc196aaf1ec25">ripple::JobQueue::addJob</a></div><div class="ttdeci">bool addJob(JobType type, std::string const &amp;name, JobHandler &amp;&amp;jobHandler)</div><div class="ttdoc">Adds a job to the JobQueue.</div><div class="ttdef"><b>Definition:</b> <a href="JobQueue_8h_source.html#l00165">JobQueue.h:165</a></div></div>
<div class="ttc" id="aclassripple_1_1RCLValidationsAdaptor_html_a71524d4aa1389ba9021de51a375b5e82"><div class="ttname"><a href="classripple_1_1RCLValidationsAdaptor.html#a71524d4aa1389ba9021de51a375b5e82">ripple::RCLValidationsAdaptor::now</a></div><div class="ttdeci">NetClock::time_point now() const</div><div class="ttdoc">Current time used to determine if validations are stale.</div><div class="ttdef"><b>Definition:</b> <a href="RCLValidations_8cpp_source.html#l00121">RCLValidations.cpp:121</a></div></div>
<div class="ttc" id="aclassripple_1_1JobQueue_html_af5e34187d55aa58e551dc196aaf1ec25"><div class="ttname"><a href="classripple_1_1JobQueue.html#af5e34187d55aa58e551dc196aaf1ec25">ripple::JobQueue::addJob</a></div><div class="ttdeci">bool addJob(JobType type, std::string const &amp;name, JobHandler &amp;&amp;jobHandler)</div><div class="ttdoc">Adds a job to the JobQueue.</div><div class="ttdef"><b>Definition:</b> <a href="JobQueue_8h_source.html#l00166">JobQueue.h:166</a></div></div>
<div class="ttc" id="aclassripple_1_1RCLValidatedLedger_html_a070e5843fed5416ecef06241a95b8914"><div class="ttname"><a href="classripple_1_1RCLValidatedLedger.html#a070e5843fed5416ecef06241a95b8914">ripple::RCLValidatedLedger::id</a></div><div class="ttdeci">ID id() const</div><div class="ttdoc">The ID (hash) of the ledger.</div><div class="ttdef"><b>Definition:</b> <a href="RCLValidations_8cpp_source.html#l00072">RCLValidations.cpp:72</a></div></div>
<div class="ttc" id="aclassripple_1_1Application_html_a280004d4cce56d8f1ec4664950aa58d4"><div class="ttname"><a href="classripple_1_1Application.html#a280004d4cce56d8f1ec4664950aa58d4">ripple::Application::timeKeeper</a></div><div class="ttdeci">virtual TimeKeeper &amp; timeKeeper()=0</div></div>
<div class="ttc" id="aclassripple_1_1RCLValidationsAdaptor_html_a642615a5ff0015b5cd42b215018f316f"><div class="ttname"><a href="classripple_1_1RCLValidationsAdaptor.html#a642615a5ff0015b5cd42b215018f316f">ripple::RCLValidationsAdaptor::RCLValidationsAdaptor</a></div><div class="ttdeci">RCLValidationsAdaptor(Application &amp;app, beast::Journal j)</div><div class="ttdef"><b>Definition:</b> <a href="RCLValidations_8cpp_source.html#l00114">RCLValidations.cpp:114</a></div></div>
<div class="ttc" id="aclassripple_1_1RCLValidationsAdaptor_html_a642615a5ff0015b5cd42b215018f316f"><div class="ttname"><a href="classripple_1_1RCLValidationsAdaptor.html#a642615a5ff0015b5cd42b215018f316f">ripple::RCLValidationsAdaptor::RCLValidationsAdaptor</a></div><div class="ttdeci">RCLValidationsAdaptor(Application &amp;app, beast::Journal j)</div><div class="ttdef"><b>Definition:</b> <a href="RCLValidations_8cpp_source.html#l00115">RCLValidations.cpp:115</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_a930d70ff72f71414fcd5b560610cefb6"><div class="ttname"><a href="classbeast_1_1Journal.html#a930d70ff72f71414fcd5b560610cefb6">beast::Journal::getNullSink</a></div><div class="ttdeci">static Sink &amp; getNullSink()</div><div class="ttdoc">Returns a Sink which does nothing.</div><div class="ttdef"><b>Definition:</b> <a href="beast__Journal_8cpp_source.html#l00072">beast_Journal.cpp:72</a></div></div>
<div class="ttc" id="aclassripple_1_1RCLValidatedLedger_html"><div class="ttname"><a href="classripple_1_1RCLValidatedLedger.html">ripple::RCLValidatedLedger</a></div><div class="ttdoc">Wraps a ledger instance for use in generic Validations LedgerTrie.</div><div class="ttdef"><b>Definition:</b> <a href="RCLValidations_8h_source.html#l00153">RCLValidations.h:153</a></div></div>
<div class="ttc" id="aclassripple_1_1STValidation_html_a6b9786a473556f9d3730a17c09fa6c8f"><div class="ttname"><a href="classripple_1_1STValidation.html#a6b9786a473556f9d3730a17c09fa6c8f">ripple::STValidation::isTrusted</a></div><div class="ttdeci">bool isTrusted() const noexcept</div><div class="ttdef"><b>Definition:</b> <a href="STValidation_8h_source.html#l00182">STValidation.h:182</a></div></div>
@@ -325,7 +326,7 @@ $(function() {
<div class="ttc" id="aclassripple_1_1Application_html_a57929fa83c551514e364fe6981b0c104"><div class="ttname"><a href="classripple_1_1Application.html#a57929fa83c551514e364fe6981b0c104">ripple::Application::getLedgerMaster</a></div><div class="ttdeci">virtual LedgerMaster &amp; getLedgerMaster()=0</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a923f3aa3898a824b4b6947abd88502c5"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a923f3aa3898a824b4b6947abd88502c5">ripple::ValidatorList::getListedKey</a></div><div class="ttdeci">std::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#l01374">ValidatorList.cpp:1374</a></div></div>
<div class="ttc" id="aclassripple_1_1RCLValidationsAdaptor_html_abe09a632ad7bb4fb77c1ce0cce5fd580"><div class="ttname"><a href="classripple_1_1RCLValidationsAdaptor.html#abe09a632ad7bb4fb77c1ce0cce5fd580">ripple::RCLValidationsAdaptor::j_</a></div><div class="ttdeci">beast::Journal j_</div><div class="ttdef"><b>Definition:</b> <a href="RCLValidations_8h_source.html#l00232">RCLValidations.h:232</a></div></div>
<div class="ttc" id="aclassripple_1_1RCLValidationsAdaptor_html_a1165a5474d2df3d127171a8ff7af3659"><div class="ttname"><a href="classripple_1_1RCLValidationsAdaptor.html#a1165a5474d2df3d127171a8ff7af3659">ripple::RCLValidationsAdaptor::acquire</a></div><div class="ttdeci">std::optional&lt; RCLValidatedLedger &gt; acquire(LedgerHash const &amp;id)</div><div class="ttdoc">Attempt to acquire the ledger with given id from the network.</div><div class="ttdef"><b>Definition:</b> <a href="RCLValidations_8cpp_source.html#l00126">RCLValidations.cpp:126</a></div></div>
<div class="ttc" id="aclassripple_1_1RCLValidationsAdaptor_html_a1165a5474d2df3d127171a8ff7af3659"><div class="ttname"><a href="classripple_1_1RCLValidationsAdaptor.html#a1165a5474d2df3d127171a8ff7af3659">ripple::RCLValidationsAdaptor::acquire</a></div><div class="ttdeci">std::optional&lt; RCLValidatedLedger &gt; acquire(LedgerHash const &amp;id)</div><div class="ttdoc">Attempt to acquire the ledger with given id from the network.</div><div class="ttdef"><b>Definition:</b> <a href="RCLValidations_8cpp_source.html#l00127">RCLValidations.cpp:127</a></div></div>
<div class="ttc" id="aclassripple_1_1Application_html_a860be08979e27d8c6f37f722f996ba6c"><div class="ttname"><a href="classripple_1_1Application.html#a860be08979e27d8c6f37f722f996ba6c">ripple::Application::getJobQueue</a></div><div class="ttdeci">virtual JobQueue &amp; getJobQueue()=0</div></div>
<div class="ttc" id="aclassripple_1_1Serializer_html_a394c3299f6cfcebdaa4bc98ec0c602d6"><div class="ttname"><a href="classripple_1_1Serializer.html#a394c3299f6cfcebdaa4bc98ec0c602d6">ripple::Serializer::slice</a></div><div class="ttdeci">Slice slice() const noexcept</div><div class="ttdef"><b>Definition:</b> <a href="Serializer_8h_source.html#l00063">Serializer.h:63</a></div></div>
<div class="ttc" id="atime_point_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/chrono/time_point.html">std::chrono::time_point</a></div></div>
@@ -352,11 +353,11 @@ $(function() {
<div class="ttc" id="aoptional_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional</a></div></div>
<div class="ttc" id="amutex_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/mutex.html">mutex</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_a556228cb60bcf405c225d3f64b7b01ae"><div class="ttname"><a href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">beast::Journal::debug</a></div><div class="ttdeci">Stream debug() const</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00315">Journal.h:315</a></div></div>
<div class="ttc" id="anamespaceripple_html_ae0f54f8ce649d639bf3e2b295347e17aac6876ad6800d8cd0a4c9a306baf35204"><div class="ttname"><a href="namespaceripple.html#ae0f54f8ce649d639bf3e2b295347e17aac6876ad6800d8cd0a4c9a306baf35204">ripple::jtADVANCE</a></div><div class="ttdeci">@ jtADVANCE</div><div class="ttdef"><b>Definition:</b> <a href="Job_8h_source.html#l00058">Job.h:58</a></div></div>
<div class="ttc" id="anamespaceripple_html_ae0f54f8ce649d639bf3e2b295347e17aac6876ad6800d8cd0a4c9a306baf35204"><div class="ttname"><a href="namespaceripple.html#ae0f54f8ce649d639bf3e2b295347e17aac6876ad6800d8cd0a4c9a306baf35204">ripple::jtADVANCE</a></div><div class="ttdeci">@ jtADVANCE</div><div class="ttdef"><b>Definition:</b> <a href="Job_8h_source.html#l00059">Job.h:59</a></div></div>
<div class="ttc" id="amax_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a></div><div class="ttdeci">T max(T... args)</div></div>
<div class="ttc" id="aclassripple_1_1STObject_html_a55d1b6946f96a770f3b2195eb5a5a943"><div class="ttname"><a href="classripple_1_1STObject.html#a55d1b6946f96a770f3b2195eb5a5a943">ripple::STObject::getFieldU32</a></div><div class="ttdeci">std::uint32_t getFieldU32(SField const &amp;field) const</div><div class="ttdef"><b>Definition:</b> <a href="STObject_8cpp_source.html#l00532">STObject.cpp:532</a></div></div>
<div class="ttc" id="anamespaceripple_html_a628c597be4a050e3957be56ec78df01a"><div class="ttname"><a href="namespaceripple.html#a628c597be4a050e3957be56ec78df01a">ripple::sfLastLedgerSequence</a></div><div class="ttdeci">const SF_UINT32 sfLastLedgerSequence</div></div>
<div class="ttc" id="anamespaceripple_html_a5be750120b2129bbf4ec4fccb592de4c"><div class="ttname"><a href="namespaceripple.html#a5be750120b2129bbf4ec4fccb592de4c">ripple::handleNewValidation</a></div><div class="ttdeci">void handleNewValidation(Application &amp;app, std::shared_ptr&lt; STValidation &gt; const &amp;val, std::string const &amp;source)</div><div class="ttdoc">Handle a new validation.</div><div class="ttdef"><b>Definition:</b> <a href="RCLValidations_8cpp_source.html#l00151">RCLValidations.cpp:151</a></div></div>
<div class="ttc" id="anamespaceripple_html_a5be750120b2129bbf4ec4fccb592de4c"><div class="ttname"><a href="namespaceripple.html#a5be750120b2129bbf4ec4fccb592de4c">ripple::handleNewValidation</a></div><div class="ttdeci">void handleNewValidation(Application &amp;app, std::shared_ptr&lt; STValidation &gt; const &amp;val, std::string const &amp;source)</div><div class="ttdoc">Handle a new validation.</div><div class="ttdef"><b>Definition:</b> <a href="RCLValidations_8cpp_source.html#l00152">RCLValidations.cpp:152</a></div></div>
<div class="ttc" id="aclassripple_1_1RCLValidatedLedger_html_a000286029eaff7f1f18cf602c33a05f3"><div class="ttname"><a href="classripple_1_1RCLValidatedLedger.html#a000286029eaff7f1f18cf602c33a05f3">ripple::RCLValidatedLedger::Seq</a></div><div class="ttdeci">LedgerIndex Seq</div><div class="ttdef"><b>Definition:</b> <a href="RCLValidations_8h_source.html#l00157">RCLValidations.h:157</a></div></div>
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>