Set Up BCHN and Fulcrum on DigitalOcean

Introduction

This guide provides step-by-step instructions to set up Bitcoin Cash Node (BCHN) and Fulcrum on an Ubuntu server hosted on DigitalOcean.

When you're done, you can connect your Electron Cash wallet and other compatible wallets to your own node! Your wallets will be able to communicate with the Bitcoin Cash peer-to-peer network without third-party servers, increasing your privacy and security.

Bitcoin Cash (BCH) is upgraded money for the world that enables instant and cheap payments to anyone, anywhere, without middlemen or banks.

BCHN is a full node for the Bitcoin Cash blockchain network.

Fulcrum is a Simplified Payment Verification (SPV) server for Bitcoin Cash. Fulcrum connects to a full node like BCHN and indexes the entire blockchain so that it can quickly provide information to light wallets like Electron Cash.

Prerequisites

Create and Upload SSH Key

We'll use an SSH key for authentication when logging into our DigitalOcean droplet. If you don't already have your SSH public key added to your DigitalOcean account, follow Step 1 to do it now.

Create a DigitalOcean Droplet

On the DigitalOcean website, log in to your DigitalOcean account and create a new droplet with the following specifications. We'll use the cheapest option that has a dedicated CPU.

After creation, note the droplet's public IPv4 address from the DigitalOcean dashboard.

Create a Firewall to Allow SSH

We'll create a firewall that allows inbound SSH TCP on port 22 and all outbound traffic.

On DigitalOcean, go to Networking > Firewall and create a new firewall:

In Inbound Rules, leave the single default rule for SSH:

In Outbound Rules, keep the default rules, which permit all traffic to any destination on any port.

Create a Firewall to Allow BCHN Traffic

We'll create another firewall that allows inbound port 8333 for the Bitcoin Cash peer-to-peer (P2P) protocol, which is used for communication between nodes to propagate transactions and blocks.

On DigitalOcean, go to Networking > Firewall and create a new firewall:

In Inbound Rules, change the single default rule to have these settings:

In Outbound Rules, keep the default rules, which permit all traffic to any destination on any port.

Initial Server Setup

Connect to your droplet via SSH as the bitcoin user from your local machine. In the Terminal app:

ssh bitcoin@YOUR_DROPLET_IP

If you gave your SSH key a custom name or location, you can specify it with the -i flag like this:

ssh -i "~/.ssh/id_rsa" bitcoin@YOUR_DROPLET_IP

If prompted about the host’s authenticity, type yes and press Return.

You will be prompted to create a password for the bitcoin user and re-login. Make sure you save the password in your password manager.

After ssh-ing back in, update the system packages:

sudo apt update && sudo apt upgrade -y

Reboot:

sudo reboot

Wait a minute, then reconnect via SSH:

ssh bitcoin@YOUR_DROPLET_IP

Download BCHN and Signatures

Create a temporary directory for easy cleanup after installation:

mkdir -p ~/tmp && cd ~/tmp

Copy the latest BCHN version number from the BCHN website.

Set a version variable for easier maintenance:

VERSION="28.0.1"

Download the BCHN binary:

wget https://github.com/bitcoin-cash-node/bitcoin-cash-node/releases/download/v$VERSION/bitcoin-cash-node-$VERSION-x86_64-linux-gnu.tar.gz

Download the signatures:

wget https://gitlab.com/bitcoin-cash-node/announcements/-/raw/master/release-sigs/$VERSION/SHA256SUMS.$VERSION.asc.Calin_Culianu
wget https://gitlab.com/bitcoin-cash-node/announcements/-/raw/master/release-sigs/$VERSION/SHA256SUMS.$VERSION.asc.imaginary_username

Download the signing keys:

wget https://gitlab.com/bitcoin-cash-node/bitcoin-cash-node/-/raw/master/contrib/gitian-signing/pubkeys.txt

Verify the BCHN Download

Import the signing keys:

gpg --import pubkeys.txt

Verify that the checksums file is cryptographically signed by the release signing keys (should see "Good signature" in output):

gpg --verify SHA256SUMS.$VERSION.asc.Calin_Culianu
gpg --verify SHA256SUMS.$VERSION.asc.imaginary_username

Verify imaginary_username's signed checksum against the actual checksum of your download (Should see "OK" in output):

grep "x86_64-linux-gnu.tar.gz" SHA256SUMS.$VERSION.asc.imaginary_username | sha256sum --check

Verify Calin's signed checksum against the actual checksum of your download (Should see "OK" in output). This command removes extraneous white space from the end of a line in the file:

grep "x86_64-linux-gnu.tar.gz" SHA256SUMS.$VERSION.asc.Calin_Culianu | sed 's/[[:space:]]*$//' | sha256sum --check

Install BCHN

Extract BCHN binaries:

tar -xvf bitcoin-cash-node-$VERSION-x86_64-linux-gnu.tar.gz

Install the binaries to /usr/local/bin:

sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-cash-node-$VERSION/bin/*

Verify that the binary runs on your system by checking the version:

bitcoin-cli --version

Create BCHN Data Directory

Identify the location (mount point) of your block storage volume (it should be something like /mnt/volume_nyc1_01):

df -h

Anywhere in this guide you see "/mnt/volume_nyc1_01", replace that text with the location of your block storage volume.

Create a bchn directory on the block storage volume identified above:

sudo mkdir /mnt/volume_nyc1_01/bchn
sudo chown bitcoin:bitcoin /mnt/volume_nyc1_01/bchn

By default, BCHN uses the .bitcoin directory in the user's home directory. Instead of creating that directory, create a symbolic link .bitcoin that points to our bchn directory:

ln -s /mnt/volume_nyc1_01/bchn /home/bitcoin/.bitcoin

Display the link and check that it is not shown in red (this would indicate an error):

cd ~ && ls -alh

Configure BCHN

Create the configuration file using the nano text editor:

nano ~/.bitcoin/bitcoin.conf

Copy and paste the following into bitcoin.conf:


###
# BCHN bitcoind configuration file
#
# This config should be placed in following path:
# ~/.bitcoin/bitcoin.conf
#
# See sample config at: https://docs.bitcoincashnode.org/share/examples/bitcoin.conf
###

### BCHN daemon ###
# Maintain a full transaction index, used by the getrawtransaction rpc call and Fulcrum.
txindex=1

### JSON-RPC options (for controlling a running bitcoind process) ###
# Accept command line and JSON-RPC commands.
server=1

### Wallet ###
# Do not load the wallet. Disable wallet RPC calls.
disablewallet=1

### ZeroMQ ###
# Enable publishing of block hashes. Fulcrum recommends enabling zmq for the "hashblock" topic: https://github.com/cculianu/Fulcrum?tab=readme-ov-file#running-fulcrum
zmqpubhashblock=tcp://0.0.0.0:8433

### Initial block download optimizations ###
# Set database cache size in MB. Machines sync faster with a larger cache.
# For initial block download optimization, set to 2000 if server has 4 GB RAM.
dbcache=2000
# Only download and relay blocks - ignore unconfirmed transactions.
blocksonly=1

            

Save the file and exit the nano text editor (Control+O, Return, Control+X).

Set permissions: only the user "bitcoin" and members of the "bitcoin" group can read conf file:

chmod 640 /home/bitcoin/.bitcoin/bitcoin.conf

Run bitcoind manually and watch the log output for a few minutes to see if it starts correctly, then stop bitcoind with Control-C:

bitcoind

Set Up BCHN as a System Service

Create a systemd configuration file to autostart bitcoind automatically in the background on boot:

sudo nano /etc/systemd/system/bitcoind.service

Copy and paste the following into bitcoind.service:


[Unit]
Description=Bitcoin Cash Node Daemon
After=network.target

[Service]
User=bitcoin
Group=bitcoin

Type=forking
PIDFile=/home/bitcoin/.bitcoin/bitcoind.pid
ExecStart=/usr/local/bin/bitcoind -daemon \
                                    -pid=/home/bitcoin/.bitcoin/bitcoind.pid \
                                    -conf=/home/bitcoin/.bitcoin/bitcoin.conf \
                                    -datadir=/home/bitcoin/.bitcoin \
                                    -disablewallet
# Fulcrum needs read access to the .cookie file via the bitcoin group for RPC authentication.
# Wait 1 second for .cookie to be created, then add read permission for the group.
ExecStartPost=/bin/sh -c "sleep 1 && /usr/bin/chmod g+r /home/bitcoin/.bitcoin/.cookie"

Restart=always
TimeoutStopSec=60s
TimeoutStartSec=3s
StartLimitInterval=120s
StartLimitBurst=5

### Hardening measures ###
# Provide a private /tmp and /var/tmp.
PrivateTmp=true

# Mount /usr, /boot/ and /etc read-only for the process.
ProtectSystem=full

# Disallow the process and all of its children to gain
# new privileges through execve().
NoNewPrivileges=true

# Use a new /dev namespace only populated with API pseudo devices
# such as /dev/null, /dev/zero and /dev/random.
PrivateDevices=true

# Deny the creation of writable and executable memory mappings.
MemoryDenyWriteExecute=true

[Install]
WantedBy=multi-user.target

            

Save the file and exit the nano text editor (Control+O, Return, Control+X).

Enable the bitcoind service:

sudo systemctl enable bitcoind

Reboot the server to verify bitcoind starts on boot:

sudo reboot

After rebooting, bitcoind should start and begin to sync and validate the Bitcoin Cash blockchain. Wait a minute, then reconnect via SSH:

ssh bitcoin@YOUR_DROPLET_IP

As of April 2025, the initial BCHN sync took about 20 hours on a droplet with 4 GB RAM and 2 vCPUs. The next section shows how you can monitor BCHN's progress.

Monitor BCHN

Check the service status (Type q to quit or Control-C):

sudo systemctl status bitcoind

The output from the above command should show "loaded", "enabled", and "active (running)".

Use bitcoin-cli to get information about the blockchain and monitor sync progress:

bitcoin-cli getblockchaininfo

When "verificationprogress" is almost 1 (0.99999...), the blockchain is up-to-date and fully synced. It won't actually show "1".

The "blocks" and "headers" values converging also indicates the sync progress.

The "initialblockdownload" value will change to false when the initial block download is finished.

You can also follow the debug log to monitor bitcoind activity (Control-C to stop following):

tail -f /home/bitcoin/.bitcoin/debug.log

To check the number of connections:

bitcoin-cli getnetworkinfo

It's normal for "connections_in" to be 0 while your node is syncing. If it is still 0 after syncing finishes, it might mean your firewall is blocking incoming connections on port 8333.

List all available bitcoin-cli commands or get help for a specific one:

bitcoin-cli help
bitcoin-cli help getblockchaininfo

The BCH blockchain grows over time. To check disk usage:

df -h /mnt/volume_nyc1_01/

If the volume is running out of space, see the section on increasing your block storage.

Adjust Configuration After Initial Sync

After bitcoind is fully synced, reduce the size of the database cache. A bigger cache speeds up the initial block download, but now we want to reduce memory consumption to allow Fulcrum to run in parallel. We'll also enable the node to listen to and relay transactions. Open bitcoin.conf in the nano text editor:

nano ~/.bitcoin/bitcoin.conf

Comment out the following lines (add a # at the beginning of the lines):


#dbcache=2000
#blocksonly=1

            

Save the file and exit the nano text editor (Control+O, Return, Control+X).

Restart bitcoind for the settings to take effect:

sudo systemctl restart bitcoind

Set Up Fulcrum and Connect Electron Cash Wallet

After BCHN is fully synced and you reduced your database cache, you can set up Fulcrum and connect your Electron Cash wallet.

For the Future: Upgrade BCHN

When a new version of BCHN is released, you can upgrade by repeating the steps to:

  1. Download BCHN
  2. Verify BCHN
  3. Install BCHN

Then restart bitcoind to apply the update:

sudo systemctl restart bitcoind

You don't need to stop bitcoind before upgrading. Simply install the new version and restart the service.

For the Future: Increase Block Storage

When you're running low on storage space, you'll need to increase the size of your block storage.

Stop the bitcoind service:

sudo systemctl stop bitcoind

Disable the bitcoind service so it doesn't auto start on reboot:

sudo systemctl disable bitcoind

Also stop and disable fulcrum if running:

sudo systemctl stop fulcrum
sudo systemctl disable fulcrum

Shut down the server:

sudo poweroff

On the DigitalOcean website, select the volume and increase the size:

    Volumes > volume-nyc1-01 > More > Increase size

Turn the droplet power back on in the DigitalOcean web interface. Wait a minute, then reconnect via SSH:

ssh bitcoin@YOUR_DROPLET_IP

Check the current size (it should be the old size) and name (probably "/dev/sda") of your filesystem:

df -h

Verify the volume itself has been resized:

lsblk

Expand the filesystem:

sudo resize2fs /dev/sda

Verify the new size of the filesystem:

df -h

Enable the bitcoind service:

sudo systemctl enable bitcoind

Enable the fulcrum service if you have that installed:

sudo systemctl enable fulcrum

Reboot the server:

sudo reboot

For the Future: Install System Upgrades

You can periodically install updates to keep your system up-to-date with the latest software versions and security patches.

Update and upgrade the system packages:

sudo apt update && sudo apt upgrade -y

Unlike autoremove, autoclean is very safe because it only removes obsolete files. It won’t affect installed packages or their dependencies:

sudo apt autoclean -y

Reboot:

sudo reboot

Resources

Next steps: Set up Fulcrum and connect your Electron Cash wallet.