In light of some recent awesome events in the Bitcoin mining sphere, I was inspired to set up my own small 4 MH/s solo mining operation and see how I could improve it. A couple of the aspects that I thought could use some work are related to connectivity and in making my setup the most “pure” in the sense of decentralization and trustlessness.
So I initially began digging into how exactly one solo mines in today’s exceedingly industrialized mining world. I’m not interested in pay-per-share pooled mining, since that drains any of the fun of solo mining, and introduces some trust. I want to directly contribute unadulterated hash rate security to the Bitcoin network.
Note: I am assuming the reader knows that solo mining is incredibly difficult and you are more than likely to never actually generate a block. Just full disclosure here. Having said that…
Years ago, solo mining required setting up a full industrial-grade pool that was designed for thousands of remote individual miners pooling their hash rate together. I remember trying to set one up either using the Eligius code or one of the other not-as-well-known pool projects on Github and it was difficult to get all of the individual software components working. Knowing this, let’s just say I wasn’t getting my hopes up that mining solo was any easier today.
CKpool has its own “solo” counterpart (which I honestly love exists), and it’s a sort of pseudo-solo mining pool where individual miners get 98% of the block reward (2% pool fee) when they generate a block and the other pool participants get 0%. Contrast this with typical pooled mining where all hash rate contributors get a piece of the block reward. The solo CKpool is great, but ultimately using the pool introduces some trust that shouldn’t exist in a pure solo mining setup. There is some incompatibility with the latest Bitcoin Core version and the most recent CKpool code as well, based upon my attempt at using it for this mining setup.
After scouring Duckduckgo and Github issues, I stumbled upon BFGMiner’s ability to communicate with a local bitcoind
for the purposes of solo mining(!). I had no idea this functionality existed since BFGMiner was typically used for interfacing with GPUs or ASIC hardware while mining.
Note: cgminer also has this functionality. Thanks Con!
So with this new BFGMiner knowledge, we can eliminate any difficult to setup pool software, or any trusted pool, and only rely on BFGMiner and a Bitcoin Core full node. This fits the bill for my purist solo mining configuration.
This leaves the improvements to connectivity. How this can be bolstered is by using Blockstream Satellite to supplement the set of peers my node uses while my ISP is functioning, and as a failover in the event my ISP gets flaky and drops my connection. This way, my mining hardware can know what block is the latest block to build on and no effort is wasted.
An area of research is block egress, however. Options do exist like Starlink or Iridium that can be used for broadcasting a newly found block. Starlink is probably overkill cost-wise due to the likelihood of actually solo mining a block, and blocks themselves being relatively small in size. But it is a good option. SMS is another option that I will explore in future blog posts.
How to solo mine like a boss
Guide assumes Ubuntu 20.04
Warning: some compiling is necessary
It’s actually really easy now. There isn’t any need to set up a full blown mining pool anymore. BFGMiner can handle everything we need. So let’s get everything set up.
Set up Blockstream Satellite
Follow Blockstream’s excellent guide for putting together a satellite antenna, aligning it, and installing all of the necessary software to start receiving Bitcoin data via geosynchronous satellite.
Install blocksat-cli
and Bitcoin Satellite, the patched Bitcoin Core node that Blockstream maintains for satellite connectivity.
Set up BFGMiner
BFGMiner is GPU/ASIC mining software that also supports solo mining using a local bitcoind
! This software will bridge our mining hardware to our local satellite Bitcoin node.
$ git clone https://github.com/luke-jr/bfgminer && cd bfgminer
For Ubuntu, all you need to do is install the dependencies and then build normally.
$ sudo apt install automake autoconf libtool pkg-config libcurl4-gnutls-dev libjansson-dev uthash-dev
Then build it.
$ ./autogen.sh
$ ./configure
$ make
With your bitcoind
synced and receiving data via satellite (debug.log should output bitrate data if successfully receiving), point BFGMiner to your local node. Make sure to set server=1
and rpcuser=user
rpcpassword=pass
in bitcoin.conf
$ ./bfgminer -T -D -P -o '127.0.0.1:8332' -O user:pass --stratum-port 3334 --generate-to <your address>
This will tell BFGMiner to pull data from your node and which port to listen on for stratum miners (basically all modern ASICs use stratum).
Once BFGminer is running, simply point your ASIC hardware to the IP address your bitcoind
and BFGMiner are running on (port 3334) instead of a normal mining pool like Slushpool. You should begin to start seeing low difficulty shares being submitted by the mining hardware in the BFGminer console output. That’s it! You’re solo mining like a boss and have a backup blockchain data source via geosync satellite. How awesome is that. Good luck with the mining!
Learn more about Blockstream Satellite: