Practical Projects
The best way to learn is by building. These projects are organized by difficulty level, each designed to reinforce specific concepts from the roadmap.
All projects should be built and tested on regtest. Never use mainnet for development experiments.
Beginner
1. Address Generator
Build a tool that generates Bitcoin addresses of different types.
- Skills practiced: Key generation, hashing, address encoding
- Suggested stack: Python + python-bitcoinlib, or JavaScript + bitcoinjs-lib
- Related sections: Prerequisites, Bitcoin Fundamentals
Steps:
- Generate a random private key
- Derive the public key (secp256k1)
- Generate a Legacy address (P2PKH —
1...) - Generate a SegWit address (P2WPKH —
bc1q...) - Generate a Taproot address (P2TR —
bc1p...) - Display the private key in WIF format
- Verify the addresses using
bitcoin-cli validateaddress
2. Transaction Parser
Build a tool that decodes and displays raw Bitcoin transactions.
- Skills practiced: Transaction structure, serialization, Script opcodes
- Suggested stack: Python or Rust
- Related sections: Bitcoin Architecture
Steps:
- Accept a raw transaction hex as input
- Parse the version, inputs, outputs, and locktime
- For each input: display txid, vout, scriptSig
- For each output: display value, scriptPubKey, address type
- Calculate and display the txid (double SHA-256 of serialized tx)
- Handle both legacy and SegWit transaction formats
- Test with transactions from
bitcoin-cli getrawtransaction
3. CLI Wallet
Build a simple command-line wallet that manages keys and sends transactions.
- Skills practiced: HD key derivation, wallet management, RPC interaction
- Suggested stack: JavaScript + bitcoinjs-lib + bip32/bip39, or Rust + BDK
- Related sections: Wallet Development, Basic Development
Steps:
- Generate a mnemonic seed phrase (BIP-39)
- Derive HD keys using BIP-84 path (
m/84'/1'/0'/0/ifor testnet) - Generate receiving addresses
- Display balance by querying the node
- Build and sign a transaction to send funds
- Broadcast the transaction
- Save/load wallet state to a file (encrypted)
Intermediate
4. Block Explorer
Build a web-based block explorer for your local regtest network.
- Skills practiced: RPC integration, data modeling, web development
- Suggested stack: Node.js + Express + any frontend, or Python + Flask
- Related sections: Libraries & SDKs
Steps:
- Connect to Bitcoin Core via RPC
- Display the latest blocks with hash, height, timestamp, tx count
- Click a block to see its transactions
- Click a transaction to see inputs, outputs, and amounts
- Search by block hash, txid, or address
- Display mempool stats (unconfirmed transactions, total fees)
- Add auto-refresh or WebSocket updates
5. Payment Processor
Build a simple payment processing system that generates invoices and tracks payments.
- Skills practiced: Address generation, payment detection, webhook patterns
- Suggested stack: Node.js or Python + Bitcoin Core RPC
- Related sections: Payment Processing
Steps:
- Generate a unique address per invoice (HD derivation)
- Create an invoice endpoint:
POST /invoice→ returns address + amount - Monitor the blockchain for incoming payments
- Track confirmation count for each payment
- Mark invoices as paid after N confirmations
- Add a webhook callback when payment is confirmed
- Build a simple dashboard showing invoice status
6. Mempool Monitor
Build a tool that monitors the mempool and provides fee estimation.
- Skills practiced: Mempool analysis, fee estimation, data visualization
- Suggested stack: Python or JavaScript + Bitcoin Core RPC
- Related sections: P2P Network, Bitcoin Architecture
Steps:
- Poll
getmempoolinfoandgetrawmempoolperiodically - Group transactions by fee rate (sat/vB)
- Display a fee rate distribution histogram
- Track mempool size over time
- Estimate confirmation time for different fee rates
- Alert when mempool exceeds a threshold
- Visualize with a web dashboard or terminal chart
Advanced
7. Multisig Wallet
Build a 2-of-3 multisig wallet with PSBT signing workflow.
- Skills practiced: Multisig, PSBT, descriptor wallets, collaborative signing
- Suggested stack: Rust + BDK, or JavaScript + bitcoinjs-lib
- Related sections: Advanced Protocols, Wallet Development
Steps:
- Generate 3 independent key pairs (simulating 3 signers)
- Create a 2-of-3 multisig descriptor (
wsh(sortedmulti(2,...))) - Derive receiving addresses from the descriptor
- Receive funds to a multisig address
- Create an unsigned PSBT for a spending transaction
- Sign with key 1 → partially signed PSBT
- Sign with key 2 → fully signed PSBT
- Finalize and broadcast
8. Lightning Payment Gateway
Build a payment gateway that accepts Lightning payments.
- Skills practiced: Lightning integration, invoice management, webhook systems
- Suggested stack: Node.js + LND gRPC, or Rust + LDK
- Related sections: Payment Processing, Protocols on Bitcoin
Steps:
- Connect to an LND node via gRPC (or build with LDK)
- Create BOLT-11 invoices with amount and description
- Monitor for invoice settlement (streaming RPC or polling)
- Generate a QR code for the invoice
- Build a REST API: create invoice, check status, list payments
- Add webhook notifications on payment settlement
- Display a simple checkout page
9. Custom Indexer
Build a blockchain indexer that tracks address balances and transaction history.
- Skills practiced: Blockchain parsing, database design, UTXO tracking
- Suggested stack: Rust or Go + PostgreSQL/SQLite
- Related sections: Bitcoin Architecture, P2P Network
Steps:
- Connect to Bitcoin Core and subscribe to new blocks
- Parse each block's transactions
- Extract inputs and outputs with addresses
- Maintain a UTXO set in a database
- Track address balances (sum of unspent outputs)
- Build an API: get balance, get transaction history, get UTXOs
- Handle reorgs (rollback when a block is disconnected)
- Index from genesis or from a specific height
Tips for All Projects
- Start on regtest — Instant blocks, free coins, full control
- Use
bitcoin-clifirst — Understand the RPC calls before coding - Read the source — When stuck, look at how existing tools solve the problem
- Keep it simple — Get the basic flow working before adding features
- Share your work — Open-source your projects, get feedback from the community