regtest
Bitcoin's "regression test" mode. Local-only chain, instant block generation, no PoW difficulty. The default for Bitcoin testing.
Setup
bitcoind -regtest -daemon -fallbackfee=0.00001
bitcoin-cli -regtest createwallet test
bitcoin-cli -regtest -rpcwallet=test getnewaddress
# bcrt1q...
# Mine 101 blocks (subsidy matures after 100)
bitcoin-cli -regtest -rpcwallet=test generatetoaddress 101 <addr>
# Now wallet has 50 BTC mature
bitcoin-cli -regtest -rpcwallet=test getbalance
-fallbackfee is required because the empty regtest mempool has
no fee estimates.
Multi-node setup
# Node 1
bitcoind -regtest -datadir=/tmp/n1 -port=18444 -rpcport=18443 -daemon
# Node 2
bitcoind -regtest -datadir=/tmp/n2 -port=18445 -rpcport=18446 \
-connect=127.0.0.1:18444 -daemon
# Node 3
bitcoind -regtest -datadir=/tmp/n3 -port=18447 -rpcport=18448 \
-connect=127.0.0.1:18444 -daemon
Useful commands
# Mine blocks (deterministic; instant)
bitcoin-cli -regtest generatetoaddress 1 <addr>
# Reset chain (start fresh)
rm -rf ~/.bitcoin/regtest
bitcoind -regtest -daemon
# Specific block at specific time
bitcoin-cli -regtest setmocktime <unix_ts>
bitcoin-cli -regtest generatetoaddress 1 <addr>
Address prefixes
- P2PKH:
m...orn.... - P2SH:
2.... - Bech32:
bcrt1q.... - Bech32m:
bcrt1p....
Use cases
- Unit tests that need a real bitcoind.
- Integration tests for wallet / Lightning logic.
- Demos / tutorials with deterministic state.
- Reproducing bugs with controlled chain history.
Common bugs
- Forgetting
-fallbackfee→sendtoaddresserrors. - Forgetting to mine 100+ blocks before spending coinbase → "input immature".
- Mixing regtest output with mainnet RPC by accident → use distinct
-datadirand explicit-regtestarg.