This guide provides step-by-step instructions to set up 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.
Fulcrum is a Simplified Payment Verification (SPV) server for Bitcoin Cash (BCH). 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.
This tutorial uses DigitalOcean, but the general steps should work on any Ubuntu or Debian server.
In the Terminal app on your Mac, SSH in to your DigitalOcean droplet:
ssh bitcoin@YOUR_DROPLET_IPCheck the amount of block storage you have available:
df -hAs of April 2025, Fulcrum uses 51 GB of disk space. If needed, follow the steps to increase your block storage.
Verify that BCHN's permission cookie can be accessed by the group “bitcoin”:
ls -alh /home/bitcoin/.bitcoin/.cookieThe output must contain "-rw-r-----" to show that the cookie is readable by the bitcoin group, otherwise Fulcrum won't be able to access BCHN.
If the cookie's permissions aren't correct, you can update them:
chmod g+r /home/bitcoin/.bitcoin/.cookieHowever, the cookie is recreated every time BCHN restarts. That's why we configured ExecStartPost in the bitcoind.service file to set the correct permissions after BCHN starts.
Other full node implementations may be able to use the startupnotify option to set the cookie permissions instead.
We'll create another firewall that opens inbound port 50002 for Electron Cash and other clients to connect via SSL.
On the DigitalOcean website, log in to your DigitalOcean account and add the tag "fulcrum" to your bchn-fulcrum droplet. This will add the droplet to the fulcrum-firewall, which we'll set up next.
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.
Create a temporary directory for easy cleanup after installation:
mkdir -p ~/tmp && cd ~/tmpCopy the latest Fulcrum version number from the Fulcrum GitHub.
Set a version variable for easier maintenance:
VERSION="1.12.0"Download the Fulcrum x86_64-linux binary:
wget https://github.com/cculianu/Fulcrum/releases/download/v$VERSION/Fulcrum-$VERSION-x86_64-linux.tar.gzDownload the signature:
wget https://github.com/cculianu/Fulcrum/releases/download/v$VERSION/Fulcrum-$VERSION-shasums.txt.ascDownload the checksum:
wget https://github.com/cculianu/Fulcrum/releases/download/v$VERSION/Fulcrum-$VERSION-shasums.txtDownload the signing key:
wget https://github.com/Electron-Cash/keys-n-hashes/raw/refs/heads/master/pubkeys/calinkey.txtImport the signing key:
gpg --import calinkey.txtVerify that the checksums file is cryptographically signed by the release signing key (should see "Good signature" in output):
gpg --verify Fulcrum-$VERSION-shasums.txt.ascVerify the signed checksum against the actual checksum of your download (Should see "OK" in output):
grep "x86_64-linux.tar.gz" Fulcrum-$VERSION-shasums.txt | sha256sum --checkExtract Fulcrum binaries:
tar -xvf Fulcrum-$VERSION-x86_64-linux.tar.gzInstall Fulcrum and FulcrumAdmin by copying them to /usr/local/bin:
sudo install -m 0755 -o root -g root -t /usr/local/bin Fulcrum-$VERSION-x86_64-linux/Fulcrum Fulcrum-$VERSION-x86_64-linux/FulcrumAdminVerify that the binary runs on your system by checking the version:
Fulcrum --versionCreate the "fulcrum" service user:
sudo adduser --disabled-password --gecos "" fulcrumAdd the "fulcrum" user to the "bitcoin" group so Fulcrum ran read BCHN's permission cookie:
sudo adduser fulcrum bitcoinIdentify the location (mount point) of your block storage volume (it should be something like /mnt/volume_nyc1_01):
df -hAnywhere in this guide you see "/mnt/volume_nyc1_01", replace that text with the location of your block storage volume.
Create a fulcrum directory on the block storage volume identified above:
sudo mkdir -p /mnt/volume_nyc1_01/fulcrum/fulcrum_dbsudo chown -R fulcrum:fulcrum /mnt/volume_nyc1_01/fulcrum/Create a symlink that points to our fulcrum directory:
sudo ln -s /mnt/volume_nyc1_01/fulcrum /home/fulcrum/.fulcrumsudo chown -R fulcrum:fulcrum /home/fulcrum/.fulcrumOpen a “fulcrum” user session:
sudo su - fulcrumChange to the fulcrum directory:
cd /mnt/volume_nyc1_01/fulcrumElectron Cash requires SSL for secure connections to Fulcrum. We'll generate a key file and a self-signed SSL certificate. When it asks you to enter some info, press Return until the prompt is shown again to use default values. It is not necessary to enter any info:
openssl req -newkey rsa:4096 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pemWhile we're still in our “fulcrum” user session, create the configuration file using the nano text editor:
nano /mnt/volume_nyc1_01/fulcrum/fulcrum.confCopy and paste the following into fulcrum.conf:
###
# Fulcrum configuration file
#
# This config should be placed in following path:
# /mnt/volume_nyc1_01/fulcrum/fulcrum.conf
#
# Full example config: https://github.com/cculianu/Fulcrum/blob/master/doc/fulcrum-example-config.conf
###
### BCHN settings ###
bitcoind = 127.0.0.1:8332
rpccookie = /mnt/volume_nyc1_01/bchn/.cookie
### Fulcrum server settings ###
datadir = /mnt/volume_nyc1_01/fulcrum/fulcrum_db
ssl = 0.0.0.0:50002
cert = /mnt/volume_nyc1_01/fulcrum/cert.pem
key = /mnt/volume_nyc1_01/fulcrum/key.pem
# Admin RPC bind - Required to use "FulcrumAdmin"
admin = 8000 # A port number by itself implies 127.0.0.1
# Anonymize client IP addresses and TxIDs in logs
anon_logs = true
### Optimizations for modest servers similar to a Raspberry Pi ###
# bitcoind_clients should not exceed the number of cores in your system
bitcoind_clients = 1
bitcoind_timeout = 600
worker_threads = 1
# If server has 4 GB RAM:
db_mem = 1024.0
db_max_open_files = 200
utxo_cache = 512
Save the file and exit the nano text editor (Control+O, Return, Control+X).
Set permissions so only the user "fulcrum" and members of the "fulcrum" group can read conf file:
chmod 640 /mnt/volume_nyc1_01/fulcrum/fulcrum.confExit "fulcrum" user session to return to "bitcoin" user session:
exitNote: We tested various combinations of settings in fulcrum.conf to see what resulted in the fastest sync without Out Of Memory (OOM) issues.
Create a systemd configuration file to autostart fulcrum automatically in the background on boot:
sudo nano /etc/systemd/system/fulcrum.serviceCopy and paste the following into fulcrum.service:
[Unit]
Description=Fulcrum
PartOf=bitcoind.service
After=bitcoind.service
StartLimitBurst=2
StartLimitIntervalSec=20
[Service]
ExecStart=/usr/local/bin/Fulcrum /mnt/volume_nyc1_01/fulcrum/fulcrum.conf
KillSignal=SIGINT
User=fulcrum
Type=exec
TimeoutStopSec=300
RestartSec=30
Restart=on-failure
[Install]
WantedBy=multi-user.target
Save the file and exit the nano text editor (Control+O, Return, Control+X).
Enable the fulcrum service:
sudo systemctl enable fulcrumStart the fulcrum service:
sudo systemctl start fulcrumFulcrum will now index the whole Bitcoin Cash blockchain so that it can provide all necessary information to wallets. After Fulcrum finishes indexing, wallets you use no longer need to connect to any third-party server to communicate with the Bitcoin Cash peer-to-peer network.
As of April 2025, the initial Fulcrum sync took about 20 hours and 12 minutes on a droplet with 4 GB RAM and 2 vCPUs. The next section shows how you can monitor Fulcrum's progress.
Warning: Initial blockchain indexing may take 20+ hours depending on your droplet’s performance. Do not interrupt the process, as it may corrupt Fulcrum's database and require a resync.
Note: some guides suggest setting up zram swap to speed up the initial indexing, but zram isn't available on DigitalOcean. DigitalOcean droplets have kernels that don't support zram.
Check the service status (Type q to quit or Control-C):
sudo systemctl status fulcrumThe output from the above command should show "loaded", "enabled", and "active (running)".
Follow the systemd service log to monitor fulcrum activity (Control-C to stop following):
sudo journalctl -u fulcrum -fThe BCH blockchain and Fulcrum data 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.
Also see the section on FulcrumAdmin for more monitoring options.
Fulcrum comes with an admin tool called FulcrumAdmin. You may send commands to Fulcrum using this script.
Make sure admin = 8000 is set in the fulcrum.conf configuration.
Get Fulcrum server information:
FulcrumAdmin -p 8000 getinfoPrint information on all the currently connected clients:
FulcrumAdmin -p 8000 clientsPrint peering information:
FulcrumAdmin -p 8000 peersView full list of commands:
FulcrumAdmin -hAfter Fulcrum is fully synced, you can connect your Electron Cash wallet to your Fulcrum server.
If your Fulcrum database is corrupted, you'll need to delete the Fulcrum database and reindex.
Stop fulcrum:
sudo systemctl stop fulcrumDelete the fulcrum_db directory content:
sudo rm -r /mnt/volume_nyc1_01/fulcrum/fulcrum_db/*If necessary, make any desired changes to your Fulcrum configuration. For example, if Fulcrum was killed due to an Out Of Memory (OOM) problem, you might want to reduce the utxo_cache or db_mem settings.
Open a “fulcrum” user session:
sudo su - fulcrumEdit the configuration file using the nano text editor:
nano /mnt/volume_nyc1_01/fulcrum/fulcrum.confSave the file and exit the nano text editor (Control+O, Return, Control+X).
Exit "fulcrum" user session to return to "bitcoin" user session:
exitStart the fulcrum service:
sudo systemctl start fulcrumWhen a new version of Fulcrum is released, you can upgrade by following these steps.
Stop the Fulcrum service:
sudo systemctl stop fulcrumRepeat the steps to:
Check the new version number:
Fulcrum --versionThen start the fulcrum service:
sudo systemctl start fulcrumYou can use a domain name and an SSL certificate issued by a Certificate Authority (CA) instead of an IP address and a self-signed SSL certificate.
To do so, follow the steps to set up a Let's Encrypt certificate for Fulcrum.
When you're done, your Fulcrum server will be accessible to Electron Cash and other Bitcoin Cash (BCH) wallets with a user-friendly domain name instead of an IP address. Your Fulcrum server will also announce itself to peers so that more clients connect to your server.
If you ever decide to stop using Fulcrum and want to uninstall it, follow these steps.
Stop fulcrum:
sudo systemctl stop fulcrumDisable fulcrum:
sudo systemctl disable fulcrumDelete the fulcrum service:
sudo rm /etc/systemd/system/fulcrum.serviceDelete the fulcrum user:
sudo userdel -r fulcrumDelete the fulcrum data directory:
sudo rm -rf /mnt/volume_nyc1_01/fulcrum/Remove the fulcrum tag from your droplet on DigitalOcean.
Delete the fulcrum-firewall on Digital Ocean.
Next steps: Connect your Electron Cash wallet to your Fulcrum server.