41 个版本 (稳定)

1.2.20 2023 年 5 月 19 日
1.2.18 2022 年 11 月 25 日
1.2.17 2022 年 1 月 5 日
1.2.16 2021 年 12 月 28 日
0.2.22 2021 年 10 月 2 日

#624 in 神奇豆子


用于 区块链周期查找器

自定义许可证

99KB
2K SLoC

bitcoin-explorer

rust test publish Crates.io Downloads

bitcoin_explorer 是一个从比特币区块链解码交易信息的有效库。

支持比特币主网,可能未来会支持其他网络。

特性

1. 区块和脚本解码

  • 根据区块高度或区块哈希查询区块。
  • 支持 tx_index=1
  • 使用 UTXO 缓存(iter_connected_block())查找输入地址。

2. 并发 + 迭代器 + 顺序输出

  • 快速并发反序列化,但产生顺序输出。
  • 原生迭代器接口(支持 for in 语法)。

3. 小内存占用(< 4 GB RAM)

  • 使用快速的磁盘 UTXO 存储(RocksDB)。

4. 为 Rust + Python(跨平台 PyPI 轮)编译

  • python 3.6-3.10 编译并发布 PyPI 轮,适用于 Windows x86/x64MacOS x86_64/arm64Linux x86_64
  • 名为 bitcoin-explorer 的 Rust 库在 crates.io 上。

文档

Rust 文档

示例

获取磁盘上可用的总区块数和交易数

use bitcoin_explorer::{BitcoinDB, FConnectedBlock, SConnectedBlock};
use std::path::Path;

fn main() {

    let path = Path::new("/Users/me/bitcoin");
    let db = BitcoinDB::new(path, false).unwrap();

    let block_count = db.get_block_count();

    let total_number_of_transactions = (0..block_count)
        .map(|i| db.get_header(i).unwrap().n_tx)
        .sum::<u32>();

}

获取一个区块(即,见文档了解完整/简单格式(FBlock/SBlock))

use bitcoin_explorer::{BitcoinDB, FBlock, SBlock, Block};
use std::path::Path;

fn main() {
    let path = Path::new("/Users/me/bitcoin");

    // launch without reading txindex
    let db = BitcoinDB::new(path, false).unwrap();

    // get block of height 600000 (in different formats)
    let block: Block = db.get_block(600000).unwrap();
    let block: FBlock = db.get_block(600000).unwrap();
    let block: SBlock = db.get_block(600000).unwrap();
}

获取一个交易(不同格式)

注意:这需要使用 Bitcoin Core 使用 --txindex=1 标志构建 tx 索引。

use bitcoin_explorer::{BitcoinDB, Transaction, FTransaction, STransaction, Txid, FromHex};
use std::path::Path;

fn main() {
    let path = Path::new("/Users/me/bitcoin");

    // !!must launch with txindex=true!!
    let db = BitcoinDB::new(path, true).unwrap();

    // get transaction
    // e3bf3d07d4b0375638d5f1db5255fe07ba2c4cb067cd81b84ee974b6585fb468
    let txid_str = "e3bf3d07d4b0375638d5f1db5255fe07ba2c4cb067cd81b84ee974b6585fb468";
    let txid = Txid::from_hex(txid_str).unwrap();

    // get transactions in different formats
    let tx: Transaction = db.get_transaction(&txid).unwrap();
    let tx: FTransaction = db.get_transaction(&txid).unwrap();
    let tx: STransaction = db.get_transaction(&txid).unwrap();
}

遍历所有块(不同格式)

use bitcoin_explorer::{BitcoinDB, Block, SBlock, FBlock};
use std::path::Path;

fn main() {
    let path = Path::new("/Users/me/bitcoin");

    // launch without reading txindex
    let db = BitcoinDB::new(path, false).unwrap();

    // iterate over block from 0 to 1000
    for block in db.iter_block::<Block>(0, 1000) {
        for tx in block.txdata {
            println!("do something for this transaction");
        }
    }

    // iterate over block from 1000 to end
    for block in db.iter_block::<FBlock>(1000, db.get_block_count()) {
        for tx in block.txdata {
            println!("do something for this transaction");
        }
    }

    // iterate over block from 0 to end
    for block in db.iter_block::<SBlock>(0, db.get_block_count()) {
        for tx in block.txdata {
            println!("do something for this transaction");
        }
    }
}

遍历所有带有输入地址的块(ConnectedBlock

use bitcoin_explorer::{BitcoinDB, FConnectedBlock, SConnectedBlock};
use std::path::Path;

fn main() {

    let path = Path::new("/Users/me/bitcoin");

    // launch without reading txindex
    let db = BitcoinDB::new(path, false).unwrap();
    let end = db.get_block_count();

    // iterate over all blocks found (simple connected format)
    for block in db.iter_connected_block::<SConnectedBlock>(end) {
        for tx in block.txdata {
            println!("do something for this transaction");
        }
    }
}

硬件要求

内存要求

内存要求:8 GB 物理RAM。

磁盘要求

使用SSD以获得更好的性能。

基准测试

  • 操作系统:x86_64 Windows 10
  • CPU:Intel i7-9700 @ 3.00GHZ(4核心,8线程)
  • 内存:16 GB 2667 MHz
  • 磁盘:WDC SN730 512GB(SSD)

遍历所有块(0 - 700000)

db.iter_block::<SBlock>(0, 700000)
  • 时间:大约10分钟
  • 峰值内存:<= 500 MB

带有输入地址遍历所有块(0 - 700000)

db.iter_connected_block::<SConnectedBlock>(700000)

使用默认配置

使用默认功能编译(Cargo.toml)

bitcoin-explorer = "^1.2"
  • 时间:大约2.5小时
  • 峰值内存:4 GB

使用非默认配置(大量RAM以获得良好性能)

使用非默认功能编译(Cargo.toml)

bitcoin-explorer = { version = "^1.2", default-features = false }
  • 时间:大约30分钟
  • 峰值内存:32 GB

备注

兼容性

此包处理另一个软件的二元文件(Bitcoin Core)。它可能不兼容较旧的Bitcoin Core版本。

Bitcoin Core版本v0.21.1.0-g194b9b8792d9b0798fdb570b79fa51f1d1f5ebaf 版权 (C) 2009-2020 Bitcoin Core开发者上进行了测试。

非默认功能(内存中UTXO缓存)

如果您有超过32 GB的内存,您可能可以尝试将default-features = false用于在db.iter_connected_block()上获得更快的性能

bitcoin-explorer = { version = "^1.2", default-features = false }

依赖项

~10–15MB
~231K SLoC