Files
rippled/ValidatorList_8cpp_source.html
2020-04-15 21:15:02 +00:00

1186 lines
229 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>rippled: ValidatorList.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">rippled
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_df9c78dcf3f59a33b12284f95992a64b.html">ripple</a></li><li class="navelem"><a class="el" href="dir_9f69212e4c6e2ca9ec5ab59cd7b6275c.html">app</a></li><li class="navelem"><a class="el" href="dir_29f79f6f29a0be0eebc6c46bea51c866.html">misc</a></li><li class="navelem"><a class="el" href="dir_976a01832cc3a05d986422b2c1d44232.html">impl</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">ValidatorList.cpp</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">//------------------------------------------------------------------------------</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">/*</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> This file is part of rippled: https://github.com/ripple/rippled</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2015 Ripple Labs Inc.</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"></span> </div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> Permission to use, copy, modify, and/or distribute this software for any</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> purpose with or without fee is hereby granted, provided that the above</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> copyright notice and this permission notice appear in all copies.</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"></span> </div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> THE SOFTWARE IS PROVIDED &quot;AS IS&quot; AND THE AUTHOR DISCLAIMS ALL WARRANTIES</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment"> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment"> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment"> OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment">*/</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment">//==============================================================================</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; </div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &lt;ripple/app/misc/ValidatorList.h&gt;</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &lt;ripple/app/misc/HashRouter.h&gt;</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &lt;ripple/basics/base64.h&gt;</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &lt;ripple/basics/FileUtilities.h&gt;</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &lt;ripple/basics/Slice.h&gt;</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &lt;ripple/basics/StringUtilities.h&gt;</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &lt;ripple/json/json_reader.h&gt;</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &lt;ripple/overlay/Overlay.h&gt;</span></div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="preprocessor">#include &lt;ripple/protocol/jss.h&gt;</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#include &lt;ripple/protocol/messages.h&gt;</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &lt;boost/regex.hpp&gt;</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; </div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &lt;date/date.h&gt;</span></div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; </div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/cmath.html">cmath</a>&gt;</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/mutex.html">mutex</a>&gt;</span></div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/shared_mutex.html">shared_mutex</a>&gt;</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; </div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceripple.html">ripple</a> {</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; </div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a></div>
<div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="namespaceripple.html#a96888695e8d79474e080c334f149e30a"> 41</a></span>&#160;<a class="code" href="namespaceripple.html#a96888695e8d79474e080c334f149e30a">to_string</a>(<a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3">ListDisposition</a> disposition)</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;{</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <span class="keywordflow">switch</span> (disposition)</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; {</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; <span class="keywordflow">case</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ListDisposition::accepted</a>:</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;accepted&quot;</span>;</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="keywordflow">case</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a774ecc994c99a32a052f6d67e9b085cc">ListDisposition::same_sequence</a>:</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;same_sequence&quot;</span>;</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keywordflow">case</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a2af01f2c39c66a1641045dd660e839b5">ListDisposition::unsupported_version</a>:</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;unsupported_version&quot;</span>;</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keywordflow">case</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a63d2a671ff6ffd00111188031808aa78">ListDisposition::untrusted</a>:</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;untrusted&quot;</span>;</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <span class="keywordflow">case</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a36f34fd8319cf30f8e132ef294c616af">ListDisposition::stale</a>:</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;stale&quot;</span>;</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keywordflow">case</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a>:</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;invalid&quot;</span>;</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; }</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;unknown&quot;</span>;</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;}</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; </div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="keyword">const</span> <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <a class="code" href="classripple_1_1ValidatorList.html#af3c12788fe36cb6f48201d3c5a688d06">ValidatorList::filePrefix_</a> = <span class="stringliteral">&quot;cache.&quot;</span>;</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; </div>
<div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a178bce347d83230ff994989adeb5327b"> 63</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a178bce347d83230ff994989adeb5327b">ValidatorList::ValidatorList</a> (</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <a class="code" href="classripple_1_1ManifestCache.html">ManifestCache</a>&amp; validatorManifests,</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <a class="code" href="classripple_1_1ManifestCache.html">ManifestCache</a>&amp; publisherManifests,</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <a class="code" href="classripple_1_1TimeKeeper.html">TimeKeeper</a>&amp; timeKeeper,</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</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; databasePath,</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <a class="code" href="classbeast_1_1Journal.html">beast::Journal</a> j,</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; boost::optional&lt;std::size_t&gt; minimumQuorum)</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; : validatorManifests_ (validatorManifests)</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; , publisherManifests_ (publisherManifests)</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; , timeKeeper_ (timeKeeper)</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; , dataPath_(databasePath)</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; , j_ (j)</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; , quorum_ (minimumQuorum.value_or(1)) <span class="comment">// Genesis ledger quorum</span></div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; , minimumQuorum_ (minimumQuorum)</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;{</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;}</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; </div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#ac26b319f046fcd0af996c60511cd1547"> 81</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#ac26b319f046fcd0af996c60511cd1547">ValidatorList::load</a> (</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; localSigningKey,</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a> <span class="keyword">const</span>&amp; configKeys,</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a> <span class="keyword">const</span>&amp; publisherKeys)</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;{</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keyword">static</span> boost::regex <span class="keyword">const</span> re (</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="stringliteral">&quot;[[:space:]]*&quot;</span> <span class="comment">// skip leading whitespace</span></div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="stringliteral">&quot;([[:alnum:]]+)&quot;</span> <span class="comment">// node identity</span></div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="stringliteral">&quot;(?:&quot;</span> <span class="comment">// begin optional comment block</span></div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="stringliteral">&quot;[[:space:]]+&quot;</span> <span class="comment">// (skip all leading whitespace)</span></div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="stringliteral">&quot;(?:&quot;</span> <span class="comment">// begin optional comment</span></div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="stringliteral">&quot;(.*[^[:space:]]+)&quot;</span> <span class="comment">// the comment</span></div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="stringliteral">&quot;[[:space:]]*&quot;</span> <span class="comment">// (skip all trailing whitespace)</span></div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="stringliteral">&quot;)?&quot;</span> <span class="comment">// end optional comment</span></div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <span class="stringliteral">&quot;)?&quot;</span> <span class="comment">// end optional comment block</span></div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; );</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; </div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</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> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</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; 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;</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="stringliteral">&quot;Loading configured trusted validator list publisher keys&quot;</span>;</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; </div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> <a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a> = 0;</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> key : publisherKeys)</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; JLOG (<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>()) &lt;&lt;</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="stringliteral">&quot;Processing &#39;&quot;</span> &lt;&lt; key &lt;&lt; <span class="stringliteral">&quot;&#39;&quot;</span>;</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="keyword">auto</span> <span class="keyword">const</span> ret = <a class="code" href="namespaceripple.html#ad8997e43f639b676f9b3f3b9379f933d">strUnHex</a> (key);</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; </div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keywordflow">if</span> (! ret || ! <a class="code" href="namespaceripple.html#abe1502195233c7375f3465f17c7610e4">publicKeyType</a>(<a class="code" href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">makeSlice</a>(*ret)))</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; JLOG (<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) &lt;&lt;</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="stringliteral">&quot;Invalid validator list publisher key: &quot;</span> &lt;&lt; key;</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</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; <span class="keyword">auto</span> <span class="keywordtype">id</span> = <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a>(<a class="code" href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">makeSlice</a>(*ret));</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; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#af8fe24acb044cf9b928d14a1e84b63ac">publisherManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a6494e744b90cbecd735b460fcd7be82f">revoked</a> (<span class="keywordtype">id</span>))</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; {</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</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;</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="stringliteral">&quot;Configured validator list publisher key is revoked: &quot;</span> &lt;&lt; key;</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keywordflow">continue</span>;</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; </div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>.count(<span class="keywordtype">id</span>))</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; 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;</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="stringliteral">&quot;Duplicate validator list publisher key: &quot;</span> &lt;&lt; key;</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; }</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_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>[id].available = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; ++<a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</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; </div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</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;</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <span class="stringliteral">&quot;Loaded &quot;</span> &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a> &lt;&lt; <span class="stringliteral">&quot; keys&quot;</span>;</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; <a class="code" href="classripple_1_1ValidatorList.html#ae572133b799990fc68d8071e6b835b39">localPubKey_</a> = <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">getMasterKey</a> (localSigningKey);</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; <span class="comment">// Treat local validator key as though it was listed in the config</span></div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#ae572133b799990fc68d8071e6b835b39">localPubKey_</a>.<a class="code" href="classripple_1_1PublicKey.html#a663437215503b159ed33b1664e4213a3">size</a>())</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.insert ({ <a class="code" href="classripple_1_1ValidatorList.html#ae572133b799990fc68d8071e6b835b39">localPubKey_</a>, 1 });</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; 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;</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="stringliteral">&quot;Loading configured validator keys&quot;</span>;</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; <a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a> = 0;</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> local;</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; n : configKeys)</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; {</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; JLOG (<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>()) &lt;&lt;</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <span class="stringliteral">&quot;Processing &#39;&quot;</span> &lt;&lt; n &lt;&lt; <span class="stringliteral">&quot;&#39;&quot;</span>;</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; boost::smatch match;</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; </div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keywordflow">if</span> (!boost::regex_match (n, match, re))</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; JLOG (<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) &lt;&lt;</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="stringliteral">&quot;Malformed entry: &#39;&quot;</span> &lt;&lt; n &lt;&lt; <span class="stringliteral">&quot;&#39;&quot;</span>;</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; }</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="keyword">auto</span> <span class="keyword">const</span> <span class="keywordtype">id</span> = parseBase58&lt;PublicKey&gt;(</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, match[1]);</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; </div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <span class="keywordflow">if</span> (!<span class="keywordtype">id</span>)</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; JLOG (<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) &lt;&lt; <span class="stringliteral">&quot;Invalid node identity: &quot;</span> &lt;&lt; match[1];</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; }</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; </div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="comment">// Skip local key which was already added</span></div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; <span class="keywordflow">if</span> (*<span class="keywordtype">id</span> == <a class="code" href="classripple_1_1ValidatorList.html#ae572133b799990fc68d8071e6b835b39">localPubKey_</a> || *<span class="keywordtype">id</span> == localSigningKey)</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keywordflow">continue</span>;</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="keyword">auto</span> ret = <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.insert ({*id, 1});</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="keywordflow">if</span> (! ret.second)</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; 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;Duplicate node identity: &quot;</span> &lt;&lt; match[1];</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; }</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keyword">auto</span> it = <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>.emplace(</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; std::piecewise_construct,</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/tuple/forward_as_tuple.html">std::forward_as_tuple</a>(local),</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/tuple/forward_as_tuple.html">std::forward_as_tuple</a>());</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="comment">// Config listed keys never expire</span></div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="keywordflow">if</span> (it.second)</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; it.first-&gt;second.expiration = TimeKeeper::time_point::max();</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; it.first-&gt;second.list.emplace_back(std::move(*<span class="keywordtype">id</span>));</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; it.first-&gt;second.available = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; ++<a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a>;</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; </div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</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;</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="stringliteral">&quot;Loaded &quot;</span> &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a> &lt;&lt; <span class="stringliteral">&quot; entries&quot;</span>;</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">return</span> <span class="keyword">true</span>;</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; </div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160;boost::filesystem::path</div>
<div class="line"><a name="l00204"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a5fe23a63d2db1a3bad3d7c34d75886ec"> 204</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a5fe23a63d2db1a3bad3d7c34d75886ec">ValidatorList::GetCacheFileName</a>(<a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; pubKey)</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">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a53a444cf253f5a11a1b800c23e691e31">dataPath_</a> / (<a class="code" href="classripple_1_1ValidatorList.html#af3c12788fe36cb6f48201d3c5a688d06">filePrefix_</a> + <a class="code" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(pubKey));</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160;}</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; </div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00210"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a4219fb7d196bbc712b2dee8e5b32ae0b"> 210</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a4219fb7d196bbc712b2dee8e5b32ae0b">ValidatorList::CacheValidatorFile</a>(<a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; pubKey,</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <a class="code" href="structripple_1_1ValidatorList_1_1PublisherList.html">PublisherList</a> <span class="keyword">const</span>&amp; publisher)</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160;{</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a53a444cf253f5a11a1b800c23e691e31">dataPath_</a>.empty())</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; </div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; boost::filesystem::path <span class="keyword">const</span> filename =</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a5fe23a63d2db1a3bad3d7c34d75886ec">GetCacheFileName</a>(pubKey);</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; boost::system::error_code ec;</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; </div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</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="l00222"></a><span class="lineno"> 222</span>&#160; </div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; value[<span class="stringliteral">&quot;manifest&quot;</span>] = publisher.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherList.html#abe3ca53e334710876f40ecc72907d4e6">rawManifest</a>;</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; value[<span class="stringliteral">&quot;blob&quot;</span>] = publisher.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherList.html#a6995e4adf4fc3157d5333f659d409b4a">rawBlob</a>;</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; value[<span class="stringliteral">&quot;signature&quot;</span>] = publisher.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherList.html#a7fd1c2f0f5ac25e9fb5ae3483cad2ddd">rawSignature</a>;</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; value[<span class="stringliteral">&quot;version&quot;</span>] = publisher.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherList.html#adfee631eb841106a863e22ca33340dd8">rawVersion</a>;</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; </div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <a class="code" href="namespaceripple.html#ae18870f8d8eaa17b582f609cc486aa04">writeFileContents</a>(ec, filename, value.<a class="code" href="classJson_1_1Value.html#a3696d34c1a1833742b4bf8e5b247f125">toStyledString</a>());</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; </div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">if</span> (ec)</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; {</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="comment">// Log and ignore any file I/O exceptions</span></div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) &lt;&lt;</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="stringliteral">&quot;Problem writing &quot;</span> &lt;&lt;</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; filename &lt;&lt;</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="stringliteral">&quot; &quot;</span> &lt;&lt;</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; ec.value() &lt;&lt;</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="stringliteral">&quot;: &quot;</span> &lt;&lt;</div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; ec.message();</div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; }</div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160;}</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; </div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160;<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">ValidatorList::PublisherListStats</a></div>
<div class="line"><a name="l00244"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#afa2abec0b9e9eb4e96e4a4d948466cbd"> 244</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#afa2abec0b9e9eb4e96e4a4d948466cbd">ValidatorList::applyListAndBroadcast</a>(</div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</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; manifest,</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</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; blob,</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</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; signature,</div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> version,</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> siteUri,</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <a class="code" href="classripple_1_1base__uint.html">uint256</a> <span class="keyword">const</span>&amp; hash,</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <a class="code" href="classripple_1_1Overlay.html">Overlay</a>&amp; overlay,</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <a class="code" href="classripple_1_1HashRouter.html">HashRouter</a>&amp; hashRouter)</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160;{</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> result = <a class="code" href="classripple_1_1ValidatorList.html#adca31b5572990c6930c0baed59af7ed7">applyList</a>(<a class="code" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>, blob, signature,</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; version, std::move(siteUri), hash);</div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> disposition = result.disposition;</div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; </div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="keywordtype">bool</span> broadcast = disposition == <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ListDisposition::accepted</a> ||</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; disposition == <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a774ecc994c99a32a052f6d67e9b085cc">ListDisposition::same_sequence</a>;</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; </div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <span class="keywordflow">if</span> (broadcast)</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; {</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; assert(result.available &amp;&amp; result.publisherKey &amp;&amp; result.sequence);</div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> toSkip = hashRouter.<a class="code" href="classripple_1_1HashRouter.html#a29980c0f77dcc002ef322c23080f3266">shouldRelay</a>(hash);</div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; </div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="keywordflow">if</span> (toSkip)</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; {</div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; protocol::TMValidatorList msg;</div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; msg.set_manifest(<a class="code" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>);</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; msg.set_blob(blob);</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; msg.set_signature(signature);</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; msg.set_version(version);</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; </div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; publisherKey = *result.publisherKey;</div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> sequence = *result.sequence;</div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; </div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="comment">// Can&#39;t use overlay.foreach here because we need to modify</span></div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="comment">// the peer, and foreach provides a const&amp;</span></div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="keyword">auto</span> message =</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; std::make_shared&lt;Message&gt;(msg, protocol::mtVALIDATORLIST);</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; peer : overlay.<a class="code" href="classripple_1_1Overlay.html#a5b8ee783b77679fb2fad2543ab521a90">getActivePeers</a>())</div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; {</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; <span class="keywordflow">if</span> (toSkip-&gt;count(peer-&gt;id()) == 0 &amp;&amp;</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; peer-&gt;supportsFeature(</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <a class="code" href="namespaceripple.html#a3b423ad1ba6341f945c08c13fe141150a9a32e2a438c197a712d352ca4e69b65b">ProtocolFeature::ValidatorListPropagation</a>) &amp;&amp;</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; peer-&gt;publisherListSequence(publisherKey) &lt; sequence)</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; {</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; peer-&gt;send(message);</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; </div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</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="l00291"></a><span class="lineno"> 291</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Sent validator list for &quot;</span> &lt;&lt; <a class="code" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(publisherKey)</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; &lt;&lt; <span class="stringliteral">&quot; with sequence &quot;</span> &lt;&lt; sequence &lt;&lt; <span class="stringliteral">&quot; to &quot;</span></div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; &lt;&lt; peer-&gt;getRemoteAddress().to_string() &lt;&lt; <span class="stringliteral">&quot; (&quot;</span></div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; &lt;&lt; peer-&gt;id() &lt;&lt; <span class="stringliteral">&quot;)&quot;</span>;</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; <span class="comment">// Don&#39;t send it next time.</span></div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; hashRouter.<a class="code" href="classripple_1_1HashRouter.html#a86c862f1b0722d061b3724ff34a53572">addSuppressionPeer</a>(hash, peer-&gt;id());</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; peer-&gt;setPublisherListSequence(publisherKey, sequence);</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; }</div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; }</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; }</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; }</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; </div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160;}</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; </div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160;<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">ValidatorList::PublisherListStats</a></div>
<div class="line"><a name="l00307"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#adca31b5572990c6930c0baed59af7ed7"> 307</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#adca31b5572990c6930c0baed59af7ed7">ValidatorList::applyList</a> (</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</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; manifest,</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</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; blob,</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</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; signature,</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> version,</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> siteUri,</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; boost::optional&lt;uint256&gt; <span class="keyword">const</span>&amp; hash)</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160;{</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <span class="keyword">using namespace </span>std::string_literals;</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; </div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; <span class="keywordflow">if</span> (version != <a class="code" href="classripple_1_1ValidatorList.html#af8c342923da977e84631fd4c54380c6d">requiredListVersion</a>)</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; <span class="keywordflow">return</span> <a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a>{ <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a2af01f2c39c66a1641045dd660e839b5">ListDisposition::unsupported_version</a> };</div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; </div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</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="l00321"></a><span class="lineno"> 321</span>&#160; </div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a> list;</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> pubKey;</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> result = <a class="code" href="classripple_1_1ValidatorList.html#ab2a2e3c9e0ca9a49469fd9298ae42bf7">verify</a> (list, pubKey, <a class="code" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>, blob, signature);</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; <span class="keywordflow">if</span> (result != <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ListDisposition::accepted</a>)</div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; {</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; <span class="keywordflow">if</span> (result == <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a774ecc994c99a32a052f6d67e9b085cc">ListDisposition::same_sequence</a> &amp;&amp;</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>.count(pubKey))</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; {</div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="comment">// We&#39;ve seen this valid list already, so return</span></div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <span class="comment">// what we know about it.</span></div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; publisher = <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>[pubKey];</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="keywordflow">return</span> <a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a>{ result, pubKey,</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; publisher.available, publisher.sequence };</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; }</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; <span class="keywordflow">return</span> <a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a>{ result };</div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; }</div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; </div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <span class="comment">// Update publisher&#39;s list</span></div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a> <span class="keyword">const</span>&amp; newList = list[<span class="stringliteral">&quot;validators&quot;</span>];</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; <span class="keyword">auto</span>&amp; publisher = <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>[pubKey];</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; publisher.available = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; publisher.sequence = list[<span class="stringliteral">&quot;sequence&quot;</span>].<a class="code" href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">asUInt</a> ();</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; publisher.expiration = <a class="code" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <a class="code" href="classbeast_1_1abstract__clock.html#ad024b15fa67696e8d1eba3744e800d32">TimeKeeper::duration</a>{list[<span class="stringliteral">&quot;expiration&quot;</span>].<a class="code" href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">asUInt</a>()}};</div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; publisher.siteUri = std::move(siteUri);</div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; publisher.rawManifest = <a class="code" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>;</div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; publisher.rawBlob = blob;</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; publisher.rawSignature = signature;</div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; publisher.rawVersion = version;</div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <span class="keywordflow">if</span>(hash)</div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; publisher.hash = *hash;</div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;PublicKey&gt;</a>&amp; publisherList = publisher.list;</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; </div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a> <span class="keyword">const</span> applyResult{ result, pubKey,</div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; publisher.available, publisher.sequence };</div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; </div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;PublicKey&gt;</a> oldList = publisherList;</div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/clear.html">clear</a> ();</div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/reserve.html">reserve</a> (newList.<a class="code" href="classJson_1_1Value.html#a23c7027ca674f989f90564d63ef36c74">size</a> ());</div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a> manifests;</div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; val : newList)</div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; {</div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <span class="keywordflow">if</span> (val.isObject() &amp;&amp;</div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; val.isMember (<span class="stringliteral">&quot;validation_public_key&quot;</span>) &amp;&amp;</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; val[<span class="stringliteral">&quot;validation_public_key&quot;</span>].isString ())</div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; {</div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; boost::optional&lt;Blob&gt; <span class="keyword">const</span> ret = <a class="code" href="namespaceripple.html#ad8997e43f639b676f9b3f3b9379f933d">strUnHex</a>(val[<span class="stringliteral">&quot;validation_public_key&quot;</span>].asString());</div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; </div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="keywordflow">if</span> (! ret || ! <a class="code" href="namespaceripple.html#abe1502195233c7375f3465f17c7610e4">publicKeyType</a>(<a class="code" href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">makeSlice</a>(*ret)))</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; {</div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; JLOG (<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) &lt;&lt;</div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <span class="stringliteral">&quot;Invalid node identity: &quot;</span> &lt;&lt;</div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; val[<span class="stringliteral">&quot;validation_public_key&quot;</span>].asString ();</div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; }</div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; {</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/push_back.html">push_back</a> (</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a>(<a class="code" href="classripple_1_1Slice.html">Slice</a>{ ret-&gt;<a class="code" href="classripple_1_1Slice.html#a9d49708cd15d24841b78dc0a9ecaac26">data</a> (), ret-&gt;size() }));</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; }</div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; </div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; <span class="keywordflow">if</span> (val.isMember (<span class="stringliteral">&quot;manifest&quot;</span>) &amp;&amp; val[<span class="stringliteral">&quot;manifest&quot;</span>].isString ())</div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; manifests.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/push_back.html">push_back</a>(val[<span class="stringliteral">&quot;manifest&quot;</span>].asString ());</div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; }</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; }</div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; </div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; <span class="comment">// Update keyListings_ for added and removed keys</span></div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/sort.html">std::sort</a> (</div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/begin.html">begin</a> (),</div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a> ());</div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; </div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; <span class="keyword">auto</span> iNew = publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/begin.html">begin</a> ();</div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <span class="keyword">auto</span> iOld = oldList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/begin.html">begin</a> ();</div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="keywordflow">while</span> (iNew != publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a> () ||</div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; iOld != oldList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a> ())</div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; {</div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; <span class="keywordflow">if</span> (iOld == oldList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a> () ||</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; (iNew != publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a> () &amp;&amp;</div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; *iNew &lt; *iOld))</div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; {</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <span class="comment">// Increment list count for added keys</span></div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; ++<a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>[*iNew];</div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; ++iNew;</div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; }</div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (iNew == publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a> () ||</div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; (iOld != oldList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a> () &amp;&amp; *iOld &lt; *iNew))</div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; {</div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <span class="comment">// Decrement list count for removed keys</span></div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>[*iOld] &lt;= 1)</div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.erase (*iOld);</div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; --<a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>[*iOld];</div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; ++iOld;</div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; }</div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; {</div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; ++iNew;</div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; ++iOld;</div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; }</div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; }</div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; </div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="keywordflow">if</span> (publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>())</div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; {</div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</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;</div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="stringliteral">&quot;No validator keys included in valid list&quot;</span>;</div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; }</div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; </div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; valManifest : manifests)</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; {</div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; <span class="keyword">auto</span> m = <a class="code" href="namespaceripple.html#a4f4d968c386163c7286107610908902b">deserializeManifest</a>(<a class="code" href="namespaceripple.html#a551be32de1cc0f8a8ff1f14ee84d892b">base64_decode</a>(valManifest));</div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; </div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <span class="keywordflow">if</span> (! m || ! <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.count (m-&gt;masterKey))</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; {</div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</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;</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="stringliteral">&quot;List for &quot;</span> &lt;&lt; <a class="code" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(pubKey) &lt;&lt;</div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; <span class="stringliteral">&quot; contained untrusted validator manifest&quot;</span>;</div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; }</div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; </div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">auto</span> <span class="keyword">const</span> r = <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a882c588d2f26d7d61ae3ffe4212cbae0">applyManifest</a> (std::move(*m));</div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; r == <a class="code" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6afedb2d84cafe20862cb4399751a8a7e3">ManifestDisposition::invalid</a>)</div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; {</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</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;</div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; <span class="stringliteral">&quot;List for &quot;</span> &lt;&lt; <a class="code" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(pubKey) &lt;&lt;</div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="stringliteral">&quot; contained invalid validator manifest&quot;</span>;</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; }</div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; }</div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; </div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="comment">// Cache the validator list in a file</span></div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a4219fb7d196bbc712b2dee8e5b32ae0b">CacheValidatorFile</a>(pubKey, publisher);</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; </div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; <span class="keywordflow">return</span> applyResult;</div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160;}</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; </div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a></div>
<div class="line"><a name="l00456"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a12f49b76ef58d9c64310aa4a7ce0115a"> 456</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a12f49b76ef58d9c64310aa4a7ce0115a">ValidatorList::loadLists</a>()</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160;{</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="keyword">using namespace </span>std::string_literals;</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="keyword">using namespace </span>boost::filesystem;</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="keyword">using namespace </span>boost::system::errc;</div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; </div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</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="l00463"></a><span class="lineno"> 463</span>&#160; </div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a> sites;</div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; sites.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/reserve.html">reserve</a>(<a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>.size());</div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [pubKey, publisher] : <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>)</div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; {</div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; boost::system::error_code ec;</div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; </div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="keywordflow">if</span> (publisher.available)</div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; </div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; boost::filesystem::path <span class="keyword">const</span> filename =</div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a5fe23a63d2db1a3bad3d7c34d75886ec">GetCacheFileName</a>(pubKey);</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; </div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> fullPath{ canonical(filename, ec) };</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <span class="keywordflow">if</span> (ec)</div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; </div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="keyword">auto</span> size = file_size(fullPath, ec);</div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; <span class="keywordflow">if</span> (!ec &amp;&amp; !size)</div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; {</div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; <span class="comment">// Treat an empty file as a missing file, because</span></div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; <span class="comment">// nobody else is going to write it.</span></div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; ec = make_error_code(no_such_file_or_directory);</div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; }</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <span class="keywordflow">if</span> (ec)</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; </div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span> prefix = [&amp;fullPath]() {</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160;<span class="preprocessor">#if _MSC_VER // MSVC: Windows paths need a leading / added</span></div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; {</div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; <span class="keywordflow">return</span> fullPath.root_path() == <span class="stringliteral">&quot;/&quot;</span>s ?</div>
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; <span class="stringliteral">&quot;file://&quot;</span> : <span class="stringliteral">&quot;file:///&quot;</span>;</div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; }</div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; {</div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; (void)fullPath;</div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;file://&quot;</span>;</div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; }</div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; }();</div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; sites.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>(prefix + fullPath.<a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string/basic_string.html">string</a>());</div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; }</div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; </div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; <span class="comment">// Then let the ValidatorSites do the rest of the work.</span></div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; <span class="keywordflow">return</span> sites;</div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160;}</div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; </div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160;<a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3">ListDisposition</a></div>
<div class="line"><a name="l00511"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#ab2a2e3c9e0ca9a49469fd9298ae42bf7"> 511</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#ab2a2e3c9e0ca9a49469fd9298ae42bf7">ValidatorList::verify</a> (</div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; list,</div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a>&amp; pubKey,</div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</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; manifest,</div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</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; blob,</div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</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; signature)</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160;{</div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keyword">auto</span> m = <a class="code" href="namespaceripple.html#a4f4d968c386163c7286107610908902b">deserializeManifest</a>(<a class="code" href="namespaceripple.html#a551be32de1cc0f8a8ff1f14ee84d892b">base64_decode</a>(<a class="code" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>));</div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; </div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <span class="keywordflow">if</span> (! m || ! <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>.count (m-&gt;masterKey))</div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a63d2a671ff6ffd00111188031808aa78">ListDisposition::untrusted</a>;</div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; </div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; pubKey = m-&gt;masterKey;</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> revoked = m-&gt;revoked();</div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; </div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> result = <a class="code" href="classripple_1_1ValidatorList.html#af8fe24acb044cf9b928d14a1e84b63ac">publisherManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a882c588d2f26d7d61ae3ffe4212cbae0">applyManifest</a> (</div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; std::move(*m));</div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; </div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; <span class="keywordflow">if</span> (revoked &amp;&amp; result == <a class="code" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470">ManifestDisposition::accepted</a>)</div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; {</div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a7204fee0608cd8491a7b1a7fbc611962">removePublisherList</a> (pubKey);</div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>.erase (pubKey);</div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; }</div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; </div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <span class="keywordflow">if</span> (revoked || result == <a class="code" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6afedb2d84cafe20862cb4399751a8a7e3">ManifestDisposition::invalid</a>)</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a63d2a671ff6ffd00111188031808aa78">ListDisposition::untrusted</a>;</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; </div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> sig = <a class="code" href="namespaceripple.html#ad8997e43f639b676f9b3f3b9379f933d">strUnHex</a>(signature);</div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> data = <a class="code" href="namespaceripple.html#a551be32de1cc0f8a8ff1f14ee84d892b">base64_decode</a> (blob);</div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <span class="keywordflow">if</span> (! sig ||</div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; ! <a class="code" href="namespaceripple.html#a018bcf9b2ddbc1ace229d8c0a37fdd79">ripple::verify</a> (</div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#af8fe24acb044cf9b928d14a1e84b63ac">publisherManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a8409a7089c3e04f972f1513a54576133">getSigningKey</a>(pubKey),</div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <a class="code" href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">makeSlice</a>(data),</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <a class="code" href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">makeSlice</a>(*sig)))</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a>;</div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; </div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; <a class="code" href="classJson_1_1Reader.html">Json::Reader</a> r;</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; <span class="keywordflow">if</span> (! r.<a class="code" href="classJson_1_1Reader.html#a8ee4d40504e4f8b069745d762ab4d78c">parse</a> (data, list))</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a>;</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; </div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="keywordflow">if</span> (list.<a class="code" href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">isMember</a>(<span class="stringliteral">&quot;sequence&quot;</span>) &amp;&amp; list[<span class="stringliteral">&quot;sequence&quot;</span>].<a class="code" href="classJson_1_1Value.html#aff51d8b52979ca06cf9d909accd5f695">isInt</a>() &amp;&amp;</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; list.<a class="code" href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">isMember</a>(<span class="stringliteral">&quot;expiration&quot;</span>) &amp;&amp; list[<span class="stringliteral">&quot;expiration&quot;</span>].<a class="code" href="classJson_1_1Value.html#aff51d8b52979ca06cf9d909accd5f695">isInt</a>() &amp;&amp;</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; list.<a class="code" href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">isMember</a>(<span class="stringliteral">&quot;validators&quot;</span>) &amp;&amp; list[<span class="stringliteral">&quot;validators&quot;</span>].<a class="code" href="classJson_1_1Value.html#a1627eb9d6568d6d0252fa8bb711c0a59">isArray</a>())</div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; {</div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> sequence = list[<span class="stringliteral">&quot;sequence&quot;</span>].<a class="code" href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">asUInt</a>();</div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> expiration = <a class="code" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{</div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; <a class="code" href="classbeast_1_1abstract__clock.html#ad024b15fa67696e8d1eba3744e800d32">TimeKeeper::duration</a>{list[<span class="stringliteral">&quot;expiration&quot;</span>].<a class="code" href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">asUInt</a>()}};</div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="keywordflow">if</span> (sequence &lt; <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>[pubKey].sequence ||</div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; 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="l00560"></a><span class="lineno"> 560</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a36f34fd8319cf30f8e132ef294c616af">ListDisposition::stale</a>;</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (sequence == <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>[pubKey].sequence)</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a774ecc994c99a32a052f6d67e9b085cc">ListDisposition::same_sequence</a>;</div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; }</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; {</div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a>;</div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; }</div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; </div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ListDisposition::accepted</a>;</div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160;}</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; </div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l00573"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a5b0d33cb960903cc89ba236178e0247b"> 573</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a5b0d33cb960903cc89ba236178e0247b">ValidatorList::listed</a> (</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock&lt;std::shared_timed_mutex&gt;</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; </div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> pubKey = <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">getMasterKey</a> (identity);</div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.find (pubKey) != <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.end ();</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160;}</div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; </div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l00583"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8"> 583</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8">ValidatorList::trusted</a> (<a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock&lt;std::shared_timed_mutex&gt;</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; </div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> pubKey = <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">getMasterKey</a> (identity);</div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.find (pubKey) != <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.end();</div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160;}</div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; </div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160;boost::optional&lt;PublicKey&gt;</div>
<div class="line"><a name="l00592"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a9213779419ea7bb7e56f43512eedd68f"> 592</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a9213779419ea7bb7e56f43512eedd68f">ValidatorList::getListedKey</a> (</div>
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock&lt;std::shared_timed_mutex&gt;</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; </div>
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> pubKey = <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">getMasterKey</a> (identity);</div>
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.find (pubKey) != <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.end ())</div>
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; <span class="keywordflow">return</span> pubKey;</div>
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; <span class="keywordflow">return</span> boost::none;</div>
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160;}</div>
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; </div>
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160;boost::optional&lt;PublicKey&gt;</div>
<div class="line"><a name="l00604"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#aece94fa28e349ef2951de33b592d7e03"> 604</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#aece94fa28e349ef2951de33b592d7e03">ValidatorList::getTrustedKey</a> (<a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock&lt;std::shared_timed_mutex&gt;</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; </div>
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> pubKey = <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">getMasterKey</a> (identity);</div>
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.find (pubKey) != <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.end())</div>
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; <span class="keywordflow">return</span> pubKey;</div>
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; <span class="keywordflow">return</span> boost::none;</div>
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160;}</div>
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; </div>
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l00615"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a90d8cf623e6011f148956964d0e09b9c"> 615</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a90d8cf623e6011f148956964d0e09b9c">ValidatorList::trustedPublisher</a> (<a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock&lt;std::shared_timed_mutex&gt;</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; <span class="keywordflow">return</span> identity.<a class="code" href="classripple_1_1PublicKey.html#a663437215503b159ed33b1664e4213a3">size</a>() &amp;&amp; <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>.count (identity);</div>
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160;}</div>
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; </div>
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160;<a class="code" href="classripple_1_1PublicKey.html">PublicKey</a></div>
<div class="line"><a name="l00622"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a4681f2660d566c13e7a3a7886512cbe4"> 622</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a4681f2660d566c13e7a3a7886512cbe4">ValidatorList::localPublicKey</a> ()<span class="keyword"> const</span></div>
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock&lt;std::shared_timed_mutex&gt;</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#ae572133b799990fc68d8071e6b835b39">localPubKey_</a>;</div>
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160;}</div>
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; </div>
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l00629"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a7204fee0608cd8491a7b1a7fbc611962"> 629</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a7204fee0608cd8491a7b1a7fbc611962">ValidatorList::removePublisherList</a> (<a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; publisherKey)</div>
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160;{</div>
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> iList = <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>.find (publisherKey);</div>
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; <span class="keywordflow">if</span> (iList == <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>.end ())</div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; </div>
<div class="line"><a name="l00635"></a><span class="lineno"> 635</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;</div>
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; <span class="stringliteral">&quot;Removing validator list for publisher &quot;</span> &lt;&lt; <a class="code" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(publisherKey);</div>
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; </div>
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; val : iList-&gt;second.list)</div>
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; {</div>
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; iVal = <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.find (val);</div>
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; <span class="keywordflow">if</span> (iVal == <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.end())</div>
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; </div>
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; <span class="keywordflow">if</span> (iVal-&gt;second &lt;= 1)</div>
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.erase (iVal);</div>
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; --iVal-&gt;second;</div>
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; }</div>
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; </div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; iList-&gt;second.list.clear();</div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; iList-&gt;second.available = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; </div>
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160;}</div>
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; </div>
<div class="line"><a name="l00656"></a><span class="lineno"> 656</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="l00657"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd"> 657</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">ValidatorList::count</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock&lt;std::shared_timed_mutex&gt;</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>.size();</div>
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160;}</div>
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160; </div>
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160;boost::optional&lt;TimeKeeper::time_point&gt;</div>
<div class="line"><a name="l00664"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a608e1393a7167c3eab922c3842c17f0d"> 664</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a608e1393a7167c3eab922c3842c17f0d">ValidatorList::expires</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock&lt;std::shared_timed_mutex&gt;</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; boost::optional&lt;TimeKeeper::time_point&gt; res{boost::none};</div>
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; p : <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>)</div>
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; {</div>
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; <span class="comment">// Unfetched</span></div>
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; <span class="keywordflow">if</span> (p.second.expiration == <a class="code" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{})</div>
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160; <span class="keywordflow">return</span> boost::none;</div>
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; </div>
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160; <span class="comment">// Earliest</span></div>
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160; <span class="keywordflow">if</span> (!res || p.second.expiration &lt; *res)</div>
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160; res = p.second.expiration;</div>
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; }</div>
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; <span class="keywordflow">return</span> res;</div>
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160;}</div>
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; </div>
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160;<a class="code" href="classJson_1_1Value.html">Json::Value</a></div>
<div class="line"><a name="l00682"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a6f943a4488f3b50dcbb5177007d43271"> 682</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a6f943a4488f3b50dcbb5177007d43271">ValidatorList::getJson</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a> res(<a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; </div>
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock&lt;std::shared_timed_mutex&gt;</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; </div>
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; res[jss::validation_quorum] = <span class="keyword">static_cast&lt;</span><a class="code" href="namespaceJson.html#ab1488c31a37eea2d37f36a0961372572">Json::UInt</a><span class="keyword">&gt;</span>(<a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a>());</div>
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160; </div>
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; {</div>
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160; <span class="keyword">auto</span>&amp; x = (res[jss::validator_list] = <a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; </div>
<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; x[jss::count] = <span class="keyword">static_cast&lt;</span><a class="code" href="namespaceJson.html#ab1488c31a37eea2d37f36a0961372572">Json::UInt</a><span class="keyword">&gt;</span>(<a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a>());</div>
<div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160; </div>
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">auto</span> when = <a class="code" href="classripple_1_1ValidatorList.html#a608e1393a7167c3eab922c3842c17f0d">expires</a>())</div>
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; {</div>
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; <span class="keywordflow">if</span> (*when == TimeKeeper::time_point::max())</div>
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; {</div>
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; x[jss::expiration] = <span class="stringliteral">&quot;never&quot;</span>;</div>
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; x[jss::status] = <span class="stringliteral">&quot;active&quot;</span>;</div>
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; }</div>
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; {</div>
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; x[jss::expiration] = <a class="code" href="namespaceripple.html#a96888695e8d79474e080c334f149e30a">to_string</a>(*when);</div>
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; </div>
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; <span class="keywordflow">if</span> (*when &gt; <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="l00707"></a><span class="lineno"> 707</span>&#160; x[jss::status] = <span class="stringliteral">&quot;active&quot;</span>;</div>
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160; x[jss::status] = <span class="stringliteral">&quot;expired&quot;</span>;</div>
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; }</div>
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; }</div>
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; {</div>
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; x[jss::status] = <span class="stringliteral">&quot;unknown&quot;</span>;</div>
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; x[jss::expiration] = <span class="stringliteral">&quot;unknown&quot;</span>;</div>
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160; }</div>
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; }</div>
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; </div>
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; <span class="comment">// Local static keys</span></div>
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> local;</div>
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; jLocalStaticKeys =</div>
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; (res[jss::local_static_keys] = <a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">auto</span> it = <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>.find(local);</div>
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160; it != <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>.end())</div>
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; {</div>
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; key : it-&gt;second.list)</div>
<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; jLocalStaticKeys.<a class="code" href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">append</a>(</div>
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; <a class="code" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(<a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, key));</div>
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; }</div>
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; </div>
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160; <span class="comment">// Publisher lists</span></div>
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; jPublisherLists =</div>
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; (res[jss::publisher_lists] = <a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; p : <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>)</div>
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; {</div>
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; <span class="keywordflow">if</span>(local == p.first)</div>
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; curr = jPublisherLists.<a class="code" href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">append</a>(<a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; curr[jss::pubkey_publisher] = <a class="code" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(p.first);</div>
<div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; curr[jss::available] = p.second.available;</div>
<div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160; curr[jss::uri] = p.second.siteUri;</div>
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160; <span class="keywordflow">if</span>(p.second.expiration != <a class="code" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{})</div>
<div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160; {</div>
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; curr[jss::seq] = <span class="keyword">static_cast&lt;</span><a class="code" href="namespaceJson.html#ab1488c31a37eea2d37f36a0961372572">Json::UInt</a><span class="keyword">&gt;</span>(p.second.sequence);</div>
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160; curr[jss::expiration] = <a class="code" href="namespaceripple.html#a96888695e8d79474e080c334f149e30a">to_string</a>(p.second.expiration);</div>
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160; curr[jss::version] = <a class="code" href="classripple_1_1ValidatorList.html#af8c342923da977e84631fd4c54380c6d">requiredListVersion</a>;</div>
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>&#160; }</div>
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; keys = (curr[jss::list] = <a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; key : p.second.list)</div>
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160; {</div>
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160; keys.<a class="code" href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">append</a>(<a class="code" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(<a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, key));</div>
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160; }</div>
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160; }</div>
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; </div>
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160; <span class="comment">// Trusted validator keys</span></div>
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; jValidatorKeys =</div>
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; (res[jss::trusted_validator_keys] = <a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a name="l00758"></a><span class="lineno"> 758</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="l00759"></a><span class="lineno"> 759</span>&#160; {</div>
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160; jValidatorKeys.<a class="code" href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">append</a>(<a class="code" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(<a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, k));</div>
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; }</div>
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>&#160; </div>
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>&#160; <span class="comment">// signing keys</span></div>
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; jSigningKeys = (res[jss::signing_keys] = <a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a7f05c967613f99e5f05af017673c6765">for_each_manifest</a>(</div>
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160; [&amp;jSigningKeys, <span class="keyword">this</span>](<a class="code" href="structripple_1_1Manifest.html">Manifest</a> <span class="keyword">const</span>&amp; <a class="code" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>) {</div>
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160; </div>
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160; <span class="keyword">auto</span> it = <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.find(<a class="code" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>.masterKey);</div>
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160; <span class="keywordflow">if</span> (it != <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.end())</div>
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; {</div>
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160; jSigningKeys[<a class="code" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(</div>
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160; <a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, <a class="code" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>.masterKey)] =</div>
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160; <a class="code" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(<a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, <a class="code" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>.signingKey);</div>
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160; }</div>
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160; });</div>
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>&#160; </div>
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>&#160; <span class="keywordflow">return</span> res;</div>
<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160;}</div>
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160; </div>
<div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00781"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#abc82f50ad5da8d3d12240e8025369789"> 781</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#abc82f50ad5da8d3d12240e8025369789">ValidatorList::for_each_listed</a> (</div>
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/functional/function.html">std::function</a>&lt;<span class="keywordtype">void</span>(<a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp;, <span class="keywordtype">bool</span>)&gt; func)<span class="keyword"> const</span></div>
<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock&lt;std::shared_timed_mutex&gt;</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>&#160; </div>
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; v : <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>)</div>
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160; func (v.first, <a class="code" href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8">trusted</a>(v.first));</div>
<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160;}</div>
<div class="line"><a name="l00789"></a><span class="lineno"> 789</span>&#160; </div>
<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00791"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a30930d47bbf6d9db299be15a72af1e13"> 791</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a30930d47bbf6d9db299be15a72af1e13">ValidatorList::for_each_available</a> (</div>
<div class="line"><a name="l00792"></a><span class="lineno"> 792</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/functional/function.html">std::function</a>&lt;<span class="keywordtype">void</span>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; manifest,</div>
<div class="line"><a name="l00793"></a><span class="lineno"> 793</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; blob, <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; signature,</div>
<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> version,</div>
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; pubKey, <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> sequence,</div>
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160; <a class="code" href="classripple_1_1base__uint.html">uint256</a> <span class="keyword">const</span>&amp; hash)&gt; func)<span class="keyword"> const</span></div>
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock&lt;std::shared_timed_mutex&gt;</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; </div>
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [key, pl] : <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>)</div>
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160; {</div>
<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160; <span class="keywordflow">if</span> (!pl.available)</div>
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; func(pl.rawManifest, pl.rawBlob, pl.rawSignature, pl.rawVersion,</div>
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160; key, pl.sequence, pl.hash);</div>
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160; }</div>
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160;}</div>
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160; </div>
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160;boost::optional&lt;Json::Value&gt;</div>
<div class="line"><a name="l00810"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a2b2a35a9ac2d60f515e07746866d6bf0"> 810</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a2b2a35a9ac2d60f515e07746866d6bf0">ValidatorList::getAvailable</a>(boost::beast::string_view <span class="keyword">const</span>&amp; pubKey)</div>
<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160;{</div>
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock&lt;std::shared_timed_mutex&gt;</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">mutex_</a>};</div>
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160; </div>
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> keyBlob = <a class="code" href="namespaceripple.html#abda439bb874eb6090230057a26e41bb2">strViewUnHex</a> (pubKey);</div>
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>&#160; </div>
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>&#160; <span class="keywordflow">if</span> (! keyBlob || ! <a class="code" href="namespaceripple.html#abe1502195233c7375f3465f17c7610e4">publicKeyType</a>(<a class="code" href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">makeSlice</a>(*keyBlob)))</div>
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160; {</div>
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; JLOG (<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) &lt;&lt;</div>
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160; <span class="stringliteral">&quot;Invalid requested validator list publisher key: &quot;</span> &lt;&lt; pubKey;</div>
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; <span class="keywordflow">return</span> {};</div>
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; }</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; <span class="keyword">auto</span> <span class="keywordtype">id</span> = <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a>(<a class="code" href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">makeSlice</a>(*keyBlob));</div>
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; </div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; <span class="keyword">auto</span> iter = <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>.find(<span class="keywordtype">id</span>);</div>
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; </div>
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; <span class="keywordflow">if</span> (iter == <a class="code" href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">publisherLists_</a>.end()</div>
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; || !iter-&gt;second.available)</div>
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; <span class="keywordflow">return</span> {};</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="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="l00832"></a><span class="lineno"> 832</span>&#160; </div>
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160; value[<span class="stringliteral">&quot;manifest&quot;</span>] = iter-&gt;second.rawManifest;</div>
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; value[<span class="stringliteral">&quot;blob&quot;</span>] = iter-&gt;second.rawBlob;</div>
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160; value[<span class="stringliteral">&quot;signature&quot;</span>] = iter-&gt;second.rawSignature;</div>
<div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160; value[<span class="stringliteral">&quot;version&quot;</span>] = iter-&gt;second.rawVersion;</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="keywordflow">return</span> value;</div>
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160;}</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;<a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="line"><a name="l00842"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a648302fc55a9ec3c6d09301519f50ade"> 842</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a648302fc55a9ec3c6d09301519f50ade">ValidatorList::calculateQuorum</a> (</div>
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> <a class="code" href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8">trusted</a>, <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> seen)</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">// Do not use achievable quorum until lists from all configured</span></div>
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160; <span class="comment">// publishers are available</span></div>
<div class="line"><a name="l00847"></a><span class="lineno"> 847</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="l00848"></a><span class="lineno"> 848</span>&#160; {</div>
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; <span class="keywordflow">if</span> (! list.second.available)</div>
<div class="line"><a name="l00850"></a><span class="lineno"> 850</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="l00851"></a><span class="lineno"> 851</span>&#160; }</div>
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; </div>
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160; <span class="comment">// Use an 80% quorum to balance fork safety, liveness, and required UNL</span></div>
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; <span class="comment">// overlap.</span></div>
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160; <span class="comment">// Theorem 8 of the Analysis of the XRP Ledger Consensus Protocol</span></div>
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160; <span class="comment">// (https://arxiv.org/abs/1802.07242) says:</span></div>
<div class="line"><a name="l00858"></a><span class="lineno"> 858</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="l00859"></a><span class="lineno"> 859</span>&#160; <span class="comment">// every pair of nodes Pi, Pj.</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">// ni: size of Pi&#39;s UNL</span></div>
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; <span class="comment">// nj: size of Pj&#39;s UNL</span></div>
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; <span class="comment">// Oi,j: number of validators in both UNLs</span></div>
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; <span class="comment">// qi: validation quorum for Pi&#39;s UNL</span></div>
<div class="line"><a name="l00865"></a><span class="lineno"> 865</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="l00866"></a><span class="lineno"> 866</span>&#160; <span class="comment">// ti,j: min{ti, tj, Oi,j}</span></div>
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160; <span class="comment">// Assume ni &lt; nj, meaning and ti,j = ti</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">// For qi = .8*ni, we make ti &lt;= .2*ni</span></div>
<div class="line"><a name="l00871"></a><span class="lineno"> 871</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="l00872"></a><span class="lineno"> 872</span>&#160; <span class="comment">// to prioritize safety over liveness, we need ti &gt;= ni - qi)</span></div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</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="l00875"></a><span class="lineno"> 875</span>&#160; <span class="comment">// between them:</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">// pi = ni - Oi,j</span></div>
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160; <span class="comment">// pj = nj - Oi,j</span></div>
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; <span class="comment">// Oi,j &gt; nj/2 + ni qi + ti,j</span></div>
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160; <span class="comment">// ni - pi &gt; (ni - pi + pj)/2 + ni .8*ni + .2*ni</span></div>
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160; <span class="comment">// pi + pj &lt; .2*ni</span></div>
<div class="line"><a name="l00883"></a><span class="lineno"> 883</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/numeric/math/ceil.html">std::ceil</a>(<a class="code" href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8">trusted</a> * 0.8f));</div>
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160; </div>
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; <span class="comment">// Use lower quorum specified via command line if the normal quorum appears</span></div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; <span class="comment">// unreachable based on the number of recently received validations.</span></div>
<div class="line"><a name="l00887"></a><span class="lineno"> 887</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; seen &lt; <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</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; <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="l00890"></a><span class="lineno"> 890</span>&#160; </div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</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>())</div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Using unsafe quorum of &quot;</span></div>
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160; &lt;&lt; <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; &lt;&lt; <span class="stringliteral">&quot; as specified in the command line&quot;</span>;</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; </div>
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a>;</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; </div>
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>&#160;<a class="code" href="structripple_1_1TrustChanges.html">TrustChanges</a></div>
<div class="line"><a name="l00901"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a890fcc8a3569fb40f0492606b2116fd8"> 901</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="l00902"></a><span class="lineno"> 902</span>&#160;{</div>
<div class="line"><a name="l00903"></a><span class="lineno"> 903</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="l00904"></a><span class="lineno"> 904</span>&#160; </div>
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>&#160; <span class="comment">// Remove any expired published lists</span></div>
<div class="line"><a name="l00906"></a><span class="lineno"> 906</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="l00907"></a><span class="lineno"> 907</span>&#160; {</div>
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; <span class="keywordflow">if</span> (list.second.available &amp;&amp;</div>
<div class="line"><a name="l00909"></a><span class="lineno"> 909</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="l00910"></a><span class="lineno"> 910</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a7204fee0608cd8491a7b1a7fbc611962">removePublisherList</a>(list.first);</div>
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160; }</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; <a class="code" href="structripple_1_1TrustChanges.html">TrustChanges</a> trustChanges;</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; <span class="keyword">auto</span> it = <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.cbegin();</div>
<div class="line"><a name="l00916"></a><span class="lineno"> 916</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="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">if</span> (!<a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.count(*it) ||</div>
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; <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="l00920"></a><span class="lineno"> 920</span>&#160; {</div>
<div class="line"><a name="l00921"></a><span class="lineno"> 921</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="l00922"></a><span class="lineno"> 922</span>&#160; it = <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.erase(it);</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">else</span></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; ++it;</div>
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; }</div>
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>&#160; }</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; <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="l00931"></a><span class="lineno"> 931</span>&#160; {</div>
<div class="line"><a name="l00932"></a><span class="lineno"> 932</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="l00933"></a><span class="lineno"> 933</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.emplace(val.first).second)</div>
<div class="line"><a name="l00934"></a><span class="lineno"> 934</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="l00935"></a><span class="lineno"> 935</span>&#160; }</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="comment">// If there were any changes, we need to update the ephemeral signing keys:</span></div>
<div class="line"><a name="l00938"></a><span class="lineno"> 938</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="l00939"></a><span class="lineno"> 939</span>&#160; {</div>
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#ae06a469121f9f99ed9f3049e46d0206c">trustedSigningKeys_</a>.clear();</div>
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160; </div>
<div class="line"><a name="l00942"></a><span class="lineno"> 942</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="l00943"></a><span class="lineno"> 943</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="l00944"></a><span class="lineno"> 944</span>&#160; }</div>
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; </div>
<div class="line"><a name="l00946"></a><span class="lineno"> 946</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="l00947"></a><span class="lineno"> 947</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="l00948"></a><span class="lineno"> 948</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="l00949"></a><span class="lineno"> 949</span>&#160; </div>
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a> = <a class="code" href="classripple_1_1ValidatorList.html#a648302fc55a9ec3c6d09301519f50ade">calculateQuorum</a> (<a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size(), seenValidators.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set/size.html">size</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; 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="l00953"></a><span class="lineno"> 953</span>&#160; &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="l00954"></a><span class="lineno"> 954</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="l00955"></a><span class="lineno"> 955</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="l00956"></a><span class="lineno"> 956</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="l00957"></a><span class="lineno"> 957</span>&#160; </div>
<div class="line"><a name="l00958"></a><span class="lineno"> 958</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="l00959"></a><span class="lineno"> 959</span>&#160; {</div>
<div class="line"><a name="l00960"></a><span class="lineno"> 960</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>())</div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; &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="l00962"></a><span class="lineno"> 962</span>&#160; &lt;&lt; <span class="stringliteral">&quot; exceeds the number of trusted validators (&quot;</span></div>
<div class="line"><a name="l00963"></a><span class="lineno"> 963</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="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; <span class="keywordflow">return</span> trustChanges;</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; </div>
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160;} <span class="comment">// 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#l01012">json_value.cpp:1012</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#l00592">ValidatorList.cpp:592</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a19f4cc404400551b2a39c7c5a137e01f"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">ripple::ValidatorList::validatorManifests_</a></div><div class="ttdeci">ManifestCache &amp; validatorManifests_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00137">ValidatorList.h:137</a></div></div>
<div class="ttc" id="anamespaceripple_html_aabe37451093c21757855542d68fba3ce"><div class="ttname"><a href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">ripple::makeSlice</a></div><div class="ttdeci">std::enable_if_t&lt; std::is_same&lt; T, char &gt;::value||std::is_same&lt; T, unsigned char &gt;::value, Slice &gt; makeSlice(std::array&lt; T, N &gt; const &amp;a)</div><div class="ttdef"><b>Definition:</b> <a href="Slice_8h_source.html#l00199">Slice.h:199</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_abc82f50ad5da8d3d12240e8025369789"><div class="ttname"><a href="classripple_1_1ValidatorList.html#abc82f50ad5da8d3d12240e8025369789">ripple::ValidatorList::for_each_listed</a></div><div class="ttdeci">void for_each_listed(std::function&lt; void(PublicKey const &amp;, bool)&gt; func) const</div><div class="ttdoc">Invokes the callback once for every listed validation public key.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00781">ValidatorList.cpp:781</a></div></div>
<div class="ttc" id="aclassripple_1_1HashRouter_html_a86c862f1b0722d061b3724ff34a53572"><div class="ttname"><a href="classripple_1_1HashRouter.html#a86c862f1b0722d061b3724ff34a53572">ripple::HashRouter::addSuppressionPeer</a></div><div class="ttdeci">bool addSuppressionPeer(uint256 const &amp;key, PeerShortID peer)</div><div class="ttdef"><b>Definition:</b> <a href="HashRouter_8cpp_source.html#l00053">HashRouter.cpp:53</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a4681f2660d566c13e7a3a7886512cbe4"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a4681f2660d566c13e7a3a7886512cbe4">ripple::ValidatorList::localPublicKey</a></div><div class="ttdeci">PublicKey localPublicKey() const</div><div class="ttdoc">Returns local validator public key.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00622">ValidatorList.cpp:622</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="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3">ripple::ListDisposition</a></div><div class="ttdeci">ListDisposition</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00042">ValidatorList.h:42</a></div></div>
<div class="ttc" id="aclassripple_1_1ManifestCache_html_adbe8167cfd5ac328a9bf8b85c319ddc1"><div class="ttname"><a href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">ripple::ManifestCache::getMasterKey</a></div><div class="ttdeci">PublicKey getMasterKey(PublicKey const &amp;pk) const</div><div class="ttdoc">Returns ephemeral signing key's master public key.</div><div class="ttdef"><b>Definition:</b> <a href="app_2misc_2impl_2Manifest_8cpp_source.html#l00301">app/misc/impl/Manifest.cpp:301</a></div></div>
<div class="ttc" id="anamespaceripple_html_a984ddd646f1e1a5032a9a17f96c6fc55"><div class="ttname"><a href="namespaceripple.html#a984ddd646f1e1a5032a9a17f96c6fc55">ripple::calcNodeID</a></div><div class="ttdeci">NodeID calcNodeID(PublicKey const &amp;pk)</div><div class="ttdoc">Calculate the 160-bit node ID from a node public key.</div><div class="ttdef"><b>Definition:</b> <a href="PublicKey_8cpp_source.html#l00307">PublicKey.cpp:307</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_abbe082bd27ca0f1d1365af2824e4f85b"><div class="ttname"><a href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">beast::Journal::trace</a></div><div class="ttdeci">Stream trace() const</div><div class="ttdoc">Severity stream access functions.</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00287">Journal.h:287</a></div></div>
<div class="ttc" id="anamespaceripple_html_abe1502195233c7375f3465f17c7610e4"><div class="ttname"><a href="namespaceripple.html#abe1502195233c7375f3465f17c7610e4">ripple::publicKeyType</a></div><div class="ttdeci">boost::optional&lt; KeyType &gt; publicKeyType(Slice const &amp;slice)</div><div class="ttdoc">Returns the type of public key.</div><div class="ttdef"><b>Definition:</b> <a href="PublicKey_8cpp_source.html#l00207">PublicKey.cpp:207</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html_a7fd1c2f0f5ac25e9fb5ae3483cad2ddd"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html#a7fd1c2f0f5ac25e9fb5ae3483cad2ddd">ripple::ValidatorList::PublisherList::rawSignature</a></div><div class="ttdeci">std::string rawSignature</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00132">ValidatorList.h:132</a></div></div>
<div class="ttc" id="astructripple_1_1TrustChanges_html"><div class="ttname"><a href="structripple_1_1TrustChanges.html">ripple::TrustChanges</a></div><div class="ttdoc">Changes in trusted nodes after updating validator list.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00068">ValidatorList.h:68</a></div></div>
<div class="ttc" id="astructripple_1_1Manifest_html"><div class="ttname"><a href="structripple_1_1Manifest.html">ripple::Manifest</a></div><div class="ttdef"><b>Definition:</b> <a href="Manifest_8h_source.html#l00078">Manifest.h:78</a></div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a36f34fd8319cf30f8e132ef294c616af"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a36f34fd8319cf30f8e132ef294c616af">ripple::ListDisposition::stale</a></div><div class="ttdeci">@ stale</div><div class="ttdoc">Trusted publisher key, but seq is too old.</div></div>
<div class="ttc" id="aclassripple_1_1Slice_html"><div class="ttname"><a href="classripple_1_1Slice.html">ripple::Slice</a></div><div class="ttdoc">An immutable linear range of bytes.</div><div class="ttdef"><b>Definition:</b> <a href="Slice_8h_source.html#l00043">Slice.h:43</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a7d499eb08ea863d674f5fab385c67653"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a7d499eb08ea863d674f5fab385c67653">ripple::ValidatorList::publisherLists_</a></div><div class="ttdeci">hash_map&lt; PublicKey, PublisherList &gt; publisherLists_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00148">ValidatorList.h:148</a></div></div>
<div class="ttc" id="aunordered_set_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/unordered_set.html">std::unordered_set</a></div><div class="ttdoc">STL class.</div></div>
<div class="ttc" id="anamespaceJson_html_a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4"><div class="ttname"><a href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a></div><div class="ttdeci">@ arrayValue</div><div class="ttdoc">array value (ordered list)</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8h_source.html#l00044">json_value.h:44</a></div></div>
<div class="ttc" id="areserve_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/reserve.html">std::vector::reserve</a></div><div class="ttdeci">T reserve(T... args)</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a2b2a35a9ac2d60f515e07746866d6bf0"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a2b2a35a9ac2d60f515e07746866d6bf0">ripple::ValidatorList::getAvailable</a></div><div class="ttdeci">boost::optional&lt; Json::Value &gt; getAvailable(boost::beast::string_view const &amp;pubKey)</div><div class="ttdoc">Returns the current valid list for the given publisher key, if available, as a Json object.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00810">ValidatorList.cpp:810</a></div></div>
<div class="ttc" id="anamespaceripple_html_ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45"><div class="ttname"><a href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">ripple::HashPrefix::manifest</a></div><div class="ttdeci">@ manifest</div><div class="ttdoc">Manifest.</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a5fe23a63d2db1a3bad3d7c34d75886ec"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a5fe23a63d2db1a3bad3d7c34d75886ec">ripple::ValidatorList::GetCacheFileName</a></div><div class="ttdeci">boost::filesystem::path GetCacheFileName(PublicKey const &amp;pubKey)</div><div class="ttdoc">Get the filename used for caching UNLs.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00204">ValidatorList.cpp:204</a></div></div>
<div class="ttc" id="anamespaceJson_html_ab1488c31a37eea2d37f36a0961372572"><div class="ttname"><a href="namespaceJson.html#ab1488c31a37eea2d37f36a0961372572">Json::UInt</a></div><div class="ttdeci">unsigned int UInt</div><div class="ttdef"><b>Definition:</b> <a href="json__forwards_8h_source.html#l00028">json_forwards.h:28</a></div></div>
<div class="ttc" id="avector_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt; std::string &gt;</a></div></div>
<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#l00615">ValidatorList.cpp:615</a></div></div>
<div class="ttc" id="aclassripple_1_1Overlay_html_a5b8ee783b77679fb2fad2543ab521a90"><div class="ttname"><a href="classripple_1_1Overlay.html#a5b8ee783b77679fb2fad2543ab521a90">ripple::Overlay::getActivePeers</a></div><div class="ttdeci">virtual PeerSequence getActivePeers()=0</div><div class="ttdoc">Returns a sequence representing the current list of peers.</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#l00182">ValidatorList.h:182</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#l00165">ValidatorList.h:165</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#l00901">ValidatorList.cpp:901</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#l00087">Slice.h:87</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#l00302">Journal.h:302</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#l00511">ValidatorList.cpp:511</a></div></div>
<div class="ttc" id="anamespaceripple_html_ad8997e43f639b676f9b3f3b9379f933d"><div class="ttname"><a href="namespaceripple.html#ad8997e43f639b676f9b3f3b9379f933d">ripple::strUnHex</a></div><div class="ttdeci">boost::optional&lt; Blob &gt; strUnHex(std::size_t strSize, Iterator begin, Iterator end)</div><div class="ttdef"><b>Definition:</b> <a href="StringUtilities_8h_source.html#l00069">StringUtilities.h:69</a></div></div>
<div class="ttc" id="afunction_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/functional/function.html">std::function</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_a3696d34c1a1833742b4bf8e5b247f125"><div class="ttname"><a href="classJson_1_1Value.html#a3696d34c1a1833742b4bf8e5b247f125">Json::Value::toStyledString</a></div><div class="ttdeci">std::string toStyledString() const</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l01081">json_value.cpp:1081</a></div></div>
<div class="ttc" id="anamespaceripple_html_a96888695e8d79474e080c334f149e30a"><div class="ttname"><a href="namespaceripple.html#a96888695e8d79474e080c334f149e30a">ripple::to_string</a></div><div class="ttdeci">std::string to_string(ListDisposition disposition)</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00041">ValidatorList.cpp:41</a></div></div>
<div class="ttc" id="aclassJson_1_1Reader_html"><div class="ttname"><a href="classJson_1_1Reader.html">Json::Reader</a></div><div class="ttdoc">Unserialize a JSON document into a Value.</div><div class="ttdef"><b>Definition:</b> <a href="json__reader_8h_source.html#l00036">json_reader.h:36</a></div></div>
<div class="ttc" id="acmath_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/cmath.html">cmath</a></div></div>
<div class="ttc" id="asort_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/sort.html">std::sort</a></div><div class="ttdeci">T sort(T... args)</div></div>
<div class="ttc" id="aclassripple_1_1HashRouter_html"><div class="ttname"><a href="classripple_1_1HashRouter.html">ripple::HashRouter</a></div><div class="ttdoc">Routing table for objects identified by hash.</div><div class="ttdef"><b>Definition:</b> <a href="HashRouter_8h_source.html#l00053">HashRouter.h:53</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a557b7cbe6e4a43df56025123e62b91e7"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a557b7cbe6e4a43df56025123e62b91e7">ripple::ValidatorList::mutex_</a></div><div class="ttdeci">std::shared_timed_mutex mutex_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00142">ValidatorList.h:142</a></div></div>
<div class="ttc" id="aclear_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/clear.html">std::vector::clear</a></div><div class="ttdeci">T clear(T... args)</div></div>
<div class="ttc" id="apush_back_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/push_back.html">std::vector::push_back</a></div><div class="ttdeci">T push_back(T... args)</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a178bce347d83230ff994989adeb5327b"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a178bce347d83230ff994989adeb5327b">ripple::ValidatorList::ValidatorList</a></div><div class="ttdeci">ValidatorList(ManifestCache &amp;validatorManifests, ManifestCache &amp;publisherManifests, TimeKeeper &amp;timeKeeper, std::string const &amp;databasePath, beast::Journal j, boost::optional&lt; std::size_t &gt; minimumQuorum=boost::none)</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00063">ValidatorList.cpp:63</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_aece94fa28e349ef2951de33b592d7e03"><div class="ttname"><a href="classripple_1_1ValidatorList.html#aece94fa28e349ef2951de33b592d7e03">ripple::ValidatorList::getTrustedKey</a></div><div class="ttdeci">boost::optional&lt; PublicKey &gt; getTrustedKey(PublicKey const &amp;identity) const</div><div class="ttdoc">Returns master public key if public key is trusted.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00604">ValidatorList.cpp:604</a></div></div>
<div class="ttc" id="anamespaceripple_html_a018bcf9b2ddbc1ace229d8c0a37fdd79"><div class="ttname"><a href="namespaceripple.html#a018bcf9b2ddbc1ace229d8c0a37fdd79">ripple::verify</a></div><div class="ttdeci">bool verify(PublicKey const &amp;publicKey, Slice const &amp;m, Slice const &amp;sig, bool mustBeFullyCanonical)</div><div class="ttdoc">Verify a signature on a message.</div><div class="ttdef"><b>Definition:</b> <a href="PublicKey_8cpp_source.html#l00277">PublicKey.cpp:277</a></div></div>
<div class="ttc" id="aclassripple_1_1base__uint_html"><div class="ttname"><a href="classripple_1_1base__uint.html">ripple::base_uint&lt; 256 &gt;</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a4219fb7d196bbc712b2dee8e5b32ae0b"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a4219fb7d196bbc712b2dee8e5b32ae0b">ripple::ValidatorList::CacheValidatorFile</a></div><div class="ttdeci">void CacheValidatorFile(PublicKey const &amp;pubKey, PublisherList const &amp;publisher)</div><div class="ttdoc">Write a JSON UNL to a cache file.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00210">ValidatorList.cpp:210</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a648302fc55a9ec3c6d09301519f50ade"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a648302fc55a9ec3c6d09301519f50ade">ripple::ValidatorList::calculateQuorum</a></div><div class="ttdeci">std::size_t calculateQuorum(std::size_t trusted, std::size_t seen)</div><div class="ttdoc">Return quorum for trusted validator set.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00842">ValidatorList.cpp:842</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html_adfee631eb841106a863e22ca33340dd8"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html#adfee631eb841106a863e22ca33340dd8">ripple::ValidatorList::PublisherList::rawVersion</a></div><div class="ttdeci">std::uint32_t rawVersion</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00133">ValidatorList.h:133</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_a7e49ac977e4bcf59745a09d426669f75"><div class="ttname"><a href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">Json::Value::append</a></div><div class="ttdeci">Value &amp; append(const Value &amp;value)</div><div class="ttdoc">Append value to array at the end.</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l00907">json_value.cpp:907</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a53a444cf253f5a11a1b800c23e691e31"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a53a444cf253f5a11a1b800c23e691e31">ripple::ValidatorList::dataPath_</a></div><div class="ttdeci">const boost::filesystem::path dataPath_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00140">ValidatorList.h:140</a></div></div>
<div class="ttc" id="anamespaceJson_html_a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6"><div class="ttname"><a href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a></div><div class="ttdeci">@ objectValue</div><div class="ttdoc">object value (collection of name/value pairs).</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8h_source.html#l00045">json_value.h:45</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_adca31b5572990c6930c0baed59af7ed7"><div class="ttname"><a href="classripple_1_1ValidatorList.html#adca31b5572990c6930c0baed59af7ed7">ripple::ValidatorList::applyList</a></div><div class="ttdeci">PublisherListStats applyList(std::string const &amp;manifest, std::string const &amp;blob, std::string const &amp;signature, std::uint32_t version, std::string siteUri, boost::optional&lt; uint256 &gt; const &amp;hash={})</div><div class="ttdoc">Apply published list of public keys.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00307">ValidatorList.cpp:307</a></div></div>
<div class="ttc" id="aclassripple_1_1PublicKey_html"><div class="ttname"><a href="classripple_1_1PublicKey.html">ripple::PublicKey</a></div><div class="ttdoc">A public key.</div><div class="ttdef"><b>Definition:</b> <a href="PublicKey_8h_source.html#l00059">PublicKey.h:59</a></div></div>
<div class="ttc" id="aclassripple_1_1PublicKey_html_a663437215503b159ed33b1664e4213a3"><div class="ttname"><a href="classripple_1_1PublicKey.html#a663437215503b159ed33b1664e4213a3">ripple::PublicKey::size</a></div><div class="ttdeci">std::size_t size() const noexcept</div><div class="ttdef"><b>Definition:</b> <a href="PublicKey_8h_source.html#l00087">PublicKey.h:87</a></div></div>
<div class="ttc" id="astructripple_1_1TrustChanges_html_a968f2c3bdc3420ca645ad54a5be5c6d9"><div class="ttname"><a href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">ripple::TrustChanges::removed</a></div><div class="ttdeci">hash_set&lt; NodeID &gt; removed</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00073">ValidatorList.h:73</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_ac3bef5a420cac0a3c854398d22d79e01"><div class="ttname"><a href="classripple_1_1ValidatorList.html#ac3bef5a420cac0a3c854398d22d79e01">ripple::ValidatorList::minimumQuorum_</a></div><div class="ttdeci">boost::optional&lt; std::size_t &gt; minimumQuorum_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00145">ValidatorList.h:145</a></div></div>
<div class="ttc" id="aunique_lock_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/thread/unique_lock.html">std::unique_lock</a></div><div class="ttdoc">STL class.</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_af8fe24acb044cf9b928d14a1e84b63ac"><div class="ttname"><a href="classripple_1_1ValidatorList.html#af8fe24acb044cf9b928d14a1e84b63ac">ripple::ValidatorList::publisherManifests_</a></div><div class="ttdeci">ManifestCache &amp; publisherManifests_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00138">ValidatorList.h:138</a></div></div>
<div class="ttc" id="aclassripple_1_1ManifestCache_html_a6494e744b90cbecd735b460fcd7be82f"><div class="ttname"><a href="classripple_1_1ManifestCache.html#a6494e744b90cbecd735b460fcd7be82f">ripple::ManifestCache::revoked</a></div><div class="ttdeci">bool revoked(PublicKey const &amp;pk) const</div><div class="ttdoc">Returns true if master key has been revoked in a manifest.</div><div class="ttdef"><b>Definition:</b> <a href="app_2misc_2impl_2Manifest_8cpp_source.html#l00349">app/misc/impl/Manifest.cpp:349</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a390041ee5976df2e6b170a3c6eed5de5"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a390041ee5976df2e6b170a3c6eed5de5">ripple::ValidatorList::timeKeeper_</a></div><div class="ttdeci">TimeKeeper &amp; timeKeeper_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00139">ValidatorList.h:139</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a5b0d33cb960903cc89ba236178e0247b"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a5b0d33cb960903cc89ba236178e0247b">ripple::ValidatorList::listed</a></div><div class="ttdeci">bool listed(PublicKey const &amp;identity) const</div><div class="ttdoc">Returns true if public key is included on any lists.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00573">ValidatorList.cpp:573</a></div></div>
<div class="ttc" id="anamespaceripple_html_ae18870f8d8eaa17b582f609cc486aa04"><div class="ttname"><a href="namespaceripple.html#ae18870f8d8eaa17b582f609cc486aa04">ripple::writeFileContents</a></div><div class="ttdeci">void writeFileContents(boost::system::error_code &amp;ec, boost::filesystem::path const &amp;destPath, std::string const &amp;contents)</div><div class="ttdef"><b>Definition:</b> <a href="FileUtilities_8cpp_source.html#l00063">FileUtilities.cpp:63</a></div></div>
<div class="ttc" id="anamespaceripple_html_a551be32de1cc0f8a8ff1f14ee84d892b"><div class="ttname"><a href="namespaceripple.html#a551be32de1cc0f8a8ff1f14ee84d892b">ripple::base64_decode</a></div><div class="ttdeci">std::string base64_decode(std::string const &amp;data)</div><div class="ttdef"><b>Definition:</b> <a href="base64_8cpp_source.html#l00237">base64.cpp:237</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_a49b0713e65bb8e2c51b76fbf16252afe"><div class="ttname"><a href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">beast::Journal::error</a></div><div class="ttdeci">Stream error() const</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00307">Journal.h:307</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_a87d6bd59020d94110027dcab3d9e3357"><div class="ttname"><a href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">beast::Journal::info</a></div><div class="ttdeci">Stream info() const</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00297">Journal.h:297</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_a23c7027ca674f989f90564d63ef36c74"><div class="ttname"><a href="classJson_1_1Value.html#a23c7027ca674f989f90564d63ef36c74">Json::Value::size</a></div><div class="ttdeci">UInt size() const</div><div class="ttdoc">Number of values in array or object.</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l00720">json_value.cpp:720</a></div></div>
<div class="ttc" id="aclassripple_1_1ManifestCache_html_a7f05c967613f99e5f05af017673c6765"><div class="ttname"><a href="classripple_1_1ManifestCache.html#a7f05c967613f99e5f05af017673c6765">ripple::ManifestCache::for_each_manifest</a></div><div class="ttdeci">void for_each_manifest(Function &amp;&amp;f) const</div><div class="ttdoc">Invokes the callback once for every populated manifest.</div><div class="ttdef"><b>Definition:</b> <a href="Manifest_8h_source.html#l00371">Manifest.h:371</a></div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a63d2a671ff6ffd00111188031808aa78"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a63d2a671ff6ffd00111188031808aa78">ripple::ListDisposition::untrusted</a></div><div class="ttdeci">@ untrusted</div><div class="ttdoc">List signed by untrusted publisher key.</div></div>
<div class="ttc" id="aclassripple_1_1ManifestCache_html_a8409a7089c3e04f972f1513a54576133"><div class="ttname"><a href="classripple_1_1ManifestCache.html#a8409a7089c3e04f972f1513a54576133">ripple::ManifestCache::getSigningKey</a></div><div class="ttdeci">PublicKey getSigningKey(PublicKey const &amp;pk) const</div><div class="ttdoc">Returns master key's current signing key.</div><div class="ttdef"><b>Definition:</b> <a href="app_2misc_2impl_2Manifest_8cpp_source.html#l00289">app/misc/impl/Manifest.cpp:289</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_ad6d4df2227321bab05e86667609a7fad"><div class="ttname"><a href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">Json::Value::isMember</a></div><div class="ttdeci">bool isMember(const char *key) const</div><div class="ttdoc">Return true if the object has a member named key.</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l00961">json_value.cpp:961</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html"><div class="ttname"><a href="classbeast_1_1Journal.html">beast::Journal</a></div><div class="ttdoc">A generic endpoint for log messages.</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00060">Journal.h:60</a></div></div>
<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#l00164">ValidatorList.h:164</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#l00244">ValidatorList.cpp:244</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#l00107">HashRouter.cpp:107</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="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="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#l01056">json_value.cpp:1056</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="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#l00213">Manifest.h:213</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a12f49b76ef58d9c64310aa4a7ce0115a"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a12f49b76ef58d9c64310aa4a7ce0115a">ripple::ValidatorList::loadLists</a></div><div class="ttdeci">std::vector&lt; std::string &gt; loadLists()</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00456">ValidatorList.cpp:456</a></div></div>
<div class="ttc" id="aemplace_back_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">std::vector::emplace_back</a></div><div class="ttdeci">T emplace_back(T... args)</div></div>
<div class="ttc" id="anamespaceripple_html"><div class="ttname"><a href="namespaceripple.html">ripple</a></div><div class="ttdoc">Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.</div><div class="ttdef"><b>Definition:</b> <a href="RCLCensorshipDetector_8h_source.html#l00029">RCLCensorshipDetector.h:29</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_ae06a469121f9f99ed9f3049e46d0206c"><div class="ttname"><a href="classripple_1_1ValidatorList.html#ae06a469121f9f99ed9f3049e46d0206c">ripple::ValidatorList::trustedSigningKeys_</a></div><div class="ttdeci">hash_set&lt; PublicKey &gt; trustedSigningKeys_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00159">ValidatorList.h:159</a></div></div>
<div class="ttc" id="anamespaceripple_html_a4f4d968c386163c7286107610908902b"><div class="ttname"><a href="namespaceripple.html#a4f4d968c386163c7286107610908902b">ripple::deserializeManifest</a></div><div class="ttdeci">boost::optional&lt; Manifest &gt; deserializeManifest(Slice s)</div><div class="ttdoc">Constructs Manifest from serialized string.</div><div class="ttdef"><b>Definition:</b> <a href="app_2misc_2impl_2Manifest_8cpp_source.html#l00037">app/misc/impl/Manifest.cpp:37</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_ac26b319f046fcd0af996c60511cd1547"><div class="ttname"><a href="classripple_1_1ValidatorList.html#ac26b319f046fcd0af996c60511cd1547">ripple::ValidatorList::load</a></div><div class="ttdeci">bool load(PublicKey const &amp;localSigningKey, std::vector&lt; std::string &gt; const &amp;configKeys, std::vector&lt; std::string &gt; const &amp;publisherKeys)</div><div class="ttdoc">Load configured trusted keys.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00081">ValidatorList.cpp:81</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a30930d47bbf6d9db299be15a72af1e13"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a30930d47bbf6d9db299be15a72af1e13">ripple::ValidatorList::for_each_available</a></div><div class="ttdeci">void for_each_available(std::function&lt; void(std::string const &amp;manifest, std::string const &amp;blob, std::string const &amp;signature, std::uint32_t version, PublicKey const &amp;pubKey, std::size_t sequence, uint256 const &amp;hash)&gt; func) const</div><div class="ttdoc">Invokes the callback once for every available publisher list's raw data members.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00791">ValidatorList.cpp:791</a></div></div>
<div class="ttc" id="aclassripple_1_1Overlay_html"><div class="ttname"><a href="classripple_1_1Overlay.html">ripple::Overlay</a></div><div class="ttdoc">Manages the set of connected peers.</div><div class="ttdef"><b>Definition:</b> <a href="Overlay_8h_source.html#l00047">Overlay.h:47</a></div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a774ecc994c99a32a052f6d67e9b085cc"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a774ecc994c99a32a052f6d67e9b085cc">ripple::ListDisposition::same_sequence</a></div><div class="ttdeci">@ same_sequence</div><div class="ttdoc">Same sequence as current list.</div></div>
<div class="ttc" id="abegin_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/begin.html">std::vector::begin</a></div><div class="ttdeci">T begin(T... args)</div></div>
<div class="ttc" id="anamespaceripple_html_abda439bb874eb6090230057a26e41bb2"><div class="ttname"><a href="namespaceripple.html#abda439bb874eb6090230057a26e41bb2">ripple::strViewUnHex</a></div><div class="ttdeci">boost::optional&lt; Blob &gt; strViewUnHex(boost::string_view const &amp;strSrc)</div><div class="ttdef"><b>Definition:</b> <a href="StringUtilities_8h_source.html#l00117">StringUtilities.h:117</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_a74b305583ec3aacf4f9dd06e799dc265"><div class="ttname"><a href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">Json::Value::asUInt</a></div><div class="ttdeci">UInt asUInt() const</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l00555">json_value.cpp:555</a></div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ripple::ListDisposition::invalid</a></div><div class="ttdeci">@ invalid</div><div class="ttdoc">Invalid format or signature.</div></div>
<div class="ttc" id="aclassJson_1_1Reader_html_a8ee4d40504e4f8b069745d762ab4d78c"><div class="ttname"><a href="classJson_1_1Reader.html#a8ee4d40504e4f8b069745d762ab4d78c">Json::Reader::parse</a></div><div class="ttdeci">bool parse(std::string const &amp;document, Value &amp;root)</div><div class="ttdoc">Read a Value from a JSON document.</div><div class="ttdef"><b>Definition:</b> <a href="json__reader_8cpp_source.html#l00076">json_reader.cpp:76</a></div></div>
<div class="ttc" id="aclassripple_1_1TimeKeeper_html_af1b5d38f3ba1bcacfbb7a89979af70e4"><div class="ttname"><a href="classripple_1_1TimeKeeper.html#af1b5d38f3ba1bcacfbb7a89979af70e4">ripple::TimeKeeper::now</a></div><div class="ttdeci">virtual time_point now() const override=0</div><div class="ttdoc">Returns the estimate of wall time, in network time.</div></div>
<div class="ttc" id="astructripple_1_1TrustChanges_html_a0c0a50258cfb5466d79bcff91a8d5c00"><div class="ttname"><a href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">ripple::TrustChanges::added</a></div><div class="ttdeci">hash_set&lt; NodeID &gt; added</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00072">ValidatorList.h:72</a></div></div>
<div class="ttc" id="aempty_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/empty.html">std::vector::empty</a></div><div class="ttdeci">T empty(T... args)</div></div>
<div class="ttc" id="anamespaceripple_html_a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6"><div class="ttname"><a href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">ripple::TokenType::NodePublic</a></div><div class="ttdeci">@ NodePublic</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="aclassripple_1_1ValidatorList_html_a6f943a4488f3b50dcbb5177007d43271"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a6f943a4488f3b50dcbb5177007d43271">ripple::ValidatorList::getJson</a></div><div class="ttdeci">Json::Value getJson() const</div><div class="ttdoc">Return a JSON representation of the state of the validator list.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00682">ValidatorList.cpp:682</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#l00292">Journal.h:292</a></div></div>
<div class="ttc" id="asize_t_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div></div>
<div class="ttc" id="anamespaceripple_html_a3b423ad1ba6341f945c08c13fe141150a9a32e2a438c197a712d352ca4e69b65b"><div class="ttname"><a href="namespaceripple.html#a3b423ad1ba6341f945c08c13fe141150a9a32e2a438c197a712d352ca4e69b65b">ripple::ProtocolFeature::ValidatorListPropagation</a></div><div class="ttdeci">@ ValidatorListPropagation</div></div>
<div class="ttc" id="anamespaceripple_html_a86e358ce3f06ff049af13c2342791cf8"><div class="ttname"><a href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">ripple::strHex</a></div><div class="ttdeci">std::string strHex(FwdIt begin, FwdIt end)</div><div class="ttdef"><b>Definition:</b> <a href="strHex_8h_source.html#l00070">strHex.h:70</a></div></div>
<div class="ttc" id="aend_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/end.html">std::vector::end</a></div><div class="ttdeci">T end(T... args)</div></div>
<div class="ttc" id="amax_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/numeric_limits/max.html">std::numeric_limits::max</a></div><div class="ttdeci">T max(T... args)</div></div>
<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#l00664">ValidatorList.cpp:664</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#l00583">ValidatorList.cpp:583</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_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#l00657">ValidatorList.cpp:657</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>
<div class="ttc" id="aclassbeast_1_1abstract__clock_html_a4e16832b0bdf9392c5138bbbde024d8e"><div class="ttname"><a href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">beast::abstract_clock&lt; NetClock &gt;::time_point</a></div><div class="ttdeci">typename NetClock ::time_point time_point</div><div class="ttdef"><b>Definition:</b> <a href="abstract__clock_8h_source.html#l00063">abstract_clock.h:63</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a4489b055e951d0923286cffecd9dee46"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">ripple::ValidatorList::keyListings_</a></div><div class="ttdeci">hash_map&lt; PublicKey, std::size_t &gt; keyListings_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00151">ValidatorList.h:151</a></div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ripple::ListDisposition::accepted</a></div><div class="ttdeci">@ accepted</div><div class="ttdoc">List is valid.</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a2c598bf8d6f6358e1f08eb47df0b49d2"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">ripple::ValidatorList::quorum_</a></div><div class="ttdeci">std::atomic&lt; std::size_t &gt; quorum_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00144">ValidatorList.h:144</a></div></div>
<div class="ttc" id="aclassbeast_1_1abstract__clock_html_ad024b15fa67696e8d1eba3744e800d32"><div class="ttname"><a href="classbeast_1_1abstract__clock.html#ad024b15fa67696e8d1eba3744e800d32">beast::abstract_clock&lt; NetClock &gt;::duration</a></div><div class="ttdeci">typename NetClock ::duration duration</div><div class="ttdef"><b>Definition:</b> <a href="abstract__clock_8h_source.html#l00062">abstract_clock.h:62</a></div></div>
<div class="ttc" id="ashared_lock_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a></div><div class="ttdoc">STL class.</div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html">ripple::ValidatorList::PublisherList</a></div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00121">ValidatorList.h:121</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_ad28f57783826e0b090713c89265c81e4"><div class="ttname"><a href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">ripple::ValidatorList::quorum</a></div><div class="ttdeci">std::size_t quorum() const</div><div class="ttdoc">Get quorum value for current trusted key set.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00340">ValidatorList.h:340</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html"><div class="ttname"><a href="classJson_1_1Value.html">Json::Value</a></div><div class="ttdoc">Represents a JSON value.</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8h_source.html#l00141">json_value.h:141</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a7204fee0608cd8491a7b1a7fbc611962"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a7204fee0608cd8491a7b1a7fbc611962">ripple::ValidatorList::removePublisherList</a></div><div class="ttdeci">bool removePublisherList(PublicKey const &amp;publisherKey)</div><div class="ttdoc">Stop trusting publisher's list of keys.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00629">ValidatorList.cpp:629</a></div></div>
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.17
</small></address>
</body>
</html>