#bitcoin #blockchain #parser #cryptocurrency #litecoin #block-index #merkle-root

app rusty-blockparser

基于比特币的常见加密货币的区块链解析器

12个版本 (7个破坏性版本)

0.11.0 2023年7月10日
0.9.0 2023年4月17日
0.8.1 2020年8月9日
0.8.0 2020年7月22日
0.4.0 2016年1月29日

#483 in 神奇豆

GPL-3.0 许可证

220KB
4K SLoC

rusty-blockparser

rusty-blockparser 是用 Rust 语言 编写的 Bitcoin 区块链解析器。

它允许从基于比特币的区块链中提取各种数据类型(区块、交易、脚本、公钥/哈希、余额等)和 UTXO 导出。

当前支持的区块链

BitcoinNamecoinLitecoinDogecoinMyriadcoinUnobtaniumNoteBlockchain

重要:它假定有一个本地未修剪的区块链副本,带有完整的区块索引和 blk 文件,使用 Bitcoin Core 0.15.1+ 或类似客户端下载。如果您不确定您的本地副本是否有效,您可以应用 --verify 以验证链和区块 Merkle 树。如果有什么不匹配,解析器会退出。

使用方法

Usage: rusty-blockparser [OPTIONS] [COMMAND]

Commands:
  unspentcsvdump  Dumps the unspent outputs to CSV file
  csvdump         Dumps the whole blockchain into CSV files
  simplestats     Shows various Blockchain stats
  balances        Dumps all addresses with non-zero balance to CSV file
  opreturn        Shows embedded OP_RETURN data that is representable as UTF8
  help            Print this message or the help of the given subcommand(s)

Options:
      --verify
          Verifies merkle roots and block hashes
  -v...
          Increases verbosity level. Info=0, Debug=1, Trace=2 (default: 0)
  -c, --coin <NAME>
          Specify blockchain coin (default: bitcoin) [possible values: bitcoin, testnet3, namecoin, litecoin, dogecoin, myriadcoin, unobtanium, noteblockchain]
  -d, --blockchain-dir <blockchain-dir>
          Sets blockchain directory which contains blk.dat files (default: ~/.bitcoin/blocks)
  -s, --start <HEIGHT>
          Specify starting block for parsing (inclusive)
  -e, --end <HEIGHT>
          Specify last block for parsing (inclusive) (default: all known blocks)
  -h, --help
          Print help
  -V, --version
          Print version

示例

要生成 Bitcoin 区块链的 unspentcsvdump,您的命令将如下所示

# ./blockparser unspentcsvdump /path/to/dump/
[6:02:53] INFO - main: Starting rusty-blockparser v0.7.0 ...
[6:02:53] INFO - index: Reading index from ~/.bitcoin/blocks/index ...
[6:02:54] INFO - index: Got longest chain with 639626 blocks ...
[6:02:54] INFO - blkfile: Reading files from ~/.bitcoin/blocks ...
[6:02:54] INFO - parser: Parsing Bitcoin blockchain (range=0..) ...
[6:02:54] INFO - callback: Using `unspentcsvdump` with dump folder: /path/to/dump ...
[6:03:04] INFO - parser: Status: 130885 Blocks processed. (left: 508741, avg: 13088 blocks/sec)
...
[10:28:47] INFO - parser: Status: 639163 Blocks processed. (left:    463, avg:    40 blocks/sec)
[10:28:57] INFO - parser: Status: 639311 Blocks processed. (left:    315, avg:    40 blocks/sec)
[10:29:07] INFO - parser: Status: 639452 Blocks processed. (left:    174, avg:    40 blocks/sec)
[10:29:17] INFO - parser: Status: 639596 Blocks processed. (left:     30, avg:    40 blocks/sec)
[10:29:19] INFO - parser: Done. Processed 639626 blocks in 266.43 minutes. (avg:    40 blocks/sec)
[10:32:01] INFO - callback: Done.
Dumped all 639626 blocks:
        -> transactions: 549390991
        -> inputs:       1347165535
        -> outputs:      1359449320
[10:32:01] INFO - main: Fin.

安装

此工具应在 Windows、OS X 和 Linux 上运行。您只需要 rustcargo

最新版本

您可以从 crates.io 下载最新版本

cargo install rusty-blockparser

从源代码构建

git clone https://github.com/gcarq/rusty-blockparser.git
cd rusty-blockparser
cargo build --release
cargo test --release
./target/release/rusty-blockparser --help

重要的是要以 --release 构建,否则您将得到可怕的性能!

在 Gentoo Linux 上使用 rust-stable 1.44.1 进行测试

支持的交易类型

Bitcoin 和 Bitcoin Testnet 交易使用 rust-bitcoin 进行解析,包括 P2SH、P2PKH、P2PK、P2WSH、P2WPKH、P2TR、OP_RETURN 和 SegWit 类型的交易。

Bitcoin 分叉(例如:Dogecoin、Litecoin 等)通过自定义脚本实现进行评估,包括 P2PK、P2PKHP2SH 和一些非标准交易。

内存使用

所需的内存使用量取决于所使用的回调

  • simplestats: ~100MB
  • csvdump: ~100M
  • unspentcsvdump: ~18GB
  • balances: ~18GB

注意:这些值是从解析到区块高度 639631(2020年7月17日)得出的。

回调

回调建立在核心解析器之上。可以实现对特定类型信息的提取。

  • balances:导出所有非零余额的地址。CSV 文件格式如下

    balances.csv
    address ; balance
    
  • unspentcsvdump:导出所有 UTXO 以及地址余额。CSV 文件格式如下

    unspent.csv
    txid ; indexOut ; height ; value ; address
    

    注意:CSV 导出的总大小至少为 8 GiB(高度 635000)。

  • opreturn:显示包含可表示为 UTF8 的 OP_RETURN 数据的交易。

  • csvdump:将所有解析数据作为 CSV 文件导出到指定的 folder 中。有关示例,请参阅 用法。我选择 CSV 导出而不是活动数据库连接,因为 LOAD DATA INFILE 是批量插入性能最高的方式。文件格式如下

    blocks.csv
    block_hash ; height ; version ; blocksize ; hashPrev ; hashMerkleRoot ; nTime ; nBits ; nNonce
    
    transactions.csv
    txid ; hashBlock ; version ; lockTime
    
    tx_in.csv
    txid ; hashPrevOut ; indexPrevOut ; scriptSig ; sequence
    
    tx_out.csv
    txid ; indexOut ; height ; value ; scriptPubKey ; address
    

    如果对某些字段不清楚,请参阅 区块交易 规范。如果您想将文件插入到 MySql,请参阅 sql/schema.sql。它包含所有表结构和批量插入的 SQL 语句。还可以参阅 sql/views.sql 以获取一些查询示例。注意:CSV 导出的总大小至少为 731 GiB(高度 635000)。

  • simplestats:打印一些区块链统计信息,如区块数量、交易数量、每块平均交易数、最大交易、交易类型等。

您还可以定义自定义回调。回调在启动时、每个块和结束时被调用。有关更多信息,请参阅 src/callbacks/mod.rs

贡献

使用问题跟踪器报告问题、建议和问题。您还可以通过提交拉取请求来贡献。

如果您觉得这个项目有帮助,请考虑捐赠:1LFidBTeg5joAqjw35ksebiNkVM8azFM1K

为您的币定制工具

该工具可以轻松定制到您的币。本节概述了需要进行的更改,并面向 Rust 和区块链的初学者用户。(本指南由审查 MerlinMagic2018 的提交而成)。在以下示例中使用的币名是 NoCoinium。

  • 主要更改是 src/blockchain/parser/types.rs
  • 在以下行之上添加一个新条目 pub struct NoCoinium(您在这里使用的首字母大写情况应适用于所有后续引用,除非另有说明)
  • 然后,您需要添加一个 impl Coin for NoCoinium。您可以轻松地复制一个之前的块,例如比特币。下面以注释形式突出显示您需要做的更改
//The name here should be the same case as defined in the pub struct line
impl Coin for NoCoinium {
    fn name(&self) -> String {
        //This is primarily for display. Use same case as before
        String::from("NoCoinium")
    }
    fn magic(&self) -> u32 {
        // Magic bytes are a string of hex characters that prefix messages in the chain. 
        // To find this value, look for the fields pchMessageStart[0-3] in the file chainparams.cpp under CMainParams
        // The value to be used here is 0x + pchMessageStart[3] + pchMessageStart[2] + pchMessageStart[1] + pchMessageStart[0]
        // i.e. string the values in reverse.
        0xd9b4bef9
    }
    fn version_id(&self) -> u8 {
        // Version ID is used to identify the address prefix for Base58 encoding of the public address
        // Found this using the stackoverflow comment - https://bitcoin.stackexchange.com/questions/62781/litecoin-constants-and-prefixes
        // Again with chainparams.cpp and CMainParams, look for base58Prefixes[PUBKEY_ADDRESS]. Convert the decimal value to Hex and add it here
        0x00
    }
    fn genesis(&self) -> sha256d::Hash {
        // This is the Genesis Block hash - Get the value from consensus.hashGenesisBlock, again found in chainparams.cpp
        sha256d::Hash::from_str("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f").unwrap()
    }
    fn default_folder(&self) -> PathBuf {
        // This is the folder from the user's home folder to where the blocks files are found
        // Note the case here. It is not CamelCase as most coin directories are lower case. However, use the actual folder name
        // from your coin implementation.
        Path::new(".nocoinium").join("blocks")
    }
}
  • 最后,将这些更改绑定到 impl FromStr for CoinType 下的 match coin。第一部分将是作为程序参数传递的案例(见下面的项目符号),而 from() 中的名称将是上面使用的名称。
"nocoinium" => Ok(CoinType::from(NoCoinium)),
  • 下一个更改是在 src/main.rs 中。在 fn parse_args() 下添加您的硬币到硬币数组。您在这里使用的案例将与执行区块链时传递的参数(使用 -c 参数)相同。
  • 最后,在 README.md 文件中添加您的硬币名称,以便其他人知道您的硬币已支持

待办事项

  • 实现 Pay2MultiSig 脚本评估

依赖项

~11–22MB
~224K SLoC