Table of Contents for
Ripple Quick Start Guide

Version ebook / Retour

Cover image for bash Cookbook, 2nd Edition Ripple Quick Start Guide by Febin John James Published by Packt Publishing, 2018
  1. Ripple Quick Start Guide
  2. Title Page
  3. Copyright and Credits
  4. Ripple Quick Start Guide
  5. Dedication
  6. About Packt
  7. Why subscribe?
  8. Packt.com
  9. Contributors
  10. About the author
  11. About the reviewer
  12. Packt is searching for authors like you
  13. Table of Contents
  14. Preface
  15. Who this book is for
  16. What this book covers
  17. To get the most out of this book
  18. Download the example code files
  19. Conventions used
  20. Get in touch
  21. Reviews
  22. Getting Started with Ripple
  23. The need for decentralization
  24. Introduction to blockchain
  25. Introduction to Bitcoin
  26. Inefficiencies in payment systems
  27. International money transfer through Bitcoin
  28. Disadvantages of Bitcoin
  29. Ripple
  30. International money transfer through Ripple
  31. The Ripple Protocol
  32. Account creation
  33. Reserve
  34. Transactions
  35. Multisigning
  36. Consensus
  37. Important properties of the consensus protocol
  38. Ledger versions
  39. Validation
  40. Advantages of Ripple
  41. Currency agnostic
  42. Simplified consensus
  43. Low fee
  44. Reduced foreign exchange cost
  45. Pathfinding algorithm
  46. Adaptable cryptography
  47. Anti-spam mechanism
  48. Potential risks of Ripple
  49. Regulatory issues
  50. Trust Issues
  51. Security vulnerabilities
  52. Problems of being an open protocol
  53. Summary
  54. Working with Ripple Currency XRP
  55. Types of wallets
  56. Online wallets
  57. Desktop/mobile wallets
  58. Offline wallets
  59. Hardware wallets
  60. Paper wallets
  61. How do I choose my wallet?
  62. Setting up a Ripple account
  63. Activating the Ripple account
  64. Making an international transfer
  65. Trading XRP
  66. Importing an existing wallet
  67. Setting up an offline wallet
  68. Protecting your Ripples
  69. Don't leave your Ripples on centralized exchanges
  70. Make backups 
  71. Use antivirus software
  72. Disable browser plugins
  73. Store Ripples in multiple wallets 
  74. For big sums, use cold wallets
  75. Use reputable wallets
  76. Important things you must remember
  77. Summary
  78. Applications of Ripple
  79. High speed and low-cost payments 
  80. xCurrent
  81. How does it work?
  82. Advanced payment applications
  83. Cross-currency payments
  84. How does it work?
  85. Checks
  86. How does it work?
  87. Payment channels
  88. How does it work?
  89. Escrow
  90. How does it work?
  91. Initial coin offering
  92. Decentralized exchange
  93. Debunking misconceptions about Ripple
  94. Ripple and XRP are not the same
  95. Funds lockup
  96. No mining
  97. Limited smart contracts
  98. Important things to remember
  99. Summary
  100. Getting Started with the Ripple API
  101. Connecting to the Ripple test network
  102. Setting up the development environment
  103. First Ripple application
  104. Sending money 
  105. Prepare transaction
  106. Sign transaction
  107. Submit transaction
  108. Summary
  109. Developing Applications Using the Ripple API
  110. Sending checks
  111. Cashing checks
  112. Creating a time-held escrow
  113. Creating a conditionally-held escrow
  114. Important things you must remember
  115. Summary
  116. Other Books You May Enjoy
  117. Leave a review - let other readers know what you think

Submit transaction

Even though we've signed the transaction, until the signed message reaches the network, no changes will occur. Once we submit the transaction, we need to wait for the validators to confirm it. When the validators approve the transaction, ledger values will change and account balances will be updated. The following function takes signed transaction as input and submits it to the network:

api.submit(signedTransaction).then(onSuccess,onFailure);

In the following lines, we've put together the code to prepare, sign, and submit the transaction. As you can see, we wait for each step to return a response before we continue to the next step:

api.connect().then(() => {

console.log('Connected to the test network.');
return api.preparePayment(sourceAddress, transaction, instructions).then(prepared => {
console.log('Payment transaction is now prepared.');
const {signedTransaction} = api.sign(prepared.txJSON, sourceSecret);
console.log('Payment transaction is now signed.');
api.submit(signedTransaction).then(onSuccess,onFailure);
});
});

In the previous block, we added a callback to the submit transaction function. We have to be prepared to handle both success and failure. In the following lines, we handle the success and failure callbacks:

 
function onSuccess(message){
console.log("Transaction Successfully Submitted.");
console.log(message);
disconnect();
}

function onFailure(message){
console.log("Transaction Submission Failed.");
console.log(message);
disconnect();
}

function disconnect(){
api.disconnect().then(()=> {
console.log("Disconnected from test network.")
})
}

The previous blocks of code send 50 XRP from one Ripple account to another. Save them to the file send_money.js. If you need help. please refer to the source code in our GitHub repository.

Let's run the previous code using this command:

./node_modules/.bin/babel-node send_money.js

If everything goes well, you should see output similar to the following:

Let's check the account balance of the destination address using our previous app to make sure our money was successfully sent. 

If your transaction was successful, the account balance of the destination should get updated as shown in the following screenshot:

Now, let's use this code to build a web application that provides us with a graphical interface to log in and sends money. 

Let's make a login modal that takes a Ripple address and secret as input and stores it in the local storage. We will be using it later to sign and submit transactions. The HTML code for the login modal is given in the following:

<div class="modal fade" id="loginModal" tabindex="-1" role="dialog" aria-labelledby="loginModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="loginModalLabel">Login</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<form>
<div class="form-group">
<label for="inputRippleAddress">Ripple Address</label>
<input type="text" class="form-control" id="inputRippleAddress" aria-describedby="rippleAddressHelp" placeholder="Enter Ripple Address">
</div>
<div class="form-group">
<label for="inputSecret">Secret</label>
<input type="password" class="form-control" id="inputSecret" placeholder="Secret">
</div>
<button onclick="storeCredentials()" class="btn btn-primary">Login</button>
</form>
</div>
</div>
</div>
</div>

When the user clicks on the login button, we are calling the "storeCredentials" function to store the address and secret. We won't be verifying whether the secret key is valid, but it'll throw an error when you try to sign the transaction.

Here's the function to store credentials:

function storeCredentials(){
localStorage.setItem("rippleAddress", $('#inputRippleAddress').val());
localStorage.setItem("secret", $('#inputSecret').val());
localStorage.setItem("loggedIn", true);
$('#loginModal').modal('hide');
updateAccount();
}

Once the credentials are stored, we need to update the UI to reflect the Ripple address and its balance. 

Storing the credentials as raw text is a bad idea. It's a good security practice to encrypt it. But, for the purpose of this tutorial, we'll ignore this step.

Use the following code to update the UI:

function updateAccount(){
$('#rippleAddress').text(localStorage.getItem('rippleAddress'));
updateBalance();
}

function updateBalance(){
api.connect().then(() => {
const accountAddress = localStorage.getItem("rippleAddress");
return api.getAccountInfo(accountAddress);
}).then(info => {
$('#balance').text("Account Balance : " + info.xrpBalance+ " XRP");
}).then(() => {
return api.disconnect();
}).catch(console.error);
}

The update account function fetches the address from the local storage and injects it into the HTML. The update balance function used the same code as in our previous app to fetch the account balance. 

Now, let's build an interface that would help the user send money. In order to do that, let's create another modal by using the following code:

<div class="modal fade" id="sendMoneyModal" tabindex="-1" role="dialog" aria-labelledby="sendMoneyModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="sendMoneyModalLabel">Send Money </h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<form>
<div class="form-group">
<label for="inputDestinationRippleAddress">Ripple Address</label>
<input type="text" class="form-control" id="inputDestinationRippleAddress" aria-describedby="destinationRippleAddressHelp" placeholder="Destination Ripple Address">
</div>
<div class="form-group">
<label for="inputAmount">Amount</label>
<input type="number" class="form-control" id="inputAmount" placeholder="Amount">
</div>
<button onclick="sendMoney()" class="btn btn-primary">Send</button>
<br/> <br/>
<div class="progress">
<div class="progress-bar progress-bar-striped bg-info" role="progressbar" style="width: 0%" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</form>
</div>
</div>
</div>
</div>

The previous form takes the destination Ripple address to which you want to send money and the amount as input. It calls the send money function. Let's have a look at the send money function that's given in the following:

function sendMoney(){
$('.progress').show();
const instructions = {};
const sourceAddress = localStorage.getItem('rippleAddress');
const sourceSecret = localStorage.getItem('secret');
const destinationAddress = $('#inputDestinationRippleAddress').val();
const transaction = {
source: {
address: sourceAddress,
maxAmount: {
value: $('#inputAmount').val(),
currency: 'XRP'
}
},
destination: {
address: destinationAddress,
amount: {
value: $('#inputAmount').val(),
currency: 'XRP'
}
}
};
api.connect().then(() => {
return api.preparePayment(sourceAddress, transaction, instructions).then(prepared => {
$('.progress-bar').css('width', 40+'%').attr('aria-valuenow', 40);
const {signedTransaction} = api.sign(prepared.txJSON, sourceSecret);
api.submit(signedTransaction).then(onSuccess,onFailure);
});
});
}

It's almost similar to the code we used before to send money. Except here, we're fetching the Ripple address and secret from the local storage. We're also fetching the destination Ripple address from the send money form. We've added a progress bar to provide a better user experience. Once the submit transaction returns, we call the on success function to update the account balance and show an alert to the user that the transaction was submitted successfully. In the case of failure, we alert them of the same.

Here's the code for that:

function onSuccess(message){
$('.progress-bar').css('width', 100+'%').attr('aria-valuenow', 100);
$('#balance').text("Fetching updated balance, please wait.");
setTimeout(updateBalance, 6000);
bootstrap_alert.success('Transaction Submitted Successfully');
clear();
}

function onFailure(message){
$('.progress-bar').css('width', 100+'%').attr('aria-valuenow', 100);
bootstrap_alert.danger('Transaction Submission Failed');
clear();
}

If the user has already logged in, then we need code to fetch the Ripple address and update in on the display; here's the code for doing that:

function login(){
      if(!localStorage.getItem("loggedIn")){
        $('#loginModal').modal('show');
      } else{
        updateAccount();
      }
 }

We also need the logout functionality. Here's the code that helps us achieve that:

function logout(){ localStorage.clear(); clearInterval(fetchBalance); location.reload(); }

That's almost all of the code we need. There's some basic HTML and JavaScript code to get this app running that's not mentioned in this chapter. They're elementary stuff such as showing the login/send money modal. If you need help, please refer to the source code in our GitHub repository.

You can save the previous blocks of code into the send_money.html file. If everything works fine, you should be able to see the login screen as follows: 

Once you log in, you should be able to see your balance and a button to send money:

Now, let's try sending some money:

If everything goes well, you should be able to see the Transaction Submitted Successfully message. You should be able to see the updated account balance in 6-8 seconds. You can use the previous app to check whether the destination account is credited with the respective amount of XRP. 

Congratulations, you've made an app that allows users to transact on the Ripple network.