Pearl Wallet 同步故障排查与修复笔记
详细记录了解决 Pearl Wallet (PRL) 桌面钱包卡在高度 1、无法连接节点进行同步,并最终成功在本地恢复显示钱包余额的完整折腾过程。
本笔记详细记录了解决 Pearl Wallet (PRL) 桌面钱包卡在高度 1、无法连接节点进行同步,并最终成功在本地恢复显示钱包余额的完整折腾过程。
1. 问题背景与故障诊断
症状
- 现象:Pearl Wallet 桌面钱包 (v1.0.0) 启动后,高度一直卡在
1/1(或0),提示Lost peer或EOF。无论等待多久,都无法同步区块,导致钱包余额无法显示(处于未同步的假空状态)。 - 原因排查:
- GFW 干扰:国内直连节点可能存在丢包。
- 握手 Bug(核心原因):官方
v1.0.0版本的客户端在向主网 DNS 种子节点进行网络握手时,错误地为不支持过滤的主网种子节点请求了紧凑过滤标志 (HasFiltering),导致主网远程节点在收到握手后瞬间主动断开连接 (Lost peer)。
解决思路
- 在海外 VPS 上,拉取官方最新的修复源码(已屏蔽
HasFilteringbug),编译最新的运行程序。 - 用新程序在 VPS 上连接主网节点,快速同步区块头和 Neutrino 过滤器数据库。
- 从 VPS 导出一份包含“已连通健康节点”的
peers.json列表。 - 将同步好的区块头缓存、过滤器数据库和节点列表打包下载到本地钱包目录。
- 通过 Clash Verge 配置路由直连规则,保障钱包连接节点时不受代理网络波动干扰。
- 确认本地钱包正常显示余额后,完全清理 VPS 上的临时编译环境。
2. 折腾全过程详细记录
第一阶段:VPS 端编译最新 Oyster 钱包
- 重置环境:VPS 重置为 Ubuntu 22.04 LTS。
- 安装编译依赖:
apt-get update apt-get install -y git build-essential make golang rustc cargo curl - 获取源码:拉取最新的
pearl官方单体仓库,切换至主分支。 - 本地编译:
- 编译 ZK 零知识证明电路缓存、FFI 动态库以及 XMSS 签名 C 语言绑定。
- 成功构建原生 fixed
oyster钱包命令行程序。
[!NOTE] 编译 Rust ZK 电路时需要较大的内存。1G 物理内存的 VPS 在启用 1G Swap 虚拟内存后顺利完成了编译,未发生 OOM 崩溃。
3. 第二阶段:VPS 挂载同步与状态监控
- 指定正常节点强制同步:
为避免受坏节点干扰,启动新编译的
oyster并显式添加多个已知可靠的海外主网节点 IP:nohup ~/pearl-sync/oyster --usespv -u test -P test \ --addpeer 104.199.167.233:44108 \ --addpeer 34.40.50.215:44108 \ --addpeer 35.223.185.30:44108 \ --addpeer 35.196.37.244:44108 \ --addpeer 34.83.190.251:44108 \ > ~/pearl-sync/oyster.log 2>&1 & - 编写监控脚本: 通过 Python 监控脚本自动计算同步速度 (blocks/s) 和预计剩余时间 (ETA)。同步在约 15~30 blocks/s 的速度下运行,共计约 25 分钟同步完 6.4 万个区块。
- 自动打包与停止:
高度追上主网 Tip 时,脚本自动停止 VPS 上的
oyster进程,并打包核心数据:block_headers.bin(区块头数据)neutrino.db(BoltDB 过滤器数据库)reg_filter_headers.bin(过滤器头文件)peers.json(节点拓扑信息)- 数据包名称:
sync_cache.tar.gz(约 12MB)
4. 第三阶段:本地数据灌入与 Clash Verge 直连配置
-
数据灌入: 数据包从 VPS 下载到本地 PC 路径:
C:\Users\<YourUsername>\.pearl-wallet\wallet-data\<YourWalletName>\mainnet并解压。- ⚠️ 特别注意:本地
wallet.db(钱包密钥数据库)保持完全不动,安全无损。 peers.json替换的作用:本地客户端直接获得了 VPS 筛选出的几千个健康节点 IP,启动时将不再尝试走报错的官方种子寻路,从而在本地绕过了官方握手 Bug,可实现永久增量自同步。
- ⚠️ 特别注意:本地
-
Clash Verge 直连规则优化: 为防止代理内核将主网 P2P 流量误判拦截或通过长链节点转发导致握手失败,在 Clash 配置文件
rules:的最顶部加入以下最高优先级规则:rules: # 1. 进程规则直连(Verge/Meta 内核支持) - 'PROCESS-NAME,oyster-windows-x64.exe,DIRECT' - 'PROCESS-NAME,Pearl Wallet.exe,DIRECT' # 2. 官方 DNS 种子域名直连 - 'DOMAIN-SUFFIX,pearlresearch.ai,DIRECT' # 3. 我们同步使用的多个高质量稳定节点 IP 直连 - 'IP-CIDR,104.199.167.233/32,DIRECT,no-resolve' - 'IP-CIDR,34.40.50.215/32,DIRECT,no-resolve' - 'IP-CIDR,35.223.185.30/32,DIRECT,no-resolve' - 'IP-CIDR,35.196.37.244/32,DIRECT,no-resolve' - 'IP-CIDR,34.83.190.251/32,DIRECT,no-resolve'
5. 成果验证与 VPS 无痕清理
-
本地成果: 打开本地 Pearl Wallet,钱包加载后仅用几秒钟便同步完了最新的新产生区块,并顺利进入区块历史交易扫描,成功在钱包界面读出您的真实总余额:
- 显示余额:
<YOUR_BALANCE> PRL💎
- 显示余额:
-
VPS 环境彻底清理: 确认本地钱包恢复后,连接 VPS 运行清理脚本:
- 停止任何残留进程。
- 彻底删除整个临时工作区(
~/pearl-src、~/pearl-sync、~/.cargo、~/.rustup、~/.oyster、~/.go)。 - 卸载所安装的开发语言环境(
go、rust、gcc/g++、make、build-essential)。 - 释放了共计数百兆 of 磁盘空间,并将内存占用恢复至 0,VPS 重回零残留安全状态。
6. 经验与建议
- 不要删除本地
wallet.db:钱包同步不上去只是区块缓存和网络同步协议的问题,私钥依然安全地存在于本地wallet.db中。遇到此类情况切记不要重装或删除数据库。 - 利用 P2P peers 直连绕过 Bug:当区块链软件客户端源码中写死的主种子发生握手 Bug 时,手动给软件注入一份已知可靠的
peers.json即可直接跳过主种子检索,是解决 P2P 客户端连不上网的通用解法。 - 使用 Merge 模板保存 Clash Verge 规则:在 Verge 中使用 Merge 模板注入直连规则,可以避免未来订阅更新时把手动改写的 rules 覆盖掉。
Last modified on 2026-05-30