forked from XRPLF/xrpl-dev-portal
-
Notifications
You must be signed in to change notification settings - Fork 0
/
rippled-setup.html
462 lines (448 loc) · 29.8 KB
/
rippled-setup.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width">
<title>rippled Setup - Ripple Developer Portal</title>
<!-- favicon -->
<link rel="icon" href="favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<!-- jQuery -->
<script src="vendor/jquery-1.11.1.min.js"></script>
<!-- Bootstrap -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<script src="js/bootstrap.min.js"></script>
<!-- Flatdoc theme -->
<link href='vendor/flatdoc/v/0.8.0/theme-white/style.css' rel='stylesheet'>
<script src="vendor/flatdoc/v/0.8.0/theme-white/script.js"></script>
<!-- syntax highlighting -->
<link rel="stylesheet" href="vendor/docco.min.css">
<script src="vendor/highlight.min.js"></script>
<!-- syntax selection js -->
<script src="js/multicodetab.js"></script>
<!-- Markdown content already parsed+included; just do the code tab stuff -->
<script>
$(document).ready(function() {
$().multicode_tabs_pandoc();
hljs.initHighlighting();
make_code_expandable();
});
</script>
<script src="js/expandcode.js"></script>
<script src="js/fixsidebarscroll.js"></script>
<!-- Custom Stylesheets -->
<link href="font/fonts.css" rel="stylesheet" type="text/css" />
<link href="css/main.css" rel="stylesheet" />
<link href="css/custom.css" rel="stylesheet" />
<link rel="shortcut icon" href="favicon.ico?v=2" type="image/x-icon" />
<link rel="icon" href="favicon.ico?v=2" type="image/x-icon" />
</head>
<body class='no-literate'>
<div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="./"><img class="small_logo" src="assets/img/ripple_logo_small.png"></a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Concepts <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="paths.html">Paths</a></li>
<li><a href="fees.html">Fees (Disambiguation)</a></li>
<li><a href="transfer_fees.html">Transfer Fees</a></li>
<li><a href="tx-cost.html">Transaction Cost</a></li>
<li><a href="fee-voting.html">Fee Voting</a></li>
<li><a href="reserves.html">Reserves</a></li>
<li><a href="freeze.html">Freeze</a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">References <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="rippled-apis.html">rippled</a></li>
<li><a href="ripple-rest.html">Ripple-REST</a></li>
<li><a href="transactions.html">Transactions</a></li>
<li><a href="ripple-ledger.html">Ripple Consensus Ledger</a></li>
<li><a href="historical_data.html">Historical Data API</a></li>
<li><a href="charts_api.html">Ripple Charts API</a></li>
<li><a href="data_api_v2.html">Ripple Data API v2</a></li>
<li><a href="rippleapi.html">RippleAPI</a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Tutorials <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="rippled-setup.html">rippled Setup</a></li>
<li><a href="reliable_tx.html">Reliable Transaction Submission</a></li>
<li><a href="gateway_guide.html">Gateway Guide</a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Tools <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="rest-api-tool.html">Ripple-REST API Tool</a></li>
<li><a href="historicaldb-api-tool.html">Historical Database API Tool</a></li>
<li><a href="ripple-api-tool.html">WebSocket API Tool</a></li>
<li><a href="charts-api-tool.html">Charts API Tool</a></li>
<li><a href="data-api-v2-tool.html">Data API v2 Tool</a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Resources <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="https://forum.ripple.com/viewforum.php?f=2">Forums</a></li>
<li><a href="https://www.bountysource.com/teams/ripple/bounties">Bounties</a></li>
<li><a href="https://ripplelabs.atlassian.net/">Bug Tracking</a></li>
<li><a href="https://ripple.com/category/dev-blog/">Dev Blog</a></li>
<li><a href="https://ripple.com/press-releases/">Press Center</a></li>
<li><a href="https://ripple.com/brand-guidelines/">Brand Guidelines</a></li>
</ul>
<li><a href="https://github.com/ripple/ripple-dev-portal" title="GitHub">Site Source</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</div>
<script type="text/javascript">
if (window.location.host.indexOf("github.io") > -1) {
document.write("<div style='background-color:red; color:white; position:fixed; top: 50px; right: 150px; padding: 10px 20px;'>DRAFT</div>");
}
</script>
<div class='wrapper'>
<div class='content-root'>
<div class='menubar'>
<div class='menu section' role='flatdoc-menu'>
<script type="text/javascript" src="js/jquery.gensidebar.js"></script>
<script type="text/javascript">
</script>
</div>
</div>
<div class='content'>
<h1 id="operating-rippled-servers">Operating rippled Servers</h1>
<p>The core server of the Ripple peer-to-peer network is <a href="rippled-apis.html"><code>rippled</code></a>. Anyone can run their own <code>rippled</code> server that follows the network and keeps a complete copy of the Ripple ledger. You can even have your server perform validations and participate in the consensus process.</p>
<p>This page contains instructions for:</p>
<ul>
<li><a href="#installing-rippled">Installing <code>rippled</code></a></li>
<li><a href="#running-a-validator">Participating in the Consensus Process</a></li>
</ul>
<h2 id="types-of-rippled-servers">Types of rippled Servers</h2>
<p>The <code>rippled</code> server software can run in several modes depending on its configuration, including:</p>
<ul>
<li>Stock server - follows the network with a local copy of the ledger.</li>
<li>Validating server, or <em>validator</em> for short - participates in consensus.</li>
<li><code>rippled</code> server in stand-alone mode - for basic testing. Does not communicate to other <code>rippled</code> servers.</li>
</ul>
<p>You can also run the <code>rippled</code> executable as a client application for accessing <a href="rippled-apis.html"><code>rippled</code> APIs</a> locally. (Two instances of the same binary can run side-by-side in this case; one as a server, and the other running briefly as a client and then terminating.)</p>
<h2 id="reasons-to-run-a-stock-server">Reasons to Run a Stock Server</h2>
<p>There are lots of reasons you might want to run your own <code>rippled</code> server, but most of them can be summarized as: you can trust your own server, you have control over its workload, and you're not at the mercy of others to decide when and how you can access it.</p>
<p>It is important that you can trust the <code>rippled</code> you use, so you can be certain that the software you are running will behave in the manner specified in its source code. Of course, you must also practice good network security to protect your server from malicious hackers. If you connect to a malicious server, there are myriad ways that it can take advantage of you or cause you to lose money. For example:</p>
<ul>
<li>A malicious server could report that you were paid when no such payment was made</li>
<li>It could selectively show or hide payment paths and currency exchange offers to guarantee its own profit while not providing you the best deal</li>
<li>If you sent it your account's secret, it could make arbitrary transactions on your behalf, and even transfer or destroy all the money in your account's balances.</li>
</ul>
<p>Additionally, running your own server gives you admin control over it, which allows you to run important admin-only and load-intensive commands. If you use a shared server, you have to worry about other users of the same server competing with you for the server's computing power. Many of the commands in the WebSocket API can put a lot of strain on the server, so <code>rippled</code> has the option to scale back its responses when it needs to. If you share a server with others, you may not always get the best results possible.</p>
<p>Finally, if you run a validating server, you can use a stock server as a proxy to the public network while keeping your validating server on a private subnet only accessible to the outside world through the stock server. This makes it more difficult to compromise the integrity of your validating server.</p>
<h2 id="reasons-to-run-a-validator">Reasons to Run a Validator</h2>
<p>The robustness of the Ripple network depends on an interconnected web of validators who each trust a few other validators <em>not to collude</em>. The more operators with different interests there are who run validators, the more certain each member of the network can be that it continues to run impartially. If you or your organization relies on the Ripple peer-to-peer network, it is in your interest to contribute to the consensus process.</p>
<p>Not all <code>rippled</code> servers need to be validators: trusting additional servers from the same operator does not provide additional protection against collusion. It could be useful for an organization to run validators in multiple regions in order to provide better redundancy in case of natural disasters and other emergencies.</p>
<p>If your organization runs a validating server, you may also run one or more stock servers, to balance the computing load of API access, or as a proxy between your validation server and the outside network.</p>
<h3 id="properties-of-a-good-validator">Properties of a Good Validator</h3>
<p>There are several properties that define a good validator. The more of these properties your server embodies, the more reason others have to include your server in their list of trusted validators:</p>
<ul>
<li><strong>Availability</strong>. An ideal validator should always be running, submitting validation votes for every proposed ledger.<ul>
<li>Basically, strive for 100% uptime.</li>
</ul>
</li>
<li><strong>Agreement</strong>. A validator's votes should match the outcome of the consensus process as often as possible. To do otherwise could indicate that the validator's software is outdated, buggy, or intentionally biased.<ul>
<li>Always run the latest <code>rippled</code> release without modifications.</li>
</ul>
</li>
<li><strong>Timeliness</strong>. A validator's votes should arrive quickly, and not after a consensus round has already finished.<ul>
<li>A fast internet connection helps with this.</li>
</ul>
</li>
<li><strong>Identified</strong>. It should be clear who runs the validator. Ideally, a list of trusted validators should include validators operated by different owners in multiple legal jurisdictions and geographic areas, to reduce the chance that any localized events could interfere with the validator's impartial operation.<ul>
<li>Setting up <a href="#domain-verification">Domain Verification</a> is a good start.</li>
</ul>
</li>
</ul>
<p>At present, Ripple, Inc. cannot recommend any validators aside from the 5 core validators run by Ripple, Inc.: these validators are included in the default <code>rippled</code> configuration. However, we are collecting data on other validators and building tools to report on their performance. For metrics on the validators currently operating, see <a href="https://validators.ripple.com">validators.ripple.com</a>.</p>
<h1 id="installing-rippled">Installing rippled</h1>
<p>For development, you can <a href="https://wiki.ripple.com/Rippled_build_instructions">compile <code>rippled</code> from source</a>.</p>
<p>Production <code>rippled</code> instances can <a href="#installation-on-centosred-hat-with-yum">use Ripple's binary executable</a>, available from the Ripple <a href="https://en.wikipedia.org/wiki/Yellowdog_Updater,_Modified">yum</a> repository.</p>
<h2 id="system-requirements">System Requirements</h2>
<p>A <code>rippled</code> server should run comfortably on commodity hardware, to make it easy to participate in the network. At present, we recommend the following:</p>
<ul>
<li>Operating System:<ul>
<li>Production: CentOS or RedHat Enterprise Linux (latest release) supported</li>
<li>Development: Mac OS X, Windows (64-bit), or most Linux distributions</li>
</ul>
</li>
<li>CPU: 64-bit x86_64, 2+ cores</li>
<li>Disk: Minimum 50GB SSD recommended (500+ IOPS, more is better) for the database partition</li>
<li>RAM: 4+GB</li>
</ul>
<p>Amazon EC2's m3.medium or m3.large VM sizes may be appropriate depending on your workload. (Validating servers need more resources.)</p>
<p>Naturally, a fast network connection is preferable.</p>
<h2 id="installation-on-centosred-hat-with-yum">Installation on CentOS/Red Hat with yum</h2>
<p>This section assumes that you are using CentOS 7 or Red Hat Enterprise Linux 7.</p>
<ol>
<li>
<p>Install the Ripple rpm repository:</p>
<pre><code>$ sudo rpm -Uvh https://mirrors.ripple.com/ripple-repo-el7.rpm
</code></pre>
</li>
<li>
<p>Install the <code>rippled</code> software package:</p>
<pre><code>$ sudo yum install --enablerepo=ripple-stable rippled
</code></pre>
</li>
<li>
<p>Configure the <code>rippled</code> service to start on system boot:</p>
<pre><code>$ sudo systemctl enable rippled.service
</code></pre>
</li>
<li>
<p>Start the <code>rippled</code> service</p>
<pre><code>$ sudo systemctl start rippled.service
</code></pre>
</li>
</ol>
<p>It can take several minutes for <code>rippled</code> to sync with the rest of the network, during which time it outputs warnings about missing ledgers. After that, you have a fully functional stock <code>rippled</code> server that you can use for local signing and API access to the Ripple peer-to-peer network.</p>
<p><a href="https://ripple.com/build/rippled-apis/#list-of-public-commands">rippled commands</a> can be run with:</p>
<pre><code> $ /opt/ripple/bin/rippled --conf /opt/ripple/etc/rippled.cfg <command>
</code></pre>
<h2 id="updating-rippled">Updating rippled</h2>
<p>Run the following commands to update to the latest release of <code>rippled</code>:</p>
<pre><code> $ sudo yum update --enablerepo=ripple-stable rippled
$ sudo systemctl daemon-reload
$ sudo service rippled restart
</code></pre>
<p>You can subscribe to the <a href="https://groups.google.com/forum/#!forum/ripple-server">rippled Google Group</a> to receive notifications of new <code>rippled</code> releases.</p>
<h1 id="running-a-validator">Running a Validator</h1>
<p>Running a <code>rippled</code> validator that participates in the Consensus process is simple:</p>
<ol>
<li><a href="#validator-setup">Enable validation</a> on your <code>rippled</code> server.<ul>
<li>At first, your server is an <em>untrusted validator</em>. Others can see the validations your server issues, but they disregard them in the consensus process.</li>
</ul>
</li>
<li>Share the public key with the public, especially other <code>rippled</code> operators.</li>
<li>When other <code>rippled</code> operators add your public key to their list of trusted servers, you have become a <em>trusted validator</em>.<ul>
<li>Also see <a href="#properties-of-a-good-validator">Properties of a Good Validator</a> for best practices.</li>
</ul>
</li>
</ol>
<h2 id="validator-setup">Validator Setup</h2>
<ol>
<li>
<p><a href="#installing-rippled">Install and configure a <code>rippled</code> server.</a></p>
</li>
<li>
<p>Start <code>rippled</code>:</p>
<pre><code>$ sudo service rippled start
</code></pre>
</li>
<li>
<p>Generate a validation public key and seed, and save the output to a secure place:</p>
<pre><code>$ /opt/ripple/bin/rippled --conf /opt/ripple/etc/rippled.cfg -q validation_create
{
"status" : "success",
"validation_key" : "FOLD WERE CHOW WIT SWIM RANK WED DAN LAIN TRIO MURK NELL",
"validation_public_key" : "n9KHn8NfbBsZV5q8bLfS72XyGqwFt5mgoPbcTV4c6qKiuPTAtXYk",
"validation_seed" : "ssdecohJMDPFuUPDkmG1w4objZyp4"
}
</code></pre>
</li>
<li>
<p>Add the generated validator signing key from above to your <code>rippled.cfg</code>:</p>
<pre><code>[validation_seed]
ssdecohJMDPFuUPDkmG1w4objZyp4
</code></pre>
</li>
<li>
<p>Restart <code>rippled</code> validator:</p>
<pre><code>$ sudo service rippled restart
</code></pre>
</li>
</ol>
<h2 id="public-facing-server">Public-Facing Server</h2>
<p>To protect a production validator from <a href="https://en.wikipedia.org/wiki/Denial-of-service_attack">DDoS</a> attacks, you can use a stock <code>rippled</code> server as a proxy between the validator and the outside network.</p>
<ol>
<li>
<p><a href="#validator-setup">Set up the <code>rippled</code> validator.</a></p>
</li>
<li>
<p><a href="#installing-rippled">Set up one or more stock <code>rippled</code> servers.</a></p>
</li>
<li>
<p>Configure the validator and stock <code>rippled</code> servers to be <a href="#clustering">clustered</a> with each other.</p>
</li>
<li>
<p>Make the following configuration changes to your validator:</p>
<ul>
<li>Copy the <code>[ips_fixed]</code> list and paste it under <code>[ips]</code>. These fields should contain only the IP addresses and ports of the public-facing rippled(s). The validator will connect to only these peers.</li>
<li>Change <code>[peer_private]</code> to <code>1</code> to prevent its IP address from being forwarded.</li>
</ul>
</li>
<li>
<p>Configure the validator host machine's firewall to only accept inbound connections from its public-facing rippled(s).</p>
</li>
</ol>
<p>Remember to restart <code>rippled</code> for config changes to take effect.</p>
<p>Take care not to publish the IP address of your validator.</p>
<h2 id="domain-verification">Domain Verification</h2>
<p>Network participants are unlikely to trust validators without knowing who is operating them. To address this concern, validator operators can associate their validator with a web domain that they operate. <a href="#ripple-txt">Publishing a ripple.txt</a> and <a href="#account-domain">setting the validator's account domain</a> allows services like <a href="https://validators.ripple.com">validators.ripple.com</a> to detect the domain associated with the validator.</p>
<h3 id="rippletxt">ripple.txt <a name="ripple-txt"></a></h3>
<p>Publish a <a href="https://wiki.ripple.com/Ripple.txt">ripple.txt</a> page at your domain with a signed SSL certificate.</p>
<p>List the validator's <code>validation_public_key</code> (generated <a href="#validator-setup">above</a> in step 3) in the <code>[validation_public_key]</code> section.</p>
<h3 id="account-domain">Account domain</h3>
<p>A master seed can be used to generate both a validation public key and a Ripple account address. Since the same secret key is used for both, whoever operates the validator also controls the account with the corresponding address. (The validator's public key and the account address both represent the public key for the same keypair.)</p>
<p>The steps below describe how to set the domain field of a validator's Ripple account.</p>
<ol>
<li>
<p>Get the validator's account address using the <code>validation_seed</code> generated <a href="#validator-setup">above</a> in step 3:</p>
<pre><code>$ /opt/ripple/bin/rippled --conf /opt/ripple/etc/rippled.cfg wallet_propose ssdecohJMDPFuUPDkmG1w4objZyp4
{
"result" : {
"account_id" : "rU7bM9ENDkybaxNrefAVjdLTyNLuue1KaJ",
"key_type" : "secp256k1",
"master_key" : "FOLD WERE CHOW WIT SWIM RANK WED DAN LAIN TRIO MURK NELL",
"master_seed" : "ssdecohJMDPFuUPDkmG1w4objZyp4",
"master_seed_hex" : "434256443542C27BD1A84A2BACC9B8F0",
"public_key" : "aBQzwnRdgHVZmr8gLNugihTf5NsWAUpayGdAHtz8YPk1w3L4fh6S",
"public_key_hex" : "038ED9785EE7FC687445E0D94065A74FF6CEC6506A03C7380075D81A2B9E7E8681",
"status" : "success"
}
}
</code></pre>
</li>
<li>
<p>Fund the account by sending it at least 25 XRP.</p>
</li>
<li>
<p>Set the <code>Domain</code> field of the account to match the domain hosting your ripple.txt.</p>
</li>
</ol>
<p>For example, this can be done using <a href="https://www.npmjs.com/package/ripple-cli">ripple-cli</a>:</p>
<pre><code> $ ripple-cli account_set_domain mycooldomain.com
{
"engine_result": "tesSUCCESS",
"engine_result_code": 0,
"engine_result_message": "The transaction was applied. Only final in a validated ledger.",
"ledger_hash": "876BC104F7EB386B929E5AD44F14EFA47FE5EB471EA00D70DDA69AE6119193B0",
"ledger_index": 1337445,
"metadata": {
...
}
}
</code></pre>
<h1 id="additional-configuration">Additional Configuration</h1>
<p><code>rippled</code> should connect to the Ripple network with the default configuration. However, you can modify your settings by editing the <code>rippled.cfg</code> file (located at <code>/opt/ripple/etc/rippled.cfg</code> when installing <code>rippled</code> with yum).</p>
<p>See <a href="https://github.com/ripple/rippled/blob/develop/doc/rippled-example.cfg">the <code>rippled</code> GitHub repository</a> for a description of all configuration options.</p>
<p>Changes to the <code>[debug_logfile]</code> or <code>[database_path]</code> sections may require you to give the <code>rippled</code> user and group ownership to your new configured path:</p>
<pre><code> $ chown -R rippled:rippled <configured path>
</code></pre>
<p>You will need to restart <code>rippled</code> for any configuration changes to take effect:</p>
<pre><code> $ sudo service rippled restart
</code></pre>
<h2 id="parallel-networks">Parallel Networks</h2>
<p>Most of the time, we describe the Ripple peer-to-peer network as one collective, singular entity -- and that's mostly true. There is one production Ripple peer-to-peer network, and all business that takes place on Ripple occurs within the production network.</p>
<p>However, sometimes you may want to do tests and experiments without interacting with the core network. That's why Ripple started the <a href="https://rippletest.net/">Ripple Test Net</a>, an "alternate universe" network, which can act as a testing ground for applications and the <code>rippled</code> server itself, without impacting the business operations of everyday Ripple users. The Ripple Test Net (also known as the AltNet) has a separate supply of TestNet-only XRP, which Ripple <a href="https://ripple.com/build/ripple-test-net/">gives away for free</a> to parties interested in developing applications on the Test Net.</p>
<p><strong>Caution:</strong> Ripple makes no guarantees about the stability of the test network. It has been and continues to be used to test various properties of server configuration, network topology, and network performance.</p>
<p>Over time, there may also be additional, smaller test networks for specific purposes.</p>
<h3 id="parallel-networks-and-consensus">Parallel Networks and Consensus</h3>
<p>There is no <code>rippled</code> setting that defines which network it uses. Instead, it uses the consensus of validators it trusts to know which ledger to accept as the truth. When different consensus groups of <code>rippled</code> instances only trust other members of the same group, each group continues to operate as a parallel network. Even if malicious or misbehaving computers connect to both networks, the consensus process overrides the confusion as long as the members of each network are not configured to trust members of another network in excess of their quorum settings.</p>
<h2 id="clustering">Clustering</h2>
<p>If you are running multiple <code>rippled</code> servers in a single datacenter, you can configure those servers to operate in a cluster to maximize efficiency. Operating your <code>rippled</code> servers in a cluster provides the following benefits:</p>
<ul>
<li>Clustered <code>rippled</code> servers share the work of cryptography. If one server has verified the authenticity of a message, the other servers in the cluster trust it and do not re-verify.</li>
<li>Clustered servers share information about peers and API clients that are misbehaving or abusing the network. This makes it harder to attack all servers of the cluster at once.</li>
<li>Clustered servers always propagate transactions throughout the cluster, even if the transaction does not meet the current load-based transaction fee on some of them.</li>
</ul>
<p>To enable clustering, modify the following sections of your <a href="https://github.com/ripple/rippled/blob/d7def5509d8338b1e46c0adf309b5912e5168af0/doc/rippled-example.cfg#L297-L346">config file</a> for each server:</p>
<ul>
<li>
<p>List the IP address and port of each other server under the <code>[ips_fixed]</code> section. The port should be the one from the other servers' <code>protocol = peer</code> setting in their <code>rippled.cfg</code>. Example:</p>
<pre><code>[ips_fixed]
192.168.0.1 51235
192.168.0.2 51235
</code></pre>
</li>
<li>
<p>Generate a unique seed (using the <a href="rippled-apis.html#validation-seed"><code>validation_create</code> command</a>) for each of your servers, and configure it under the <code>[node_seed]</code> section. The <code>rippled</code> server uses this key to sign its messages to other servers in the peer-to-peer network. <strong>Note:</strong> This is a different key than the one <code>rippled</code> uses to sign ledger proposals for consensus, but it is in the same format.</p>
</li>
<li>Add the public keys (for peer communication) of each of your other servers under the <code>[cluster_nodes]</code> section.</li>
</ul>
</div>
</div>
</div>
<footer class="footer">
<div class="container">
<div class="row">
<div class="col-md-3">
<h4>Documentation</h4>
<ul class="footer_links">
<li><a href="paths.html">Paths</a></li>
<li><a href="fees.html">Fees (Disambiguation)</a></li>
<li><a href="transfer_fees.html">Transfer Fees</a></li>
<li><a href="tx-cost.html">Transaction Cost</a></li>
<li><a href="fee-voting.html">Fee Voting</a></li>
<li><a href="reserves.html">Reserves</a></li>
<li><a href="freeze.html">Freeze</a></li>
<li><a href="rippled-apis.html">rippled</a></li>
<li><a href="rippled-setup.html">rippled Setup</a></li>
<li><a href="ripple-rest.html">Ripple-REST</a></li>
<li><a href="transactions.html">Transactions</a></li>
<li><a href="ripple-ledger.html">Ripple Consensus Ledger</a></li>
<li><a href="reliable_tx.html">Reliable Transaction Submission</a></li>
<li><a href="gateway_guide.html">Gateway Guide</a></li>
<li><a href="historical_data.html">Historical Data API</a></li>
<li><a href="charts_api.html">Ripple Charts API</a></li>
<li><a href="data_api_v2.html">Ripple Data API v2</a></li>
<li><a href="rippleapi.html">RippleAPI</a></li>
</ul>
</div>
<div class="col-md-3">
<h4>Resources</h4>
<ul class="footer_links">
<li><a href="https://ripple.com/press-releases/">Press Center</a></li>
<li><a href="https://ripple.com/brand-guidelines/">Brand Use and Guidelines</a></li>
<li><a href="https://forum.ripple.com/viewforum.php?f=2">Forums</a></li>
<li><a href="https://ripple.com/category/dev-blog/">Dev Blog</a></li>
</ul>
</div>
<div class="col-md-3">
<h4>Ripple Projects</h4>
<ul class="footer_links">
<li><a href="https://www.rippletrade.com">Ripple Trade</a>
<li><a href="https://www.ripplecharts.com">Ripple Charts</a>
<li><a href="https://ripple.com/graph">Ripple Graph</a>
<li><a href="http://codius.org/">Codius</a>
</ul>
</div>
<div class="col-md-3">
<h4>Ripple Labs</h4>
<ul class="footer_links">
<li><a href="https://www.ripplelabs.com/wp-content/uploads/2014/10/ripple_labs_bylaws.pdf">Corporate Bylaws</a></li>
<li><a href="https://www.ripplelabs.com/wp-content/uploads/2014/09/ripple_labs_code_of_conduct1.pdf">Code of Conduct</a></li>
<li><a href="https://www.ripplelabs.com/team/">Team</a></li>
<li><a href="https://www.ripplelabs.com/careers/">Careers</a></li>
<li><a href="https://www.ripplelabs.com/investors/">Investors</a></li>
<li><a href="https://www.ripplelabs.com/advisors/">Advisors</a></li>
<li><a href="https://www.ripplelabs.com/xrp-distribution/">XRP Distribution</a></li>
<li><a href="https://www.ripplelabs.com/contact/">Contact</a></li>
</ul>
</div>
</div>
</div>
</footer>
</body>
</html>