Blockstream Explorer 搭建记录
最近做实验需要实时查询交易的链上状态,不带 API KEY 去请求 https://blockstream.info/testnet/api/ 太频繁会被限流,而且持续一天后直接被拉黑,正好同时也有维护 Bitcoin testnet3 节点的需求,因此决定 DIY 一个 Blockstream Explorer,在此将节点与 Blockstream electrs / esplora 的搭建过程做一下记录
Bitcoin 节点搭建
Blockstream electrs 节点搭建
由于区块解析器存在问题,解析区块极有可能报 Error(Msg("mssing txo ...")) 错误,根据 Github Issue(Issue 1、Issue 2),需要在启动参数中添加 --jsonrpc-import,来让 electrs 节点通过比特币节点的 RPC 获取区块信息,而不是之前通过直接解析 blk*.dat 文件来获取区块信息,但速度较慢(测试链大概用了 24h)
此外,直接让 electrs 节点通过 RPC 请求区块信息可能会报 WARN reconnecting to bitcoind: Error: Connection error: ... 类似警告,根据 Github Issue electrs - syncing error with bitcoin core 28 · Issue #158 · Blockstream/electrs,这是因为 electrs 节点会并发请求比特币节点导致超过了节点默认可以处理的并发数,因此需要根据 这条提交评论 修改节点配置:
D = electrs 的 –daemon-parallelism 并发参数 D,应该设置为分配给容器的 CPU 核心数,默认值为 2
E = electrs 实例数量
B = Bitcoin Core 实例数量
则
bitcoin.conf中的配置为:rpcthreads=ceil(E/B) * (D + 3) rpcworkqueue=ceil(E/B) * D * 8 rpcservertimeout=600
虽然处理器有 24 线程,考虑到部署后不会有太多并发请求,就设置了 --daemon-parallelism=4,bitcoin.conf 中对应的配置为:
rpcthreads=7
rpcworkqueue=32
rpcservertimeout=600
由于我们是自己编译安装的 gcc-11,为了让 electrs 使用 gcc-11 的 libstdc++.so.6,需要手动加入环境变量中,启动命令为:
sudo LD_LIBRARY_PATH=/opt/gcc-11/lib64:$LD_LIBRARY_PATH ./electrs/target/release/electrs --network testnet --daemon-dir ~/blockchain/bitcoin/data/ --db-dir ./db --jsonrpc-import --daemon-parallelism=4
程序启动后,首先会从比特币节点下载区块头,这个过程大概会持续 16h:
INFO downloading all block headers up to ...
INFO fetching blocks .../... (...%)
INFO processing blocks .../... (...%)
完成后会压缩 RocksDB 数据库,过程大概也会持续 7h:
INFO starting full compaction on RocksDB { path: "./db/testnet/newindex/txstore" }
INFO finished full compaction on RocksDB { path: "./db/testnet/newindex/txstore" } in elapsed='13753.3s'
INFO starting full compaction on RocksDB { path: "./db/testnet/newindex/history" }
INFO finished full compaction on RocksDB { path: "./db/testnet/newindex/history" } in elapsed='8162.1s'
INFO starting full compaction on RocksDB { path: "./db/testnet/newindex/cache" }
INFO finished full compaction on RocksDB { path: "./db/testnet/newindex/cache" } in elapsed='166.7ms'
完成后默认会将 Rest Server 开在 http://127.0.0.1:3001、Electrum RPC server 开在 127.0.0.1:60001