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.
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.
You can choose the region closest to you that supports block storage, but if you select another region you'll need to modify some of the commands in this guide to reflect the location of your block storage volume.
As of April 2025, the BCHN data directory fully synced with txindex is 248 GB and Fulcrum fully synced is another 51 GB.
When a disk is formatted with an Ext4 filesystem, the filesystem typically reserves 5% of the total disk space for system processes. So only 95% will be available to us.
Thus, if we want 20 GB of free space, the storage should be (248 + 51 + 20) / 0.95 = ~336 GB. Round up to 340 GB.
You don't need to enable backups at this time.
Copy and paste the following User data cloud-config script to create a non-root user named "bitcoin":
#!/bin/bash set -euo pipefail USERNAME=bitcoin # Create user and immediately expire password to force a change on login useradd --create-home --shell "/bin/bash" --groups sudo "${USERNAME}" passwd --delete "${USERNAME}" chage --lastday 0 "${USERNAME}" # Create SSH directory for sudo user and move keys over home_directory="$(eval echo ~${USERNAME})" mkdir --parents "${home_directory}/.ssh" cp /root/.ssh/authorized_keys "${home_directory}/.ssh" chmod 0700 "${home_directory}/.ssh" chmod 0600 "${home_directory}/.ssh/authorized_keys" chown --recursive "${USERNAME}":"${USERNAME}" "${home_directory}/.ssh" # Disable root SSH login with password sed --in-place 's/^PermitRootLogin.*/PermitRootLogin prohibit-password/g' /etc/ssh/sshd_config if sshd -t -q; then systemctl restart sshd; fi
This will add the droplet to the inbound-ssh-only-firewall, which we'll set up later.
This will add the droplet to the bchn-firewall, which we'll set up later.
After creation, note the droplet's public IPv4 address from the DigitalOcean dashboard.
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.
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.
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
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
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
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
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
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
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.
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.
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
After BCHN is fully synced and you reduced your database cache, you can set up Fulcrum and connect your Electron Cash wallet.
When a new version of BCHN is released, you can upgrade by repeating the steps to:
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.
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
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
Next steps: Set up Fulcrum and connect your Electron Cash wallet.