-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathconsensus-principles-and-rules.html
More file actions
570 lines (464 loc) · 37 KB
/
consensus-principles-and-rules.html
File metadata and controls
570 lines (464 loc) · 37 KB
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
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width">
<title>Consensus Principles and Rules - XAG Ledger Dev Portal</title>
<!-- favicon -->
<link rel="apple-touch-icon" sizes="180x180" href="assets/favicons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/favicons/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="assets/favicons/favicon-32x32.png">
<link rel="manifest" href="assets/favicons/site.webmanifest">
<link rel="shortcut icon" href="favicon.ico">
<meta name="msapplication-TileColor" content="#25A768">
<meta name="msapplication-config" content="assets/favicons/browserconfig.xml">
<meta name="theme-color" content="#25A768">
<!-- jQuery -->
<script src="assets/vendor/jquery-1.11.1.min.js"></script>
<!-- Stylesheet -->
<link href="assets/css/devportal.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
<!-- syntax highlighting -->
<link rel="stylesheet" href="assets/vendor/docco.min.css" />
<script src="assets/vendor/highlight.min.js"></script>
<!-- expandable code samples -->
<script src="assets/js/expandcode.js"></script>
<!-- multi-code selection tabs -->
<script src="assets/js/multicodetab.js"></script>
<script>
$(document).ready(function() {
$(".multicode").minitabs();
hljs.initHighlighting();
make_code_expandable();
});
</script>
</head>
<body class="xrp-ledger-dev-portal sidebar-primary lang-en ">
<nav class="navbar fixed-top navbar-expand-lg navbar-light bg-white">
<a href="index.html" class="navbar-brand"><img src="assets/img/logo.png" class="logo" height="44" alt="XAG Ledger Dev Portal" /></a>
<button class="navbar-toggler" type="button" data-toggle="slide-collapse" data-target="#navbarHolder" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse justify-content-end" id="navbarHolder">
<ul class="nav navbar-nav">
<li class="nav-item">
<a class="nav-link" href="dev-tools.html">Dev Tools</a>
</li>
<li class="nav-item">
<a class="nav-link" href="http://xagfans.com/" target="blank">BBS</a>
</li>
</ul><!-- /.navbar-nav -->
<div class="github-edit-wrap">
<a href="https://github.com/xagfans/docs/concepts/consensus-network/consensus-principles-and-rules.md" target="_blank" class="github-edit">Edit</a>
</div><!-- /.github-edit -->
<div class="nav navbar-nav language-selector">
<div class="dropdown">
<button class="btn btn-outline-secondary dropdown-toggle" type="button" id="language_selector_header_btn" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
English
</button>
<div class="dropdown-menu" aria-labelledby="language_selector_header_btn">
<a class="dropdown-item" href="/consensus-principles-and-rules.html">English</a>
<a class="dropdown-item" href="/cn/consensus-principles-and-rules.html">中文</a>
</div><!--/.dropdown-menu-->
</div><!--/.dropdown-->
</div><!--/.language-selector-->
</div><!--/#navbarHolder-->
<div class="menu-overlay"></div>
</nav>
<div class="container-fluid" role="document" id="main_content_wrapper">
<div class="row">
<!-- Right sidebar first so it's at the beginning for mobile layouts -->
<aside class="right-sidebar col-lg-3 order-lg-4 p-0" role="complementary">
<div class="card" id="page-toc-wrapper">
<div class="card-header">
<h4>In this document</h4>
</div>
<ul class="card-body">
<li class="level-1"><a href="#consensus-principles-and-rules">Consensus Principles and Rules</a></li>
<li class="level-2"><a href="#background">Background</a></li>
<li class="level-3"><a href="#mechanics">Mechanics</a></li>
<li class="level-3"><a href="#the-double-spend-problem">The Double Spend Problem</a></li>
<li class="level-2"><a href="#how-consensus-works">How Consensus Works</a></li>
<li class="level-3"><a href="#simplifying-the-problem">Simplifying the Problem</a></li>
<li class="level-3"><a href="#consensus-rules">Consensus Rules</a></li>
<li class="level-3"><a href="#consensus-rounds">Consensus Rounds</a></li>
<li class="level-3"><a href="#consensus-can-fail">Consensus Can Fail</a></li>
<li class="level-3"><a href="#how-the-xrp-ledger-handles-consensus-failure">How the XAG Ledger Handles Consensus Failure</a></li>
<li class="level-2"><a href="#philosophy">Philosophy</a></li>
<li class="level-2"><a href="#see-also">See Also</a></li>
</ul>
</div>
</aside>
<!-- main column -->
<main class="main col-md-7 col-lg-6 order-md-3 " role="main" id="main_content_body">
<nav class="breadcrumbs-wrap p-0 p-md-3" aria-label="breadcrumb">
<ul class="breadcrumb bg-white">
<li class="breadcrumb-item"><a href="index.html">Home</a></li>
<li class="active breadcrumb-item"><a href="docs.html">Docs</a></li>
<li class="active breadcrumb-item"><a href="concepts.html">Concepts</a></li>
<li class="active breadcrumb-item"><a href="consensus-network.html">Consensus Network</a></li>
<li class="active breadcrumb-item">Consensus Principles and Rules</li>
</ul>
</nav><!--/.breadcrumbs-wrap--> <article class="pt-3 p-md-3">
<div class="content">
<h1 id="consensus-principles-and-rules">Consensus Principles and Rules</h1>
<p>The XAG Ledger is a universal payment system enabling users to transfer funds across national boundaries as seamlessly as sending an email. Like other peer-to-peer payment networks such as Bitcoin, the XAG Ledger enables peer-to-peer transaction settlement across a decentralized network of computers. Unlike other digital currency protocols, the XAG Ledger allows users to denominate their transactions with any currency they prefer, including fiat currencies, digital currencies and other forms of value, in addition to XAG (the native asset of the XAG Ledger).</p>
<p>The XAG Ledger's technology enables near real-time settlement (three to six seconds) and contains a decentralized exchange, where payments automatically use the cheapest currency trade orders available to bridge currencies.</p>
<h2 id="background">Background</h2>
<h3 id="mechanics">Mechanics</h3>
<p>At the core, the XAG Ledger is a shared database that records information such as accounts, balances, and offers to trade assets. Signed instructions called "transactions" cause changes such as creating accounts, making payments, and trading assets.</p>
<p>As a cryptographic system, the owners of XAG Ledger accounts are identified by <em>cryptographic identities</em>, which correspond to public/private key pairs. Transactions are authorized by cryptographic signatures matching these identities. Every server processes every transaction according to the same deterministic, known rules. Ultimately, the goal is for every server in the network to have a complete copy of the exact same ledger state, without needing a single central authority to arbitrate transactions.</p>
<h3 id="the-double-spend-problem">The Double Spend Problem</h3>
<p>The "double spend" problem is a fundamental challenge to operating any sort of payment system. The problem comes from the requirement that when money is spent in one place, it can't also be spent in another place. More generally, the problem occurs when you have any two transactions such that either one is valid but not both together.</p>
<p>Suppose Alice, Bob, and Charlie are using a payment system, and Alice has a balance of $10. For the payment system to be useful, Alice must be able to send her $10 to Bob, or to Charlie. However, if Alice tries to send $10 to Bob and also send $10 to Charlie at the same time, that's where the double spend problem comes in.</p>
<p>If Alice can send the "same" $10 to both Charlie and Bob, the payment system ceases to be useful. The payment system needs a way to choose which transaction should succeed and which should fail, in such a way that all participants agree on which transaction has happened. Either of those two transactions is equally valid on its own. However, different participants in the payment system may have a different view of which transaction came first.</p>
<p>Conventionally, payment systems solve the double spend problem by having a central authority track and approve transactions. For example, a bank decides to clear a check based on the issuer's available balance, of which the bank is the sole custodian. In such a system, all participants follow the central authority's decisions.</p>
<p>Distributed ledger technologies, like the XAG Ledger, have no central authority. They must solve the double spend problem in some other way.</p>
<h2 id="how-consensus-works">How Consensus Works</h2>
<h3 id="simplifying-the-problem">Simplifying the Problem</h3>
<p>Much of the double spend problem can be solved by well-known rules such as prohibiting an account from spending funds it does not have. In fact, the double spend problem can be reduced to putting transactions in order.</p>
<p>Consider the example of Alice trying to send the same $10 to both Bob and Charlie. If the payment to Bob is known to be first, then everyone can agree that she has the funds to pay Bob. If the payment to Charlie is known to be second, then everyone can agree that she cannot send those funds to Charlie because the money has already been sent to Bob.</p>
<p>We can also order transactions by deterministic rules. Because transactions are collections of digital information, it's trivial for a computer to sort them.</p>
<p>This would be enough to solve the double spend problem without a central authority, but it would require us to have every transaction that would ever occur (so that we could sort them) before we could be certain of the results of any transaction. Obviously, this is impractical. <!-- STYLE_OVERRIDE: obviously --></p>
<p>If we could collect transactions into groups and agree on those groupings, we could sort the transactions within that group. As long as every participant agrees on which transactions are to be processed as a unit, they can use deterministic rules to solve the double spend problem without any need for a central authority. The participants each sort the transactions and apply them in a deterministic way following the known rules. The XAG Ledger solves the double-spend problem in exactly this way.</p>
<p>The XAG Ledger allows multiple conflicting transactions to be in the agreed group. The group of transactions is executed according to deterministic rules, so whichever transaction comes first according to the sorting rules succeeds and whichever conflicting transaction comes second fails.</p>
<h3 id="consensus-rules">Consensus Rules</h3>
<p>The primary role of consensus is for participants in the process to agree on which transactions are to be processed as a group to resolve the double spend problem. There are four reasons this agreement is easier to achieve than might be expected:</p>
<ol>
<li>If there is no reason a transaction should not be included in such a group of transactions, all honest participants agree to include it. If all participants already agree, consensus has no work to do.</li>
<li>If there is any reason at all a transaction should not be included in such a group of transactions, all honest participants are willing to exclude it. If the transaction is still valid, there is no reason not to include it in the next round, and they should all agree to include it then.</li>
<li>It is extremely rare for a participant to particularly care how the transactions were grouped. Agreement is easiest when everyone’s priority is reaching agreement and only challenging when there are diverging interests.</li>
<li>Deterministic rules can be used even to form the groupings, leading to disagreement only in edge cases. For example, if there are two conflicting transactions in a round, deterministic rules can be used to determine which is included in the next round.</li>
</ol>
<p>Every participant’s top priority is correctness. They must first enforce the rules to be sure nothing violates the integrity of the shared ledger. For example, a transaction that is not properly signed must never be processed (even if other participants want to be processed). However, every honest participant’s second priority is agreement. A network with possible double spends has no utility at all. Agreement is facilitated by the fact that every honest participant values it above everything but correctness.</p>
<h3 id="consensus-rounds">Consensus Rounds</h3>
<p>A consensus round is an attempt to agree on a group of transactions so they can be processed. A consensus round starts with each participant who wishes to do so taking an initial position. This is the set of valid transactions they have seen.</p>
<p>Participants then “avalanche” to consensus: If a particular transaction does not have majority support, participants agree to defer that transaction. If a particular transaction does have majority support, participants agree to include the transaction. Thus slight majorities rapidly become full support and slight minorities rapidly become universal rejection from the current round.</p>
<p>To prevent consensus from stalling near 50% and to reduce the overlap required for reliable convergence, the required threshold to include a transaction increases over time. Initially, participants continue to agree to include a transaction if 50% or more of other participants agree. If participants disagree, they increase this threshold, first to 60% and then even higher, until all disputed transactions are removed from the current set. Any transactions removed this way are deferred to the next ledger version.</p>
<p>When a participant sees a supermajority that agrees on the set of transactions to next be processed, it declares a consensus to have been reached.</p>
<h3 id="consensus-can-fail">Consensus Can Fail</h3>
<p>It is not practical to develop a consensus algorithm that never fails to achieve perfect consensus. To understand why, consider how the consensus process finishes. At some point, each participant must declare that a consensus has been reached and that some set of transactions is known to be the result of the process. This declaration commits that participant irrevocably to some particular set of transactions as the result of the consensus process.</p>
<p>Some participant must do this first or no participant will ever do it, and they will never reach a consensus. Now, consider the participant that does this first. When this participant decides that consensus is finished, other participants have not yet made that decision. If they were incapable of changing the agreed set from their point of view, they would have already decided consensus was finished. So they must be still capable of changing their agreed set. <!-- STYLE_OVERRIDE: will --></p>
<p>In other words, for the consensus process to ever finish, some participant must declare that consensus has been reached on a set of transactions even though every other participant is theoretically still capable of changing the agreed upon set of transactions.</p>
<p>Imagine a group of people in a room trying to agree which door they should use to exit. No matter how much the participants discuss, at some point, <em>someone</em> has to be the first one to walk out of a door, even though the people behind that person could still change their minds and leave through the other door.</p>
<p>The probability of this kind of failure can be made very low, but it cannot be reduced to zero. The engineering tradeoffs are such that driving this probability down below about one in a thousand makes consensus significantly slower, and less able to tolerate network and endpoint failures.</p>
<h3 id="how-the-xrp-ledger-handles-consensus-failure">How the XAG Ledger Handles Consensus Failure</h3>
<p>After a consensus round completes, each participant applies the set of transactions that they believe were agreed to. This results in constructing what they believe the next state of the ledger should be.</p>
<p>Participants that are also validators then publish a cryptographic fingerprint of this next ledger. We call this fingerprint a “validation vote”. If the consensus round succeeded, the vast majority of honest validators should be publishing the same fingerprint.</p>
<p>Participants then collect these validation votes. From the validation votes, they can determine whether the previous consensus round resulted in a supermajority of participants agreeing on a set of transactions or not.</p>
<p>Participants then find themselves in one of three cases, in order of probability:</p>
<ol>
<li>They built the same ledger a supermajority agreed to. In this case, they can consider that ledger fully validated and rely on its contents.</li>
<li>They built a different ledger than a supermajority agreed on. In this case, they must build and accept the supermajority ledger. This typically indicates that they declared a consensus early and many other participants changed after that. They must “jump” to the super-majority ledger to resume operation.</li>
<li>No supermajority is clear from the received validations. In this case, the previous consensus round was wasted and a new round must occur before any ledger can be validated.</li>
</ol>
<p>Of course, case 1 is the most common. Case 2 does no harm to the network whatsoever. A small percentage of the participants could even fall into case 2 every round, and the network would work with no issues. Even those participants can recognize that they did not build the same ledger as the supermajority, so they know not to report their results as final until they are in agreement with the supermajority.</p>
<p>Case 3 results in the network losing a few seconds in which it could have made forward progress, but is extremely rare. In this case, the next consensus round is much less likely to fail because disagreements are resolved in the consensus process and only remaining disagreements can cause a failure.</p>
<p>On rare occasions, the network as a whole fails to make forward progress for a few seconds. In exchange, average transaction confirmation times are low.</p>
<h2 id="philosophy">Philosophy</h2>
<p>One form of reliability is the ability of a system to provide results even under conditions where some components have failed, some participants are malicious, and so on. While this is important, there is another form of reliability that is much more important in cryptographic payment systems — the ability of a system to produce results that can be relied upon. That is, when a system reports a result to us as reliable, we should be able to rely on that result.</p>
<p>Real-world systems, however, face operational conditions in which both kinds of reliability can be compromised. These include hardware failures, communication failures, and even dishonest participants. Part of the XAG Ledger's design philosophy is to detect conditions where the reliability of results are impaired and report them, rather than providing results that must not be relied on.</p>
<p>The XAG Ledger's consensus algorithm provides a robust alternative to proof of work systems, without consuming computational resources needlessly. Byzantine failures are possible, and do happen, but the consequence is only minor delays. In all cases, the XAG Ledger's consensus algorithm reports results as reliable only when they in fact are.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><strong>Concepts:</strong><ul>
<li><a href="intro-to-consensus.html">Introduction to Consensus</a></li>
<li><a href="consensus-research.html">Consensus Research</a></li>
<li><a class="external-link" href="https://www.youtube.com/watch?v=pj1QVb1vlC0" target="_blank">Ripple Consensus Video <i aria-hidden="true" class="fa fa-external-link"></i></a></li>
</ul>
</li>
<li><strong>Tutorials:</strong><ul>
<li><a href="reliable-transaction-submission.html">Reliable Transaction Submission</a></li>
<li><a href="run-rippled-as-a-validator.html">Run <code>rippled</code> as a Validator</a></li>
</ul>
</li>
<li><strong>References:</strong><ul>
<li><a href="ledger-data-formats.html">Ledger Format Reference</a></li>
<li><a href="transaction-formats.html">Transaction Format Reference</a></li>
<li><a href="consensus_info.html">consensus_info method</a></li>
<li><a href="validator_list_sites.html">validator_list_sites method</a></li>
<li><a href="validators.html">validators method</a></li>
<li><a href="consensus_info.html">consensus_info method</a></li>
</ul>
</li>
</ul>
<!-- -->
<!-- -->
<!-- API object types -->
<!-- -->
<!-- -->
<!-- -->
<!-- rippled release notes links -->
</div>
</article>
</main>
<!-- Left sidebar last so it's at the end for mobile -->
<aside class="sidebar col-md-5 col-lg-3 p-0 order-md-1" role="complementary">
<div class="tree_nav">
<!---->
<div class="sidenav_parent">
<a href="concepts.html"> Concepts</a>
</div>
<!---->
<!---->
<div id="sidenav" role="tablist" aria-multiselectable="true">
<!---->
<div class="card">
<div class="card-header" role="tab" id="sidenav_cat_head_2">
<a class="collapsed sidenav_cat_toggler" role="button" data-toggle="collapse" href="#sidenav_collapse_2" aria-expanded="true" aria-controls="sidenav_collapse_2"></a>
<h5 class="card-title">
<a class="sidenav_cat_title" href="introduction.html">Introduction</a>
<!-- <a class="sidenav_cat_title" href="introduction.html">Introduction</a> -->
</h5>
</div><!-- /.card-header -->
<div id="sidenav_collapse_2" class="collapse" role="tabpanel" aria-labelledby="sidenav_cat_head_2">
<div class="card-body">
<ul class="sidebar_pagelist">
<li><a class="nosubcat-page" href="xag-ledger-overview.html">XAG Ledger Overview</a></li>
<li><a class="nosubcat-page" href="intro-to-consensus.html">Introduction to Consensus</a></li>
<li><a class="nosubcat-page" href="xag.html">XAG</a></li>
<li><a class="nosubcat-page" href="software-ecosystem.html">Software Ecosystem</a></li>
<li><a class="nosubcat-page" href="technical-faq.html">Technical FAQ</a></li>
</ul>
</div><!-- /.card-body -->
</div><!-- /#sidenav_collapse2 -->
</div><!-- /.card -->
<!---->
<div class="card">
<div class="card-header" role="tab" id="sidenav_cat_head_8">
<a class="collapsed sidenav_cat_toggler" role="button" data-toggle="collapse" href="#sidenav_collapse_8" aria-expanded="true" aria-controls="sidenav_collapse_8"></a>
<h5 class="card-title">
<a class="sidenav_cat_title" href="payment-system-basics.html">Payment System Basics</a>
<!-- <a class="sidenav_cat_title" href="payment-system-basics.html">Payment System Basics</a> -->
</h5>
</div><!-- /.card-header -->
<div id="sidenav_collapse_8" class="collapse" role="tabpanel" aria-labelledby="sidenav_cat_head_8">
<div class="card-body">
<ul class="sidebar_pagelist">
<li><a class="subcat-title" href="accounts.html">Accounts</a></li>
<li><a class="subpage" href="cryptographic-keys.html">Cryptographic Keys</a></li>
<li><a class="subpage" href="multi-signing.html">Multi-Signing</a></li>
<li><a class="subpage" href="reserves.html">Reserves</a></li>
<li><a class="subpage" href="depositauth.html">Deposit Authorization</a></li>
<li><a class="nosubcat-page" href="fees.html">Fees (Disambiguation)</a></li>
<li><a class="nosubcat-page" href="ledgers.html">Ledgers</a></li>
<li><a class="subcat-title" href="transaction-basics.html">Transaction Basics</a></li>
<li><a class="subpage" href="transaction-cost.html">Transaction Cost</a></li>
<li><a class="subpage" href="finality-of-results.html">Finality of Results</a></li>
<li><a class="subpage" href="source-and-destination-tags.html">Source and Destination Tags</a></li>
</ul>
</div><!-- /.card-body -->
</div><!-- /#sidenav_collapse8 -->
</div><!-- /.card -->
<!---->
<div class="card">
<div class="card-header" role="tab" id="sidenav_cat_head_20">
<a class="collapsed sidenav_cat_toggler" role="button" data-toggle="collapse" href="#sidenav_collapse_20" aria-expanded="true" aria-controls="sidenav_collapse_20"></a>
<h5 class="card-title">
<a class="sidenav_cat_title" href="payment-types.html">Payment Types</a>
<!-- <a class="sidenav_cat_title" href="payment-types.html">Payment Types</a> -->
</h5>
</div><!-- /.card-header -->
<div id="sidenav_collapse_20" class="collapse" role="tabpanel" aria-labelledby="sidenav_cat_head_20">
<div class="card-body">
<ul class="sidebar_pagelist">
<li><a class="nosubcat-page" href="direct-xrp-payments.html">Direct XAG Payments</a></li>
<li><a class="nosubcat-page" href="cross-currency-payments.html">Cross-Currency Payments</a></li>
<li><a class="nosubcat-page" href="partial-payments.html">Partial Payments</a></li>
</ul>
</div><!-- /.card-body -->
</div><!-- /#sidenav_collapse20 -->
</div><!-- /.card -->
<!---->
<div class="card">
<div class="card-header" role="tab" id="sidenav_cat_head_28">
<a class="collapsed sidenav_cat_toggler" role="button" data-toggle="collapse" href="#sidenav_collapse_28" aria-expanded="true" aria-controls="sidenav_collapse_28"></a>
<h5 class="card-title">
<a class="sidenav_cat_title" href="issued-currencies.html">Issued Currencies</a>
<!-- <a class="sidenav_cat_title" href="issued-currencies.html">Issued Currencies</a> -->
</h5>
</div><!-- /.card-header -->
<div id="sidenav_collapse_28" class="collapse" role="tabpanel" aria-labelledby="sidenav_cat_head_28">
<div class="card-body">
<ul class="sidebar_pagelist">
<li><a class="nosubcat-page" href="issued-currencies-overview.html">Issued Currencies Overview</a></li>
<li><a class="nosubcat-page" href="trust-lines-and-issuing.html">Trust Lines and Issuing</a></li>
<li><a class="nosubcat-page" href="authorized-trust-lines.html">Authorized Trust Lines</a></li>
<li><a class="nosubcat-page" href="freezes.html">Freezing Issued Currencies</a></li>
<li><a class="nosubcat-page" href="rippling.html">Rippling</a></li>
<li><a class="nosubcat-page" href="transfer-fees.html">Transfer Fees</a></li>
<li><a class="nosubcat-page" href="issuing-and-operational-addresses.html">Issuing and Operational Addresses</a></li>
<li><a class="nosubcat-page" href="paths.html">Paths</a></li>
<li><a class="nosubcat-page" href="demurrage.html">Demurrage</a></li>
</ul>
</div><!-- /.card-body -->
</div><!-- /#sidenav_collapse28 -->
</div><!-- /.card -->
<!---->
<div class="card">
<div class="card-header" role="tab" id="sidenav_cat_head_38">
<a class="collapsed sidenav_cat_toggler" role="button" data-toggle="collapse" href="#sidenav_collapse_38" aria-expanded="true" aria-controls="sidenav_collapse_38"></a>
<h5 class="card-title">
<a class="sidenav_cat_title" href="decentralized-exchange.html">Decentralized Exchange</a>
<!-- <a class="sidenav_cat_title" href="decentralized-exchange.html">Decentralized Exchange</a> -->
</h5>
</div><!-- /.card-header -->
<div id="sidenav_collapse_38" class="collapse" role="tabpanel" aria-labelledby="sidenav_cat_head_38">
<div class="card-body">
<ul class="sidebar_pagelist">
<li><a class="nosubcat-page" href="offers.html">Offers</a></li>
<li><a class="nosubcat-page" href="autobridging.html">Auto-Bridging</a></li>
<li><a class="nosubcat-page" href="ticksize.html">Tick Size</a></li>
</ul>
</div><!-- /.card-body -->
</div><!-- /#sidenav_collapse38 -->
</div><!-- /.card -->
<!---->
<div class="card active">
<div class="card-header" role="tab" id="sidenav_cat_head_42">
<a class="sidenav_cat_toggler" role="button" data-toggle="collapse" href="#sidenav_collapse_42" aria-expanded="true" aria-controls="sidenav_collapse_42"></a>
<h5 class="card-title">
<a class="sidenav_cat_title active-parent" href="consensus-network.html">Consensus Network</a>
<!-- <a class="sidenav_cat_title" href="consensus-network.html">Consensus Network</a> -->
</h5>
</div><!-- /.card-header -->
<div id="sidenav_collapse_42" class="collapse show" role="tabpanel" aria-labelledby="sidenav_cat_head_42">
<div class="card-body">
<ul class="sidebar_pagelist">
<li><a class="nosubcat-page" href="consensus.html">Consensus</a></li>
<li><a class="active nosubcat-page" href="consensus-principles-and-rules.html">Consensus Principles and Rules</a></li>
<li><a class="nosubcat-page" href="consensus-protections.html">Consensus Protections Against Attacks and Failure Modes</a></li>
<li><a class="nosubcat-page" href="transaction-queue.html">Transaction Queue</a></li>
<li><a class="nosubcat-page" href="about-canceling-a-transaction.html">About Canceling a Transaction</a></li>
<li><a class="nosubcat-page" href="transaction-malleability.html">Transaction Malleability</a></li>
<li><a class="subcat-title" href="amendments.html">Amendments</a></li>
<li><a class="subpage" href="known-amendments.html">Known Amendments</a></li>
<li><a class="nosubcat-page" href="fee-voting.html">Fee Voting</a></li>
<li><a class="nosubcat-page" href="consensus-research.html">Consensus Research</a></li>
<li><a class="nosubcat-page" href="parallel-networks.html">Parallel Networks</a></li>
</ul>
</div><!-- /.card-body -->
</div><!-- /#sidenav_collapse42 -->
</div><!-- /.card -->
<!---->
<div class="card">
<div class="card-header" role="tab" id="sidenav_cat_head_54">
<a class="collapsed sidenav_cat_toggler" role="button" data-toggle="collapse" href="#sidenav_collapse_54" aria-expanded="true" aria-controls="sidenav_collapse_54"></a>
<h5 class="card-title">
<a class="sidenav_cat_title" href="the-rippled-server.html">The rippled Server</a>
<!-- <a class="sidenav_cat_title" href="the-rippled-server.html">The rippled Server</a> -->
</h5>
</div><!-- /.card-header -->
<div id="sidenav_collapse_54" class="collapse" role="tabpanel" aria-labelledby="sidenav_cat_head_54">
<div class="card-body">
<ul class="sidebar_pagelist">
<li><a class="nosubcat-page" href="rippled-server-modes.html">rippled Server Modes</a></li>
<li><a class="nosubcat-page" href="clustering.html">Clustering</a></li>
<li><a class="subcat-title" href="ledger-history.html">Ledger History</a></li>
<li><a class="subpage" href="online-deletion.html">Online Deletion</a></li>
<li><a class="subpage" href="history-sharding.html">History Sharding</a></li>
<li><a class="nosubcat-page" href="peer-protocol.html">Peer Protocol</a></li>
<li><a class="nosubcat-page" href="transaction-censorship-detection.html">Transaction Censorship Detection</a></li>
</ul>
</div><!-- /.card-body -->
</div><!-- /#sidenav_collapse54 -->
</div><!-- /.card -->
</div><!-- /#sidenav -->
</div><!-- /.tree_nav --> </aside>
</div><!--/.row (main layout)-->
</div>
<footer class="xrpl-footer" role="contentinfo">
<section class="container-fluid card-grid card-grid-Nx1">
<div class="card">
<div class="card-header">
<h5><a href="docs.html">Docs</a></h5>
</div><!--/.card-header-->
<div class="card-body">
<div class="children-display">
<ul>
<li class="level-1"><a href="concepts.html">Concepts</a></li>
<li class="level-1"><a href="tutorials.html">Tutorials</a></li>
<li class="level-1"><a href="references.html">References</a></li>
</ul>
</div> </div><!--/.card-body-->
<div class="flag-vertical">01</div>
</div><!--/.card -->
<div class="card">
<div class="card-header">
<h5><a href="use-cases.html">Use Cases</a></h5>
</div><!--/.card-header-->
<div class="card-body">
<div class="children-display">
<ul>
<li class="level-1"><a href="run-a-rippled-validator.html">Run a rippled Validator</a></li>
<li class="level-1"><a href="list-xrp-in-your-exchange.html">List XAG in Your Exchange</a></li>
<li class="level-1"><a href="contribute-code-to-rippled.html">Contribute Code to rippled</a></li>
<li class="level-1"><a href="contribute-code-to-ripple-lib.html">Contribute Code to ripple-lib</a></li>
</ul>
</div> </div><!--/.card-body-->
<div class="flag-vertical">02</div>
</div><!--/.card -->
<div class="card">
<div class="card-header">
<h5><a href="dev-tools.html">Dev Tools</a></h5>
</div><!--/.card-header-->
<div class="card-body">
<div class="children-display">
<ul>
<li class="level-1"><a href="xag-ledger-rpc-tool.html">RPC Tool</a></li>
<li class="level-1"><a href="websocket-api-tool.html">WebSocket API Tool</a></li>
<li class="level-1"><a target="_blank" href="https://scan.xrpgen.com/">XAG Ledger Explorer</a> <i class="fa fa-external-link"></i></li>
</ul>
</div> </div><!--/.card-body-->
<div class="flag-vertical">03</div>
</div><!--/.card -->
<div class="card">
<div class="card-header">
<h5><a href="https://xrpgen.com/" target="_blank">Xrpalike Gene<i class="fa fa-external-link"></i></a></h5>
</div><!--/.card-header-->
<!--/.card-body-->
<div class="flag-vertical">04</div>
</div><!--/.card -->
</section>
<section class="container-fluid p-5 pl-sm-0">
<nav role="navigation" class="d-flex mb-3 language-selector">
<img class="language_selector_icon" src="assets/img/icon-language-selector.svg" width="32" height="40" alt="language selection icon" />
<ul class="nav">
<li class="nav-item">
<a class="nav-link active" href="/consensus-principles-and-rules.html"><i class="fa fa-check-circle"></i> English</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/cn/consensus-principles-and-rules.html">中文</a>
</li>
</ul>
</nav>
<div class="absolute_bottom_footer">
<span>© XAG Ledger Project 2020</span>
<span><a href="">License</a></span>
</div><!-- /.absolute_bottom_footer -->
</section>
</footer>
<!-- Jump to top button -->
<a href="#main_content_wrapper" class="jump-to-top btn btn-primary btn-lg" role="button" title="Jump to top of page">Top</a>
<script type="text/javascript" src="assets/js/jump-to-top.js"></script>
<!-- Non-blocking resources -->
<!-- Bootstrap JS -->
<script src="assets/vendor/bootstrap.min.js"></script>
<!-- fontawesome icons -->
<link rel="stylesheet" href="assets/vendor/fontawesome/css/font-awesome.min.css" />
<!-- Algolia DocSearch -->
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js"></script>
<script type="text/javascript"> docsearch({
apiKey: '70de5b9b8ef95460f3c6e04054b325b2',
indexName: 'xrpl',
inputSelector: '#topsearchbar',
algoliaOptions: { 'facetFilters': ["lang:en"] },
debug: false
});
</script>
<script type="application/javascript">
gtag('set', {'content_group1': 'Content Docs'});
</script>
</body>
</html>