{"action":"created","comment":{"url":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/comments/58430063","id":58430063,"diff_hunk":"@@ -0,0 +1,164 @@\n+# Amendments #\n+\n+The Amendments system provides a means of introducing new features to the decentralized Ripple consensus network without causing disruptions. The amendments system works by utilizing the core consensus process of the network to approve any changes by showing continuous support before those changes go into effect. An amendment normally requires **80% support for two weeks** before it can apply.\n+\n+When an Amendment has been enabled, it applies permanently to all ledger versions after the one that included it. You cannot disable an Amendment, unless you introduce a new Amendment to do so.\n+\n+\n+## Background ##\n+\n+Any changes to transaction processing could cause servers to build a different ledger with the same set of transactions. If only a portion of validators have upgraded to a new version of the software, this could cause anything from minor inconveniences (a minority of servers spend more time and bandwidth fetching the actual consensus ledger because they cannot rely on their own) to serious problems: consensus might be unable to validate new ledger versions because servers are unable to reach a consensus who agree to the exact same result.\n+\n+Amendments provide solution to this problem, so that new features can be enabled only when enough validators support those features.\n+\n+Users and businesses who rely on the Ripple Consensus Ledger can also use Amendments to provide advance notice of changes in transaction processing that might affect their business. However, API changes that do not impact transaction processing or [the consensus process](https://ripple.com/knowledge_center/the-ripple-ledger-consensus-process/) do not require Amendments.\n+\n+\n+## Amendment Process ##\n+\n+An amendment is a fully-functional feature or change, ready to apply when a consensus of servers can handle it. A `rippled` server that wants to use an amendment has business logic for two modes: without the amendment (previous behavior) and with the amendment (new behavior). Every amendment has a unique identifying hex value and a short name. The short name is for human use, and does not affect the status of the amendment.\n+\n+Every 256th ledger is called a \"flag\" ledger. The process of approving an amendment starts in the ledger version immediately before the flag ledger: at this time, `rippled` validator servers submit votes in favor of specific amendments alongside their validations for that ledger. ([Fee Voting](concept-fee-voting.html) also occurs around flag ledgers.)\n+\n+In the flag ledger itself, there is nothing unusual. However, during that time, the servers look at the votes of the validators they trust, and decide whether to insert an [`EnableAmendment` pseudo-transaction](reference-transaction-format.html#enableamendment) into the following ledger. The flags of an EnableAmendment pseudo-transaction indicate what the server thinks happened:\n+\n+* The `tfGotMajority` flag means that support for the amendment has increased to at least 80% of trusted validators.\n+* The `tfLostMajority` flag means that support for the amendment has decreased to less than 80% of trusted validators.\n+* An EnableAmendment pseudo-transaction with no flags means that support for the amendment has been enabled. (The change in transaction processing applies to every ledger after this one.)\n+\n+A server only inserts the pseudo-transaction to enable an amendment if all of the following conditions are met:\n+\n+* The amendment has not already been enabled.\n+* A previous ledger includes an EnableAmendment pseudo-transaction for this amendment with the `tfGotMajority` flag enabled.\n+* The previous ledger in question is an ancestor of the current ledger.\n+* The previous ledger in question has a close time that is at least **two weeks** before the close time of the latest flag ledger.\n+* There are no EnableAmendment pseudo-transactions for this amendment with the `tfLostMajority` flag enabled in the consensus ledgers between the `tfGotMajority` pseudo-transaction and the current ledger.\n+\n+It is theoretically possible (but extremely unlikely) that a `tfLostMajority` EnableAmendment pseudo-transaction could be included in the same ledger as the pseudo-transaction to enable an amendment. In this case, the pseudo-transaction with the `tfLostMajority` pseudo-transaction has no effect.\n+\n+## Amendment Voting ##\n+\n+Operators of `rippled` validators can choose which amendments to support or reject using the [`feature` command](reference-rippled.html#feature). This decides which amendments the validator votes for in the [amendment process](#amendment-process). By default, `rippled` votes in favor of every amendment it knows about.\n+\n+The operator of a `rippled` validator can \"veto\" an amendment. In this case, that validator never sends a vote in favor of the amendment. If enough servers veto an amendment, that prevents it from reaching consistent 80% support, so the amendment does not apply.\n+\n+As with all aspects of the consensus process, amendment votes are only taken into account by servers that trust the validators sending those votes. Currently, Ripple recommends only trusting the 5 default validators that Ripple (the company) operates. For now, trusting only those validators is sufficient to coordinate with Ripple on releasing new features.\n+\n+### Configuring Amendment Voting ###\n+\n+You can temporarily configure an amendment using the [`feature` command](reference-rippled.html#feature). To make a persistent change to your server's support for an amendment, modify your server's `rippled.cfg` file.\n+\n+Use the `[veto_amendments]` stanza to list amendments you do not want the server to vote for. Each line should contains one amendment's unique ID, optionally followed by the short name for the amendment. For example:","path":"content/concept-amendments.md","position":51,"original_position":51,"commit_id":"2045bc55f555b20a59c46cee4e565f68ef9bff7e","original_commit_id":"2045bc55f555b20a59c46cee4e565f68ef9bff7e","user":{"login":"ryangyoung","id":8494827,"avatar_url":"https://avatars.githubusercontent.com/u/8494827?v=3","gravatar_id":"","url":"https://api.github.com/users/ryangyoung","html_url":"https://github.com/ryangyoung","followers_url":"https://api.github.com/users/ryangyoung/followers","following_url":"https://api.github.com/users/ryangyoung/following{/other_user}","gists_url":"https://api.github.com/users/ryangyoung/gists{/gist_id}","starred_url":"https://api.github.com/users/ryangyoung/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ryangyoung/subscriptions","organizations_url":"https://api.github.com/users/ryangyoung/orgs","repos_url":"https://api.github.com/users/ryangyoung/repos","events_url":"https://api.github.com/users/ryangyoung/events{/privacy}","received_events_url":"https://api.github.com/users/ryangyoung/received_events","type":"User","site_admin":false},"body":"Typo: \"Each line should *contain* one amendment's...\"","created_at":"2016-04-04T19:06:31Z","updated_at":"2016-04-04T19:06:31Z","html_url":"https://github.com/ripple/ripple-dev-portal/pull/174#discussion_r58430063","pull_request_url":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/174","_links":{"self":{"href":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/comments/58430063"},"html":{"href":"https://github.com/ripple/ripple-dev-portal/pull/174#discussion_r58430063"},"pull_request":{"href":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/174"}}},"pull_request":{"url":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/174","id":64404152,"html_url":"https://github.com/ripple/ripple-dev-portal/pull/174","diff_url":"https://github.com/ripple/ripple-dev-portal/pull/174.diff","patch_url":"https://github.com/ripple/ripple-dev-portal/pull/174.patch","issue_url":"https://api.github.com/repos/ripple/ripple-dev-portal/issues/174","number":174,"state":"open","locked":false,"title":"[Do not merge yet] Simple Multi-Sign Documentation","user":{"login":"mDuo13","id":7515597,"avatar_url":"https://avatars.githubusercontent.com/u/7515597?v=3","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":"placeholder PR for feedback","created_at":"2016-03-29T02:09:20Z","updated_at":"2016-04-04T19:06:31Z","closed_at":null,"merged_at":null,"merge_commit_sha":"858eb1d844eb8e34869a0d6cae07584149e4ed17","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/174/commits","review_comments_url":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/174/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/174/comments","statuses_url":"https://api.github.com/repos/ripple/ripple-dev-portal/statuses/2045bc55f555b20a59c46cee4e565f68ef9bff7e","head":{"label":"mDuo13:simplesigning","ref":"simplesigning","sha":"2045bc55f555b20a59c46cee4e565f68ef9bff7e","user":{"login":"mDuo13","id":7515597,"avatar_url":"https://avatars.githubusercontent.com/u/7515597?v=3","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,"name":"ripple-dev-portal","full_name":"mDuo13/ripple-dev-portal","owner":{"login":"mDuo13","id":7515597,"avatar_url":"https://avatars.githubusercontent.com/u/7515597?v=3","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":"2016-01-29T23:24:26Z","pushed_at":"2016-04-04T17:20:33Z","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":11631,"stargazers_count":1,"watchers_count":1,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":1,"default_branch":"gh-pages"}},"base":{"label":"ripple:master","ref":"master","sha":"7ec702365aa784ac90b73222d5f46231b7dc6503","user":{"login":"ripple","id":3165523,"avatar_url":"https://avatars.githubusercontent.com/u/3165523?v=3","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,"name":"ripple-dev-portal","full_name":"ripple/ripple-dev-portal","owner":{"login":"ripple","id":3165523,"avatar_url":"https://avatars.githubusercontent.com/u/3165523?v=3","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":"2016-03-31T11:11:43Z","pushed_at":"2016-04-04T17:20:34Z","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":11458,"stargazers_count":39,"watchers_count":39,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":39,"mirror_url":null,"open_issues_count":3,"forks":39,"open_issues":3,"watchers":39,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/174"},"html":{"href":"https://github.com/ripple/ripple-dev-portal/pull/174"},"issue":{"href":"https://api.github.com/repos/ripple/ripple-dev-portal/issues/174"},"comments":{"href":"https://api.github.com/repos/ripple/ripple-dev-portal/issues/174/comments"},"review_comments":{"href":"https://api.github.com/repos/ripple/ripple-dev-portal/pulls/174/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/174/commits"},"statuses":{"href":"https://api.github.com/repos/ripple/ripple-dev-portal/statuses/2045bc55f555b20a59c46cee4e565f68ef9bff7e"}}}}