/filecoin

CoinSummer实验室Filecoin资源分享。

Filecoin 资源分享

CoinSummer实验室 Filecoin 资源分享。

常用链接

节点操作

查看节点信息

# 查看本节点所监听的地址:
lotus net listen
# 查看连接的节点列表:
lotus net peers

手动连接其它节点(命令中的地址为示例地址)

lotus net connect /ip4/47.240.110.221/tcp/44845/p2p/12D3KooWRgxLL84TSkYSjhvhCy5ZNSuJZZzHWp2FXDY7ufqGBmUW

当启动 daemon 后无法正常同步链上的数据,可以试试在启动 daemon 的时候禁用自动连接 peers (即:加上 --bootstrap=false 参数),然后手动连接到一个正常节点,例如:

lotus daemon --bootstrap=false
lotus net connect /ip4/47.240.110.221/tcp/44845/p2p/12D3KooWRgxLL84TSkYSjhvhCy5ZNSuJZZzHWp2FXDY7ufqGBmUW

上述的节点是示例节点,当您在使用该命令的时候,您需要自己去找一个可以使用的节点。

手动设置链的高度

# 设置高度到9700
lotus chain sethead --epoch=9700

节点同步出错时,可下载 CoinSummer实验室 提供的 国内节点备份,将下载后的文件解压得到的 datastore 目录,替换你本机 ~/.lotus 目录下的 datastore,然后执行上面手动设置链高度的命令(需要 daemon 启动的情况下),即可从指定高度进行同步。

手动下载 proof 参数

# export IPFS_GATEWAY="https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/"
./lotus fetch-params --proving-params 2KiB     # 例如下载 2KiB 扇区对应的 Proof 参数
./lotus fetch-params --proving-params 16MiB    # 下载 16MiB 扇区对应的 Proof 参数
./lotus fetch-params --proving-params 32GiB    # 下载 32GiB 扇区对应的 Proof 参数

参考

编译参数

v25 版本代码的编译命令:

env RUSTFLAGS="-C target-cpu=native -g" FFI_BUILD_FROM_SOURCE=1 make clean all

特别是针对 AMD 处理器,使用该命令自己编译出来的代码更适合自己的机器。

启用内存最大化参数:

export FIL_PROOFS_MAXIMIZE_CACHING=1

该参数仅针对Testnet3的 32GB 扇区有效。

启用 Log 日志:

export RUST_LOG=Debug

运行 miner 之前加入该参数可以在 miner 的日志中查看更详细的输出信息(底层 rust 代码的输出信息),Log 登记从低到高分别有: Trace、Debug、Info、Warn、Error,Trace 输出的信息最详细,Error 输出的信息最少,仅输入错误信息。

修改 Proofs 文件路径

export FIL_PROOFS_PARAMETER_CACHE=/path/to/proof_params/v26/

Storage miner 操作

查看扇区状态

# 列举所有扇区信息:
lotus-storage-miner sectors list
# 查看某个扇区的历史状态
lotus-storage-miner sectors status --log <SectorID>

手动修改扇区状态

lotus-storage-miner sectors update-state --really-do-it <SectorID> <NewSectorStatus>
# 例如:手动修改扇区 1 的状态为 FaultedFinal 状态
lotus-storage-miner sectors update-state --really-do-it 1 FaultedFinal

更改默认存储路径

export LOTUS_STORAGE_PATH="/path/to/.lotusstorage"
  • 默认存储路径是 ~/.lotusstorage,可通过指定 LOTUS_STORAGE_PATH 环境变量来更改;
  • 每个存储路径下都会有 sectorstore.json 配置文件,该文件可以配置该存储路径的用途,比如,是否可以用来存储密封过程中生成的临时文件 "CanSeal": true, 是否可以用来存储密封好的数据 "CanStore": true,以及该路径的权重 "Weight": 10 和一个唯一标识符:ID
{
  "ID": "e59facdc-6a82-418f-a25e-4cbd9165b5de",
  "Weight": 10,
  "CanSeal": true,
  "CanStore": true
}

增加存储路径

# 设置数据存储路径,该路径用来存储最终密封好的数据
# 执行该命令可能需要一点时间等待
lotus-storage-miner storage attach --store --init /path/to/persistent_storage

# 设置密封扇区的存储路径,密封完成之后该路径下的数据会被自动清空,相当于临时目录
# 执行该命令可能需要一点时间等待
lotus-storage-miner storage attach --seal --init /path/to/fast_cache

以上两个命令都是在启动了 miner 之后才可以执行,是一种动态添加存储路径的方式,非常灵活。 当然还可以在命令中添加权重 --weight=10,默认权重是 10。 执行该命令后,可通过以下命令查看存储列表:

lotus-storage-miner storage list

移动存储目录

默认的存储目录 ~/.lotusstorage 可以移动到其他地方。 移动前最好先停掉 daemon 和 miner。 移动后,假设新路径为 /path/to/.lotusstorage,需要手动更改 /path/to/.lotusstorage 目录下 storage.json 中的 StoragePaths 为新路径:

{
  "StoragePaths": [
    {
      "Path": "/path/to/.lotusstorage"
    }
  ]
}

移动后,重启 daemon 和 miner,miner 会重新读取新路径下的所有 sector 信息。

使用远程 daemon(daemon 在其他机器)

假设daemon在 192.168.1.100 机器上,miner在 192.168.1.101 机器上:

  1. 修改远程 daemon (192.168.1.100)上 ~/.lotus/config.toml 中的 ListenAddress 为:
# Default config:
[API]
ListenAddress = "/ip4/192.168.1.100/tcp/1234/http"
  1. 将远程 daemon (192.168.1.100) 上 ~/.lotus 目录下的 apitoken 拷贝到 miner 机器(192.168.1.101)的 ~/.lotus 目录下;
  2. 重启 miner 即可。

赎回已获得的奖励(Testnet3 才需要手动赎回)

lotus-storage-miner rewards redeem
lotus-storage-miner rewards list

赎回之后,可能需要过一段时间才能看到自己钱包的余额增加。

v26 版本参数中使用 GPU 计算 Precommit2 的方法

运行 miner 之前导出已下环境变量(目前官方还未放出v26参数):

export FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1

参考

Worker操作

Testnet3 查看 Worker 信息

lotus-storage-miner workers list

Testnet3 启动 worker

lotus-seal-worker run --address=192.168.1.201:2333 --precommit1=false --precommit2=true --commit=true

启动worker需要注意以下几点:

  • 要给 worker 指定本机地址和一个随机端口(至少四位数);
  • precommit1precommit2commit 默认是启用的,如果想要禁用,可以设置为 false,例如: --precommit1=false;
  • commit 参数是配置 commit2 的,commit1 无法在 Worker 中启用。

Testnet3 集群配置

  1. 修改 miner ~/.lotusstorage/config.toml 里面的 ListenAddress:
[API]
ListenAddress = "/ip4/192.168.1.100/tcp/2345/http"
RemoteListenAddress = "192.168.1.100:2345"
  1. 配置 worker 的环境变量
export STORAGE_API_INFO=<TOKEN>:<API>

TOKEN 为 ~/.lotusstorage 中的 token; API 为 ~/.lotusstorage 中的 api;

  1. 启动 worker
./lotus-seal-worker run --address=192.168.1.222:3456

需要给 worker 指定一个四位数的端口。

常用环境变量

# lotus 路径:
LOTUS_PATH
# 例如: export LOTUS_PATH=/home/user/nvme_disk/lotus

# miner 路径: 
LOTUS_STORAGE_PATH
# 例如: export LOTUS_STORAGE_PATH=/home/user/nvme_disk/lotusstorage

# worker 路径: 
WORKER_PATH
# 例如: export WORKER_PATH=/home/user/nvme_disk/lotusworker

# proof 证明参数路径: 
FIL_PROOFS_PARAMETER_CACHE
# 例如: export FIL_PROOFS_PARAMETER_CACHE=/home/user/nvme_disk/filecoin-proof-parameters

# 临时文件夹路径: 
TMPDIR
# 例如: export TMPDIR=/home/user/nvme_disk/tmp

# 最大化内存参数
FIL_PROOFS_MAXIMIZE_CACHING
# 例如: export FIL_PROOFS_MAXIMIZE_CACHING=1

# Rust 日志
RUST_LOG
# 例如: export RUST_LOG=Debug

# GPU计算Precommit2
FIL_PROOFS_USE_GPU_COLUMN_BUILDER
# 例如: export FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1

# 源码编译底层库
FFI_BUILD_FROM_SOURCE
# 例如: export FFI_BUILD_FROM_SOURCE=1

# GOLANG 代理
GOPROXY
# 例如: export GOPROXY=https://goproxy.cn

# 启动小扇区支持
FIL_USE_SMALL_SECTORS
# 例如: export FIL_USE_SMALL_SECTORS=true

# 显卡相关
BELLMAN_CUSTOM_GPU
# 例如: export BELLMAN_CUSTOM_GPU="GeForce RTX 2080 Ti:4352"

# 下载证明参数代理:
IPFS_GATEWAY
# 例如: export IPFS_GATEWAY="https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/"

解决拉取代码冲突问题(git pull)

如果你在执行 git pull 的时候出现类似如下错误(CONFLICT xxx),你可以使用以下方法解决该问题:

warning: Cannot merge binary files: build/genesis/devnet.car (HEAD vs. 8bea0e02d77a6d36c3fc72746a9b38c7018608e9)
Auto-merging build/genesis/devnet.car
CONFLICT (add/add): Merge conflict in build/genesis/devnet.car
Auto-merging build/bootstrap/bootstrappers.pi
CONFLICT (content): Merge conflict in build/bootstrap/bootstrappers.pi
Automatic merge failed; fix conflicts and then commit the result.

上述示例来源于从 interopnet 分支的 799f5e5 版本执行 git pull 的时候出现的问题(2020年5月7日),而这个问题在新版的代码中经常会出现,解决这个问题的方法如下(只是其中一个方法,当然还有别的方法):

方法一:

# 先重置代码,恢复代码到原始状态
git reset --hard HEAD
# 再随意的获取一个很久以前的代码版本号: commit ID
git log -111 | tail | grep -ni "commit "
# 假设这里拿到的一个 commit ID 是:"8c0f2c1ce06"
# 然后恢复到这个版本
git reset --hard 8c0f2c1ce06
# 最后再重新拉取代码
git pull
# 这时候就完成代码更新了,并解决代码冲突问题
# 此时就可以重新编译代码了:
# 当然,在这之前,你可能需要设置一下 GOLANG 的代理
# 已经挂了代理的用户可忽略
env RUSTFLAGS="-C target-cpu=native -g" FFI_BUILD_FROM_SOURCE=1 make clean all bench

方法二:

# 先重置代码,恢复代码到原始状态
git reset --hard HEAD
# 切换到 master 分支或者其它分支也行
git checkout master
# 删除 interopnet 分支
git branch -D interopnet
# 拉取所有代码
git fetch
# 再切换到 interopnet 分支
git checkout interopnet

方法三:

# 如果你没有修改代码,直接执行以下两条命令
git fetch origin
git reset --hard origin/interopne

常见问题(待续)

  • Testnet/3 的Actual Power,Byte Power 是什么?
  • lotus sync status时的base和target代表什么?
  • lotus sync时的worker是如何工作的?

持续更新中,有问题请在Issues中反馈...

参考文档