#blocks #iterate #bitcoin #block

bin+lib blocks_iterator

遍历比特币区块

16 个版本 (5 个稳定版本)

1.0.4 2023年8月4日
1.0.3 2023年3月31日
1.0.2 2023年2月21日
1.0.1 2022年11月1日
0.2.0 2021年4月30日

#495神奇豆

Download history 150/week @ 2024-04-03 139/week @ 2024-04-10 99/week @ 2024-04-17 5/week @ 2024-04-24 128/week @ 2024-05-01 135/week @ 2024-05-08 122/week @ 2024-05-15 19/week @ 2024-05-22 2/week @ 2024-05-29 4/week @ 2024-06-05 57/week @ 2024-07-03

每月57次 下载
txood 中使用

MIT 许可证

100KB
2K SLoC

MIT license Crates Docs

区块迭代器

遍历比特币区块,解码 Bitcoin Core 区块目录中的数据。

功能

  • 区块按高度顺序返回,这避免了重组织(见 Config::max_reorg 参数)
  • 区块包含额外数据 BlockExtra,如所有区块的前一个输出,它允许计算交易费用或 验证 区块链中的脚本。

迭代模式

在 Rust 程序中

作为库使用时,可以通过 [iter()] 方法迭代区块,如下所示:

// "blocks" dir contains first 400 testnet blocks
let conf = blocks_iterator::Config::new("blocks", bitcoin::Network::Testnet);
let mut total_fee = 0u64;
for b in blocks_iterator::iter(conf) {
  total_fee += b.fee().expect("fee available cause we are keeping prevouts");
}

// Only a bunch of tx with fee exists on testnet with height < 400
// in blocks: 385, 387, 389, 390, 392, 394
assert_eq!(total_fee, 450_000u64);

当执行的任务计算成本较高时,例如验证消费条件,建议并行执行,就像在 验证 示例中所做的那样(注意 par_bridge() 调用)。

通过管道

除了在 Rust 程序内,还可以使用 Unix 管道迭代有序的区块及其前一个输出。

$ cargo build --release 
$ cargo build --release --examples
$ ./target/release/blocks_iterator --blocks-dir ~/.bitcoin/testnet3/blocks --network testnet --max-reorg 40 --stop-at-height 200000 | ./target/release/examples/with_pipe
...
[2023-03-31T15:01:23Z INFO  with_pipe] Max number of txs: 6287 block: 0000000000bc915505318327aa0f18568ce024702a024d7c4a3ecfe80a893d6c
[2023-03-31T15:01:23Z INFO  with_pipe] total missing reward: 50065529986 in 100 blocks
[2023-03-31T15:01:23Z INFO  with_pipe] most_output tx is 640e22b5ddee1f6d2d701e37877027221ba5b36027634a2e3c3ee1569b4aa179 with #outputs: 10001

如果您有更多消费者进程,可以通过将 stdout 传递给 PipeIterator::new 或使用 tee 工具拆分 blocks_iterator 的 stdout 来连接管道。后者更好,因为它不需要重新序列化数据。

内存需求和性能

运行(cargo run --release -- --network X --blocks-dir Y >/dev/null)在threadripper 1950X上,测试网 @ 2130k,主网 @ 705k。旋转磁盘。以下基准测试仅供参考,因为它们涉及旧版本。

网络 --skip--prevout --max-reorg utxo-db 内存 时间
主网 true 6 no 33MB 1h:00m
主网 false 6 no 5.3GB 1h:29m
主网 false 6 1次运行 201MB 9h:42m
主网 false 6 2次运行 113MB 1h:05m
测试网 true 40 no 123MB 3m:03s
测试网 false 40 no 1.4GB 8m:02s
测试网 false 40 1次运行 247MB 16m:12s
测试网 false 40 2次运行 221MB 8m:32s

文档

构建文档

RUSTDOCFLAGS="--cfg docsrs" cargo +nightly doc --all-features --open

示例

使用以下命令运行示例

cargo run --release --example verify

版本1.0的含义

1.0不应被视为经过战斗测试的生产级库,BlockExtra的二进制格式已更改,我想通过主要版本发布来强调这一点。

类似项目

  • bitcoin-iterate 这个项目启发了blocks_iterator,区别在于
    • 它是基于C的
    • 它更适合shell管道,而blocks_iterator可以用管道使用,也可以作为Rust库使用
    • 它不提供先前输出的信息
    • 它对blocks*.dat进行两次顺序遍历,而blocks_iterator并行进行两次遍历。
  • rust-bitcoin-indexer 这个项目需要更长的设置时间(大约9小时索引)和Postgre数据库,索引完成后允许在关系数据库上快速查询。
  • electrs 专门针对Electrum协议

MSRV

检查CI中运行的最小Rust版本,截至2023年8月为

  • 1.60.0无功能(需要一些锁定,请检查CI)
  • 1.66.0带有功能。

依赖关系

~13–22MB
~339K SLoC