Skip to content

Latest commit

 

History

History
198 lines (147 loc) · 6.97 KB

README_CN.md

File metadata and controls

198 lines (147 loc) · 6.97 KB

For english version click here

扇区修复

Filecoin在封装或挖矿过程中,可能面临扇区数据丢失,那么就要销毁PreCommit预质押的FIL,或者终止扇区最大损失扇区的90天的收益。扇区修复能修复丢失的文件,来减少或者避免损失。

扇区丢失的原因

1.存储盘坏盘

矿商为了降低封装成本,不得不使用裸盘做存储,来降低成本,提高自己的竞争力,往往会直接使用裸盘做扇区的存储。 16T的盘,可以存储130多个32GiB扇区,如果损坏一个硬盘,数据无法恢复要终止扇区,最大损失扇区90天的全网平均收益。

2. NVMe缓存盘坏盘

在这个情况下,扇区有2个状态会造成损失。

  • 扇区已经提交了PreCommit消息,但是30内未提交ProveCommit消息,会销毁PreCommit预质押的FIL;
  • 设置 FinalizeEarly=false,使用先提交ProveCommit再落到存储,等同丢失扇区需要终止扇区。

扇区修复的工作原理

从原因可以分析,所有需要恢复的扇区都是已经提交过PreCommit消息之后的扇区,一旦数据丢失,只能重新组装原始封装的数据,重新封装扇区。

p1o, err := ffi.SealPreCommitPhase1(
    sector.ProofType,
    paths.Cache,
    paths.Unsealed,
    paths.Sealed,
    sector.ID.Number,
    sector.ID.Miner,
    ticket,
    pieces,
)

p2...

重新封装CC扇区(无订单),pieces使用官方默认的生成方式即可,只需要额外获取ticket和ProofType。

这是链上记录的PreCommit消息体:

{
  "RegisteredProof": 9,
  "SectorNumber": 1322006,
  "SealedCid": "bagboea4b5abcasqanjadumno7blvgx4k5pk765cki6vurnpgs2q3trt2trkznhj3",
  "SealRandEpoch": 925221,
  "DealIds": [],
  "Expiration": 2480426,
  "ReplaceCapacity": false,
  "ReplaceSectorDeadline": 0,
  "ReplaceSectorPartition": 0,
  "ReplaceSector": 0
}

ProofType在不同网络版本和扇区大小下是不相同的,详细代码。直接使用消息体中的RegisteredProof更加方便。

使用precommit消息体中的SealRandEpoch做为扇区的ticketEpoch,向链服务器再次提取出随机数。

ticket, err := fullNodeApi.StateGetRandomnessFromTickets(ctx, crypto.DomainSeparationTag_SealRandomness, ticketEpoch, buf.Bytes(), ts.Key())
if err != nil {
    return nil, nil, err
}

比较链上记录的PreCommit消息体中的SealedCid和修复程序PreCommit2计算结果storage.SectorCids,如果结果cid一致表示修复成功!

Go

构建filecoin-sealer-recover,你需要安装Go 1.16.4 or higher:

wget -c https://golang.org/dl/go1.16.4.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local

构建

1、构建需要下载一些Go模块。这些通常托管在Github上,而Github来自中国的带宽较低。要解决此问题,请在运行之前通过设置以下变量来使用本地代理:

export GOPROXY=https://goproxy.cn,direct  

2、根据您的 CPU 型号,根据您的需要选择环境变量:

a.如果您有AMD Zen 或 Intel Ice Lake CPU(或更高版本),请通过添加以下两个环境变量来启用 SHA 扩展的使用:

export RUSTFLAGS="-C target-cpu=native -g"
export FFI_BUILD_FROM_SOURCE=1

有关此过程的更多详细信息,请参阅Filecoin FFI(https://docs.filecoin.io/get-started/lotus/installation/#native-filecoin-ffi) 部分

b.一些没有 ADX 指令支持的老式 Intel 和 AMD 处理器可能会因为非法指令错误而紊乱。要解决这个问题,添加 CGO_CFLAGS 环境变量:

export CGO_CFLAGS_ALLOW="-D__BLST_PORTABLE__"
export CGO_CFLAGS="-D__BLST_PORTABLE__"

c.默认情况下,证明库中使用multicore-sdr选项。 除非明确禁用,否则此功能也用于 FFI。 要禁用multicore-sdr依赖项的构建,请将FFI_USE_MULTICORE_SDR设置为0

export FFI_USE_MULTICORE_SDR=0

d.可以在证明库中使用 CUDA 的实验性gpu选项。默认情况下禁用此功能(opencl 是默认值)。要使用gpuCUDA 依赖项启用构建,请设置FFI_USE_CUDA=1

export FFI_USE_CUDA=1

3、Build and install

# 扇区恢复不区分mainnet或者calibnet
make clean all

sudo make install

sealer-recover 安装到 /usr/local/bin

4、安装完成后,使用下面的命令确保为正确的网络成功安装了扇区恢复工具.

sealer-recover --version

使用方式

1、指定矿工号及扇区列表,导出扇区信息文件:

export FULLNODE_API_INFO=...:/ip4/10.10.10.1/tcp/1234/http
sealer-recover export --miner=f01000 1 2 3 4 5 6

在当前目录下生成扇区恢复的元数据文件sectors-recovery-f01000.json

注意: 读取扇区信息,需要lotus daemon有存储足够旧的状态树,全链节点最佳。

2、启动恢复程序,执行本机执行恢复的扇区列表:

export FIL_PROOFS_USE_MULTICORE_SDR=1
export FIL_PROOFS_MAXIMIZE_CACHING=1
export FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1
export FIL_PROOFS_USE_GPU_TREE_BUILDER=1

sealer-recover recover \
    --sectors-recovery-metadata=./sectors-recovery-f01000.json \
    --parallel=6 \ 
    --sealing-result=/sector \ 
    --sealing-temp=/temp \
    2 4 5

命令工具和参数介绍

导出扇区元数据工具 :

sealer-recover export [command options] [sectorNum1 sectorNum2 ...]
命令参数 含义 备注
miner 需要修复扇区的矿工号 必填

扇区恢复工具:

sealer-recover recover [command options] [sectorNum1 sectorNum2 ...]
命令参数 含义 备注
sectors-recovery-metadata 指定扇区恢复的元数据文件 必填
parallel 修复扇区p1的并行数, 参考核心数进行设置 默认值:1
sealing-result 修复后的扇区产物路径 默认值: ~/sector
sealing-temp 修复过程的中间产物路径,需要大空间,建议使用NVMe盘 默认值: ~/temp
最小空间:
32GiB # > 512GiB!
64GiB # > 1024GiB!

优化

使用自己修改的lotus进行打包,能优化修复速度

TODO

  • 支持有订单的扇区,通过链的订单id,检索到订单,重新生成pieces。

Contributing

欢迎PR、错误报告和问题建议!对于重大更改,请先在issues中提出问题,以便讨论兼容性和收益。

Other

联系我们

License

Licensed under Apache 2.0