Expand description
§brk_indexer
Full Bitcoin blockchain indexer for fast analytics queries.
§What It Enables
Transform raw Bitcoin blockchain data into indexed vectors and key-value stores optimized for analytics. Query any block, transaction, address, or UTXO without scanning the chain.
§Key Features
- Multi-phase block processing: Parallel TXID computation, input/output processing, sequential finalization
- Address indexing: Maps addresses to their transaction history and UTXOs per address type
- UTXO tracking: Live outpoint→value lookups, address→unspent outputs
- Reorg handling: Automatic rollback to valid chain state on reorganization
- Collision detection: Validates rapidhash-based prefix lookups against known duplicate TXIDs
- Incremental snapshots: Periodic checkpoints for crash recovery
§Core API
ⓘ
let mut indexer = Indexer::forced_import(&outputs_dir)?;
// Index new blocks
let starting_indexes = indexer.index(&blocks, &client, &exit)?;
// Access indexed data
let txindex = indexer.stores.txidprefix_to_txindex.get(&txid_prefix)?;
let blockhash = indexer.vecs.blocks.blockhash.get(height)?;§Data Structures
Vecs (append-only vectors):
blocks:blockhash,timestamp,difficulty,total_size,weighttransactions:txid,first_txinindex,first_txoutindexinputs:outpoint,txindexoutputs:value,outputtype,typeindex,txindexaddresses: Per-typep2pkhbytes,p2shbytes,p2wpkhbytes, etc.
Stores (key-value lookups):
txidprefix_to_txindex- TXID lookup via 10-byte prefixblockhashprefix_to_height- Block lookup via 4-byte prefixaddresstype_to_addresshash_to_addressindex- Address lookup per typeaddresstype_to_addressindex_and_unspentoutpoint- Live UTXO set per address
§Processing Pipeline
- Block metadata: Store blockhash, difficulty, timestamp
- Compute TXIDs: Parallel SHA256d across transactions
- Process inputs: Lookup spent outpoints, resolve address info
- Process outputs: Extract addresses, assign type indexes
- Finalize: Sequential store updates, UTXO set mutations
- Commit: Periodic flush to disk
§Performance
| Machine | Time | Disk | Peak Disk | Memory | Peak Memory |
|---|---|---|---|---|---|
| MBP M3 Pro (36GB, internal SSD) | 3h | 247 GB | 314 GB | 5.2 GB | 11 GB |
| Mac Mini M4 (16GB, external SSD) | 4.9h | 233 GB | 303 GB | 5.4 GB | 11 GB |
Full benchmark data: bitcoinresearchkit/benches
§Recommended: mimalloc v3
Use mimalloc v3 as the global allocator to reduce memory usage.
§Built On
vecdbfor append-only vectorsbrk_cohortfor address type handlingbrk_iteratorfor block iterationbrk_storefor key-value storagebrk_typesfor domain types
Macros§
- parallel_
import - Imports multiple items in parallel using thread::scope.
Each expression must return Result
.
Structs§
- Addresses
Vecs - Block
Processor - Processes a single block, extracting and storing all indexed data.
- Blocks
Vecs - Computed
Tx - Indexer
- Indexes
- Blockchain-level indexes tracking current positions for various entity types. Used by brk_indexer during block processing.
- Inputs
Vecs - Outputs
Vecs - Processed
Output - Readers
- Readers for vectors that need to be accessed during block processing. These provide consistent snapshots for reading while the main vectors are being modified.
- Same
Block Output Info - Scripts
Vecs - Stores
- Transactions
Vecs - Vecs
Enums§
Traits§
- Indexes
Ext - Extension trait for Indexes with brk_indexer-specific functionality.