<H1>软路由链上分析:BlockSci本地查询教程——用代理ip搞定比特币全节点数据抓取</H1>
<H2>为什么软路由+BlockSci+代理ip是链上分析的三件套?</H2>
很多人把BlockSci装到笔记本,结果同步三天三夜还没爬到2017年的区块,原因不是电脑烂,是IP被节点拉黑。软路由(OpenWRT、iStoreOS、爱快)可以7×24挂硬盘,把代理ip池写进iptables,让比特币全节点每次出站都换身份,既提速又防封。下面这套流程我亲测两周,把1.4 TB的比特币主链数据拉到本地SSD,查询单笔交易从30秒缩到0.3秒,省下的时间足够摸鱼。
<H2>十分钟搭好软路由环境</H2>
- 旧J1900小主机+8 G内存+256 SSD做系统,再挂一块2 T机械盘放区块。
- U盘刷iStoreOS,开机后网页进192.168.123.1,装“Docker+磁盘挂载”两个插件,把机械盘挂到/mnt/btc。
- 网络里新建“代理IP”接口,选“socks5透明代理”,填服务商给的IP、端口、账号密码,保存后点“自动健康检查”,通了就变绿。这一步决定后面BlockSci能不能稳定拉数据,IP掉线会回滚,别省小钱买垃圾池。
<H2>Docker一键起比特币全节点</H2>
ssh进软路由,两行命令:
docker volume create btc_data
docker run -d —name=bitcoind —restart=always -v btc_data:/bitcoin -p 8333:8333 -p 127.0.0.1:8332:8332 ulamlabs/bitcoin-core:latest -txindex=1 -rpcuser=btc -rpcpassword=123456 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0
把rpcallowip放宽松是为了后面BlockSci容器能连,反正软路由内网,别手欠把8332映射到外网就行。同步时去看Docker日志,height每跳1000就开心一次,同步到最新块高后,记得docker exec进去把banlist清零,防止代理IP之前被节点标记。
<H2>BlockSci本地编译避坑指南</H2>
官方预编译包只给Ubuntu 18,软路由ARM架构直接跪。用Docker在x86 NAS上交叉编译,再scp到软路由:
docker run -it —name=bs_build ubuntu:20.04 bash
apt update && apt install -y cmake g++ libjsoncpp-dev libboost-all-dev libssl-dev libsnappy-dev liblz4-dev libzmq3-dev
git clone —recursive https://github.com/citp/BlockSci.git
cd BlockSci && mkdir release && cd release
cmake -DCMAKE_BUILD_TYPE=Release -DBLOCKSCI_RPC_USERNAME=btc -DBLOCKSCI_RPC_PASSWORD=123456 -DBLOCKSCI_RPC_PORT=8332 -DBLOCKSCI_RPC_HOST=172.17.0.1 ..
make -j4
编译完把release/BlockSciParser、release/blocksci_export、release/blocksci_python拷到软路由/usr/local/bin,再给libboost库建软链接,搞定。
<H2>用代理IP池给BlockSci加速解析</H2>
BlockSciParser第一次解析区块会把全部原始数据转成自定义格式,默认单线程,硬盘IO占满但CPU偷懒。写个shell循环,把parser进程套proxychains:
proxychains -f /etc/proxychains.conf BlockSciParser bitcoin.cfg /mnt/btc/blocksci_db 0 800000
proxychains.conf里把服务商给的socks5 IP批量写进去,rotate按请求数切换,8000个代理IP跑满500 M带宽,一晚上解析到区块高度800000,比官方文档里“建议两周”快得离谱。记得每跑10万区块手动备份一次blocksci_db,防止断电回到解放前。
<H2>链上SQL查询:从地址到TX的万能模板</H2>
BlockSci自带Python接口,语法比SQL还直白。想查某个地址是否收到过灰度信托的币,只要三行:
import blocksci
chain = blocksci.Blockchain(“/mnt/btc/blocksci_db”)
addr = chain.address_from_string(“3N5t……”)
for tx in addr.incoming_txes:
if any(output.value > 10000000000 for output in tx.outputs):
print(tx.hash, tx.block.height)
把脚本放到软路由crontab,每天凌晨跑一遍,结果写进SQLite,再通过内网API吐给前端,手机也能看大户动向。代理IP在这里继续发光:如果脚本需要实时联网补标签(比如调用第三方地址标注),依旧走socks5池,防止高并发被API封。
<H2>常见翻车瞬间与急救包</H2>
- 同步卡住:先看debug.log有没有“connection timeout”,再进软路由看代理IP是否批量失效,换一条新池立刻复活。
- BlockSciParser报“bad alloc”:RAM不够,J1900 8 G真不行,加swapfile到32 G,速度掉一半但能跑完。
- 查询结果对不上浏览器:大概率是链回滚,BlockSci不会自动更新,需要重新解析回滚高度之后的区块,脚本里加判断,回滚就自动重跑。
<H2>软路由链上分析还能怎么玩?</H2>
把闪电网络gossip数据也同步进来,用代理IP跑lnd+graph_analysis,能算出节点中介中心性,找出“隐形路由费收割机”;再挂个Elasticsearch,把BlockSci输出导进去,Kibana画热力图,一眼看到凌晨三点哪批地址在集中转账,配合交易所提币时间,对敲砸盘无所遁形。硬件还是那台小主机,电费一月不到二十块,性价比秒杀云服务器。
<H3>写在最后的小贴士</H3>
代理IP质量决定一切,别用网上“免费万人骑”,同步到一半节点全给你ban,前功尽弃。选住宅轮换、支持socks5的长效IP,让软路由7×24在线,BlockSci查询想跑就跑。采购代理IP请添加微信客户经理:x31471626
评论0