{"action":"created","comment":{"url":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/comments/210788520","pull_request_review_id":147079225,"id":210788520,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMDc4ODUyMA==","diff_hunk":"@@ -0,0 +1,63 @@\n+# Introduction to Consensus\n+\n+_Consensus_ is the most important property of any decentralized payment system. In traditional centralized payment systems, one authoritative administrator gets the final say in how and when payments occur. Decentralized systems, by definition, don't have an operator to do that. Instead, decentralized systems like the XRP Ledger define a set of rules all participants follow, so every participant can agree on the exact same series of events and their outcome at any point in time. We call this set of rules a _consensus protocol_.\n+\n+\n+## Consensus Protocol Properties\n+\n+The XRP Ledger uses a consensus protocol unlike any digital asset that came before it. This protocol, known as the XRP Ledger Consensus Protocol, is designed to have the following important properties:\n+\n+- Everyone who uses the XRP Ledger can agree on the latest state, and which transactions have occurred in which order.\n+- All valid transactions are processed without needing a central operator or having a single point of failure.\n+- The ledger can make progress even if some participants join, leave, or behave inappropriately.\n+- If too many participants are unreachable or misbehaving, the network fails to make progress rather than diverging or confirming invalid transactions.\n+- Confirming transactions does not require wasteful or competitive use of resources, unlike most blockchain systems.\n+\n+This protocol is still evolving, as is our knowledge of its limits and possible failure cases. For academic research on the protocol itself, see [Consensus Research](consensus-research.html).\n+\n+## Background\n+\n+Consensus protocols are a solution to the _double-spend problem_: the challenge to prevent someone from successfully spending the same digital money in two places. The hardest part about this problem is putting transactions in order: without a central authority, it can be difficult to resolve disputes about which transaction comes first when you have two or more mutually-exclusive transactions sent around the same time. For a detailed analysis of the double-spend problem, how the XRP Ledger Consensus Protocol solves this problem, and the tradeoffs and limitations involved, see [Consensus Principles and Rules](consensus-principles-and-rules.html).\n+\n+\n+## Ledger History\n+\n+The XRP Ledger processes transactions in blocks called \"ledger versions\", or \"ledgers\" for short. Each ledger version contains three pieces:\n+\n+- The current state of all balances and objects stored in the ledger.\n+- The set of transactions applied to the previous ledger to result in this one.\n+- Metadata about the current ledger version, such as its ledger index, a [cryptographic hash](https://en.wikipedia.org/wiki/Cryptographic_hash_function) that uniquely identifies its contents, and information on the parent ledger was used as a basis for building this one.\n+\n+[![Figure 1: Anatomy of a ledger version, which includes transactions, state, and metadata](img/anatomy-of-a-ledger-simplified.png)](img/anatomy-of-a-ledger-simplified.png)\n+<!--{# Diagram source: https://docs.google.com/presentation/d/1mg2jZQwgfLCIhOU8Mr5aOiYpIgbIgk3ymBoDb2hh7_s/ #}-->\n+\n+Each ledger version is numbered with a _ledger index_ and builds on a previous ledger version whose index is one less, going all the way back to a starting point called the _genesis ledger_ with ledger index 1. Like Bitcoin and other blockchain technologies, this forms a public history of all transactions and their results. Unlike most blockchain technologies, each new \"block\" in the XRP Ledger contains the entirety of the current state, so you don't need to collect the entire history to know what's happening now.[¹](#footnote-1)","path":"content/concepts/introduction/intro-to-consensus.md","position":34,"original_position":34,"commit_id":"579d2f0a48a6bad45b09467a297a2d588bc33e8d","original_commit_id":"579d2f0a48a6bad45b09467a297a2d588bc33e8d","user":{"login":"MarkusTeufelberger","id":950561,"node_id":"MDQ6VXNlcjk1MDU2MQ==","avatar_url":"https://avatars0.githubusercontent.com/u/950561?v=4","gravatar_id":"","url":"https://api.github.com/users/MarkusTeufelberger","html_url":"https://github.com/MarkusTeufelberger","followers_url":"https://api.github.com/users/MarkusTeufelberger/followers","following_url":"https://api.github.com/users/MarkusTeufelberger/following{/other_user}","gists_url":"https://api.github.com/users/MarkusTeufelberger/gists{/gist_id}","starred_url":"https://api.github.com/users/MarkusTeufelberger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MarkusTeufelberger/subscriptions","organizations_url":"https://api.github.com/users/MarkusTeufelberger/orgs","repos_url":"https://api.github.com/users/MarkusTeufelberger/repos","events_url":"https://api.github.com/users/MarkusTeufelberger/events{/privacy}","received_events_url":"https://api.github.com/users/MarkusTeufelberger/received_events","type":"User","site_admin":false},"body":"\"Unlike most blockchain technologies\" is a bit of a bold claim, especially considering that Ethereum did the same thing as XRPL with its StateRoot and UTXO commitments are still being talked about for Bitcoin.","created_at":"2018-08-17T02:03:04Z","updated_at":"2018-08-17T02:03:04Z","html_url":"https://github.com/ripple/ripple-dev-portal/pull/445#discussion_r210788520","pull_request_url":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/445","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/comments/210788520"},"html":{"href":"https://github.com/ripple/ripple-dev-portal/pull/445#discussion_r210788520"},"pull_request":{"href":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/445"}}},"pull_request":{"url":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/445","id":208621660,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA4NjIxNjYw","html_url":"https://github.com/ripple/ripple-dev-portal/pull/445","diff_url":"https://github.com/ripple/ripple-dev-portal/pull/445.diff","patch_url":"https://github.com/ripple/ripple-dev-portal/pull/445.patch","issue_url":"https://api.github.com/repos/ripple/ripple-dev-portal/issues/445","number":445,"state":"open","locked":false,"title":"Introductory consensus article","user":{"login":"mDuo13","id":7515597,"node_id":"MDQ6VXNlcjc1MTU1OTc=","avatar_url":"https://avatars0.githubusercontent.com/u/7515597?v=4","gravatar_id":"","url":"https://api.github.com/users/mDuo13","html_url":"https://github.com/mDuo13","followers_url":"https://api.github.com/users/mDuo13/followers","following_url":"https://api.github.com/users/mDuo13/following{/other_user}","gists_url":"https://api.github.com/users/mDuo13/gists{/gist_id}","starred_url":"https://api.github.com/users/mDuo13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mDuo13/subscriptions","organizations_url":"https://api.github.com/users/mDuo13/orgs","repos_url":"https://api.github.com/users/mDuo13/repos","events_url":"https://api.github.com/users/mDuo13/events{/privacy}","received_events_url":"https://api.github.com/users/mDuo13/received_events","type":"User","site_admin":false},"body":"- Adds a new, simpler article introducing consensus at a high level for the intro category\r\n- Moves the existing consensus article to the \"Consensus Network\" category\r\n- Adds a FAQ-like article describing how Consensus handles various challenges and attack types.\r\n\r\nReviewers: please review the introduction to consensus article closely with an eye for things that can be removed to make the article more approachable at an introductory level, and omissions that may lead to misunderstandings later.","created_at":"2018-08-15T17:03:59Z","updated_at":"2018-08-17T02:03:04Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4cb7c2229b7f4f3e78a2d099b12cbe5f19018210","assignee":null,"assignees":[],"requested_reviewers":[{"login":"bachase","id":14430,"node_id":"MDQ6VXNlcjE0NDMw","avatar_url":"https://avatars2.githubusercontent.com/u/14430?v=4","gravatar_id":"","url":"https://api.github.com/users/bachase","html_url":"https://github.com/bachase","followers_url":"https://api.github.com/users/bachase/followers","following_url":"https://api.github.com/users/bachase/following{/other_user}","gists_url":"https://api.github.com/users/bachase/gists{/gist_id}","starred_url":"https://api.github.com/users/bachase/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bachase/subscriptions","organizations_url":"https://api.github.com/users/bachase/orgs","repos_url":"https://api.github.com/users/bachase/repos","events_url":"https://api.github.com/users/bachase/events{/privacy}","received_events_url":"https://api.github.com/users/bachase/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/445/commits","review_comments_url":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/445/comments","review_comment_url":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ripple/ripple-dev-portal/issues/445/comments","statuses_url":"https://api.github.com/repos/ripple/ripple-dev-portal/statuses/579d2f0a48a6bad45b09467a297a2d588bc33e8d","head":{"label":"mDuo13:simple-consensus","ref":"simple-consensus","sha":"579d2f0a48a6bad45b09467a297a2d588bc33e8d","user":{"login":"mDuo13","id":7515597,"node_id":"MDQ6VXNlcjc1MTU1OTc=","avatar_url":"https://avatars0.githubusercontent.com/u/7515597?v=4","gravatar_id":"","url":"https://api.github.com/users/mDuo13","html_url":"https://github.com/mDuo13","followers_url":"https://api.github.com/users/mDuo13/followers","following_url":"https://api.github.com/users/mDuo13/following{/other_user}","gists_url":"https://api.github.com/users/mDuo13/gists{/gist_id}","starred_url":"https://api.github.com/users/mDuo13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mDuo13/subscriptions","organizations_url":"https://api.github.com/users/mDuo13/orgs","repos_url":"https://api.github.com/users/mDuo13/repos","events_url":"https://api.github.com/users/mDuo13/events{/privacy}","received_events_url":"https://api.github.com/users/mDuo13/received_events","type":"User","site_admin":false},"repo":{"id":19550849,"node_id":"MDEwOlJlcG9zaXRvcnkxOTU1MDg0OQ==","name":"ripple-dev-portal","full_name":"mDuo13/ripple-dev-portal","owner":{"login":"mDuo13","id":7515597,"node_id":"MDQ6VXNlcjc1MTU1OTc=","avatar_url":"https://avatars0.githubusercontent.com/u/7515597?v=4","gravatar_id":"","url":"https://api.github.com/users/mDuo13","html_url":"https://github.com/mDuo13","followers_url":"https://api.github.com/users/mDuo13/followers","following_url":"https://api.github.com/users/mDuo13/following{/other_user}","gists_url":"https://api.github.com/users/mDuo13/gists{/gist_id}","starred_url":"https://api.github.com/users/mDuo13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mDuo13/subscriptions","organizations_url":"https://api.github.com/users/mDuo13/orgs","repos_url":"https://api.github.com/users/mDuo13/repos","events_url":"https://api.github.com/users/mDuo13/events{/privacy}","received_events_url":"https://api.github.com/users/mDuo13/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mDuo13/ripple-dev-portal","description":"Ripple developer portal with documentation and examples","fork":true,"url":"https://api.github.com/repos/mDuo13/ripple-dev-portal","forks_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/forks","keys_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/teams","hooks_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/hooks","issue_events_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/issues/events{/number}","events_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/events","assignees_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/assignees{/user}","branches_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/branches{/branch}","tags_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/tags","blobs_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/git/refs{/sha}","trees_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/statuses/{sha}","languages_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/languages","stargazers_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/stargazers","contributors_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/contributors","subscribers_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/subscribers","subscription_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/subscription","commits_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/commits{/sha}","git_commits_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/git/commits{/sha}","comments_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/comments{/number}","issue_comment_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/issues/comments{/number}","contents_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/contents/{+path}","compare_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/merges","archive_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/downloads","issues_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/issues{/number}","pulls_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/pulls{/number}","milestones_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/milestones{/number}","notifications_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/labels{/name}","releases_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/releases{/id}","deployments_url":"https://api.github.com/repos/mDuo13/ripple-dev-portal/deployments","created_at":"2014-05-07T21:23:09Z","updated_at":"2017-02-14T22:15:33Z","pushed_at":"2018-08-17T00:03:32Z","git_url":"git://github.com/mDuo13/ripple-dev-portal.git","ssh_url":"git@github.com:mDuo13/ripple-dev-portal.git","clone_url":"https://github.com/mDuo13/ripple-dev-portal.git","svn_url":"https://github.com/mDuo13/ripple-dev-portal","homepage":null,"size":24207,"stargazers_count":1,"watchers_count":1,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":1,"open_issues":1,"watchers":1,"default_branch":"gh-pages"}},"base":{"label":"ripple:master","ref":"master","sha":"d3b230174e0bff349f82bdbfabca14686ae0daef","user":{"login":"ripple","id":3165523,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNjU1MjM=","avatar_url":"https://avatars2.githubusercontent.com/u/3165523?v=4","gravatar_id":"","url":"https://api.github.com/users/ripple","html_url":"https://github.com/ripple","followers_url":"https://api.github.com/users/ripple/followers","following_url":"https://api.github.com/users/ripple/following{/other_user}","gists_url":"https://api.github.com/users/ripple/gists{/gist_id}","starred_url":"https://api.github.com/users/ripple/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ripple/subscriptions","organizations_url":"https://api.github.com/users/ripple/orgs","repos_url":"https://api.github.com/users/ripple/repos","events_url":"https://api.github.com/users/ripple/events{/privacy}","received_events_url":"https://api.github.com/users/ripple/received_events","type":"Organization","site_admin":false},"repo":{"id":17273151,"node_id":"MDEwOlJlcG9zaXRvcnkxNzI3MzE1MQ==","name":"ripple-dev-portal","full_name":"ripple/ripple-dev-portal","owner":{"login":"ripple","id":3165523,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNjU1MjM=","avatar_url":"https://avatars2.githubusercontent.com/u/3165523?v=4","gravatar_id":"","url":"https://api.github.com/users/ripple","html_url":"https://github.com/ripple","followers_url":"https://api.github.com/users/ripple/followers","following_url":"https://api.github.com/users/ripple/following{/other_user}","gists_url":"https://api.github.com/users/ripple/gists{/gist_id}","starred_url":"https://api.github.com/users/ripple/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ripple/subscriptions","organizations_url":"https://api.github.com/users/ripple/orgs","repos_url":"https://api.github.com/users/ripple/repos","events_url":"https://api.github.com/users/ripple/events{/privacy}","received_events_url":"https://api.github.com/users/ripple/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ripple/ripple-dev-portal","description":"Ripple developer portal with documentation and examples","fork":false,"url":"https://api.github.com/repos/ripple/ripple-dev-portal","forks_url":"https://api.github.com/repos/ripple/ripple-dev-portal/forks","keys_url":"https://api.github.com/repos/ripple/ripple-dev-portal/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ripple/ripple-dev-portal/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ripple/ripple-dev-portal/teams","hooks_url":"https://api.github.com/repos/ripple/ripple-dev-portal/hooks","issue_events_url":"https://api.github.com/repos/ripple/ripple-dev-portal/issues/events{/number}","events_url":"https://api.github.com/repos/ripple/ripple-dev-portal/events","assignees_url":"https://api.github.com/repos/ripple/ripple-dev-portal/assignees{/user}","branches_url":"https://api.github.com/repos/ripple/ripple-dev-portal/branches{/branch}","tags_url":"https://api.github.com/repos/ripple/ripple-dev-portal/tags","blobs_url":"https://api.github.com/repos/ripple/ripple-dev-portal/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ripple/ripple-dev-portal/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ripple/ripple-dev-portal/git/refs{/sha}","trees_url":"https://api.github.com/repos/ripple/ripple-dev-portal/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ripple/ripple-dev-portal/statuses/{sha}","languages_url":"https://api.github.com/repos/ripple/ripple-dev-portal/languages","stargazers_url":"https://api.github.com/repos/ripple/ripple-dev-portal/stargazers","contributors_url":"https://api.github.com/repos/ripple/ripple-dev-portal/contributors","subscribers_url":"https://api.github.com/repos/ripple/ripple-dev-portal/subscribers","subscription_url":"https://api.github.com/repos/ripple/ripple-dev-portal/subscription","commits_url":"https://api.github.com/repos/ripple/ripple-dev-portal/commits{/sha}","git_commits_url":"https://api.github.com/repos/ripple/ripple-dev-portal/git/commits{/sha}","comments_url":"https://api.github.com/repos/ripple/ripple-dev-portal/comments{/number}","issue_comment_url":"https://api.github.com/repos/ripple/ripple-dev-portal/issues/comments{/number}","contents_url":"https://api.github.com/repos/ripple/ripple-dev-portal/contents/{+path}","compare_url":"https://api.github.com/repos/ripple/ripple-dev-portal/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ripple/ripple-dev-portal/merges","archive_url":"https://api.github.com/repos/ripple/ripple-dev-portal/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ripple/ripple-dev-portal/downloads","issues_url":"https://api.github.com/repos/ripple/ripple-dev-portal/issues{/number}","pulls_url":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls{/number}","milestones_url":"https://api.github.com/repos/ripple/ripple-dev-portal/milestones{/number}","notifications_url":"https://api.github.com/repos/ripple/ripple-dev-portal/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ripple/ripple-dev-portal/labels{/name}","releases_url":"https://api.github.com/repos/ripple/ripple-dev-portal/releases{/id}","deployments_url":"https://api.github.com/repos/ripple/ripple-dev-portal/deployments","created_at":"2014-02-28T02:47:58Z","updated_at":"2018-08-07T22:08:01Z","pushed_at":"2018-08-17T00:04:45Z","git_url":"git://github.com/ripple/ripple-dev-portal.git","ssh_url":"git@github.com:ripple/ripple-dev-portal.git","clone_url":"https://github.com/ripple/ripple-dev-portal.git","svn_url":"https://github.com/ripple/ripple-dev-portal","homepage":null,"size":23800,"stargazers_count":117,"watchers_count":117,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":127,"mirror_url":null,"archived":false,"open_issues_count":18,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":127,"open_issues":18,"watchers":117,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/445"},"html":{"href":"https://github.com/ripple/ripple-dev-portal/pull/445"},"issue":{"href":"https://api.github.com/repos/ripple/ripple-dev-portal/issues/445"},"comments":{"href":"https://api.github.com/repos/ripple/ripple-dev-portal/issues/445/comments"},"review_comments":{"href":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/445/comments"},"review_comment":{"href":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/445/commits"},"statuses":{"href":"https://api.github.com/repos/ripple/ripple-dev-portal/statuses/579d2f0a48a6bad45b09467a297a2d588bc33e8d"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"MarkusTeufelberger"}}