Biter (Bitcoin Block Iterator) is a very fast and simple Rust library which reads raw block files (blkXXXXX.dat) from Bitcoin Core Node and creates an iterator over all the requested blocks in sequential order (0, 1, 2, ...).
The element returned by the iterator is a tuple which includes the:
- Height:
usize
- Block:
Block
(frombitcoin-rust
) - Block's Hash:
BlockHash
(also frombitcoin-rust
)
use bitcoincore_rpc::{Auth, Client};
fn main() {
let i = std::time::Instant::now();
// Path to the Bitcoin data directory
let data_dir = "../../bitcoin";
// Path to the export directory where a mini blk indexer will be exported
let export_dir = "./target";
// Inclusive starting height of the blocks received, `None` for 0
let start = Some(850_000);
// Inclusive ending height of the blocks received, `None` for the last one
let end = None;
// RPC client to filter out forks
let url = "http://localhost:8332";
let auth = Auth::UserPass("satoshi".to_string(), "nakamoto".to_string());
let rpc = Client::new(url, auth).unwrap();
// Create channel receiver then iterate over the blocks
biter::new(data_dir, export_dir, start, end, rpc)
.iter()
.for_each(|(height, _block, hash)| {
println!("{height}: {hash}");
});
dbg!(i.elapsed());
}
Even though it reads blkXXXXX.dat files, it needs bitcoind
to run with the RPC server to filter out block forks.
Peak memory should be around 500MB.
biter | bitcoin-explorer | blocks_iterator | |
---|---|---|---|
Run with bitcoind |
Yes ✅ | No ❌ | Yes ✅ |
Run without bitcoind |
No ❌ | Yes ✅ | Yes ✅ |
0..=855_000 |
16mn40s | 17mn 46s | > 2h |
800_000..=855_000 |
2mn 53s (16mn40s if first run) | 3mn 2s | > 2h |
Benchmarked on a Macbook Pro M3 Pro