本仓库已归档,不再更新。 请使用继任分支 Brian44913/boost-2.5.2。
所有沿用改动已经 squash + audit 后 port 到 2.5.2。openReader mmap CAR v2 验证移除 和 --start-epoch-head-offset 已被上游 v2.5.2 subsume,不再需要单独维护。filecoin-ffi 在 2.5.2 上重新使用 git submodule(不再 vendor)。
基于 Filecoin 官方 Boost v2.4.7 的定制分支,针对大规模存储提供者场景进行了优化。
涉及文件:
node/config/types.go— 新增SkipCommPVerify配置项node/config/def.go— 默认值truestoragemarket/provider.go— Provider Config 新增字段storagemarket/direct_deals_provider.go— DDPConfig 新增字段node/modules/storageminer.go— 配置传递node/modules/directdeals.go— 配置传递storagemarket/deal_execution.go— 离线订单和在线订单验证逻辑storagemarket/direct_deals_provider.go— DDO 直接导入验证逻辑
改动说明:
新增 SkipCommPVerify 配置开关(默认 true),统一控制三处 CommP 验证:
| 场景 | 文件 | 原行为 | 改后 |
|---|---|---|---|
| 离线订单导入 | deal_execution.go execDealUptoAddPiece() |
强制 verifyCommP() |
SkipCommPVerify=true 时跳过 |
| 在线订单传输 | deal_execution.go transferAndVerify() |
强制 verifyCommP() |
SkipCommPVerify=true 时跳过 |
| DDO 直接导入 | direct_deals_provider.go execDeal() |
计算 CommP + 比对 | SkipCommPVerify=true 时跳过计算,用文件大小推算 PieceSize |
配置方式(config.toml):
[Dealmaking]
SkipCommPVerify = true # 默认已开启收益: 跳过 CommP 计算可显著加速离线订单和 DDO 订单的导入速度,尤其在批量导入场景下效果明显。
涉及文件:
storagemarket/deal_execution.go—openReader()函数
改动说明:
移除 carv2.OpenReader(filePath) 调用。该调用使用 mmap 映射整个 CAR 文件到内存,仅用于格式验证后立即关闭,验证结果未被使用。
原代码:
v2r, err := carv2.OpenReader(filePath) // mmap 映射整个文件
if err != nil { return nil, err }
_ = v2r.Close() // 立即关闭,结果丢弃问题: 大规模应用阶段(大量未完成订单),特别是重启 boostd 进程时,所有订单并发触发 mmap,耗尽虚拟地址空间导致进程崩溃。
收益: 消除 mmap 地址空间耗尽导致的崩溃风险,提升大规模场景下的稳定性。
涉及文件:
cmd/boost/deal_cmd.go
改动说明:
在 dealFlags 中新增 --libp2p 可选参数,允许覆盖链上查询到的存储提供者完整 libp2p 地址(含 peer ID),直接连接指定节点进行发单。
适用命令:
boost deal --libp2p=/ip4/10.78.36.98/tcp/49413/ws/p2p/12D3KooWNZ1bNn... ...
boost offline-deal --libp2p=/ip4/10.78.36.97/tcp/4949/p2p/12D3KooWRJi4nB... ...实现方式:
- 在
GetAddrInfo获取链上地址后、Connect之前,用peer.AddrInfoFromString解析 multiaddr - 完整替换
addrInfo(包含 peer ID 和地址列表),不再受链上 PeerId 限制
未指定时: 完全兼容原版行为,不影响任何现有逻辑。
涉及文件:
react/src/transform.js— 递归改迭代react/src/gql.js— transformResponseLink 加 try-catchreact/src/Deals.js— 空值保护react/src/DirectDeals.js— 空值保护
问题现象: 当 deals 数量超过 5 万条后,Storage Deals 页面加载后变成空白,浏览器控制台报错:
TypeError: can't access property "deals", b is undefined (Deals.js:108)
根因分析:
虽然前端查询是分页的(默认 10 条/页),但 pollInterval: 10000 每 10 秒重新查询。当 SELECT count(*) FROM Deals(50k+ 行)变慢时,Apollo Client 的 poll 触发竞态,导致 data 返回 undefined,前端直接访问 data.deals 崩溃白屏。
此外 transform.js 中的递归 response 转换在极端场景下有栈溢出风险。
修复方案(3 层防护):
| 层级 | 改动 | 作用 |
|---|---|---|
| 根因修复 | transform.js 递归改为迭代(显式栈) |
消除栈溢出风险,不受数据量限制 |
| 安全网 | gql.js transformResponse 加 try-catch |
转换失败时返回原始数据,不中断 Apollo 链路 |
| 崩溃保护 | Deals.js / DirectDeals.js 加 !data || !data.deals 检查 |
data 为 undefined 时显示错误提示,不再白屏 |
涉及文件:
db/directdeals.go—List()函数
问题现象: Web UI 的 /direct-deals 页面,第 1 页有数据,从第 2 页开始翻页无数据且无报错,而 /storage-deals 页面翻页正常。
根因: DirectDealsDB.List() 中的 cursor 子查询写错了表名:
// 原代码(错误)
where += "CreatedAt <= (SELECT CreatedAt FROM Deals WHERE ID = ?)"
// 修复后
where += "CreatedAt <= (SELECT CreatedAt FROM DirectDeals WHERE ID = ?)"cursor 是 direct deal 的 UUID,但子查询去了 Deals 表(普通订单表),找不到记录返回 NULL,导致 CreatedAt <= NULL 永远为 false,翻页结果为空。这是上游 boost 官方代码的 bug。
涉及文件:
extern/filecoin-ffi/— 完整 FFI 源码
改动说明:
原版通过 git submodule 引用 filecoin-ffi,clone 后需要 git submodule update --init --recursive 才能编译。本分支将 filecoin-ffi v1.34.0(commit 586063e)直接作为普通目录提交,clone 后即可编译,无需额外操作。
编译:
git clone git@github.com:Brian44913/boost-2.4.7.git
cd boost-2.4.7
make build