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 在 神奇豆
每月57次 下载
在 txood 中使用
100KB
2K SLoC
区块迭代器
遍历比特币区块,解码 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
- heaviest 查找具有最大权重的交易
- most_output 查找具有最多输出的交易
- outputs_versions 计算输出见证版本
- signatures_in_witness 计算见证中的签名
- verify 使用libbitcoin-consensus验证区块中的交易。消费者并行运行。
版本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