Captain’s Log 013 – Rippled Developer Setup Guide

In creating the XRPine I was, and still am, forced to tinker with the rippled configuration file. Coupled with the Pine board’s sporty albeit slow performance when compared to a full server, I needed something that was more responsive to play around with. In doing so I could more easily learn how use the configuration file to its fullest extent possible.

My first instinct was to search for a Linux how to guide online. Apart from Ripple’s own guide on their development website, there hasn’t been one made if you want to do it manually. Wieste made a wonderful guide to use with DigitalOcean, an online Virtual Private Server (VPS) hosting server, that walks one through setting up a validator by using Docker. Other members of the community have posted information about what makes a good validator, summarizing developer information. All of this is great, but I don’t like Docker. I have no reason to give you other than it’s not my cup of tea.

For lack of a manual guide and my inclination to do everything myself, a force of habit for someone with a learning hobby, I decided to create this guide for the community. A lot of what’s here went into setting up the XRPine, but I’ll leave the gross nuts and bolts details of that out and keep it specific to using a VPS. This just gave me the development environment.

The purpose of this blog post is to hit all the in between details for other fellow DIYers. I am not pushing my guide over anyone else’s. If you like using Docker and you just want to run a validator out of the box, then by all means. Use the guide that does just that. There are some benefits to my guide. My guide will show you how to do everything from scratch, so if you’re a developer then this is the perfect guide for setting up shop. The information is readily available on the developer site. I’m paraphrasing a good portion here in the context of setting up on a VPS, and I’ll also point out a couple hurdles you might encounter.

Step 1 – DigitalOcean – SetUp your VPS

An online subscription to a VPS with 8GB of RAM and 4vCPUs is what I need so I have acquired one of those. I’m taking advantage of the free $100 slash 60 day credit that DigitalOcean is offering to get my feet wet.

To start, go to DigitalOcean (or a VPS hosting service of your choosing) and create an account. My guide will be with respect to that hosting service .When logged in, there’s a green button that says “create” in the top right. Go there and select “Droplet”

If you’re wondering what options to pick, here’s a PDF link that’ll show you.

Here’s my configuration:

  1. OS: Ubuntu
  2. Size, Standard: 8 GB RAM, 4 vCPUs
  3. Backup: None
  4. Block Storage: None
  5. Region: Pick a region that you want. This is case by case.
  6. Additional Options: I didn’t pick any.
  7. SSH Keys: Leave Alone. Can do this later.
  8. Hostname: my-awesome-vps
  9. Tags: None

Step 2 – DigitalOcean – Get your IP Address

Each droplet is going to come with a public facing IP address that you’ll need to take note of. I personally prefer to log in via secure shell from my own machine. That way I don’t have to go online, log in to a website, and click 10 buttons before I can get to my VPS.

From the dashboard, click on your droplet to expand its information. Here’s an example of mine (redacted). In place of 127.0.0.1 (There’s not place like home!) you’ll have your IP address. Note it.

dashboard-dropplet.png

If you want to use the online shell to access the VPS, those three dots in the top right will give you a button to click; “Access Console”. A window will appear with a command prompt to play with. Probably a pop up blocker hazard!

Step 3 – First Log In

One may choose from any secure shell (SSH) client, such as Putty, however I found one I like called SmartTTY. Just has a few extra buttons and whistles I’ve found useful over time. You can download and install that from their website. Since there are a plethora of SSH clients to choose from, I leave it to the reader to pick on of their choosing and configure it.

To log in, check your email first. You’ll need to get your credentials. The root password is emailed to you. The password is long so happy typing!

Default User: root

Password: See email

Step 4 – Add a new user

This is just good practice. Make a new user and add it as a sudo user. On Ubuntu follow these steps:

  • adduser username
  • usermod -aG sudo username

After setting that new user with a new password, switch to it

  • su username

 Step 5 – Update Linux & Install

Now, moving toward getting ready to install rippled, one must prepared linux for it. This step might be rather lengthy since Linux can take a long time to update.

Update Linux with the following commands:

  • sudo apt-get update
  • sudo apt-get -y upgrade

(After your cup of coffee xD)

Install the prerequisite packages with the following commands:

  • sudo apt-get -y install package

Replace package with the following packages:

git cmake pkg-config protobuf-compiler libprotobuf-dev libssl-dev wget doxygen

You may install each separately or all at once on the same line. Just separate each package with a space on the command line.

Step 6 – Download, Build, and Configure Boost

Image result for boost c++

Boost is a community C++ library that is both an amazing treasure trove of useful software and also a huge pain in the neck because it is so big.

Here’s how:

  • First, navigate to your home directory; cd ~
  • Download it with wget:
    • wget https://dl.bintray.com/boostorg/release/1.64.0/source/boost_1_64_0.tar.gz
  • Use tar to unpack it:
    • tar xvzf boost_1_64_0.tar.gz
  • Move into the boost directory: cd boost_1_64_0/
  • Now, prepare the boost build with; ./bootstrap.sh
  • After the command completes, build boost!
    • ./b2 -j

I used 3 of the 4 cores to build boost on the VPS.

After Boost builds, you have to tell the OS where to find it, so you do that by setting an environment variable. Environment variables are like global labels that the OS or any program can see. You add Boost to an environment variable so the rippled software can see it when it builds later.

Here’s how I do it. On Ubuntu there is the “bashrc” file. That file executes each time the user logs in or opens a new terminal. Open that file with the editor of your choice. I use emacs because VI is not my cup of tea. If you do use emacs, you’ll have to install that too. Just follow the previous step for installing a package.

  • Open the bashrc file
    • emacs ~/.bashrc
  • Add this line to the emacs file:
    • export BOOST_ROOT=/home/USERNAME/boost_1_64_0
  • For the first time, source the file. Every time you log in in the future this doesn’t need to be done.
    • source ~/.bashrc
  • Save and exit the file:
    • Save: ctrl-x and then ctrl-s
    • Exit: ctrl-x and then ctrl-c

Step 6 – Download and Build rippled

This step will clone the rippled repository and build it.

  • Navigate to the home directory; cd ~
  • Clone the rippled repository:
  • Navigate into the rippled directory: cd rippled
  • Check out the master branch:
    • git checkout master
  • Use CMAKE to build the software:
    • Make a build directory: mkdir my_build
    • cd my_build
    • Run cmake to generate makefiles. cmake will tell you if anything is wrong at this point
      • cmake -Dtarget=gcc.debug.unity ..
    • Run the build command
      • cmake –build . — -j
        • Note two dashes 

Here’s where I ran into some issues. Ubuntu straight out of the release that DigitalOcean is using is version 3.5. Unfortunately, the build system will force you to use version 3.9 or higher for a clean configure.

Here’s how to handle that. We’ll need to obtain cmake, build it from source and install it.

  • Navigate to the home directory: cd ~
  • Use wget to obtain the latest release candidate (or stable release)
    • wget https://cmake.org/files/v3.12/cmake-3.12.0-rc2.tar.gz
  • Unpack cmake
    • tar xvf cmake-3.12.0-rc2.tar.gz
  • Go into the cmake directory: cd cmake-3.12.0-rc2
  • Run the bootstrap; ./bootstrap
  • make
  • sudo make install

After this point, go back and rerun the cmake commands for rippled. Be sure to make a new build folder!

  • cmake -Dtarget=gcc.debug.unity ..
  • cmake –build . — -j

NOTE: If you’re ultimate goal is to run rippled as a validator. You will want to change your build target to the release version. If you’ve made changes and want to test them out in release. This is how that works. The debug version will be slower!

  • cmake -Dtarget=gcc.release.unity ..

This time, the build should work. Here’s what a valid configuration will output

And a successful build. I love how cmake counts up to 100%!

Step 7 – Modifying Code and Version Control

Now you know the command to build. If you want to rebuild, just issue the same command and watch cmake count up again!

Using git can git a little tough at times, but fortunately you can get started with minimal effort. Go back up one folder from the “my_build” directory.

If you were here: /home/validator/rippled/my_build

Go up one directory with this command; cd ..

First things first. Set up your Github username and email;

  • git config –global user.name “John Doe”
  • git config –global user.email “[email protected]

If you have a preferred editor:

  • git config –global core.editor emacs

Now a nifty git command to get your current information:

  • git status

You’ll just have one red folder which is the build folder. That should always stay untracked. Actually I’m surprised it’s not in the “.gitignore” which is a file with file name patterns that tells git which files to ignore completely.

Best to be on the develop branch, so we’ll checkout that one:

  • git checkout develop

You can probably get away with just working on develop. You won’t be able to push to ripple’s rep but you can make commits locally and pull changes that are made remotely. To get your changes pushed then you’ll have to make a pull request.

  • git add *
  • git commit -m “Fancy commit message”

That wraps it up! I thought about going as far as making the guide detail how to set up with a Integrated Development Environment, such as Eclipse. I really don’t know what the community devs prefer to use. Some might prefer building on Windows in which case Visual Studio would be better. If I got some idea of what IDE developers were choosing, I’d make a guide for that.

This is half the battle. I hope Ripple updates their developer guide to account for the version issues with cmake. Getting around it isn’t hard, but it could potentially make somebody stumble. If you’re a developer, go ahead and checkout ripple’s issue list. Pick one and have at it. Who knows? Maybe some of your code might end up in the next rippled release! I hope so there are far fewer low level C/C++ devs out there than there are web developers.

Moving forward, I’ll post about the configuration steps involved with setting up rippled to run. That include the configuration file, setting up the linux service so it runs automatically and generating validator keys.

As always. Second star to the right; and Warp 6 this time!

Reference

  • https://developers.ripple.com/build-run-rippled-ubuntu.html
  • https://medium.com/@WietseWind/how-to-run-a-ripple-validator-digitalocean-7e5fca1c3d77
  • https://xrpcommunity.blog/rippled/
  • https://www.digitalocean.com/pricing/
  • http://smartty.sysprogs.com/
  • https://www.digitalocean.com/community/tutorials/how-to-create-a-sudo-user-on-ubuntu-quickstart
  • https://developers.ripple.com/build-run-rippled-ubuntu.html
  • https://github.com/ripple/rippled

 

Captain’s Log 012 – XRPine Performance

The stats on the XRPine are in!

Captain’s Log 012 – Supplemental

Starting off. Wow! I had no idea my home project would receive so much support and attention. Thank you to everyone for the kind words, sharing thoughts, and questions. I am truly humbled and I will do my best to answer them. This community is awesome!

 I have been asked by the community to share some resources usage statistics of the XRPine whilst running a validator. The machine has been running solid over two days without a reboot. I have been impressed to say the least that this little XRPine has some fight in it!

Here is how the validator has done since I started it up. If you go and look at other validators you’ll see each with 20+ thousand validations. I’d say around 9-10,000validations in one day isn’t half bad for the XRPine! The validations are however, mostly disagreements. These are validations that did not pass consensus. Also, you’ll notice Monday the 25th had notably less total validations than the day before. The reason there’s only 20 validations on the first day is because I got it working right before the new day rolled over.

To review, the Pine/Rock64 has:

  • An RK3328 Quad-core ARM Cortex A53 64-Bit processor; Datasheet.
  • 4GB of LPDDR3 1600MHz memory. (The LP just means low power)

What sort of statistics would be worth gathering for load analysis? The obvious are CPU usage and Memory usage so I’ll share that information.I shall note that I am operating the validator with [node_size] tiny in the configuration file. I left the XRPine running for a day solid in this configuration before pulling stats. There was one day, I thought I’d try and run the XRPine with [node_size] small in the configuration file, but it was too much for it so I went back to tiny. I had a feeling that would happen, but I wanted to try it out anyway.

The following are methods of collecting usage information and screenshots of what i have:

 Method 1

iostat – You can view the manual page for it here. Will give me average cpu utilization and other statistics. I did mine every 5 seconds randomly.

Command: iostat -m -p sdb 5

Output:

Averages:

  • User: 61.064 %
  • System: 10.648%
  • IOWait: 16.908%
  • Idle: 11.312%

Conclusions: The user percentage indicates that the rippled service, which is all I have running at the user leve, takes up the very bulk of the entire machine’s computing power. Also worth noting, the IOWait time is not so good, but I think it’s not so bad for what the machine is.

To explain, the machine is taking a lot of time to both call up information and write information to SD card that serves as the hard disk. I am going to have to play around with it and try to improve this number. I’d love to try and make this work with a solid state drive attached!

Method 2

htop – Nicer version of “top”. Shows me memory usage and overall CPU usage.

Command: htop

Overall memory usage is reported at 87.0%. I am intrigued because some people have reported that their Virtual Machines with 8GB have memory usage all the way at maximum. Overall CPU utilization at this snapshot was ~190% across 4 cores. However, I’ve seen it up to ~340%. The CPU utilization fluctuates back and forth. I’m closely monitoring the memory usage to determine if it increases to the maximum amount over time.

Conclusions. It works! And there is room for improvement. I am personally surprised the machine isn’t overtaxed and barely running, but these are the numbers I’m getting as of this moment. I recognize I have a lot of work left to do with this project. Some have asked that I share it. For now, since it’s in its infancy I want to continue working on it to improve its performance as best I can before turning it lose. I am happy to take suggestions for things to check from people to help improve it.  For the future, as I make adjustments and improve the performance I intend to write about my progress.

I will be submitting a poll to the community to see what the interest is in using the XRPine and determining how best to release it for others to use. Some of us are technical people and want to tinker like myself, while others may just want something to plug into a router and walk away from.

Second star to the right; Warp 8!

Captain’s Log 011 – Introducing the XRPine

Warp field of focus: Primary & Secondary – Achievement

So I did a thing…

As a part of playing to my strengths I decided to act on my curiosity. Validators. With XRP, all the coins are pre-mined and distributed at the time the public ledger goes live. The technology is still the same; blockchain. Instead of miners there are validators. A number of computers run the “rippled” software server. This software is publically available on GitHub. Anybody can download it and run the software. It’s like mining without getting paid, but you do it because it’s for a good cause.

There are very few people running a ripple validator in the world as opposed to those mining for a sliver of Bitcoin these days. Anybody can verify this looking at the validator list on Ripple’s website; here. Naturally, I wanted to be involved. I found @WiesteWind’s article for setting up a validator on a Virtual Private Server (VPS). He did a great job telling one how to set up a validator using a docker image but I didn’t want to pay for a VPS. That left me with my rig at home and, honestly, I mine with it so I didn’t want the thing to be overtaxed with tasks.

I was short on machines to operate one of these things. Combined with my aversion to spending loads of money or subscribing to services I thought about other options. Necessity is the mother of all innovation. I did, however, have a little nugget of hardware lying around known as a Raspberry Pi 3. The lights in my head were going off. Why don’t I make this little guy run a validator.

To the google machine! I went and looked on the interwebs to see if anybody had set this up for a Raspberry Pi already. I found a thread on XRP chat that indicated otherwise. There had been attempts by some community members to give this a whirl but there was no success. You can read this thread here. I looked around. Trying to find if others had found success but I came up empty. I was encouraged, however, because David Schwartz, @JoelKatz, himself wrote in on the chat forum that running a validator on a Raspberry Pi 3 should be possible.

So, I set out to make it happen. Immediately I hit some walls. There are instructions for building the rippled software online and I was following it. The Raspberry Pi 3 only has 1GB of RAM and there are only 32-Bit Operating Systems for it. Finding a 64-bit OS for a Pi is possible but at the moment, very difficult to deploy. I figured I’d try it out anyway wit ha 32-bit OS. After waiting half a day for boost to build on the platform I got excited, copied the rippled software to the machine and proceeded to build that. No sooner than executing the command. Halted! The rippled software only builds on a 64-bit machine. There went my plan.

Many days of research later, I came across a suitable single board computer that had larger amounts of RAM, was physically similar in size to a Raspberry Pi 3, and most importantly had a 64-bit operating system too! And the best part is the machine didn’t cost an arm and a leg, since it was close to the price of a Pi. I found the Pine 64 website that sold the Rock64 computer. The highlights are the machine had 4GB of RAM and has a 64-bit processor to run with a 64-bit OS that was easily available. Nice! So, I bought one and patiently waited.

Here are the specs:

If you want to check out the board, you can find it here.

Repeating my previous progress I built boost, download the rippled software, and this time I was able to build it. Turns out that was half the battle. From there, I had to turn the executable program into a linux service and create myself some keys. I might write another post in the future with all the nitty gritty details, but the point is I was able to complete them and configure the software to operate sucessfully.

All rippled servers acting as validators have a public key to identify it. You configure your validator by generating one with the key generator tool that ripple also makes available. However, that is still not the entire solution. If you set your validator loose at the point then it is considered unverified. The validator is still validating transactions on the public ledger but other verified validators might not use it for consensus. I went through a process to have it validated. Ripple requires that you prove the machine running the validator is in your control by requiring your public domain be signed against your public facing validator key. Mine is as of yet, unverified but is currently under consideration. I generated the appropriate key signatures and submitted an online form to Ripple.

Until then, my validator remains unverified but is still chugging away at transactions. Here’s my validator online:

I remember watching the film Armageddon. Yes, the one where an asteroid is about to impact earth and a team of deep water oil drillers led by Bruce Willis goes into space to blow it up. I love that movie just because it’s fun to watch. When the big asteroid is found, the discoverer gives it a name. So, I want to give my creation a name as well. I call this the XRPine! And, for the record, my wife is not a life sucking bitch named dotty. She is an amazing woman equal to any man that can write a line a code!

In lieu of the XRPine I am also revealing my new domain name. I had to get one to get my validator verified:

cointrek.voyage

The domain simply points to my blog. I thought voyage was a good ending to the dot because it fit so well. CoinTrek is inspired by Star Trek and we’re all on a voyage anyway so I took it!

That’s not all. I asked a good friend of mine help me make up a case for the XRPine with a 3d printer. I thought the new XRP logo was fitting and of course blue made the most sense. I am grateful to him for his help.

IMG-0154.jpeg

Check this case out my YouTube channel

This creation is still in its earliest stage, but my intent is to make these available to the community so those who want to run a validator with a minimal footprint may do so. Parts of this are specific to the person deploying the validator; the keys to the validator are secret and so is a domain name. Therefore I cannot make one fully configured since I would know the keys! That part of configuration must be done alone.

One can still run an unverified validator so a domain name is not totally necessary. I’m glad to be able to give something back to this wonderful group of people. If anybody has comments or suggestions please let me know. If there is interest within the community for others to run one of these little guys I’d be interested in setting them up for folks; time permitting of course.

I look forward to seeing how this thing works out. As I continue to tinker with it I’m sure I’ll be learning more and make further improvements. I encourage others to learn and find ways to advance the community at large. This technology would not live without a fervent following.

As always, second star to the right; Warp 8!

Reference:

  • https://medium.com/@WietseWind/how-to-run-a-ripple-validator-digitalocean-7e5fca1c3d77
  • https://www.pine64.org/

Catpain’s Log 009 – xCoding XRP

Ever read a Dan Brown book? I have. A lot of people will have heard of this Novel, “The Davinci Code” [1]. In short, it’s a mystery, suspense book where the main character Robert Langdon embarks on an adventure to search for a real life Holy Grail. The man is a symbologist and on his journey he deciphers countless meanings behind paintings and object to help solve the mystery of finding the grail. “A picture is worth a thousand words” as the saying goes, but Langdon would say “Which words?”

Symbols are at the heart of every civilization. Use them every day! From the app icons on our smartphones to the alphabet to the markings on our currency. Symbols are instantly recognizable and when looking at one you may identify with the meaning immediately.

Let’s take a look at a widely known symbol. It’s a very important one. And you don’t even have to be a math geek to know it! Pi!

Image result for pi

This singular symbol is a cornerstone of mathematics; geometry. Unlink a flag it is also a unit of measurement. Pi is used as an angle measurement expressed in the unit radians. But if you prefer degrees, one Pi is 180 degrees. Two Pi and you get a full circle.

Alright, so units and instant identification and meaning make up a good symbol. A currencies do this exactly. Here are two currency symbols. Can you tell what country they belong to?

Image result for indian rupee symbolImage result for british pound symbol

On the left is the Indian Rupee symbol, and the British Pound symbol on the right. Each, when seen, can easily strike in the mind of the view what country that money came from. I argue XRP needs the same. Bitcoin even does this! The capital ‘B’ with two lines down.

Image result for bitcoin symbol

When I think of XRP I think of this symbol. The symbol is that of a triskelion, and it has been around for years. To me, it reminds me of their three core software offerings; xRapid, xCurrent, xVia. All joined together.

Image result for ripple symbol

When thinking of XRP you may be tricked into thinking that the Ripple triskelion is good enough, but you’d be dead wrong. Ripple and XRP are totally different things. XRP is the digital asset that flows like drops of water on the Interledger that has a caretaker; Ripple.

The XRP community has called for a design. There have been numerous submissions. All you have to do is take a look at the @xrpsmbol twitter account to see the various tweets and ideas of others.

Here are a couple of the submissions from that twitter account:

CoinTrek even has one! Although mine is less of a creation and points out something that’s already out there. I even like the explanation behind it. I had this idea of complex numbers. There’s a real part and an imaginary one.

Image result for complex numbers

The ledger is very real and we use it to confirm transactions we make. Swapping IOU’s actually. But XRP is the enabler of said ledger and maybe it’s analogous to the imaginary part. I was searching about for existing symbols for imaginary parts of numbers. Of course there’s the italicised letter ‘i’ that we all know from high school algebra. But what about those fancy math papers? Then I remembered writing a document in LaTeX and thought of a font. Why don’t we just use this? It’s simple. The image below is the symbol ‘I’ from the Fraktur script [2][3]. There a loads of angles and is used by LaTex for, you guessed it, the imaginary number symbol. Nobody would see it coming either, and it already exists!

Call me silly but there’s kind of a backward ‘P’ and forward ‘R’ in there too. Not seeing an ‘X’ though. Just drop a line in there somewhere and call it a day!

File:Fraktur I symbol.png

Symbols are important. The community is adoping one. Years from now, the adoped symbol for XRP is going to be globally recognizable. The question I submit to you is, will you rember the days you owned XRP before then?

References:

  1. https://en.wikipedia.org/wiki/The_Da_Vinci_Code
  2. https://en.wikipedia.org/wiki/Fraktur
  3. https://commons.wikimedia.org/wiki/File:Fraktur_I_symbol.png

Captain’s Log 007 – Ripple Leads The Way

Primary Field of Focus: Ripple – Leading the Way.Today I want to write about a recent occurrence in the realm of crypto and why I think that it is important.Ripple recently announce in a public statement [1] that they were giving $29 Million dollars worth of $XRP to DonorsChoosefor the benefit of teachers in the classroom for Best School Day This single donation of cryptocurrency is special because it is notably the largest ever donated in a single instance before. Check out their YouTube video! The founders of OmiseGO (OMG), Jun Hasegawa, and Ethereum (ETH), Vitalik Buterin, also donated $1Million to Ugandan Refugees [2]. The average person even has the opportunity donate to charity with their own cryptocurrency through an organization called Fidelity Charitable. There is even a little known crypto called Donationcoin (DON). That particular crypto doesn’t seem to have much activity, but at least the concept is out there. If there’s another one out there, let me know. I’d be curious.The act of giving $29 Million to Donors Choose by Ripple is not some publicity stunt by Ripple. I’d venture to say there is way more behind it than that. Yes their name is out there, but for starters, Ripple isn’t just a crypto. Like OmiseGo, they are a company. This single act will help show other companies out there that, one, donating in crypto is possible and a good thing, and two, they are carrying the torch leading the way to encourage other companies to do the same. Now 35,000 classrooms across the country are having their needs fulfilled because of $XRP.Another significant effect, in my opinion, is the market stimulation. DonorsChoose didn’t get $29 United States Dollars, they have it in $XRP. DonorsChoose has to liquidate all of the $XRP into USD to obtain their donation for it to be useful to them. That means selling on markets. At the time of donation $XRP was trading at $0.53, so the $29 Million donation released a new 54,716,981 $XRP onto the market. I know Ripple still has boat loads of $XRP of their own, but it’s now less! This is good for the market because, first, Ripple itself has less of a piece of the overall market. Second, because of the increase in trade volume over the coming weeks as DonorsChoose sells off their donation. They agreed not to sell it all at once, as is their policy with donated shares of a company, according to CNBC [3].In the future, it is my hope and also I expect there will be additional companies contributing to society by donating their crypto. As new companies are created and their crypto assets obtain and grow value, a great source of financial power is wielded. One that can benefit any charity should that company or crypto organization choose to follow Ripple’s lead. In the market volatility of crypto currency $29 Million is created and lost on a weekly basis. We should try and do some good with it while we ride the roller coaster!References:

  1. https://ripple.com/insights/ripple-executives-proud-support-americas-public-schools-29-million-xrp-donation-donorschoose-org/
  2. https://stocksgazette.com/2018/03/30/omisego-omg-and-ethereum-founder-give-hope-to-uganda-refugees-with-1m-donation/
  3. https://www.cnbc.com/2018/03/28/ripple-gives-away-29-million-of-its-cryptocurrency-to-public-schools.html