Crate bitcoin_block_parser

Source
Expand description

§Bitcoin Block Parser

Crates.io Docs MIT licensed

Fast optimized parser for bitcoin blocks with input and output 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 Amount of every TxIn for calculating metrics such as fee rates
  • Multithreaded in-memory parsing provides the fastest 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:
FunctionTimeMemory
BlockParser::parse()
Parses blocks
2m 55s0.9 GB
UtxoParser::parse()
Tracks input amounts (no filter)
7m 41s25.0 GB
UtxoParser::create_filter()
Creates new filter
16m 09s5.6 GB
UtxoParser::load_filter().parse()
Tracks input & outputs (with filter)
7m 46s11.8 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 a value
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::*;

let parser = UtxoParser::new("/home/user/.bitcoin/blocks/").unwrap();
let blocks = parser.load_or_create_filter("filter.bin").unwrap().parse();
for block in blocks {
  for tx in block.txdata {
    for (output, status) in tx.output() {
      // Do something with the output status
    }
    for (input, amount) in tx.input() {
      // Do something with the input amounts
    }
  }
}

Re-exports§

Modules§