What's New:
Fulcrum 2.1.0 is a minor upgrade version of the 2.x series. Most significantly, it contains support for the new Electrum Cash protocol v1.6 (which has some minor tweaks, mainly for BTC). This release also contains some bugfixes, optimizations and improvements to peering, and some dependent packages were updated for the static build.
Detailed Summary of Changes vs v2.0.0
- Added support for Electrum Cash protocol v1.6. See: https://electrum-cash-protocol.readthedocs.io/en/latest/protocol-changes.html#version-1-6-0 for differences vs. 1.4 & 1.5.
- Note: As usual, if the client declares protocol <1.6, nothing changes.
- This upgrade to the protocol came from the BTC people and mainly concerns BTC. See: spesmilo/electrum-protocol#6
- Note for BTC admins: If you want to take full advantage of protocol 1.6, please upgrade your node to Bitcoin Core or Bitcoin Knots v28.0.0 or above.
- Improvements to the logic and code of the
PeerMgrwhich controls peering (federation) behavior of Fulcrum:- Fulcrum no longer maintains active connections to all peers in the "Good" list, as it has always done. Instead, it simply disconnects from "Good" peers and periodically reconnects to them to refresh them (every 30 mins).
- Motivation: The previous behavior of keeping connections alive to all "Good" turned-out to annoy some people, in particular on the BTC mainnet network, because there are so many BTC peers that Fulcrum can eat 200+ connections on any 1 server doing this. See: #307 .
- Fulcrum tries harder now to reconnect to seemingly-failed peers on their SSL port if their TCP port has failed.
- Motivation: Many servers declare a TCP port that doesn't work, but their SSL port works ok.
- Fulcrum no longer maintains active connections to all peers in the "Good" list, as it has always done. Instead, it simply disconnects from "Good" peers and periodically reconnects to them to refresh them (every 30 mins).
- Switched all static builds to no longer use the Qt5 series but instead use the Qt6 series, specifically Qt 6.10.0.
- Motivation: Qt5 is ancient at this point and I don't trust it to not contain dragons and subtle bugs.
- Static build: Updated miniupnpc to use a custom-patched version. This fixes an esoteric crash bug when using UPnP (
--upnp) and when more than 1024 clients are connected. - Some code quality / compiler warning fixups for newer GCC, etc.
- Some updates of the codebase to use more modern C++20 features in many places.
- Updated servers.json for BCH and BTC.
Pre-compiled Binaries for Linux
I have provided two pre-built binaries for Linux:
Fulcrum-2.1.0-x86_64-linux.tar.gz, which is compiled on anUbuntu 18.04system using Docker.Fulcrum-2.1.0-arm64-linux.tar.gz, which is compiled on anUbuntu 22.04system (for ARM64 bit) using Docker.
All of the above binaries contain jemalloc, libzmq, libminiupnpc, Qt6Core, Qt6Network (from Qt 6.10.0), OpenSSL 1.1.1 and libstdc++ statically linked. They still require libz2, and the right libc version as dynamic libs on your system (but those are usually present if you are on a recent system).
Pre-compiled Binaries for Windows
Fulcrum-2.1.0-win64.zip- Pre-built, statically linked Windows version.- It should "just work" on any Windows 10 or above 64-bit system.
- Includes is a statically-linked
Fulcrum.exe, built withjemalloc,libzmq,libminiupnpc,Qt 6.10.10,OpenSSL 3.3.0, andgcc 15.2.0. - Additionally,
FulcrumAdmin.exeis included which is the python script, but made into aonefile .exeusing PyInstaller.- NOTE Windows virus scanners have been known to erroneously identify
FulcrumAdmin.exeas containing a virus. This is because many heuristic scanners dislike the use ofPyInstalleronefile .exe's. See: #203. Please ignore this -- we contain no viruses! Also please complain to your virus software vendor about this.
- NOTE Windows virus scanners have been known to erroneously identify
See the .asc file for signatures; I signed the sha256 hashes of all the release binaries. My gpg public key can be obtained here: https://github.com/Electron-Cash/keys-n-hashes/blob/master/pubkeys/calinkey.txt
Binary builds for macOS coming soon -- Until then you can always build from source!
Note: If ugprading from Fulcrum 1.x, please read the below!
Brief Summary: What's New in the 2.x series
A brief summary of what Fulcrum 2.x offers vs the 1.x series:
- Database Reliability - one of the main weaknesses of Fulcrum 1.x was that should the process be killed at an inopportune time, or should abrupt powerloss or kernel-level crash occur at an inopportune time, there was always a risk that the datadir would get corrupted and the admin would be forced to do a full database resynch. This is no longer the case!
- Fulcrum 2.x series will no longer suffer from this problem and the process can be killed at any time (including abrupt powerloss), without any database corruption. At worst the last few blocks worth of data is rolled-back and Fulcrum will re-synch from the rollback point.
- It is still recommended that admins gracefully shut-down Fulcrum, however, via
SIGINT/SIGTERM/SIGQUIT(either from their init/systemd scripts or viakill -TERM <pid>, etc), and wait for it to terminate. This maximizes performance and minimizes startup times for Fulcrum the next time it is restarted.
- Platform Neutrality - database format is now 100% platform-neutral. This means it should be possible to always copy datadirs around regardless if transferring them from Windows, Linux, BSD, macOS, and regardless of platform architecture (including big endian platforms).
- Improved database performance.
Upgrading from the Fulcrum 1.x Series
Upgrade Instructions
Fulcrum 2.x has a different database format than the 1.x series. As such, you have two options for upgrading:
- Create a blank new datadir and just re-synch from block 0 (slow, but 100% reliable)
- Upgrade your existing 1.x datadir (faster, but irreversible and destructice)
To upgade your existing database, be sure to pass the one-time --db-upgrade flag to Fulcrum. It will refuse to start up if it detects that your datadir is in the old format and you did not pass this flag. This ensures that admins know what they are getting into.
Note: The upgrade process takes seconds to minutes on BCH and BTC testnet(s), maybe ~15 minutes on BCH mainnet, and around an hour or more (depending on hardware) on BTC mainnet.
--utxo-cache Removed
The --utxo-cache option has been completely removed. If you want to temporarily leverage memory to help out initial synch, use a temporary --db_mem (CLI) or db_mem= setting in the conf file to give Fulcrum more memory for initial synch, stop Fulcrum, then set it down again to a smaller value for continued operations.
Critical Note On Upgrading the DB from 1.x -> 2.x
Let it run to completion!
While Fulcrum 2.x is 100% reliable and may be killed at any time during its operation -- there is one exception to this rule: the upgrade process that converts 1.x databases -> 2.0. As such please let the upgrade process run to completion and do not kill, stop, molest, or otherwise abuse the Fulcrum process while it's upgrading the DB!!. If you do, the old 1.x database will be lost and your 2.x database will also be corrupted.
You have been warned!
Detailed Summary of Changes in 2.x vs 1.x:
- Completely redid the database format to leverage rockskdb atomicity and reliability guarantees.
- Added
--db-upgradeCLI arg (required to upgrade an existing DB from Fulcrum 1.x to 2.x format) - Added some performance improvements to the rocksdb database
- Made some tables use point-lookup optimizations
- Made all tables use 2-level indexing which is more appropriate for the way Fulcrum data is laid out
- Made some of the tables' keys be properly sorted (such as scripthash_history) -- they were not always completely sorted in an optimal fashion before, which cost a few cycles sometimes.
- Changes to make better use of
db_memdb memory (should also help slightly reduce memory consumption) - More forcefully enforce rocksdb
kNoCompressionfor all levels.
- Made the database format have a specifiec endian-ness for all data and so the database is completely cross-platform. You should now be able to copy any Fulcrum datadir from any OS and architecture to any other OS and architecture, regardless of endianness, word size, etc.
- Got rid of the entire
--utxo-cachemechanism (it's no longer compatible with Fulcrum's newfound data reliability guarantees). db_memnow defauls to 2048 MiB or 25% of total physical memory, whichever is smallerdb_max_open_filesnow defaults to 1000 (was: 40)- Internal misc. other performance fixups
- Internal code quality improvements
- Removal of some dead/unused code
- Redid some aspects of the internal unit test system, and added some unit tests
- Various build system and misc. compile issue fixes