#bitcoin #crypto #parser #block #input #tracking #output

bin+lib bitcoin-block-parser

Blazing fast parser for bitcoin 'blocks' data with input amount and output spend tracking

12 unstable releases (3 breaking)

0.5.3 Jan 1, 2025
0.5.2 Nov 23, 2024
0.3.4 Nov 14, 2024
0.3.2 Oct 18, 2024
0.1.1 Sep 13, 2024

#101 in #tracking

Download history 38/week @ 2024-09-24 19/week @ 2024-10-01 2/week @ 2024-10-08 336/week @ 2024-10-15 29/week @ 2024-10-22 3/week @ 2024-10-29 10/week @ 2024-11-05 230/week @ 2024-11-12 330/week @ 2024-11-19 62/week @ 2024-11-26 1/week @ 2024-12-03 21/week @ 2024-12-10 176/week @ 2024-12-31 3/week @ 2025-01-07

179 downloads per month

MIT license

55KB
897 lines

Bitcoin Block Parser

Crates.io Docs MIT licensed

Blazing fast parser for bitcoin blocks data with input amount and output spend tracking.

⚠️ The API is still evolving and should not be considered stable until release 1.0.0

Features

  • Parses blocks into the Rust bitcoin Block format for easier manipulation
  • Can track if any TxOut is spent or unspent for calculations on the UTXO set
  • Can track the TxOut of every TxIn for calculating metrics such as fee rates
  • Multithreaded in-memory parsing provides fast block parsing performance

Requirements / Benchmarks

  • You must be running a non-pruning bitcoin node (this is the default configuration)
  • We recommend using fast storage (e.g. NVMe) and a multithreaded CPU for best performance
  • See benchmarks below to understand how much RAM you may need:
Function Time Memory
BlockParser::parse()
Parses blocks
2m 55s 0.9 GB
UtxoParser::create_filter()
Create a new filter
15m 12s 2.6 GB
UtxoParser::parse()
Parse with existing filter
18m 30s 12.1 GB

Our benchmarks were run on NVMe storage with a 32-thread processor on 800,000 blocks.

Quick Usage

See BlockParser for details on how to parse blocks:

use bitcoin_block_parser::*;

// Initialize a logger (if you want to monitor parsing progress)
env_logger::builder().filter_level(log::LevelFilter::Info).init();

// Parse all blocks in the directory and map them to total_size
let parser = BlockParser::new("/home/user/.bitcoin/blocks/").unwrap();
for size in parser.parse(|block| block.total_size()) {
  // Do something with the block sizes
}

See UtxoParser for details on how to track inputs and outputs:

use bitcoin_block_parser::*;

// Load a filter file or create a new one for tracking output status
let parser = UtxoParser::new("/home/user/.bitcoin/blocks/", "filter.bin");
for txdata in parser.parse(|block| block.txdata).unwrap() {
  for tx in txdata {
    for (output, status) in tx.output() {
      // Do something with the output status
    }
    for (input, output) in tx.input() {
      // Do something with TxOut that are used in the inputs
    }
  }
}

Dependencies

~11–17MB
~178K SLoC