Setting up an Eth2 Node on DigitalOcean with Prysm and Ubuntu

Recently, I set up an Eth2 node with a friend. Eth2 refers to a series of upgrades planned to make Ethereum more scalable, secure and sustainable. The main part of this upgrade is a move to the beacon chain which operates on Proof-of-Stake (PoS), as opposed to the Proof-of-Work (PoW) consensus used by Bitcoin, amongst others.

As you have likely already heard, Bitcoin’s Proof-of-Work consensus currently consumes more energy than all of Argentina, which is one of the many reasons for newer cryptocurrencies considering the less energy-intensive Proof-of-Stake mechanism. Here’s a good FAQ on Proof-of-Stake, if you want to learn more.

Why run an Eth2 node?

The move to Proof-of-Stake is an exciting new chapter. Whilst some networks, such as Cardano, were built on this form of consensus from the beginning, the Ethereum network is already very large, so a transition at its current scale is a big event that many will be watching with interest. By setting up a node, you get to directly participate in this piece of this history.

The other reason people seek to become validators is due to the pay-outs that are made for staking and validating: a Proof-of-Stake consensus requires people to validate transactions for it to work at all, so the networks compensates those that participate. That currently works out at around 7% APR, but will likely drop to 3-5% eventually.

Personally, I already held a little ETH that I didn’t plan on cashing out any time soon, so it was just like putting my investment into a funky new bank that gives pretty decent interest, whilst learning a few things along the way.

If you’re seriously interested in becoming a validator, you should read over the Eth2 Validator checklist.

What’s the catch?

As the name suggests, Proof-of-Stake requires each node to stake a certain amount of ETH to join the beacon chain.

At the time we set up the node, this was about $120,000 of ETH, because ETH had jumped to nearly $4000! That is not an amount I had to hand, hence co-investing with a friend who has more substantial crypto investments.

Not only this but your money is locked away for several years, until the merge, when the Mainnet and beacon chains will become one.

Finally, there’s also ongoing maintenance in the form of server admin and client upgrades. You need to be comfortable with this because if you get it wrong you could be penalised and lose money.

Setup

I originally went through the Launchpad Testnet guide first, so that I could play in a consequence-free test environment.

In terms of the actual server setup, I’m not going to replicate existing information: I followed Somer Esat’s Guide to Staking on Ethereum 2.0 (Ubuntu/Prysm) to the letter and didn’t experience any issues. There are several Eth2 clients to choose from. I only went with Prysm because it is written in Go, a language with which I have some experience with.

The only part I would draw extra attention to is this:

DO NOT DEPOSIT any ETH at this moment. [after generating your keys]

It is important to complete and verify your staking setup first. If the ETH deposits become active and your staking setup is not ready you will start receiving penalties for non-activity.

During my Testnet experiments, I did not follow this advice and got some errors that likely would have meant being penalised in real life.

I also looked into running an Eth1 client. As the Eth2 validator checklist explains:

To process incoming validator deposits from the Eth1 chain, you’ll need to run an Eth1 client as well as your Eth2 client. You can use a third-party service like Infura, but we recommend running your own client to keep the network as decentralised as possible.

Despite this, running an Eth1 node currently requires 1 gigabyte of extra space per day so for now so we also used Infura, as many other guides recommend.

Hosting

I chose DigitalOcean to host the node. It’s probably not as cheap as paying AWS bills months in advance, but there was a good joining discount and I had used DigitalOcean a lot recently.

You will need this size droplet:

DigitalOcean droplet selection
DigitalOcean droplet selection

If you are also interested in using DigitalOcean, you can click the badge below to get $100 of credit to start with!

DigitalOcean Referral Badge

Sending the funds

Transferring this amount of money to the Eth2 deposit account was a pretty terrifying experience and highlights one area where people still struggle: get one character of the address wrong and the money is gone, forever. Thankfully, browser-based tools like Metamask really help here. Needless to say, the address was still checked many, many times.

ETH transfer via MetaMask
ETH transfer via MetaMask

The 32 ETH was sent to the Eth2 deposit account, which anyone can view on Etherscan. At the time, it contained nearly $17 billion of ETH.

Eth2 deposit account
Eth2 deposit account

After a lot of waiting and queueing to join the beacon chain, things were finally up and running and I had thankfully not sent a hundred thousand dollars into a black hole.

Monitoring

I mostly use beaconcha.in to check in every few days: it shows earnings, current APR and other key details on one screen. It also allows you to sign up for email notifications on important events like missed attestations and proposed blocks.

In addition to this, I set up the Prysm web interface. This requires adding the --web flag to /etc/systemd/system/prysmvalidator.service file—full details here. To be honest, it doesn’t offer much more visibility, but it’s still useful to have to hand.

Instead of exposing the interface publicly, I follow a recommendation in the above guide and manually set up local port forwarding over SSH when I want to view it:

ssh -L 7500:127.0.0.1:7500 [email protected] -p 10478

Results

So far, so good! The node has earned about half an ETH over the first 3 months. The APR started at 7% but is currently hovering at 6%. This currently equates to a return of ~0.17 ETH per month (around $500 with ETH @ ~$3000).

The only issues I’ve had in running the node are four missed attestations. I couldn’t see any rhyme or reason to these after examining the logs. It seems to just happen from time to time when the client does not respond fast enough. The attestation rate is still way above the standard expected so I’m not worried.

Finally, I needed to stay up-to-date on client updates or security issues. It’s recommended to join Discord but rather than submit myself to that I just subscribed to updates via GitHub like so:

GitHub subscribe to important updates
GitHub subscribe to important updates

Happy validating!