multi-sign - standalone mode in separate article

This commit is contained in:
mDuo13
2016-03-22 18:00:34 -07:00
parent aac47fa398
commit dfafdcc237
27 changed files with 464 additions and 200 deletions

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">
@@ -120,6 +121,7 @@
<li class="level-2"><a href="concept-reserves.html">Reserves</a></li> <li class="level-2"><a href="concept-reserves.html">Reserves</a></li>
<li class="level-2"><a href="concept-freeze.html">Freeze</a></li> <li class="level-2"><a href="concept-freeze.html">Freeze</a></li>
<li class="level-2"><a href="concept-amendments.html">Amendments</a></li> <li class="level-2"><a href="concept-amendments.html">Amendments</a></li>
<li class="level-2"><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
<hr/> <hr/>
<h5>In this page:</h5> <h5>In this page:</h5>

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">
@@ -120,6 +121,7 @@
<li class="level-2"><a href="concept-reserves.html">Reserves</a></li> <li class="level-2"><a href="concept-reserves.html">Reserves</a></li>
<li class="level-2"><a href="concept-freeze.html">Freeze</a></li> <li class="level-2"><a href="concept-freeze.html">Freeze</a></li>
<li class="level-2"><a href="concept-amendments.html">Amendments</a></li> <li class="level-2"><a href="concept-amendments.html">Amendments</a></li>
<li class="level-2"><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
<hr/> <hr/>
<h5>In this page:</h5> <h5>In this page:</h5>

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">
@@ -120,6 +121,7 @@
<li class="level-2"><a href="concept-reserves.html">Reserves</a></li> <li class="level-2"><a href="concept-reserves.html">Reserves</a></li>
<li class="level-2"><a href="concept-freeze.html">Freeze</a></li> <li class="level-2"><a href="concept-freeze.html">Freeze</a></li>
<li class="level-2"><a href="concept-amendments.html">Amendments</a></li> <li class="level-2"><a href="concept-amendments.html">Amendments</a></li>
<li class="level-2"><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
<hr/> <hr/>
<h5>In this page:</h5> <h5>In this page:</h5>

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">
@@ -120,6 +121,7 @@
<li class="level-2"><a href="concept-reserves.html">Reserves</a></li> <li class="level-2"><a href="concept-reserves.html">Reserves</a></li>
<li class="level-2"><a href="concept-freeze.html">Freeze</a></li> <li class="level-2"><a href="concept-freeze.html">Freeze</a></li>
<li class="level-2"><a href="concept-amendments.html">Amendments</a></li> <li class="level-2"><a href="concept-amendments.html">Amendments</a></li>
<li class="level-2"><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
<hr/> <hr/>
<h5>In this page:</h5> <h5>In this page:</h5>

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">
@@ -120,6 +121,7 @@
<li class="level-2"><a href="concept-reserves.html">Reserves</a></li> <li class="level-2"><a href="concept-reserves.html">Reserves</a></li>
<li class="level-2"><a href="concept-freeze.html">Freeze</a></li> <li class="level-2"><a href="concept-freeze.html">Freeze</a></li>
<li class="level-2"><a href="concept-amendments.html">Amendments</a></li> <li class="level-2"><a href="concept-amendments.html">Amendments</a></li>
<li class="level-2"><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
<hr/> <hr/>
<h5>In this page:</h5> <h5>In this page:</h5>

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">
@@ -120,6 +121,7 @@
<li class="level-2"><a href="concept-reserves.html">Reserves</a></li> <li class="level-2"><a href="concept-reserves.html">Reserves</a></li>
<li class="level-2"><a href="concept-freeze.html">Freeze</a></li> <li class="level-2"><a href="concept-freeze.html">Freeze</a></li>
<li class="level-2"><a href="concept-amendments.html">Amendments</a></li> <li class="level-2"><a href="concept-amendments.html">Amendments</a></li>
<li class="level-2"><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
<hr/> <hr/>
<h5>In this page:</h5> <h5>In this page:</h5>

View File

@@ -0,0 +1,234 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<meta content="width=device-width" name="viewport">
<title>Stand-Alone Mode - Ripple Developer Portal</title>
<!-- favicon -->
<link href="favicon.ico" rel="icon" type="image/x-icon">
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon">
<!-- jQuery -->
<script src="assets/vendor/jquery-1.11.1.min.js"></script>
<!-- Custom Stylesheets. ripple.css includes bootstrap, font stuff -->
<link href="assets/css/ripple.css" rel="stylesheet"/>
<link href="assets/css/devportal.css" rel="stylesheet"/>
<!-- Bootstrap JS -->
<script src="assets/vendor/bootstrap.min.js"></script>
<!-- syntax highlighting -->
<link href="assets/vendor/docco.min.css" rel="stylesheet">
<script src="assets/vendor/highlight.min.js"></script>
<!-- syntax selection js -->
<script src="assets/js/multicodetab.js"></script>
<script>
$(document).ready(function() {
$().multicode_tabs();
hljs.initHighlighting();
make_code_expandable();
});
</script>
<script src="assets/js/expandcode.js"></script>
<script src="assets/js/fixsidebarscroll.js"></script>
</link></link></link></meta></meta></meta></head>
<body class="page page-template page-template-template-dev-portal page-template-template-dev-portal-php sidebar-primary wpb-js-composer js-comp-ver-3.6.2 vc_responsive">
<header class="banner navbar navbar-default navbar-fixed-top initial_header" role="banner">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="index.html"><img class="logo" src="assets/img/ripple-logo-color.png"/></a>
</div><!-- /.navbar-header -->
<div class="nav">
<div class="draft-warning">DRAFT PAGE</div>
</div><!-- /.nav -->
</div><!-- /.container -->
<div class="subnav dev_nav">
<div class="container">
<ul class="menu" id="menu-dev-menu">
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">References <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="reference-rippled.html">rippled</a></li>
<li><a href="reference-transaction-format.html">Transaction Format</a></li>
<li><a href="reference-ledger-format.html">Ledger Format</a></li>
<li><a href="reference-rippleapi.html">RippleAPI</a></li>
<li><a href="reference-data-api.html">Ripple Data API v2</a></li>
</ul>
</li>
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">Tutorials <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="tutorial-rippleapi-beginners-guide.html">RippleAPI Beginners Guide</a></li>
<li><a href="tutorial-rippled-setup.html">rippled Setup</a></li>
<li><a href="tutorial-reliable-transaction-submission.html">Reliable Transaction Submission</a></li>
<li><a href="tutorial-multisign.html">Multi-Signing Transactions</a></li>
</ul>
</li>
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">Concepts <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="concept-paths.html">Paths</a></li>
<li><a href="concept-fees.html">Fees (Disambiguation)</a></li>
<li><a href="concept-transfer-fees.html">Transfer Fees</a></li>
<li><a href="concept-transaction-cost.html">Transaction Cost</a></li>
<li><a href="concept-fee-voting.html">Fee Voting</a></li>
<li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul>
</li>
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">Best Practices <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="concept-issuing-and-operational-addresses.html">Issuing and Operational Addresses</a></li>
<li><a href="tutorial-gateway-guide.html">Gateway Guide</a></li>
</ul>
</li>
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">API Tools <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="ripple-api-tool.html">WebSocket API Tool</a></li>
<li><a href="data-api-v2-tool.html">Data API v2 Tool</a></li>
<li><a href="tool-jsonrpc.html">rippled JSON-RPC Tool</a></li>
</ul>
</li>
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">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>
</li></ul><!-- /#dev-menu -->
</div><!-- /.subnav .container -->
</div><!-- /.subnav -->
</header>
<div class="wrap container" role="document">
<aside class="sidebar" role="complementary">
<div class="dev_nav_wrapper">
<div id="cont">
<ul class="dev_nav_sidebar">
<li class="level-1"><a href="index.html">Category: Concepts</a></li>
<li class="level-2"><a href="concept-paths.html">Paths</a></li>
<li class="level-2"><a href="concept-fees.html">Fees (Disambiguation)</a></li>
<li class="level-2"><a href="concept-transfer-fees.html">Transfer Fees</a></li>
<li class="level-2"><a href="concept-transaction-cost.html">Transaction Cost</a></li>
<li class="level-2"><a href="concept-fee-voting.html">Fee Voting</a></li>
<li class="level-2"><a href="concept-reserves.html">Reserves</a></li>
<li class="level-2"><a href="concept-freeze.html">Freeze</a></li>
<li class="level-2"><a href="concept-amendments.html">Amendments</a></li>
<li class="level-2"><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul>
<hr/>
<h5>In this page:</h5>
</div>
<script src="assets/js/jquery.gensidebar.js" type="text/javascript"></script>
</div>
</aside>
<main class="main" role="main">
<div class="content">
<h1 id="stand-alone-mode">Stand-Alone Mode</h1>
<p>You can run <code>rippled</code> in stand-alone mode without a consensus of trusted servers. In stand-alone mode, <code>rippled</code> does not communicate with any other servers in the Ripple peer-to-peer network, but you can perform most of the same actions on your local server only. Stand-alone provides a method for testing <code>rippled</code> behavior, including the effects of <a href="concept-amendments.html">Amendments</a> before those Amendments have gone into effect across the decentralized network.</p>
<p>When you run <code>rippled</code> in stand-alone mode, you have to tell it what ledger version to start from:</p>
<ul>
<li>Create a <a href="#new-genesis-ledger">new genesis ledger</a> from scratch.</li>
<li><a href="#load-saved-ledger">Load an existing ledger version</a> from disk.</li>
</ul>
<p><strong>Caution:</strong> In stand-alone mode, you must <a href="#advancing-ledgers-in-stand-alone-mode">manually advance the ledger</a>.</p>
<h2 id="new-genesis-ledger">New Genesis Ledger</h2>
<p>In stand-alone mode, you can have <code>rippled</code> create a new genesis ledger. This provides a known state, with none of the ledger history from the production Ripple network. (This is very useful for unit tests, among other things.)</p>
<ul>
<li>To start <code>rippled</code> in stand-alone mode with a new genesis ledger, use the <code>-a</code> and <code>--start</code> options:</li>
</ul>
<pre><code>rippled -a --start --conf=/path/to/rippled.cfg
</code></pre>
<p>In a genesis ledger, the <a href="reference-rippled.html#special-addresses">genesis account</a> holds all 100 billion XRP. The keys of the genesis account are <a href="https://github.com/ripple/rippled/blob/94ed5b3a53077d815ad0dd65d490c8d37a147361/src/ripple/app/ledger/Ledger.cpp#L184">hardcoded</a> as follows:</p>
<p><strong>Address:</strong> <code>rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh</code></p>
<p><strong>Secret:</strong> <code>snoPBrXtMeMyMHUVTgbuqAfg1SUTb</code> ("masterpassphrase")</p>
<h2 id="load-saved-ledger">Load Saved Ledger</h2>
<p>You can start with a ledger version that was saved to disk if your <code>rippled</code> server was previously synced with the Ripple peer-to-peer network (either the production network or the <a href="tutorial-rippled-setup.html#parallel-networks">Test Net</a>).</p>
<h3 id="1-to-retrieve-existing-ledgers-start-rippled-normally">1. To retrieve existing ledgers, start <code>rippled</code> normally:</h3>
<pre><code>rippled --conf=/path/to/rippled.cfg
</code></pre>
<h3 id="2-wait-until-rippled-is-synced">2. Wait until <code>rippled</code> is synced:</h3>
<p>When <code>rippled</code> is synced with the state of the network, the response from the <a href="reference-rippled.html#server-info"><code>server_info</code> command</a> shows a <code>server_state</code> value that is <code>full</code>, <code>proposing</code>, or <code>validating</code>.</p>
<h3 id="3-optional-retrieve-specific-ledger-versions">3. (Optional) Retrieve specific ledger versions:</h3>
<p>If you only want the most recent ledger, you can skip this step.</p>
<p>If you want to load a specific historical ledger version, use the <a href="reference-rippled.html#ledger-request"><code>ledger_request</code> command</a> to make <code>rippled</code> fetch it. If <code>rippled</code> does not already have the ledger version, you may have to run the <code>ledger_request</code> command multiple times until it has finished retrieving the ledger.</p>
<p>If you want to replay a specific historical ledger version, you must fetch both the ledger version to replay and the ledger version immediately before it.</p>
<h3 id="4-shut-down-rippled">4. Shut down <code>rippled</code>:</h3>
<pre><code>rippled stop --conf=/path/to/rippled.cfg
</code></pre>
<h3 id="5-start-rippled-in-stand-alone-mode-loading-the-saved-ledger">5. Start <code>rippled</code> in stand-alone mode, loading the saved ledger.</h3>
<p>To load the most recent ledger version, you can use the <code>-a</code> and <code>--load</code> options:</p>
<pre><code>rippled -a --load --conf=/path/to/rippled.cfg
</code></pre>
<p>To instead load a specific historical ledger, use the <code>--ledger</code> parameter with the ledger index or identifying hash of the ledger version to load:</p>
<pre><code>rippled -a --ledger 19860944 --conf=/path/to/rippled.cfg
</code></pre>
<p><span class="draft-comment">(TODO: test this)</span></p>
<h3 id="6-manually-advance-the-ledger">6. Manually advance the ledger.</h3>
<p>When you load a ledger with <code>--ledger</code> in stand-alone mode, it goes to the current open ledger, so you need to <a href="#advancing-ledgers-in-stand-alone-mode">manually advance the ledger</a> to finalize it:</p>
<pre><code>rippled ledger_accept --conf=/path/to/rippled.cfg
</code></pre>
<h2 id="advancing-ledgers-in-stand-alone-mode">Advancing Ledgers in Stand-Alone Mode</h2>
<p>In stand-alone mode, <code>rippled</code> does not communicate to other members of the peer-to-peer network or participate in a consensus process. Instead, you must manually advance the ledger index using the <a href="reference-rippled.html#ledger-accept"><code>ledger_accept</code> command</a>:</p>
<pre><code>rippled ledger_accept --conf=/path/to/rippled.cfg
</code></pre>
<p>In stand-alone mode, <code>rippled</code> makes no distinction between a "closed" ledger version and a "validated" ledger version. (For more information about the difference, see <a href="https://ripple.com/knowledge_center/the-ripple-ledger-consensus-process/">The Ripple Ledger Consensus Process</a>.)</p>
<p>Whenever <code>rippled</code> closes a ledger, it reorders the transactions according to a deterministic but hard-to-game algorithm. (This is an important part of consensus, since different <code>rippled</code> servers may see transactions in a different order.) When using <code>rippled</code> in stand-alone mode, it is important to manually advance the ledger before submitting a transaction that depends on the result of a previous transaction. Otherwise, the second transaction might be executed before the first transaction when you manually advance the ledger. <strong>Note:</strong> You can safely submit multiple transactions from a single account to a single ledger, because <code>rippled</code> sorts transactions from the same account in ascending order by <code>Sequence</code> number.</p>
</div>
</main>
</div>
<footer class="content-info" role="contentinfo">
<div class="container">
<div class="row">
<section class="col-sm-3 widget nav_menu-3 widget_nav_menu">
<h4>Resources<hr/></h4>
<ul class="menu" id="menu-resources">
<li class="menu-insights"><a href="https://ripple.com/insights/">Insights</a></li>
<li class="menu-press-center"><a href="https://ripple.com/press-center/">Press Center</a></li>
<li class="menu-media-resources"><a href="https://ripple.com/media-resources/">Media Resources</a></li>
<li class="menu-videos"><a href="https://ripple.com/videos/">Videos</a></li>
<li class="menu-whitepapers-reports"><a href="https://ripple.com/whitepapers-reports/">Whitepapers &amp; Reports</a></li>
<li class="menu-xrp-portal"><a href="https://ripple.com/xrp-portal/">XRP Portal</a></li>
</ul>
</section>
<section class="col-sm-3 widget nav_menu-5 widget_nav_menu">
<h4>Regulators<hr/></h4>
<ul class="menu" id="menu-compliance-regulatory-relations"><li class="menu-compliance"><a href="https://ripple.com/compliance/">Compliance</a></li>
<li class="menu-policy-framework"><a href="https://ripple.com/policy-framework/">Policy Framework</a></li>
</ul>
</section>
<section class="col-sm-3 widget nav_menu-4 widget_nav_menu">
<h4>Support<hr/></h4>
<ul class="menu" id="menu-dev-footer-menu">
<li class="menu-contact-us"><a href="https://ripple.com/contact/">Contact Us</a></li>
<li class="active menu-developer-center"><a href="https://ripple.com/build/">Developer Center</a></li>
<li class="menu-knowledge-center"><a href="https://ripple.com/learn/">Knowledge Center</a></li>
<li class="menu-ripple-forum"><a href="https://forum.ripple.com/" target="_blank">Ripple Forum</a></li>
</ul>
</section>
<section class="col-sm-3 widget nav_menu-2 widget_nav_menu">
<h4>About<hr/></h4>
<ul class="menu" id="menu-company-footer">
<li class="menu-our-company"><a href="https://ripple.com/company/">Our Company</a></li>
<li class="menu-careers"><a href="https://ripple.com/company/careers/">Careers</a></li>
</ul>
</section>
<div class="col-sm-12 absolute_bottom_footer">
<div class="col-sm-8">
<span>© 2013-2015 Ripple Labs, Inc. All Rights Reserved.</span>
<span><a href="https://ripple.com/terms-of-use/">Terms</a></span>
<span><a href="https://ripple.com/privacy-policy/">Privacy</a></span>
</div>
</div><!-- /.absolute_bottom_footer -->
</div><!-- /.row -->
</div><!-- /.container -->
</footer>
</body>
</html>

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">
@@ -120,6 +121,7 @@
<li class="level-2"><a href="concept-reserves.html">Reserves</a></li> <li class="level-2"><a href="concept-reserves.html">Reserves</a></li>
<li class="level-2"><a href="concept-freeze.html">Freeze</a></li> <li class="level-2"><a href="concept-freeze.html">Freeze</a></li>
<li class="level-2"><a href="concept-amendments.html">Amendments</a></li> <li class="level-2"><a href="concept-amendments.html">Amendments</a></li>
<li class="level-2"><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
<hr/> <hr/>
<h5>In this page:</h5> <h5>In this page:</h5>

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">
@@ -120,6 +121,7 @@
<li class="level-2"><a href="concept-reserves.html">Reserves</a></li> <li class="level-2"><a href="concept-reserves.html">Reserves</a></li>
<li class="level-2"><a href="concept-freeze.html">Freeze</a></li> <li class="level-2"><a href="concept-freeze.html">Freeze</a></li>
<li class="level-2"><a href="concept-amendments.html">Amendments</a></li> <li class="level-2"><a href="concept-amendments.html">Amendments</a></li>
<li class="level-2"><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
<hr/> <hr/>
<h5>In this page:</h5> <h5>In this page:</h5>

View File

@@ -0,0 +1,94 @@
Stand-Alone Mode
===============================================================================
You can run `rippled` in stand-alone mode without a consensus of trusted servers. In stand-alone mode, `rippled` does not communicate with any other servers in the Ripple peer-to-peer network, but you can perform most of the same actions on your local server only. Stand-alone provides a method for testing `rippled` behavior, including the effects of [Amendments](concept-amendments.html) before those Amendments have gone into effect across the decentralized network.
When you run `rippled` in stand-alone mode, you have to tell it what ledger version to start from:
* Create a [new genesis ledger](#new-genesis-ledger) from scratch.
* [Load an existing ledger version](#load-saved-ledger) from disk.
**Caution:** In stand-alone mode, you must [manually advance the ledger](#advancing-ledgers-in-stand-alone-mode).
New Genesis Ledger
-------------------------------------------------------------------------------
In stand-alone mode, you can have `rippled` create a new genesis ledger. This provides a known state, with none of the ledger history from the production Ripple network. (This is very useful for unit tests, among other things.)
* To start `rippled` in stand-alone mode with a new genesis ledger, use the `-a` and `--start` options:
```
rippled -a --start --conf=/path/to/rippled.cfg
```
In a genesis ledger, the [genesis account](reference-rippled.html#special-addresses) holds all 100 billion XRP. The keys of the genesis account are [hardcoded](https://github.com/ripple/rippled/blob/94ed5b3a53077d815ad0dd65d490c8d37a147361/src/ripple/app/ledger/Ledger.cpp#L184) as follows:
**Address:** `rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh`
**Secret:** `snoPBrXtMeMyMHUVTgbuqAfg1SUTb` ("masterpassphrase")
Load Saved Ledger
-------------------------------------------------------------------------------
You can start with a ledger version that was saved to disk if your `rippled` server was previously synced with the Ripple peer-to-peer network (either the production network or the [Test Net](tutorial-rippled-setup.html#parallel-networks)).
### 1. To retrieve existing ledgers, start `rippled` normally: ###
```
rippled --conf=/path/to/rippled.cfg
```
### 2. Wait until `rippled` is synced: ###
When `rippled` is synced with the state of the network, the response from the [`server_info` command](reference-rippled.html#server-info) shows a `server_state` value that is `full`, `proposing`, or `validating`.
### 3. (Optional) Retrieve specific ledger versions: ###
If you only want the most recent ledger, you can skip this step.
If you want to load a specific historical ledger version, use the [`ledger_request` command](reference-rippled.html#ledger-request) to make `rippled` fetch it. If `rippled` does not already have the ledger version, you may have to run the `ledger_request` command multiple times until it has finished retrieving the ledger.
If you want to replay a specific historical ledger version, you must fetch both the ledger version to replay and the ledger version immediately before it.
### 4. Shut down `rippled`: ###
```
rippled stop --conf=/path/to/rippled.cfg
```
### 5. Start `rippled` in stand-alone mode, loading the saved ledger.
To load the most recent ledger version, you can use the `-a` and `--load` options:
```
rippled -a --load --conf=/path/to/rippled.cfg
```
To instead load a specific historical ledger, use the ``--ledger`` parameter with the ledger index or identifying hash of the ledger version to load:
```
rippled -a --ledger 19860944 --conf=/path/to/rippled.cfg
```
<span class='draft-comment'>(TODO: test this)</span>
### 6. Manually advance the ledger. ###
When you load a ledger with `--ledger` in stand-alone mode, it goes to the current open ledger, so you need to [manually advance the ledger](#advancing-ledgers-in-stand-alone-mode) to finalize it:
```
rippled ledger_accept --conf=/path/to/rippled.cfg
```
Advancing Ledgers in Stand-Alone Mode
-------------------------------------------------------------------------------
In stand-alone mode, `rippled` does not communicate to other members of the peer-to-peer network or participate in a consensus process. Instead, you must manually advance the ledger index using the [`ledger_accept` command](reference-rippled.html#ledger-accept):
```
rippled ledger_accept --conf=/path/to/rippled.cfg
```
In stand-alone mode, `rippled` makes no distinction between a "closed" ledger version and a "validated" ledger version. (For more information about the difference, see [The Ripple Ledger Consensus Process](https://ripple.com/knowledge_center/the-ripple-ledger-consensus-process/).)
Whenever `rippled` closes a ledger, it reorders the transactions according to a deterministic but hard-to-game algorithm. (This is an important part of consensus, since different `rippled` servers may see transactions in a different order.) When using `rippled` in stand-alone mode, it is important to manually advance the ledger before submitting a transaction that depends on the result of a previous transaction. Otherwise, the second transaction might be executed before the first transaction when you manually advance the ledger. **Note:** You can safely submit multiple transactions from a single account to a single ledger, because `rippled` sorts transactions from the same account in ascending order by `Sequence` number.

View File

@@ -1,5 +1,5 @@
Introduction to Multi-Signing Introduction to Multi-Signing
================================================================== ===============================================================================
Multi-signing in Ripple is the act of authorizing transactions for the Ripple Consensus Ledger by using a combination of multiple secret keys. After setting up multi-signing for an account, you can put the master secret in cold storage, or even disable the master key entirely. With multiple secret keys required to authorize a multi-signature, you can improve security in several ways. Multi-signing in Ripple is the act of authorizing transactions for the Ripple Consensus Ledger by using a combination of multiple secret keys. After setting up multi-signing for an account, you can put the master secret in cold storage, or even disable the master key entirely. With multiple secret keys required to authorize a multi-signature, you can improve security in several ways.
@@ -10,57 +10,26 @@ Multi-signing in Ripple is the act of authorizing transactions for the Ripple Co
Availability of Multi-Signing Availability of Multi-Signing
----------------------------------------------------------------- -------------------------------------------------------------------------------
Multi-signing is due to be enabled by an **Amendment** to the Ripple Consensus Protocol. This Amendment must be approved by a consensus of validators showing consistent support for the feature over a period of time. For more information, see [Amendments](concept-amendments.html). Multi-signing is built into `rippled` starting with version **0.31.0**. Because multi-signing is a change in transaction processing, the change is due to be enabled by an **Amendment** to the Ripple Consensus Protocol. This Amendment must be approved by a consensus of validators showing consistent support for the feature over a period of time. For more information, see [Amendments](concept-amendments.html).
You can test multi-signing by running `rippled` in stand-alone mode with the feature enabled. In stand-alone mode, `rippled` does not communicate with the rest of the Ripple peer-to-peer network, but you can perform most of the same actions on your local server only. This way, you can be sure that you are ready for multi-signing when it goes live. You can test multi-signing by running `rippled` in [stand-alone mode](concept-stand-alone-mode.html) with the Multi-Sign feature enabled. To enable Multi-Sign for testing, add the following stanza to your `rippled.cfg`:
How to Multi-Sign
=================================================================
The basic process of Multi-Signing a transaction is necessarily more complex than the process of signing a transaction with a single master key or regular key.
## 1. Download and build rippled with multi-sign ##
Until a binary for `rippled` with multi-signing is available, the best you can do is build it from source.
$ git clone git@github.com:ripple/rippled.git
$ git checkout release
$ scons
See [rippled build instructions](https://wiki.ripple.com/Rippled_build_instructions) for help building from source.
## 2. Configure rippled to enable MultiSign ##
Add the following to the bottom of the config file:
[features] [features]
MultiSign MultiSign
Note that this stanza is case-sensitive.
## 3. Start rippled in stand-alone mode ## How to Multi-Sign
===============================================================================
If you have previously synced to the network, you can have the server load the latest ledger as a starting place for stand-alone mode using the `--load` commandline option: The basic process of Multi-Signing a transaction is necessarily more complex than the process of signing a transaction with a single master key or regular key.
$ sudo ./build/rippled --conf=/home/mduo13/.config/ripple/rippled.cfg -a --load ## 1. (Optional) Generate keys for a new wallet ##
If you'd rather start from scratch, you can use the `--start` commandline option to create a fresh ledger. In this case, the root account holds all 100 billion XRP: This step is not strictly necessary. For this process, we generate and fund a new Ripple account and then set up multi-signing for that account. To set up multi-signing on an existing Ripple account, skip ahead to [Step 4: creating a signer list](4-create-a-signerlist-on-the-new-account-with-a-signerlistset-transaction).
**Address:** `rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh` $ rippled wallet_propose
**Secret:** `snoPBrXtMeMyMHUVTgbuqAfg1SUTb` ("masterpassphrase")
## 4. Generate keys for a new wallet ##
This step is not strictly necessary. For this process, we generate and fund a new Ripple account and then set up multi-signing for that account. To set up multi-signing on an existing Ripple account, skip ahead to [Step 7: creating a signer list](#7-create-a-signerlist-on-the-account-with-a-signerlistset-transaction).
$ build/rippled wallet_propose
Loading: "/home/mduo13/.config/ripple/rippled.cfg" Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005 Connecting to 127.0.0.1:5005
{ {
@@ -79,11 +48,11 @@ This step is not strictly necessary. For this process, we generate and fund a ne
As always, be sure that an account's secret key never gets transmitted to anyone you don't trust with full control of that account, and certainly not unencrypted over the network. As always, be sure that an account's secret key never gets transmitted to anyone you don't trust with full control of that account, and certainly not unencrypted over the network.
## 5. Fund the new account with an existing wallet ## ## 2. Fund the new account with an existing wallet ##
Again, this step is only necessary if you are setting up a new account to use multi-signing for this example. Again, this step is only necessary if you are setting up a new account to use multi-signing for this example.
$ build/rippled submit <your existing account secret> '{ $ rippled submit <your existing account secret> '{
> "TransactionType" : "Payment", > "TransactionType" : "Payment",
> "Account" : "<your existing account address>", > "Account" : "<your existing account address>",
> "Destination" : "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H", > "Destination" : "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
@@ -115,14 +84,13 @@ Again, this step is only necessary if you are setting up a new account to use mu
} }
## 6. Manually close the ledger ## ## 3. Close the ledger ##
In the live network, you would simply wait for the ledger to close If you are using the live network, you can wait for the ledger to close automatically as the result of consensus. This typically takes 4-7 seconds.
automatically as the result of consensus. However, a rippled node running in
stand-alone mode does not engage in consensus, so you must manually close the
ledger with the [`ledger_accept` command](rippled-apis.html#ledger-accept).
$ build/rippled ledger_accept If you are running `rippled` in stand-alone mode, you must manually close the ledger with the [`ledger_accept` command](reference-rippled.html#ledger-accept).
$ rippled ledger_accept
Loading: "/home/mduo13/.config/ripple/rippled.cfg" Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005 Connecting to 127.0.0.1:5005
{ {
@@ -133,13 +101,13 @@ ledger with the [`ledger_accept` command](rippled-apis.html#ledger-accept).
} }
## 7. Create a SignerList on the new account with a SignerListSet transaction ## ## 4. Create a SignerList on the new account with a SignerListSet transaction ##
Before you can multi-sign transactions, you must associate a SignerList with your account, so that RCL knows which keys can be used to sign for you. You do this with a [SignerListSet transaction](transactions.html#signerlistset). Before you can multi-sign transactions, you must associate a SignerList with your account, so that RCL knows which keys can be used to sign for you. You do this with a [SignerListSet transaction](reference-transaction-format.html#signerlistset).
In this example, the SignerList has 3 members, with the weights and quorum set up such that multi-signed transactions need a signature from rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW plus at least one signature from the other two members of the list. The `Account` values you use in your list can be funded accounts that exist in the ledger or just unused addresses. In this example, the SignerList has 3 members, with the weights and quorum set up such that multi-signed transactions need a signature from rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW plus at least one signature from the other two members of the list. The `Account` values you use in your list can be funded accounts that exist in the ledger or just unused addresses.
$ build/rippled submit shqZZy2Rzs9ZqWTCQAdqc3bKgxnYq '{ $ rippled submit shqZZy2Rzs9ZqWTCQAdqc3bKgxnYq '{
> "Flags": 0, > "Flags": 0,
> "TransactionType": "SignerListSet", > "TransactionType": "SignerListSet",
> "Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H", > "Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
@@ -210,11 +178,13 @@ In this example, the SignerList has 3 members, with the weights and quorum set u
} }
## 8. Manually close the ledger again ## ## 5. Close the ledger again ##
As before, you would wait for the ledger to close on a live network. We use the [`ledger_accept` command](reference-rippled.html#ledger-accept) to manually close the ledger when running `rippled` in stand-alone mode. As before, on the live network, you can wait for the ledger to close automatically.
$ build/rippled ledger_accept If running `rippled` in stand-alone mode, use the [`ledger_accept` command](reference-rippled.html#ledger-accept) to manually close the ledger:
$ rippled ledger_accept
Loading: "/home/mduo13/.config/ripple/rippled.cfg" Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005 Connecting to 127.0.0.1:5005
{ {
@@ -225,11 +195,11 @@ As before, you would wait for the ledger to close on a live network. We use the
} }
## 9. Confirm the presence of the new signer list using account_objects ## ## 6. Confirm the presence of the new signer list using account_objects ##
Normally an account has lots of different types of objects, but for this new account, the only thing we've done is add a SignerList, so it should be easy to find in the results of the [`account_objects` command](reference-rippled.html#account-objects). Normally an account has lots of different types of objects, but for this new account, the only thing we've done is add a SignerList, so it should be easy to find in the results of the [`account_objects` command](reference-rippled.html#account-objects).
$ build/rippled account_objects rnBFvgZphmN39GWzUJeUitaP22Fr9be75H $ rippled account_objects rnBFvgZphmN39GWzUJeUitaP22Fr9be75H
Loading: "/home/mduo13/.config/ripple/rippled.cfg" Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005 Connecting to 127.0.0.1:5005
{ {
@@ -274,8 +244,7 @@ Normally an account has lots of different types of objects, but for this new acc
} }
10. Create a new transaction that you plan to multi-sign ## 7. Create a new transaction that you plan to multi-sign ##
-----------------------------------------------------------------
You have to specify _everything_ about this transaction, including `Fee` and You have to specify _everything_ about this transaction, including `Fee` and
`Sequence`. Also include the field `SigningPubKey` as an empty string -- this `Sequence`. Also include the field `SigningPubKey` as an empty string -- this
@@ -307,9 +276,9 @@ it sometimes takes a while to collect signatures from multiple sources, you may
want to include additional buffer in case the load fee increases in that time. want to include additional buffer in case the load fee increases in that time.
## 11. Get a signature using the sign_for command ## ## 8. Get a signature using the sign_for command ##
$ build/rippled sign_for rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW <rsA2's secret> '{ $ rippled sign_for rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW <rsA2's secret> '{
> "TransactionType": "TrustSet", > "TransactionType": "TrustSet",
> "Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H", > "Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
> "Flags": 262144, > "Flags": 262144,
@@ -359,11 +328,11 @@ The valuable part in the response is the `Signers` field. This is the part that
The other parts, such as the `tx_blob`, are not very useful at this point, unless you're "multi-signing" a transaction with only one signature. The other parts, such as the `tx_blob`, are not very useful at this point, unless you're "multi-signing" a transaction with only one signature.
## 12. Get additional signatures the same way ## ## 9. Get additional signatures the same way ##
If the accounts in your SignerList are funded accounts, the secret key you use to sign for those accounts can come from the regular key (if they have one), or the master key (unless it's disabled). For accounts that don't exist in the ledger, you can only use the master secret associated with the address. If the accounts in your SignerList are funded accounts, the secret key you use to sign for those accounts can come from the regular key (if they have one), or the master key (unless it's disabled). For accounts that don't exist in the ledger, you can only use the master secret associated with the address.
$ build/rippled sign_for rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v <rUpy's secret> '{ $ rippled sign_for rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v <rUpy's secret> '{
"TransactionType": "TrustSet", "TransactionType": "TrustSet",
"Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H", "Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
"Flags": 262144, "Flags": 262144,
@@ -411,14 +380,13 @@ If the accounts in your SignerList are funded accounts, the secret key you use t
Depending on the SignerList you configured, you may need to repeat this step several times in order to get signatures from all the necessary parties. Depending on the SignerList you configured, you may need to repeat this step several times in order to get signatures from all the necessary parties.
13. Combine the signatures and submit ## 10. Combine the signatures and submit ##
-----------------------------------------------------------------
Take the contents of all the `Signers` arrays from all the responses, and concatenate them in to a single `Signers` array field. The commandline syntax for the [`submit_multisigned` command](reference-rippled.html#submit-multisigned) takes a single JSON object with two elements: this combined `Signers` array; and `tx_json`, which is the transaction JSON that they signed. Take the contents of all the `Signers` arrays from all the responses, and concatenate them in to a single `Signers` array field. The commandline syntax for the [`submit_multisigned` command](reference-rippled.html#submit-multisigned) takes a single JSON object with two elements: this combined `Signers` array; and `tx_json`, which is the transaction JSON that they signed.
This command actually submits the transaction for inclusion in the ledger. In online mode, this relays it to other members of the network. This command actually submits the transaction for inclusion in the ledger. In online mode, this relays it to other members of the network.
$ build/rippled submit_multisigned ' { $ rippled submit_multisigned ' {
> "Signers": [ > "Signers": [
> { > {
> "Signer" : { > "Signer" : {
@@ -494,13 +462,13 @@ This command actually submits the transaction for inclusion in the ledger. In on
Take note of the `hash` value from the response (In this case, it's `878C1C988305D87070F3E961FC27AC9D02C46FFDD92FC7EBB74E962344E58C78`) so you can check the results of the transaction later. Take note of the `hash` value from the response (In this case, it's `878C1C988305D87070F3E961FC27AC9D02C46FFDD92FC7EBB74E962344E58C78`) so you can check the results of the transaction later.
## 14. Manually close the ledger one last time ## ## 14. Close the ledger one last time ##
Once again, you would wait for the ledger to close on a live network. We use As before, on the live network, you can wait 4-7 seconds for the ledger to close automatically.
the [`ledger_accept` command](reference-rippled.html#ledger-accept) to manually
close the ledger when running `rippled` in stand-alone mode.
$ build/rippled ledger_accept If running `rippled` in stand-alone mode, use the [`ledger_accept` command](reference-rippled.html#ledger-accept) to manually close the ledger:
$ rippled ledger_accept
Loading: "/home/mduo13/.config/ripple/rippled.cfg" Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005 Connecting to 127.0.0.1:5005
{ {
@@ -515,7 +483,7 @@ close the ledger when running `rippled` in stand-alone mode.
Use the hash value from the response to the `submit_multisigned` command. Use the hash value from the response to the `submit_multisigned` command.
$ build/rippled tx 878C1C988305D87070F3E961FC27AC9D02C46FFDD92FC7EBB74E962344E58C78 $ rippled tx 878C1C988305D87070F3E961FC27AC9D02C46FFDD92FC7EBB74E962344E58C78
Loading: "/home/mduo13/.config/ripple/rippled.cfg" Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005 Connecting to 127.0.0.1:5005
{ {
@@ -638,8 +606,6 @@ Use the hash value from the response to the `submit_multisigned` command.
In particular, check that the `TransactionResult` is the string `tesSUCCESS`. In particular, check that the `TransactionResult` is the string `tesSUCCESS`.
On the live network, you must also confirm that the `validated` field is set to On the live network, you must also confirm that the `validated` field is set to the boolean `true`. If the field is not `true`, you might need to wait longer for the consensus process to finish; or your transaction may be unable to be included in a ledger for some reason.
the boolean `true`. If not, you might need to wait longer for the consensus
process to finish; or your transaction may be unable to be included in a ledger In stand-alone mode, the server automatically considers a ledger to be `validated` if it has been manually closed.
for some reason. In stand-alone mode, the server automatically considers a
ledger to be `validated` if it has been manually closed.

View File

@@ -60,6 +60,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">

View File

@@ -67,6 +67,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">
@@ -153,6 +154,7 @@ Ripples distributed settlement network is built on open-source technology tha
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">

View File

@@ -60,6 +60,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">

View File

@@ -60,6 +60,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">

View File

@@ -172,6 +172,13 @@ pages:
ripple.com: https://wiki.ripple.com/Understanding:_Feature_adoption ripple.com: https://wiki.ripple.com/Understanding:_Feature_adoption
sidebar: true sidebar: true
- name: Stand-Alone Mode
category: Concepts
html: concept-stand-alone-mode.html
md: concept-stand-alone-mode.md
ripple.com: https://wiki.ripple.com/Rippled#--standalone.2C_-a
sidebar: true
# "Best Practices" documents are mostly in the same category as tutorials # "Best Practices" documents are mostly in the same category as tutorials
- name: Issuing and Operational Addresses - name: Issuing and Operational Addresses
category: Best Practices category: Best Practices

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">
@@ -126,11 +127,7 @@
<main class="main" role="main"> <main class="main" role="main">
<div class="content"> <div class="content">
<h1 id="introduction-to-multi-signing">Introduction to Multi-Signing</h1> <h1 id="introduction-to-multi-signing">Introduction to Multi-Signing</h1>
<p>Multi-signing in Ripple is the act of authorizing transactions for the Ripple <p>Multi-signing in Ripple is the act of authorizing transactions for the Ripple Consensus Ledger by using a combination of multiple secret keys. After setting up multi-signing for an account, you can put the master secret in cold storage, or even disable the master key entirely. With multiple secret keys required to authorize a multi-signature, you can improve security in several ways.</p>
Consensus Ledger by using a combination of multiple secret keys. After setting
up multi-signing for an account, you can put the master secret in cold storage,
or even disable the master key entirely. With multiple secret keys required to
authorize a multi-signature, you can improve security in several ways.</p>
<ul> <ul>
<li>If you keep an account's keys on different devices, a malicious user must compromise multiple machines in order to send transactions on your behalf.</li> <li>If you keep an account's keys on different devices, a malicious user must compromise multiple machines in order to send transactions on your behalf.</li>
<li>If the keys to an account are in the custody of entirely different people, those people must collaborate in order to send transaction from that account.</li> <li>If the keys to an account are in the custody of entirely different people, those people must collaborate in order to send transaction from that account.</li>
@@ -138,48 +135,16 @@ authorize a multi-signature, you can improve security in several ways.</p>
<li>Even more uses than can be described here.</li> <li>Even more uses than can be described here.</li>
</ul> </ul>
<h2 id="availability-of-multi-signing">Availability of Multi-Signing</h2> <h2 id="availability-of-multi-signing">Availability of Multi-Signing</h2>
<p>Multi-signing is due to be enabled by an <strong>Amendment</strong> to the Ripple Consensus <p>Multi-signing is built into <code>rippled</code> starting with version <strong>0.31.0</strong>. Because multi-signing is a change in transaction processing, the change is due to be enabled by an <strong>Amendment</strong> to the Ripple Consensus Protocol. This Amendment must be approved by a consensus of validators showing consistent support for the feature over a period of time. For more information, see <a href="concept-amendments.html">Amendments</a>.</p>
Protocol. This Amendment must be approved by a consensus of validators showing <p>You can test multi-signing by running <code>rippled</code> in <a href="concept-stand-alone-mode.html">stand-alone mode</a> with the Multi-Sign feature enabled. To enable Multi-Sign for testing, add the following stanza to your <code>rippled.cfg</code>:</p>
consistent support for the feature over a period of time. For more information,
see Amendments (TODO: link).</p>
<p>You can test multi-signing by running <code>rippled</code> in stand-alone mode with the
feature enabled. In stand-alone mode, <code>rippled</code> does not communicate with the
rest of the Ripple peer-to-peer network, but you can perform most of the same
actions on your local server only. This way, you can be sure that you are ready
for multi-signing when it goes live.</p>
<h1 id="how-to-multi-sign">How to Multi-Sign</h1>
<p>The basic process of Multi-Signing a transaction is necessarily more
complex than the process of signing a transaction with a single master key or
regular key. </p>
<h2 id="1-download-and-build-rippled-with-multi-sign">1. Download and build rippled with multi-sign</h2>
<p>Until a binary for <code>rippled</code> with multi-signing is available, the best you can do is build it from source.</p>
<pre><code>$ git clone git@github.com:scottschurr/rippled.git (TODO: switch to a Ripple Labs repo when available)
$ git checkout fix-sign_for
$ scons
</code></pre>
<p>See <a href="https://wiki.ripple.com/Rippled_build_instructions">rippled build instructions</a> for help building from source.</p>
<h2 id="2-configure-rippled-to-enable-multisign">2. Configure rippled to enable MultiSign</h2>
<p>Add the following to the bottom of the config file:</p>
<pre><code>[features] <pre><code>[features]
MultiSign MultiSign
</code></pre> </code></pre>
<p>Note that this stanza is case-sensitive.</p> <h1 id="how-to-multi-sign">How to Multi-Sign</h1>
<h2 id="3-start-rippled-in-stand-alone-mode">3. Start rippled in stand-alone mode</h2> <p>The basic process of Multi-Signing a transaction is necessarily more complex than the process of signing a transaction with a single master key or regular key.</p>
<p>If you have previously synced to the network, you can have the server load the <h2 id="1-optional-generate-keys-for-a-new-wallet">1. (Optional) Generate keys for a new wallet</h2>
latest ledger as a starting place for stand-alone mode using the <code>--load</code> <p>This step is not strictly necessary. For this process, we generate and fund a new Ripple account and then set up multi-signing for that account. To set up multi-signing on an existing Ripple account, skip ahead to <a href="4-create-a-signerlist-on-the-new-account-with-a-signerlistset-transaction">Step 4: creating a signer list</a>.</p>
commandline option:</p> <pre><code>$ rippled wallet_propose
<pre><code>$ sudo ./build/rippled --conf=/home/mduo13/.config/ripple/rippled.cfg -a --load
</code></pre>
<p>If you'd rather start from scratch, you can use the <code>--start</code> commandline
option to create a fresh ledger. In this case, the root account holds all
100 billion XRP:</p>
<p><strong>Address:</strong> <code>rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh</code></p>
<p><strong>Secret:</strong> <code>snoPBrXtMeMyMHUVTgbuqAfg1SUTb</code> ("masterpassphrase")</p>
<h2 id="4-generate-keys-for-a-new-wallet">4. Generate keys for a new wallet</h2>
<p>This step is not strictly necessary. For this process, we generate the keys to
a new Ripple account and then set up multi-signing for that account. To set up
multi-signing on an existing Ripple account, just use the keys to that account.</p>
<pre><code>$ build/rippled wallet_propose
Loading: "/home/mduo13/.config/ripple/rippled.cfg" Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005 Connecting to 127.0.0.1:5005
{ {
@@ -195,13 +160,10 @@ Connecting to 127.0.0.1:5005
} }
} }
</code></pre> </code></pre>
<p>As always, be sure that an account's secret key never gets transmitted to <p>As always, be sure that an account's secret key never gets transmitted to anyone you don't trust with full control of that account, and certainly not unencrypted over the network.</p>
anyone you don't trust with full control of that account, and certainly not <h2 id="2-fund-the-new-account-with-an-existing-wallet">2. Fund the new account with an existing wallet</h2>
unencrypted over the network.</p> <p>Again, this step is only necessary if you are setting up a new account to use multi-signing for this example.</p>
<h2 id="5-fund-the-new-account-with-an-existing-wallet">5. Fund the new account with an existing wallet</h2> <pre><code>$ rippled submit &lt;your existing account secret&gt; '{
<p>Again, this step is only necessary if you are setting up a new account to use
multi-signing for this example.</p>
<pre><code>$ build/rippled submit &lt;your existing account secret&gt; '{
&gt; "TransactionType" : "Payment", &gt; "TransactionType" : "Payment",
&gt; "Account" : "&lt;your existing account address&gt;", &gt; "Account" : "&lt;your existing account address&gt;",
&gt; "Destination" : "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H", &gt; "Destination" : "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
@@ -232,12 +194,10 @@ Connecting to 127.0.0.1:5005
} }
} }
</code></pre> </code></pre>
<h2 id="6-manually-close-the-ledger">6. Manually close the ledger</h2> <h2 id="3-close-the-ledger">3. Close the ledger</h2>
<p>In the live network, you would simply wait for the ledger to close <p>If you are using the live network, you can wait for the ledger to close automatically as the result of consensus. This typically takes 4-7 seconds.</p>
automatically as the result of consensus. However, a rippled node running in <p>If you are running <code>rippled</code> in stand-alone mode, you must manually close the ledger with the <a href="reference-rippled.html#ledger-accept"><code>ledger_accept</code> command</a>.</p>
stand-alone mode does not engage in consensus, so you must manually close the <pre><code>$ rippled ledger_accept
ledger with the <a href="rippled-apis.html#ledger-accept"><code>ledger_accept</code> command</a>.</p>
<pre><code>$ build/rippled ledger_accept
Loading: "/home/mduo13/.config/ripple/rippled.cfg" Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005 Connecting to 127.0.0.1:5005
{ {
@@ -247,16 +207,10 @@ Connecting to 127.0.0.1:5005
} }
} }
</code></pre> </code></pre>
<h2 id="7-create-a-signerlist-on-the-new-account-with-a-signerlistset-transaction">7. Create a SignerList on the new account with a SignerListSet transaction</h2> <h2 id="4-create-a-signerlist-on-the-new-account-with-a-signerlistset-transaction">4. Create a SignerList on the new account with a SignerListSet transaction</h2>
<p>Before you can multi-sign transactions, you must associate a SignerList with <p>Before you can multi-sign transactions, you must associate a SignerList with your account, so that RCL knows which keys can be used to sign for you. You do this with a <a href="reference-transaction-format.html#signerlistset">SignerListSet transaction</a>.</p>
your account, so that RCL knows which keys can be used to sign for you. You do <p>In this example, the SignerList has 3 members, with the weights and quorum set up such that multi-signed transactions need a signature from rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW plus at least one signature from the other two members of the list. The <code>Account</code> values you use in your list can be funded accounts that exist in the ledger or just unused addresses.</p>
this with a <a href="transactions.html#signerlistset">SignerListSet transaction</a>.</p> <pre><code>$ rippled submit shqZZy2Rzs9ZqWTCQAdqc3bKgxnYq '{
<p>In this example, the SignerList has 3 members, with the weights and quorum set
up such that multi-signed transactions need a signature from
rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW plus at least one signature from the other
two members of the list. The <code>Account</code> values you use in your list can be
funded accounts that exist in the ledger or just unused addresses.</p>
<pre><code>$ build/rippled submit shqZZy2Rzs9ZqWTCQAdqc3bKgxnYq '{
&gt; "Flags": 0, &gt; "Flags": 0,
&gt; "TransactionType": "SignerListSet", &gt; "TransactionType": "SignerListSet",
&gt; "Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H", &gt; "Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
@@ -326,11 +280,10 @@ Connecting to 127.0.0.1:5005
} }
} }
</code></pre> </code></pre>
<h2 id="8-manually-close-the-ledger-again">8. Manually close the ledger again</h2> <h2 id="5-close-the-ledger-again">5. Close the ledger again</h2>
<p>As before, you would wait for the ledger to close on a live network. We use <p>As before, on the live network, you can wait for the ledger to close automatically.</p>
the <a href="rippled-apis.html#ledger-accept"><code>ledger_accept</code> command</a> to manually <p>If running <code>rippled</code> in stand-alone mode, use the <a href="reference-rippled.html#ledger-accept"><code>ledger_accept</code> command</a> to manually close the ledger:</p>
close the ledger when running <code>rippled</code> in stand-alone mode.</p> <pre><code>$ rippled ledger_accept
<pre><code>$ build/rippled ledger_accept
Loading: "/home/mduo13/.config/ripple/rippled.cfg" Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005 Connecting to 127.0.0.1:5005
{ {
@@ -340,12 +293,9 @@ Connecting to 127.0.0.1:5005
} }
} }
</code></pre> </code></pre>
<h2 id="9-confirm-the-presence-of-the-new-signer-list-using-account-objects">9. Confirm the presence of the new signer list using account_objects</h2> <h2 id="6-confirm-the-presence-of-the-new-signer-list-using-account-objects">6. Confirm the presence of the new signer list using account_objects</h2>
<p>Normally an account has lots of different types of objects, but for this new <p>Normally an account has lots of different types of objects, but for this new account, the only thing we've done is add a SignerList, so it should be easy to find in the results of the <a href="reference-rippled.html#account-objects"><code>account_objects</code> command</a>.</p>
account, the only thing we've done is add a SignerList, so it should be easy to <pre><code>$ rippled account_objects rnBFvgZphmN39GWzUJeUitaP22Fr9be75H
find in the results of the
<a href="rippled-apis.html#account-objects"><code>account_objects</code> command</a>.</p>
<pre><code>$ build/rippled account_objects rnBFvgZphmN39GWzUJeUitaP22Fr9be75H
Loading: "/home/mduo13/.config/ripple/rippled.cfg" Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005 Connecting to 127.0.0.1:5005
{ {
@@ -389,9 +339,9 @@ Connecting to 127.0.0.1:5005
} }
} }
</code></pre> </code></pre>
<h2 id="10-create-a-new-transaction-that-you-plan-to-multi-sign">10. Create a new transaction that you plan to multi-sign</h2> <h2 id="7-create-a-new-transaction-that-you-plan-to-multi-sign">7. Create a new transaction that you plan to multi-sign</h2>
<p>You have to specify <em>everything</em> about this transaction, including Fee and <p>You have to specify <em>everything</em> about this transaction, including <code>Fee</code> and
Sequence. Also include the field <code>SigningPubKey</code> as an empty string -- this <code>Sequence</code>. Also include the field <code>SigningPubKey</code> as an empty string -- this
indicates that the transaction is multi-signed.</p> indicates that the transaction is multi-signed.</p>
<p>Here's an example transaction we can send from our test account:</p> <p>Here's an example transaction we can send from our test account:</p>
<pre><code>{ <pre><code>{
@@ -408,15 +358,15 @@ indicates that the transaction is multi-signed.</p>
"Fee": "12000" "Fee": "12000"
} }
</code></pre> </code></pre>
<p>(If you started from a fresh ledger, you first need to fund the account <p>(If you started from a fresh ledger, you first need to fund the account
specified by the <code>issuer</code> in this example, and then manually close the ledger.)</p> specified by the <code>issuer</code> in this example, and then manually close the ledger.)</p>
<p>Keep in mind that the <code>Fee</code> for multi-signed transactions is significantly <p>Keep in mind that the <code>Fee</code> for multi-signed transactions is significantly
higher than for regularly-signed transactions. It should be (N+1) times the higher than for regularly-signed transactions. It should be (N+1) times the
normal fee, where N is the number of signatures you plan to provide. Given that normal fee, where N is the number of signatures you plan to provide. Given that
it sometimes takes a while to collect signatures from multiple sources, you may it sometimes takes a while to collect signatures from multiple sources, you may
want to include additional buffer in case the load fee increases in that time.</p> want to include additional buffer in case the load fee increases in that time.</p>
<h2 id="11-get-a-signature-using-the-sign-for-command">11. Get a signature using the sign_for command</h2> <h2 id="8-get-a-signature-using-the-sign-for-command">8. Get a signature using the sign_for command</h2>
<pre><code>$ build/rippled sign_for rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW &lt;rsA2's secret&gt; '{ <pre><code>$ rippled sign_for rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW &lt;rsA2's secret&gt; '{
&gt; "TransactionType": "TrustSet", &gt; "TransactionType": "TrustSet",
&gt; "Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H", &gt; "Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
&gt; "Flags": 262144, &gt; "Flags": 262144,
@@ -461,17 +411,11 @@ Connecting to 127.0.0.1:5005
} }
} }
</code></pre> </code></pre>
<p>The valuable part in the response is the <code>Signers</code> field. This is the part that <p>The valuable part in the response is the <code>Signers</code> field. This is the part that you're going to need later in order to construct the full, multi-signed transaction.</p>
you're going to need later in order to construct the full, multi-signed <p>The other parts, such as the <code>tx_blob</code>, are not very useful at this point, unless you're "multi-signing" a transaction with only one signature.</p>
transaction.</p> <h2 id="9-get-additional-signatures-the-same-way">9. Get additional signatures the same way</h2>
<p>The other parts, such as the <code>tx_blob</code>, are not very useful at this point, <p>If the accounts in your SignerList are funded accounts, the secret key you use to sign for those accounts can come from the regular key (if they have one), or the master key (unless it's disabled). For accounts that don't exist in the ledger, you can only use the master secret associated with the address.</p>
unless you're "multi-signing" a transaction with only one signature.</p> <pre><code>$ rippled sign_for rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v &lt;rUpy's secret&gt; '{
<h2 id="12-get-additional-signatures-the-same-way">12. Get additional signatures the same way</h2>
<p>If the accounts in your SignerList are funded accounts, the secret key you use
to sign for those accounts can come from the regular key (if they have one), or
the master key (unless it's disabled). For accounts that don't exist in the
ledger, you can only use the master secret associated with the address.</p>
<pre><code>$ build/rippled sign_for rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v &lt;rUpy's secret&gt; '{
"TransactionType": "TrustSet", "TransactionType": "TrustSet",
"Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H", "Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
"Flags": 262144, "Flags": 262144,
@@ -516,17 +460,11 @@ Connecting to 127.0.0.1:5005
} }
} }
</code></pre> </code></pre>
<p>Depending on the SignerList you configured, you may need to repeat this step <p>Depending on the SignerList you configured, you may need to repeat this step several times in order to get signatures from all the necessary parties.</p>
several times in order to get signatures from all the necessary parties.</p> <h2 id="10-combine-the-signatures-and-submit">10. Combine the signatures and submit</h2>
<h2 id="13-combine-the-signatures-and-submit">13. Combine the signatures and submit</h2> <p>Take the contents of all the <code>Signers</code> arrays from all the responses, and concatenate them in to a single <code>Signers</code> array field. The commandline syntax for the <a href="reference-rippled.html#submit-multisigned"><code>submit_multisigned</code> command</a> takes a single JSON object with two elements: this combined <code>Signers</code> array; and <code>tx_json</code>, which is the transaction JSON that they signed.</p>
<p>Take the contents of all the <code>Signers</code> arrays from all the responses, and <p>This command actually submits the transaction for inclusion in the ledger. In online mode, this relays it to other members of the network.</p>
concatenate them in to a single <code>Signers</code> array field. The commandline syntax <pre><code>$ rippled submit_multisigned ' {
for the <a href="rippled-apis.html#submit-multisigned"><code>submit_multisigned</code> command</a>
takes a single JSON object with two elements: this combined <code>Signers</code> array;
and <code>tx_json</code>, which is the transaction JSON that they signed.</p>
<p>This command actually submits the transaction for inclusion in the ledger. In
online mode, this relays it to other members of the network.</p>
<pre><code>$ build/rippled submit_multisigned ' {
&gt; "Signers": [ &gt; "Signers": [
&gt; { &gt; {
&gt; "Signer" : { &gt; "Signer" : {
@@ -599,14 +537,11 @@ Connecting to 127.0.0.1:5005
} }
} }
</code></pre> </code></pre>
<p>Take note of the <code>hash</code> value from the response (In this case, it's <p>Take note of the <code>hash</code> value from the response (In this case, it's <code>878C1C988305D87070F3E961FC27AC9D02C46FFDD92FC7EBB74E962344E58C78</code>) so you can check the results of the transaction later.</p>
<code>878C1C988305D87070F3E961FC27AC9D02C46FFDD92FC7EBB74E962344E58C78</code>) so you can <h2 id="14-close-the-ledger-one-last-time">14. Close the ledger one last time</h2>
check the results of the transaction later.</p> <p>As before, on the live network, you can wait 4-7 seconds for the ledger to close automatically.</p>
<h2 id="14-manually-close-the-ledger-one-last-time">14. Manually close the ledger one last time</h2> <p>If running <code>rippled</code> in stand-alone mode, use the <a href="reference-rippled.html#ledger-accept"><code>ledger_accept</code> command</a> to manually close the ledger:</p>
<p>Once again, you would wait for the ledger to close on a live network. We use <pre><code>$ rippled ledger_accept
the <a href="rippled-apis.html#ledger-accept"><code>ledger_accept</code> command</a> to manually
close the ledger when running <code>rippled</code> in stand-alone mode.</p>
<pre><code>$ build/rippled ledger_accept
Loading: "/home/mduo13/.config/ripple/rippled.cfg" Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005 Connecting to 127.0.0.1:5005
{ {
@@ -618,7 +553,7 @@ Connecting to 127.0.0.1:5005
</code></pre> </code></pre>
<h2 id="15-confirm-the-results-of-the-transaction">15. Confirm the results of the transaction</h2> <h2 id="15-confirm-the-results-of-the-transaction">15. Confirm the results of the transaction</h2>
<p>Use the hash value from the response to the <code>submit_multisigned</code> command.</p> <p>Use the hash value from the response to the <code>submit_multisigned</code> command.</p>
<pre><code>$ build/rippled tx 878C1C988305D87070F3E961FC27AC9D02C46FFDD92FC7EBB74E962344E58C78 <pre><code>$ rippled tx 878C1C988305D87070F3E961FC27AC9D02C46FFDD92FC7EBB74E962344E58C78
Loading: "/home/mduo13/.config/ripple/rippled.cfg" Loading: "/home/mduo13/.config/ripple/rippled.cfg"
Connecting to 127.0.0.1:5005 Connecting to 127.0.0.1:5005
{ {
@@ -739,12 +674,9 @@ Connecting to 127.0.0.1:5005
} }
} }
</code></pre> </code></pre>
<p>In particular, check that the <code>TransactionResult</code> is the string <code>tesSUCCESS</code>. </p> <p>In particular, check that the <code>TransactionResult</code> is the string <code>tesSUCCESS</code>.</p>
<p>On the live network, you must also confirm that the <code>validated</code> field is set to <p>On the live network, you must also confirm that the <code>validated</code> field is set to the boolean <code>true</code>. If the field is not <code>true</code>, you might need to wait longer for the consensus process to finish; or your transaction may be unable to be included in a ledger for some reason.</p>
the boolean <code>true</code>. If not, you might need to wait longer for the consensus <p>In stand-alone mode, the server automatically considers a ledger to be <code>validated</code> if it has been manually closed.</p>
process to finish; or your transaction may be unable to be included in a ledger
for some reason. In stand-alone mode, the server automatically considers a
ledger to be <code>validated</code> if it has been manually closed.</p>
</div> </div>
</main> </main>
</div> </div>

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">

View File

@@ -74,6 +74,7 @@
<li><a href="concept-reserves.html">Reserves</a></li> <li><a href="concept-reserves.html">Reserves</a></li>
<li><a href="concept-freeze.html">Freeze</a></li> <li><a href="concept-freeze.html">Freeze</a></li>
<li><a href="concept-amendments.html">Amendments</a></li> <li><a href="concept-amendments.html">Amendments</a></li>
<li><a href="concept-stand-alone-mode.html">Stand-Alone Mode</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown"> <li class="dropdown">