Bitcoin Splice

Goes live in 

Get started

Four steps. You need Docker, a computer that stays on, and a bit of patience. The commands take minutes, but one download takes a while.

Step one

Get the node.

pull it
docker pull ghcr.io/kosinskihenry/bitcoin-splice
# 38 MB, linux/amd64
or build it yourself
git clone https://github.com/kosinskihenry/bitcoin
cd bitcoin
docker build -t ghcr.io/kosinskihenry/bitcoin-splice .
# same name, so everything below works either way

That's an ordinary Bitcoin node with a different difficulty rule. It can't connect to the real Bitcoin network, in either direction, even if you tried. The two networks speak different greetings. That's what makes it safe to leave this thing plugged into the internet like any other node.

The published image is amd64 only. On an ARM machine, a Raspberry Pi or an Apple-silicon Mac, the pull fails with no matching manifest and building it yourself is the way in. Tag your build with the same name, as above, and every command on this page works unchanged. There is a 961635 tag as well, if you would rather pin an exact image than follow latest.

Don't start it yet. A node needs a chain to open, and on this network you can't collect one from strangers as you go, so the chain comes first and the node starts on top of it. That's step two.

Step two

Get the chain, then start on it.

Bitcoin Splice continues from a real Bitcoin block, number 961,635, mined this August, and your node needs Bitcoin's history up to that point before it can do anything at all. The snapshot is where that comes from.

get the snapshot
# 11.4 GiB, the chain at block 961,635
curl -O https://snapshots.bitcoinsplice.com/splice-961635-pruned.tar.zst
curl -O https://snapshots.bitcoinsplice.com/SHA256SUMS
curl -O https://snapshots.bitcoinsplice.com/SHA256SUMS.asc

gpg --verify SHA256SUMS.asc SHA256SUMS
sha256sum -c SHA256SUMS --ignore-missing
unpack it, then run the node on it
mkdir -p ~/.bitcoin-splice
tar -I zstd -xf splice-961635-pruned.tar.zst \
  -C ~/.bitcoin-splice
# blocks/ and chainstate/, 14.6 GiB. Nothing else.

docker run -d --name bitcoin \
  -e FORK_RPC_PASSWORD=pick-a-password \
  -v ~/.bitcoin-splice:/home/bitcoin/.bitcoin \
  ghcr.io/kosinskihenry/bitcoin-splice \
  -printtoconsole -prune=550

The snapshot is the ordinary way in, not a shortcut. It is this chain already at block 961,635, pruned back to the last few hundred blocks, so your node opens at the fork point and syncs forward from there like any other. The archive holds blocks/ and chainstate/ and nothing else: no config, no wallet, no keys. The node writes its own bitcoin.conf on first start and finds the network through a built-in seed, so you don't have to know anyone to join.

Pick a real password. The node refuses to start on the default one, because that password can mine, rewrite and read everything. Keep the -prune=550 as well: a pruned datadir records that it is pruned, and a node started without the flag asks for a reindex it has no blocks left to do.

Verify the manifest. It's signed with DE25 4950 C136 1D98 B87F 33E2 7043 0561 A29C 5FB7, and that check is the one that matters. A snapshot leading anywhere except the fork hash won't start at all, but one with the right hashes and a doctored ledger inside would start fine and only misbehave later.

Check where it opened. The best block hash has to be the one below. That value is compiled into the binary, so a node disagreeing with it is not on this chain, and it will say so and refuse to start rather than mine somewhere plausible and wrong.

After that it syncs forward over P2P to whatever the network has mined since, which is ordinary catching up and nothing to do but watch. Once it's current, mining will work.

Not taking the snapshot? Then the history has to arrive over P2P too, and the ordinary Bitcoin network cannot give it to you. Splice speaks its own protocol, so only another Splice node will serve this history, and right now that is a single machine: the seed node the developer runs. It is kept unpruned for exactly this purpose, but it is one computer with one connection, so expect a long download and be patient with it.

Already run a Bitcoin node? Then you have nearly all of this on disk already, and copying that folder across is quicker than pulling it down again. Stop your node cleanly first. That route also leaves you unpruned, which is the kind of node this network is short of.

did it open where it should?
docker exec --user bitcoin bitcoin \
  bitcoin-cli getblockchaininfo

# "blocks": 961635
# "pruned": true
# "bestblockhash":
#   00000000000000000000c705b7a0a847d2713d73da4a1b20cea3dfdd617fa651
A pruned node can't onboard anyone. Yours keeps the ledger and the last few hundred blocks, not the history, so it cannot hand a newcomer the thing you just downloaded. A network of nothing but pruned nodes has no way in at all. If you have the disk, taking the long route and staying unpruned is a real contribution.
If it refuses to start and prints two block hashes, the datadir you started from is on the wrong branch. The node checks this on purpose: mining on the wrong branch looks healthy the entire time it is wasting your electricity.

Step three

Make yourself a wallet.

a fresh wallet and an address
docker exec --user bitcoin bitcoin \
  bitcoin-cli createwallet mining

docker exec --user bitcoin bitcoin \
  bitcoin-cli getnewaddress "" legacy
# 1… this is where your coins go
Use a brand new wallet. Your normal wallet software can't sign for this chain at all, so the keys have to live inside this node. Never put a seed phrase here that controls real money. Make a fresh one, like the command above does, and let mining fill it.

Ask for a legacy address, as above. BFGMiner cannot mine to a bech32 one, so a legacy address is the type that works with every miner here.

It will start with a 1, exactly like an ordinary Bitcoin address. That's a bit unfortunate and worth remembering: label things clearly so you never paste one into the other.

Step four

Point a miner at it.

Three have been tested against Splice: BFGMiner, cpuminer-opt and a commercial ASIC. None of them needs modifying. cpuminer-opt is the quickest on a CPU, so it is the one set up below.

let the miner reach the node
# restart with the mining port open
docker rm -f bitcoin
docker run -d --name bitcoin -p 8455:8455 \
  -e FORK_RPC_PASSWORD=pick-a-password \
  -e FORK_RPC_ALLOW_IP=172.17.0.0/16 \
  -v ~/.bitcoin-splice:/home/bitcoin/.bitcoin \
  ghcr.io/kosinskihenry/bitcoin-splice \
  -printtoconsole -prune=550
# unpruned? your own datadir, and no -prune
build the miner
sudo apt install build-essential automake autoconf \
  pkg-config libssl-dev libcurl4-openssl-dev \
  libjansson-dev libgmp-dev zlib1g-dev

git clone https://github.com/JayDDee/cpuminer-opt
cd cpuminer-opt
./autogen.sh
./configure CFLAGS="-O3 -march=native -Wall"
make -j"$(nproc)" \
  LIBS="-lz -lcurl -lcrypto -lssl -lpthread -lgmp"
mine
./cpuminer -a sha256d \
  -o http://your-node:8455 \
  -u fork -p pick-a-password \
  --coinbase-addr=1…your…legacy…address

# accepted 1/1 (100%), 114.8 MH/s
# BLOCK SOLVED 961636

That's it. Leave it running. Blocks arrive quickly at first and then slow down to roughly one every ten minutes as the chain works out how much power is pointed at it.

Coins you mine become spendable after 101 confirmations, the same as on Bitcoin, so about a day once things settle.

or mine with a graphics card
# BFGMiner, with the GPU switched on
bfgminer -S opencl:auto \
  -o http://your-node:8455 \
  -u fork -p pick-a-password \
  --coinbase-addr 1…your…legacy…address

# GPU0: 3.73 GH/s

BFGMiner drives a graphics card as well as a CPU, and on this chain that is the fastest thing most people own. An RTX 3090 manages about 3.73 GH/s, roughly seven times what the same machine got out of its processor.

It needs the legacy address from step three. BFGMiner will not mine to a bech32 address, which is the whole reason this guide asks for the older type.

If the build fails with errors about curl, that's a known quirk in cpuminer-opt. The LIBS= line above is the fix, so don't drop it. If mining does nothing, check the node actually reached block 961,635 first; below that, it's still playing by Bitcoin's rules and nothing you own will ever find a block. If you took the long route and your node is unpruned, restart it with your own datadir and no -prune: adding the flag to an unpruned node throws away the history it holds, and that history is the only thing anyone else can join from.

Stuck? The developer is one person and reads everything.