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
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/x64
、MacOS x86_64/arm64
和Linux 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
))
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