From f97e8d9ef0c452a861406c13a5bcc99a1560661d Mon Sep 17 00:00:00 2001 From: mDuo13 Date: Fri, 9 Jan 2015 17:03:04 -0800 Subject: [PATCH] [DOC] e2g - more precautions + another diagram --- content/exchange_to_gateway.md | 81 ++++++++++++++++++++------------- img/e2g-03.gif | Bin 0 -> 32306 bytes 2 files changed, 49 insertions(+), 32 deletions(-) create mode 100644 img/e2g-03.gif diff --git a/content/exchange_to_gateway.md b/content/exchange_to_gateway.md index 12108b0f56..7c4f43abfd 100644 --- a/content/exchange_to_gateway.md +++ b/content/exchange_to_gateway.md @@ -2,7 +2,7 @@ An existing online financial service, such as a payment system or digital currency exchangea, can provide additional value to customers by acting as a Ripple Gateway. This provides users the ability to send cross-currency payments to users linked by other Ripple Gateways, and potentially provides a new revenue source for balances deposited, withdrawn, or transferred in Ripple. -Expanding an existing exchange system to support Ripple is a relatively simple task. This document explains the concepts necessary to set up a system, and covers the details of doing so. In this document, we use a fictional online currency exchange named "ACME" and its users as examples of how ACME can expand its business to include being a Ripple Gateway. +Expanding an existing exchange system to support Ripple is a relatively simple task. This document explains the concepts necessary to set up a system, and covers the details of doing so. In this document, we use a fictional online currency exchange named "ACME" and its users as examples, to show how ACME can expand its business to include being a Ripple Gateway. ## Ripple Gateways Explained ## @@ -15,7 +15,17 @@ Ripple's native cryptocurrency, XRP, can also be exchanged for issuances, and se A "trust line" is link between two accounts in Ripple that represents an explicit statement of willingness to hold gateway debt obligations. Those debt obligations, which we call *issuances*, are digital assets that can be sent and traded. A *gateway deposit* is when someone sends value (outside the Ripple Network) to a gateway in exchange for issuances on the Ripple network. An issuance represents a promise that whoever holds the issuance can redeem it with the issuer on the Ripple Network for that amount of value (off the Ripple Network). Doing so is a *gateway withdrawal*. -All assets in Ripple, except for the native cryptocurrency XRP, are represented as issuances. Issuances get their value from the promise that the gateway issuing them will honor the obligation that the issuances represent; there is no computer system that can force a Ripple gateway to honor that obligation. Therefore, trust lines ensure that users only hold issuances from gateways they trust. +All assets in Ripple, except for the native cryptocurrency XRP, are represented as issuances. Issuances get their value from the promise that the gateway issuing them will honor the obligation that the issuances represent; there is no computer system that can force a Ripple gateway to honor that obligation. Therefore, trust lines ensure that users only hold issuances from gateways they trust to pay out when needed. + + +## Suggested Business Practices ## + +The value of a gateway's issuances in Ripple comes directly from users' trust that the gateway will pay withdrawals when needed. Since a gateway cannot pay out if it shuts down, it is also in users' interest that a gateway does not shut down. There are a number of precaution a gateway can take that reduce the risk of business interruptions: + +* Use [Hot and Cold Wallets](#hot-and-cold-wallets) to limit your risk profile on the network. +* Comply with anti-money-laundering regulations for your jurisdiction, such as the [Bank Secrecy Act](http://en.wikipedia.org/wiki/Bank_Secrecy_Act). This usually includes requirements to collect ["Know-Your-Customer" (KYC) information](http://en.wikipedia.org/wiki/Know_your_customer). +* Read and stay up-to-date with [Gateway Bulletins](https://ripple.com/knowledge_center/gateway-bulletins/), which provide news and suggestions for Ripple gateways. +* Clearly publicize all your policies and fees. ### Hot and Cold Wallets ### @@ -26,6 +36,10 @@ The cold wallet should remain offline, and serves as the asset issuer. This mean A hot wallet makes payments to the gateway's users in Ripple by sending them issuances created by the cold wallet. It also needs a trust line to the cold wallet. A gateway can use one or more "hot wallet" accounts, but each hot wallet has a limited balance of the gateway's issuances. If it is compromised, the gateway can only lose as much currency as the hot wallet holds. However, this means that the gateway must monitor the hot wallet's balance, so that it doesn't run out during ordinary operation. +If the hot wallet is compromised, the amount the hot wallet holds may be lost, but that's all. Customers do not need to change any configuration in order to receive funds from a new hot wallet. + +If a cold wallet is compromised, the attacker could create an unlimited amount of issuances, which makes it very difficult to redeem legitimately-held issuances fairly. In this case, the gateway must create a new cold wallet account, and all users with trust lines to the old gateway must create new trust lines to the new account. (Thus, it's best to keep your cold wallet as secure as possible.) + ## Prior to Ripple Integration ## @@ -41,7 +55,7 @@ In the following diagram, ACME Exchange starts with €5 on hand, including €1 * ACME waits for deposits to clear before crediting them internally. * ACME always keeps enough funds on-hand to pay withdrawals on demand, subject to their terms and conditions. * ACME can set fees, minimum withdrawals, and delay times for deposits and withdrawals as their business model demands. - + ## Ripple Integration ## @@ -62,25 +76,6 @@ An example of a deposit flow: ![ACME issues 2 EUR@ACME to Alice on Ripple](img/e2g-02.gif) - ### Deposit Requirements ### @@ -93,6 +88,13 @@ There are several prerequisites that ACME must meet in order for this to happen: - ACME must create a user interface for Alice to deposit funds from ACME into Ripple. - In order to do this, ACME needs to know Alice's Ripple address. ACME can have Alice input her Ripple addresss as part of the deposit interface, or ACME can require Alice to input and verify her Ripple address in advance. +### Deposit Precautions ### + +We recommend the following precautions when handling deposits: + +- Protect yourself against reversible deposits. Ripple payments are irreversible, but many electronic money systems like credit cards or PayPal are not. Scammers can abuse this to take their fiat money back after receiving Ripple issuances. +- Follow the guidelines for [reliable transaction submission](#reliable-transaction-submission) when processing deposits. + ## Withdrawals from Ripple to Gateway ## @@ -110,11 +112,11 @@ In addition to the [requirements for making deposits possible](#deposit-requirem - ACME must monitor its Ripple accounts for incoming payments. - ACME must recognize the identities of users from the incoming payments. - - We recommend that ACME should bounce any unrecognized incoming payments back to their sender. + - We recommend that ACME should [bounce any unrecognized incoming payments](#bouncing-payments) back to their sender. - Typically, the preferred method of recognizing incoming payments is through [destination tags](#destination-tags). -### Precautions ### +### Withdrawal Precautions ### Processing withdrawals and bouncing incoming payments are both potentially risky processes, so a gateway should be sure to take care in implementing them. We recommend the following precautions: @@ -139,6 +141,10 @@ Exchanging EUR@ACME for other currencies within Ripple requires market makers wh To facilitate exchanging currency, ACME may decide to become its own market maker. For various reasons, we recommend using a separate Ripple account for trading. +The following diagram depicts a simple Ripple payment sending 2EUR@ACME from Alice to Charlie. Note that ACME's balance sheet and holdings do not change: + +![Alice's sends 2 EUR@ACME from her trust line to Charlie's](img/e2g-03.gif) + ## Fees and Revenue Sources ## @@ -147,7 +153,14 @@ There are several ways in which a gateway can seek to benefit financially from R * Indirect revenue from value added. Ripple integration can provide valuable functionality for your customers that distinguishes your business from your competitors. * Withdrawal and Deposit fees. It is typical for a gateway to charge a small fee (such as 1%) for the service of adding or removing money from Ripple. You have the power to determine the rate you credit people when they move money onto and off of Ripple through your gateway. * Transfer fees. You can set a percentage fee to charge when Ripple users send each other issuances created by your account. This amount disappears from the Ripple ledger, decreasing your obligation each time your issuances change hands. See [TransferRate](#transferrate) for details. -* Market making. A gateway can also make offers to buy and sell its issuances for other issuances on Ripple, providing liquidity to cross-currency payments and possibly making a profit. (As with any financial exchange, profits are not guaranteed.) +* Interest on Ripple-backed funds. You can keep some of your Ripple-backing currency in an external account that earns interest. Just be sure the external account's policies do not interfere with your ability to adequately serve your customer withdrawals. (For example, limits on withdrawing money, or risk of losses.) +* Market making. A gateway can also make offers to buy and sell its issuances for other issuances on Ripple, providing liquidity to cross-currency payments and possibly making a profit. (As with any market making opportunity, profits are not guaranteed.) + +## Infrastructure ## + +For the gateway's own security as well as the stability of the network, we recommend that each gateway operate its own `rippled` servers, along with any other important infrastructure necessary for the gateway's operation. Ripple Labs provides detailed and individualized recommendations to businesses interested in operating a significant Ripple-based business. + +Contact [partners@ripple.com](mailto:partners@ripple.com) to see how Ripple Labs can help. # Technical Details # @@ -292,13 +305,15 @@ The following is an example of a TrustSet transaction to authorize the (customer In order to robustly monitor incoming payments, gateways should do the following: * Keep a record of the most-recently-processed transaction. That way, if you temporarily lose connectivity, you know how far to go back. -* Check the result code of every incoming payment. Some payments go into the ledger to charge an anti-spam fee, even though they failed. Only transactions with the result code `tesSUCCESS` can change non-XRP balances. +* Check the result code of every incoming payment. Some payments go into the ledger to charge an anti-spam fee, even though they failed. Only transactions with the result code `tesSUCCESS` can change non-XRP balances. Only transactions from a validated ledger are final. * Look out for Partial Payments. If an incoming transaction has a `destination_balance_changes` field (Ripple-REST) or a `meta.AmountDelivered` field (WebSocket/JSON-RPC), then use that to see how much money *actually* got delivered to the destination account. Payments with the partial-payment flag enabled are considered "successful" if any non-zero amount is delivered, even miniscule amounts. (The flag is called `"partial_payment": true` in REST, and `tfPartialPayment` in WebSocket/JSON-RPC) -* Some transactions modify your balances without being payments directly to or from one of your accounts. For example, if ACME sets a nonzero [TransferRate](#transferrate), then ACME's cold wallet's outstanding obligations decrease each time Bob and Charlie exchange ACME issuances. (How does this look in REST?) +* Some transactions modify your balances without being payments directly to or from one of your accounts. For example, if ACME sets a nonzero [TransferRate](#transferrate), then ACME's cold wallet's outstanding obligations decrease each time Bob and Charlie exchange ACME issuances. See [TransferRate](#transferrate) for more information. To make things simpler for your users, we recommend monitoring for incoming payments to hot wallets and the cold wallet, and treating the two equivalently. -As an added precaution, we recommend regularly comparing the balances of your Ripple cold wallet account with the Ripple-backing funds in your internal accounting system. The cold wallet's balance should be the negative of the assets you hold, backing Ripple. If the two do not match up, then you should check that you have processed all transactions correctly. +As an added precaution, we recommend regularly comparing the balances of your Ripple cold wallet account with the Ripple-backing funds in your internal accounting system. The cold wallet's shows all outstanding issuances as negative balances, which should be match the positive assets you hold outside the network, backing Ripple. If the two do not match up, then you should check that you have processed all transactions correctly. + +* Use the [Get Account Balances method](ripple-rest.html#get-account-balances) (Ripple-REST) or the [`account_lines` command](rippled-apis.html#account-lines) (rippled) to check your balances. ## Destination Tags ## @@ -325,7 +340,7 @@ When sending a payment from a hot wallet, we also recommend creating a source ta ## TransferRate ## -The *TransferRate* setting (`transfer_rate` in Ripple-REST) defines a fee to charge for transferring issuances from one Ripple account to another. The transfer fee is set by the issuing (cold wallet) account. For any transaction *except paying back to the issuing account*, the sending account is debited issuances at a ratio of TransferRate:1 compared to the destination amount. TransferRate has a maximum precision of 9 decimal places, and cannot be less than 1 or greater than 2. +The *TransferRate* setting (`transfer_rate` in Ripple-REST) defines a fee to charge for transferring issuances from one Ripple account to another. The transfer fee is set by the issuing (**cold wallet**) account. For any transaction *except paying back to the issuing account*, the sending account is debited issuances at a ratio of TransferRate:1 compared to the destination amount. TransferRate has a maximum precision of 9 decimal places, and cannot be less than 1 or greater than 2. The fee represented by the TransferRate disappears from the Ripple ledger, becoming the property of the gateway. @@ -351,6 +366,8 @@ Response: Setting the TransferRate in Ripple-REST is currently broken. See [RLJS-158](https://ripplelabs.atlassian.net/browse/RLJS-158) for status. +All Ripple Accounts, including the hot wallet, are subject to the TransferRate. If you set a nonzero TransferRate, then you must send extra (to pay the TransferRate) when making payments from the hot wallet. You can accomplish this by setting the `source_amount` (Ripple-REST) or the `SendMax` (rippled) parameters higher than the destination amount. + ## Bouncing Payments ## @@ -417,9 +434,9 @@ Follow these steps to extend a trust line to a Gateway's issuing (cold wallet) a ![Gateway connected](img/connectgateway_05.png) -## Robust Transaction Submission ## +## Reliable Transaction Submission ## -The goal of robustly submitting transactions is to achieve the following two properties in a finite amount of time: +The goal of reliably submitting transactions is to achieve the following two properties in a finite amount of time: * Idempotency - Transactions will be processed once and only once, or not at all. * Verifiability - Applications can determine the final result of a transaction. @@ -427,7 +444,7 @@ The goal of robustly submitting transactions is to achieve the following two pro In order to achieve this, there are several steps you can take when submitting transactions: * Persist details of the transaction before submitting it. -* Use the `LastLedgerSequence` parameter. +* Use the `LastLedgerSequence` parameter. (Ripple-REST and ripple-lib do this by default.) * Resubmit a transaction if it has not appeared in a validated ledger whose sequence number is less than or equal to the transaction's `LastLedgerSequence` parameter. For additional information, consult the guide to [Reliable Transaction Submission](reliable_tx.html) diff --git a/img/e2g-03.gif b/img/e2g-03.gif new file mode 100644 index 0000000000000000000000000000000000000000..076caff8bca049e60b1c5f07f39d0818e36cc495 GIT binary patch literal 32306 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 Zk?}NI%!-YF2WIfLGO5&`7qCcV{};pFnZf`7 literal 0 HcmV?d00001