2 releases

0.1.1 Oct 4, 2024
0.1.0 Aug 3, 2024

#191 in #bitcoin

30 downloads per month

MIT license

25KB
411 lines

Biter

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 (from bitcoin-rust)
  • Block's Hash: BlockHash (also from bitcoin-rust)

Example

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());
}

Requirements

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.

Comparaison

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

Dependencies

~11MB
~169K SLoC