Skip to content

modytor/filecoin

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Filecoin 资源分享

CoinSummer 实验室 Filecoin 资源分享。

1.常用链接

2. 主网

2.1 活动

2.2 宣称分叉

2.3 SpaceRace2 专用

2.4 主网上线后依然可用的测试网

由于某些需求,主网上线之后,官方依然保留测试网,用于测试:

  • 网络列表
    • 【Butterfly】 : For core implementers testing new code. This network suffers frequent resets and is not recommended for most users.
    • 【Calibration】 : Calibration is the primary live testing network. It is used to evaluate Filecoin at meaningful scale via testing, benchmarking, and optimizations. It is recommended for most prospective miners and app developers.
    • 【Nerpa】 : For app developers looking to do small-scale testing. Has small sector sizes and reduced proofs parameters, so sealing takes ~25 minutes.

【主网在这】

3. SpaceRace 专用

3.0 宋江 vs. Why

(1). 2020/08/21: 【宋江之 Filecoin Discover 硬盘拷问】

(2). 2020/08/21: 【宋江之 硬盘与数据探讨】

(3). 2020/08/22: 【宋江之 Filecoin 灵魂拷问】

(4). 2020/08/25: 【宋江之 Filecoin 网络容易受攻击】

3.1 参数下载

使用 JDCloud 下载 32GB 的证明参数:

# v28 版本的参数
export IPFS_GATEWAY=https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/
./lotus fetch-params 32GiB

3.2 官方文档

3.3 自己创建矿工

如果水龙头无法创建矿工,可以取一些 FIL 币,那可以自己在本地创建矿工:

# (1) 生成钱包地址【已有的忽略】
./lotus wallet new bls
# (2) 去水龙头取一次 FIL 币【一次可以取得 100 FIL】
# (3) 本地创建矿工【请把 t3 开头的地址替换成你自己的钱包地址】
./lotus-miner init --owner t3u3fa4z6sxprcm47ufzfiayyg6jnpsulis2xaua5fpyifmuzap2kavw7pefvgu5j3jeb4mtfaqvppzcqwl6gb --sector-size 32GiB

注: 创建矿工一般不支持指定 actor 地址,既: t01000, t01001,t1002 等,也就是说,init 命令中的 --actor t01xxx 是不可用的。

4. 节点操作

4.1 查看节点信息

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

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

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

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

4.3 手动下载 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 参数

# v27 版本参数【目前在 next 分支: 2020/06/15】
git fetch
git checkout origin/next
export IPFS_GATEWAY="https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/"
./lotus fetch-params 32GiB

参考

4.4 编译参数

v28 版本代码的编译命令:

源码编译底层 rust 库的命令:

FFI_BUILD_FROM_SOURCE=1 make clean all lotus-bench

对于 Intel 的机器,可能由于兼容性原因(比如,执行过程中出现非法指令: illegal instruction),需要添加相应的参数:

FFI_BUILD_FROM_SOURCE=1 CGO_CFLAGS="-O -D__BLST_PORTABLE__" make clean all lotus-bench

启用内存最大化参数:

export FIL_PROOFS_MAXIMIZE_CACHING=1

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

启用 Log 日志:

export RUST_LOG=Debug

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

4.5 修改 Proofs 文件路径

export FIL_PROOFS_PARAMETER_CACHE=/path/to/proof_params/v28/

4.6 导入导出同步数据:

# 导出同步数据(去除无用的消息,保证导出的 car 文件很小)
./lotus chain export --recent-stateroots=900 --skip-old-msgs snapshot.car
# 这样导出的话,导出的 car 文件会很大(文件中保存了历史消息)
# ./lotus chain export snapshot.car
# 导入同步数据(在此之前保证 .lotus 目录中的内容是空的)
# 导入数据之后, daemon 默认自动启动,
# 如果不想在导入数据之后启动 daemon,可以加上参数 --halt-after-import
./lotus daemon --import-snapshot snapshot.car

【官方 5GB 左右的快照】,先手动下载好这个 car 文件,然后在一个干净的 .lotus 目录中导入即可,记得在做任何操作之前先备份数据(至少需要备份好钱包私钥:参考 【16.2】 小节)。

参考:【快速同步数据:Slack】【官方文档:Chain sync】【官方文档:create-a-snapshot】

5 Storage miner 操作

5.1 查看扇区状态

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

5.2 手动修改扇区状态【谨慎操作】

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

5.3 更改默认存储路径

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

5.4 增加存储路径

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

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

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

lotus-miner storage list

5.5 移动存储目录

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

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

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

5.6 使用远程 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 即可。

5.7 启动 miner 参考命令

# 注意空格不能少【以下命令是使用 screen 进行后台启动的方式】
t=$(date +%Y_%m_%d_%H_%M_%S)
FIL_PROOFS_USE_GPU_TREE_BUILDER=1 FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1 FIL_PROOFS_MAXIMIZE_CACHING=1 RUST_LOG=Trace screen -L -S miner -t miner_${t} ./lotus-miner run

# 常规方式
FIL_PROOFS_USE_GPU_TREE_BUILDER=1 FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1 FIL_PROOFS_MAXIMIZE_CACHING=1 RUST_LOG=Trace ./lotus-miner run

5.8 FIL 余额操作

# 从 【Available】 中提取 10 个 FIL 到 【Worker Balance】 中
./lotus-miner actor withdraw 10
# 从 【Worker Balance】 中发送 10 个 FIL 到 【Available】 中(假设 minerID 是 t01000 )
./lotus send t01000 10

参考

5.9 更新扇区操作

原来使用 pledge 命令质押的扇区是垃圾扇区,里面的数据都是垃圾数据,为了让这些扇区能够存储有效数据,可以把这些扇区标记为可存储有效数据的扇区:

./lotus-miner sectors mark-for-upgrade <sector number>

参考

5.10 移除扇区操作

如何扇区出现问题,或者不想要某个扇区,可以把该扇区删除:

./lotus-miner sectors remove --really-do-it <sector id>

5.11 移除时空证明失败的扇区

由于误删、调度错乱等各种原因,导致扇区已提交到了链上,但时空证明失败的问题,可以合并1475-IPFS提供的方案,一次性删除链上失败的扇区。

代码地址

在lotus目录下执行:git cherry-pick 023cec4d7fa438bceda331dbcc046f7a094ecfc4即可将该commit合并到自己的代码中,然后重新编译,运行:

# 删除链上错误的扇区
lotus-miner proving terminate --sectors xxx,xxx,xxx

该命令将会发送一条消息,一次性删除错误扇区(注意:会扣币)。

6 Worker操作

6.1 查看 Worker 列表

lotus-miner sealing workers

6.2 集群配置

6.2.1. 修改 miner

修改 miner ~/.lotusminer/config.toml 里面的 ListenAddressRemoteListenAddress ,把这两个变量中的地址都改为 miner 本机的地址:

[API]
ListenAddress = "/ip4/192.168.1.100/tcp/2345/http"
RemoteListenAddress = "192.168.1.100:2345"

6.2.2. 配置 worker

方法一:使用环境变量

export STORAGE_API_INFO=<TOKEN>:<API>

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

注意:启动 miner 之后再查看这两个的值。

方法二:直接复制文件

启动了 miner 之后,复制 miner 的 ~/.lotusminer 目录中的 tokenapi 到 worker 中的 ~/.lotusminer (worker 中没有这个目录就手动创建一个),然后启动 worker 即可。

6.2.3. 启动 worker

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

# 新版改用 --listen=xxx
lotus-worker run --listen=192.168.1.201:2333 --precommit1=false --precommit2=true --commit=true

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

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

7 Deal操作

7.1 Deal配置 - Miner有公网IP

假设Miner的公网IP为123.123.73.123,内网IP为10.4.0.100

(1) MinerIP配置

修改$LOTUS_STORAGE_PATH/config.toml文件中的以下内容:

  • ListenAddresses中的IP改为123.123.73.123(即公网IP地址),端口自己指定一个固定端口,例如1024
[Libp2p]
ListenAddresses = ["/ip4/123.123.73.123/tcp/1024", "/ip6/::/tcp/0"]

配置修改以后,重启Miner。

(2) 设置multiaddress

这里的multiaddress即为上面第(1)步中配置的ListenAddresses的地址。

lotus-miner actor set-addrs /ip4/123.123.73.123/tcp/1024

设置完等待消息确认后,可以通过以下命令查看结果:

lotus state miner-info [t0xxxx]

(3) 设置Miner连接的节点

执行以下命令查看Miner连接的节点:

lotus-miner net peers

如果返回的结果很少(只有本地一个节点),需要手动连接节点:

lotus-miner net connect /dns4/bootstrap-1.calibration.fildev.network/tcp/1347/p2p/12D3KooWQAKmfoAQBDwyaruE1bfFsuekttD974arrkB4G4ZKWk6r
lotus-miner net connect /dns4/bootstrap-0.calibration.fildev.network/tcp/1347/p2p/12D3KooWCoZZ9gExszHaNLoLXhW7DJa3dDZXjGgHELxwhqxoKJUQ
lotus-miner net connect /dns4/bootstrap-2.calibration.fildev.network/tcp/1347/p2p/12D3KooWKRNgz3a8RyxLFa1gihdFHMG6rPKuEFnSwmzk4GTo2TC1
lotus-miner net connect /dns4/bootstrap-3.calibration.fildev.network/tcp/1347/p2p/12D3KooWJt4zgPL8B2cMoCLDQ6MPpMKH62ZjgvvPmrfDBLWpggKG

注意:上面连接的地址,需要替换成Louts项目/build/bootstrappers.pi文件中的地址 连接成功后会有connect 12D3KooWQAKmfoAQBDwyaruE1bfFsuekttD974arrkB4G4ZKWk6r: success这样的返回。 执行上面的操作后,再次执行lotus-miner net peers,应该就能看到不少节点了。

(4) 太空竞赛订单过滤

太空竞赛可以配置Miner只接收官方机器人的订单参考官方文档,将$LOTUS_STORAGE_PATH/config.toml文件中的:

[Dealmaking]
#  Filter = ""

改为:

Filter = "jq -e '.Proposal.Client == \"t1nslxql4pck5pq7hddlzym3orxlx35wkepzjkm3i\" or .Proposal.Client == \"t1stghxhdp2w53dym2nz2jtbpk6ccd4l2lxgmezlq\" or .Proposal.Client == \"t1mcr5xkgv4jdl3rnz77outn6xbmygb55vdejgbfi\" or .Proposal.Client == \"t1qiqdbbmrdalbntnuapriirduvxu5ltsc5mhy7si\" '"

(5) 检查配置

  • 首先通过官方提供的Ping工具看看能否ping通自己Miner的公网IP;
  • 其次,通过[Port-chk]查看自己Miner的公网端口是否开放;
  • telnet 123.123.73.123 1024(注意替换成自己的IP和端口)看看是否返回/multistream/1.0.0

7.2 Deal配置 - Miner无公网IP

如果Miner机器没有公网IP,就需要在边缘网络设备(如路由器,或有公网IP和端口转发服务的服务器)上做公网IP和端口向内网IP和端口的转发,假设公网IP为123.123.73.123,Miner的内网IP为10.4.0.100

(1) MinerIP配置

修改$LOTUS_STORAGE_PATH/config.toml文件中的以下内容:

  • ListenAddresses中的端口改为自己指定一个固定端口,例如1024
  • AnnounceAddresses中的IP改为Miner所在网络的公网IP(例子中为:123.123.73.123),端口改为公网监听端口,例如10240
[Libp2p]
ListenAddresses = ["/ip4/0.0.0.0/tcp/1024", "/ip6/::/tcp/0"]
AnnounceAddresses = ["/ip4/123.123.73.123/tcp/10240"]

配置完以后,重启Miner。

(2) 设置端口转发规则

  • 如果边缘网络设备为路由器,登录路由器管理控制台,将外网的10240转发到内网的1024端口;
  • 如果边缘网络设备为服务器,按以下方式设置转发规则: 编辑系统的/etc/sysctl.conf文件(以Ubuntu为例),将net.ipv4.ip_forward=1前面的#注释去掉,保存文件,然后执行sudo sysctl -p使其生效。 在Miner所在网络中,添加以下端口转发规则,将外网的10240端口映射到内网的1024端口。
sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 10240 -j DNAT --to-destination 10.4.0.100:1024

其中10.4.0.100为Miner的内网IP。

(3) 设置multiaddress

参照7.1中的设置multiaddress。

(4) 设置Miner连接的节点

参照7.1中的设置Miner连接的节点。

7.3 Deal常用操作

# query ask
lotus client query-ask [t0xxxx]

# 查看本地导入的文件
lotus client local

# 导入文件,需要在daemon所在机器上操作
lotus client import /path/filename

# 发送订单
lotus client deal [CID] [miner_id] 0.0000000005 622080

# 查看deals列表
lotus client list-deals

# Miner查看存储订单列表
lotus-miner storage-deals list

# Miner查看检索订单列表
lotus-miner retrieval-deals list

8 常用环境变量

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

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

# 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/"

# Parent cache 参数
FIL_PROOFS_PARENT_CACHE
# 例如: export FIL_PROOFS_PARENT_CACHE=/disk/parent_cache

# 启用 GPU 计算 Precommit2 中的部分过程
FIL_PROOFS_USE_GPU_TREE_BUILDER
FIL_PROOFS_USE_GPU_COLUMN_BUILDER
# 例如:export FIL_PROOFS_USE_GPU_TREE_BUILDER=1
# 例如:export FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1

# 禁用 GPU 参数
BELLMAN_NO_GPU
# 例如:export BELLMAN_NO_GPU=1
# 如果要启用 GPU,则不能让这个环境变量(BELLMAN_NO_GPU)出现在系统的环境变量中(env)
# 如果它出现在 env 中,则需要使用以下命令取消,
#(因为设置 export BELLMAN_NO_GPU=0 无效):
unset BELLMAN_NO_GPU

# AMD 3970x 2h10m 跑完 P1 环境变量
FIL_PROOFS_USE_MULTICORE_SDR=1

9. 解决拉取代码冲突问题(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日),而这个问题在新版的代码中经常会出现,解决这个问题的方法如下(只是其中一个方法,当然还有别的方法):

9.1 方法一:

# 先重置代码,恢复代码到原始状态
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

9.2 方法二:

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

9.3 方法三:

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

10. 重置本地测试网环境

如果你在使用本地测试网,发现 lotus daemon 启动不了,或者是 miner 启动不了,或者是其它的问题,这时候,如果你没有别的更好的解决方法,你可以尝试完全清理本地环境,然后再启动 daemon 和 miner, 默认情况下,你需要清理如下的文件或文件夹等:

# 如果 daemon 一直同步不了,也可以试试这个方法,很多情况下可以解决同步问题
# 此外,处理前请检查环境变量,比如,是否修改了默认的 ~/.lotus 目录的位置
rm -rf ~/.lotus/
rm -rf ~/.lotusminer/
rm -rf ~/.lotusworker/
rm -rf ~/.lotus-bench/
rm -rf ~/.genesis-sectors/
rm -rf ~/dev.gen
rm -rf ~/localnet.json

如果是同步不了,还建议清空 FIL_PROOFS_MAXIMIZE_CACHING 环境变量,最近不少人因为在 .bashrc 中加入这个环境变量导致无法同步,原因未知:

unset FIL_PROOFS_MAXIMIZE_CACHING

11. GDB 调试 lotus 源码

11.1 GDB 调试 lotus 源码

使用 GDB 调试 lotus 源码(包括上层的 go 语言代码和底层的 rust 语言代码),你只需要一个 GDB 工具就可以单步调试了,非常方便:

链接

11.2 本地测试网搭建教程

为了方便调试测试网,可以在本地自己搭建一个私有链,搭建教程参考 【官方教程】

多 Miner 本地测试网的搭建教程可参考 【./scripts】 中的脚本,目录中有启动 genersis 节点的两个脚本:start_genesis_daemon.shstart_genesis_miner.sh,以及启动其它节点的两个脚本:start_daemon.shstart_miner.sh,这四个脚本中有一些默认的设置,如果你需要运行这些脚本,你可以自己进行修改:

  • 默认执行脚本的目录为 home 目录(即:~/$
  • lotus 可执行文件的默认目录在: /home/tears/filecoin/official/lotus
  • 创世节点所在的主机名称默认是:tears (你需要修改为你自己的主机名称)
  • 创世节点所在的主机地址默认是:192.168.1.11 (你需要修改为你自己的主机地址)
  • 扇区大小默认是:2KiB
  • 节点启动 daemon 的时候会删除 home 目录下的旧文件,请检查:start_genesis_daemon.shstart_daemon.sh

脚本文件:

12. 常用的两个查看系统资源的工具

12.1 htop 查看 CPU 和内存等信息

htop 比系统自带的 top 界面更加友好,在 Ubuntu 上安装只需要执行:

sudo apt install htop

效果如下:

htop效果

12.2 nvtop 查看显卡信息

nvtop 比 nvidia-msi 好看多了,但是安装稍微麻烦一些: 在 Ubuntu 19.04 之后可以直接使用 sudo apt install nvtop 安装,否则,你需要执行以下命令安装:

sudo apt install cmake libncurses5-dev libncursesw5-dev git
git clone https://github.com/Syllo/nvtop.git
mkdir -p nvtop/build && cd nvtop/build
cmake ..
cmake .. -DNVML_RETRIEVE_HEADER_ONLINE=True  # 如果上一个命令出错就用这个
sudo make install

效果如下:

nbvtop效果

12 编译相关问题

12.1 crate.io 源的问题

如果因为编译的时候卡住,症状如下图所示:

更新 crate.io 时卡住

解决方法:可以试试更改 crate.io 的源为国内的源,例如:

# 上海交通大学(正常使用)
[source.crates-io]
replace-with = 'sjtu'
[source.sjtu]
registry = "https://mirrors.sjtug.sjtu.edu.cn/git/crates.io-index"

# 清华的源(失效)
[source.crates-io]
replace-with = 'tuna'
[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"

# rustcc社区
[source.crates-io]
replace-with = 'rustcc'
[source.rustcc]
registry = "git:https://crates.rustcc.cn/crates.io-index"

使用方法:vi ~/.cargo/config, 然后把以上中的任意一个添加进去,保存好,然后再重新编译一次即可。 参考

12.2 GOPROXY 的问题

如果在编译的时候因为下载代码子模块的时候卡住(GO 代码),可能是 GOPROXY 没有设置,此时,设置一下 GOPROXY,然后再重新编译一遍即可:

export GOPROXY=https://goproxy.cn

12.3 go 版本太低的问题

lotus 的 interopnet 分支在编译的时候,如果检测到 go 的版本低于 1.14, 则会编译失败,如下图所示:

go 版本过低

解决方法,安装新版本的 go,并软链接 /usr/bin/go 到新版的 go 可执行文件中(或者卸载旧版的 go):

# Ubuntu 20.04 示例
sudo apt install golang-1.14
# 删除原来的 go 软链接
sudo rm /usr/bin/go
# 让它链接到新版本的 go 可执行文件中
sudo ln -s /usr/lib/go-1.14/bin/go /usr/bin/go

12.4 编译提示 Rustup 1.43.1 版本找不到

在编译最新版的 master 分支分支的时候遇到这个问题(2020年6月19号23点,master 的 commit 是: ffa7be86fe6ee738ab4b095469029b9fac51e090),编译的时候提示找不到 1.43.1-x86_64-unknown-linux-gnu ,错误信息如下所示:

rustup 版本未能找到

解决方法是跳过这个版本,直接使用 nightly 的版本,即,替换以下这个文件中的 1.43.1nightly

echo "nightly" > ./extern/filecoin-ffi/rust/rust-toolchain

然后再重新编译,即可正常编译。

12.5 Intel 机器 【SIGILL: illegal instruction】

使用 Intel (老)机器,调试本地测试网测试 2KiB 扇区,执行 lotus-seed 命令的时候出现程序崩溃现象:

./lotus-seed genesis add-miner localnet.json ~/.genesis-sectors/pre-seal-t01000.json

错误信息大致如下所示:

SIGILL: illegal instruction
PC=0xe910af m=4 sigcode=2

goroutine 0 [idle]:
runtime: unknown pc 0xe910af
stack: frame={sp:0x7efc33ec4830, fp:0x0} stack=[0x7efc336c4ec8,0x7efc33ec4ac8)
00007efc33ec4730:  0000000003ed46a0  000000000063e394 <path/filepath.walkSymlinks+660> 
00007efc33ec4740:  0000000000000000  0000000000000000 
00007efc33ec4750:  0000000000000000  0000000000000000 
......
goroutine 1 [syscall]:
runtime.cgocall(0xe7a700, 0xc0009b77c8, 0x6cb501)
	/usr/lib/go-1.14/src/runtime/cgocall.go:133 +0x5b fp=0xc0009b7798 sp=0xc0009b7760 pc=0x51b75b
github.com/supranational/blst/bindings/go._Cfunc_blst_keygen(0xc000156320, 0xc0001562c0, 0x20, 0x0, 0x0)
	_cgo_gotypes.go:298 +0x45 fp=0xc0009b77c8 sp=0xc0009b7798 pc=0xe61505
github.com/supranational/blst/bindings/go.KeyGen(0xc0001562c0, 0x20, 0x20, 0x0, 0x0, 0x0, 0x6882897a)
	/home/ml/filecoin/official/lotus/extern/fil-blst/blst/bindings/go/blst.go:79 +0x96 fp=0xc0009b7808 sp=0xc0009b77c8 pc=0xe63596
github.com/filecoin-project/lotus/lib/sigs/bls.blsSigner.GenPrivate(0xc000542468, 0xc39cc8db33e69201, 0xc300000000000008, 0x0, 0xc000542460)
	/home/ml/filecoin/official/lotus/lib/sigs/bls/init.go:32 +0xeb fp=0xc0009b7868 sp=0xc0009b7808 pc=0xe6c98b
......

解决方法: 编译的时候加上参数 CGO_CFLAGS="-D__BLST_PORTABLE__"

FFI_BUILD_FROM_SOURCE=1 CGO_CFLAGS="-D__BLST_PORTABLE__" make clean debug

参考:【lotus/issues/4059】

12.6 编译错误:Unable to find libclang

新版的 lotus 需要用到 clang 编译器来编译部分底层的代码,因此,如果系统上没有安装 clang 的话,在编译 lotus 的时候就会报错,错误信息如下所示:

cargo:rustc-link-lib=stdc++
cargo:warning=couldn't execute `llvm-config --prefix` (error: No such file or directory (os error 2))
cargo:warning=set the LLVM_CONFIG_PATH environment variable to the full path to a valid `llvm-config` executable (including the executable itself)

--- stderr
thread 'main' panicked at 'Unable to find libclang: "couldn\'t find any valid shared libraries matching: [\'libclang.so\', \'libclang-*.so\', \'libclang.so.*\', \'libclang-*.so.*\'], set the `LIBCLANG_PATH` environment variable to a path where one of these files can be found (invalid: [])"', /home/ml/.cargo/registry/src/mirrors.tuna.tsinghua.edu.cn-df7c3c540f42cdbd/bindgen-0.54.0/src/lib.rs:1959:13
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

warning: build failed, waiting for other jobs to finish...
error: build failed
+ rm -f /tmp/tmp.npUjYGfyHa
Makefile:11: recipe for target '.install-filcrypto' failed
make[1]: *** [.install-filcrypto] Error 101
make[1]: Leaving directory '/home/ml/filecoin/official/lotus/extern/filecoin-ffi'

解决方法: 编译之前先安装 clang:

# 安装 clang
sudo apt install clang
# 或者
# sudo apt install clang-10
# 出问题可以试一下(在 Ubuntu 18.04 上安装 clang-10 的时候可能会需要加上【--fix-missing】参数):
# sudo apt install clang-10 --fix-missing

# 然后再重新编译
FFI_BUILD_FROM_SOURCE=1 make all

参考:【lotus/issues/3826】

12.7 Ulimit 问题:Too many open files (os error 24)

miner 在运行过程中可能会出现这个错误 Too many open files (os error 24), 导致程序退出,解决的方法就是设置系统中最大允许的文件打开数量:

ulimit 命令分别可以作用于 soft 类型和 hard 类型,soft 表示可以超出,但只是警告 hard 表示绝对不能超出,两者的值一般是不一样的:

# 查看当前值(默认是 soft 值):
ulimit -a | grep -ni "open"
# 查看当前值 soft 值:
ulimit -Sa | grep -ni "open"
# 查看当前值 hard 值:
ulimit -Ha | grep -ni "open"

# 临时修改(只对当前 Shell 有用,修改立即生效):
# 修改为 65535 (默认修改的是 soft 值):
ulimit -n 65535  # 等效于 ulimit -Sn 65535
# 临时修改 hard 值为 65535
ulimit -Hn 65535
# 可同时修改 soft 和 hard 的值:
ulimit -SHn 65535

# 针对正在运行中的miner进程,可以通过以下命令修改:
prlimit --pid <PID> --nofile=65535:65535
# 通过以下命令查看修改:
cat /proc/<PID>/limits

# 永久修改(重新登录或重启生效): 
# 把文件 /etc/systemd/user.conf  和 /etc/systemd/system.conf 中的字段修改如下:
DefaultLimitNOFILE=65535
# 并修改 /etc/security/limits.conf 文件,添加如下内容:
* hard nofile 65535
* soft nofile 65535

Ref: 【解决Too many open files问题】【Too many open files的四种解决办法】

12.8 daemon 无法启动时恢复钱包密钥的方法

由于某种原因,可能由于 .lotus 目录下的某些文件损坏导致 lotus daemon 无法启动,此时,最关键的还是要先把钱包的密钥导出来备份好(如果之前有备份的话就可以不用往下看了),导出的方法如下所示:

假设出故障的机器叫做 机器A,新的机器叫做 机器B

  • (1). 在 机器B 上启动一个干净的 daemon 进程(同一台机器上也行,但是要保证有一个新的 .lotus 目录,和旧 .lotus 目录不能冲突),启动之后,daemon 会自动创建一个新的 .lotus 目录
  • (2). 关闭 机器B 上的 daemon 进程,删除 机器B 上的 .lotus 目录中的 token 文件和 keystore 文件夹。
  • (3). 拷贝 机器A 上的 .lotus 目录中的 token 文件和 keystore 文件夹到 机器B.lotus 目录中
  • (4). 再次启动 机器B 中的 daemon,此时就可以在 机器B 中正常的导出钱包地址了

12.9 链同步错误:block was from the future

同步链错误,由于本机的时间与网络时间不同步导致,解决方法如下所示:

# 同步本机时间
ntpdate ntp.aliyun.com

12.10 编译错误:/usr/bin/ld: cannot find -lhwloc

hwloc 是获取 CPU 硬件信息的有用工具,lotus 需要使用到这个工具,安装一下就可以:

# Ubuntu 上的解决方法:
sudo apt install hwloc libhwloc-dev

参考

12.11 编译错误:[email protected]: Permission denied (publickey)

给自己的 github 添加一对公私钥就可以了,生成公私钥对的命令参考如下,生成之后,你还需要把公钥复制到 github 账号的 SSH Keys 中(这步需要在网页上操作),默认生成的公钥名称是 id_rsa.pub, 私钥名称是 id_rsa,私钥放在你的 ~/.ssh 文件夹中即可,公钥上传到 github 服务器中:

# 生成公私钥对,带 .pub 后缀的文件是公钥,是需要上传到 github 上面的
# 命令中 【[email protected]】 输入你的 github 账号
ssh-keygen -t rsa -C "[email protected]"

参考

12.12 同步错误:Error: chain contained block marked previously as bad

例如,当前链同步的高度是 6100,但是同步的时候出现某个块是坏块,因此,会导致同步失败,失败信息如下所示:

Error: chain linked to block marked previously as bad ([bafy2bzacedwp2ciwsjirnxc5gdtehddjurpp7qijzal32su7ob5vh4ons2sm2],

解决方法:先把高度往前调一些(比如,当前高度在 6100, 往前调到 6000),然后再手动标记某些坏块:

lotus chain sethead --epoch 6000
# 重启一下 daemon
lotus sync mark-bad bafy2bzacedwp2ciwsjirnxc5gdtehddjurpp7qijzal32su7ob5vh4ons2sm2

参考

13 Benchmark

13.1 v26 版本参数

  • CPU: AMD 3970x (32核心64线程)
  • GPU: RTX 2080Ti
  • 内存: 256GB (2133MHz)
  • 硬盘: NVMe 1TB * 2

CPU+GPU

# 命令
t=$(date +%Y_%m_%d_%H_%M_%S)
FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1 FIL_PROOFS_MAXIMIZE_CACHING=1 RUST_LOG=Trace screen -L -S bench -t bench_${t} ./bench sealing --sector-size=32GiB --storage-dir=/home/gossip/disk_nvme1/lotus-bench

# 结果

results (v26) (34359738368)
seal: addPiece: 6m15.3044756s (87.3 MiB/s)
seal: preCommit phase 1: 4h12m45.246321786s (2.16 MiB/s)
seal: preCommit phase 2: 33m25.314284805s (16.3 MiB/s)
seal: commit phase 1: 3.376010315s (9.48 GiB/s)
seal: commit phase 2: 43m46.504108069s (12.5 MiB/s)
seal: verify: 30.908086ms
unseal: 4h10m45.224077903s  (2.18 MiB/s)

generate candidates: 2.716063ms (11.5 TiB/s)
compute winnnig post proof (cold): 4.727151776s
compute winnnig post proof (hot): 2.921746828s
verify winnnig post proof (cold): 72.31729ms
verify winnnig post proof (hot): 15.464289ms

compute window post proof (cold): 17m16.771668516s
compute window post proof (hot): 11m34.142457801s
verify window post proof (cold): 5.157438678s
verify window post proof (hot): 43.763838ms

CPU

# 命令
# BELLMAN_NO_GPU 环境变量的使用请参考第 6 节的说明
t=$(date +%Y_%m_%d_%H_%M_%S)
BELLMAN_NO_GPU=1 FIL_PROOFS_MAXIMIZE_CACHING=1 RUST_LOG=Trace screen -L -S bench -t bench_${t} ./bench sealing --sector-size=32GiB --no-gpu --storage-dir=/home/gossip/disk_nvme1/lotus-bench

# 结果

results (v26) (34359738368)
seal: addPiece: 6m18.045655671s (86.7 MiB/s)
seal: preCommit phase 1: 4h11m2.665760729s (2.18 MiB/s)
seal: preCommit phase 2: 51m35.998398427s (10.6 MiB/s)
seal: commit phase 1: 3.2534009s (9.84 GiB/s)
seal: commit phase 2: 1h19m24.107221673s (6.88 MiB/s)
seal: verify: 27.802053ms
unseal: 4h10m25.648494319s  (2.18 MiB/s)

generate candidates: 2.331868ms (13.4 TiB/s)
compute winnnig post proof (cold): 5.941671756s
compute winnnig post proof (hot): 4.172625272s
verify winnnig post proof (cold): 64.764102ms
verify winnnig post proof (hot): 17.119677ms

compute window post proof (cold): 26m34.328794808s
compute window post proof (hot): 20m47.199004707s
verify window post proof (cold): 5.195517605s
verify window post proof (hot): 46.366221ms

13.2 v27 版本参数

  • CPU: AMD 3970x (32核心64线程)
  • GPU: RTX 2080Ti
  • 内存: 256GB (2133MHz)
  • 硬盘: NVMe 1TB * 2

CPU+GPU【next 分支】

# 命令
t=$(date +%Y_%m_%d_%H_%M_%S)
FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1 FIL_PROOFS_MAXIMIZE_CACHING=1 RUST_LOG=Trace screen -L -S bench -t bench_${t} ./bench sealing --sector-size=32GiB --storage-dir=/home/gossip/disk_nvme1/lotus-bench

# 结果

results (v27) (34359738368)
seal: addPiece: 10m0.840580268s (54.5 MiB/s)
seal: preCommit phase 1: 4h11m42.386256191s (2.17 MiB/s)
seal: preCommit phase 2: 27m5.279700449s (20.2 MiB/s)
seal: commit phase 1: 2.594602083s (12.3 GiB/s)
seal: commit phase 2: 50m31.427904703s (10.8 MiB/s)
seal: verify: 27.388448ms
unseal: 4h12m40.52388773s  (2.16 MiB/s)

generate candidates: 2.714168ms (11.5 TiB/s)
compute winnnig post proof (cold): 6.114939733s
compute winnnig post proof (hot): 5.097337848s
verify winnnig post proof (cold): 50.41631ms
verify winnnig post proof (hot): 15.678623ms

compute window post proof (cold): 18m51.79180394s
compute window post proof (hot): 11m25.783003134s
verify window post proof (cold): 5.36059116s
verify window post proof (hot): 47.596046ms

CPU【master 分支】

# 命令
# BELLMAN_NO_GPU 环境变量的使用请参考第 6 节的说明
t=$(date +%Y_%m_%d_%H_%M_%S)
BELLMAN_NO_GPU=1 FIL_PROOFS_MAXIMIZE_CACHING=1 RUST_LOG=Trace screen -L -S bench -t bench_${t} ./bench sealing --sector-size=32GiB --no-gpu --storage-dir=/home/gossip/disk_nvme1/lotus-bench


# lotus 版本
# lotus version 0.4.1+git.9d56dabb

# 结果

results (v27) (34359738368)
seal: addPiece: 10m10.633126077s (53.7 MiB/s)
seal: preCommit phase 1: 4h14m22.4235947s (2.15 MiB/s)
seal: preCommit phase 2: 51m36.998604335s (10.6 MiB/s)
seal: commit phase 1: 1.151689271s (27.8 GiB/s)
seal: commit phase 2: 1h36m30.270483546s (5.66 MiB/s)
seal: verify: 34.083162ms
unseal: 4h13m10.812170289s  (2.16 MiB/s)

generate candidates: 2.333397ms (13.4 TiB/s)
compute winnnig post proof (cold): 7.327267683s
compute winnnig post proof (hot): 6.318365117s
verify winnnig post proof (cold): 45.298003ms
verify winnnig post proof (hot): 16.806329ms

compute window post proof (cold): 28m6.99008574s
compute window post proof (hot): 20m41.201090515s
verify window post proof (cold): 5.46349285s
verify window post proof (hot): 37.986216ms

14 Scripts

14.1 Auto pledge sectors script

脚本中默认每 15 分钟添加一个扇区,总共添加 2000 个扇区(你可以自己修改),此外,使用次脚本你需要手动指定 lotus 的路径,即:脚本中的 lotus_path 参数。

auto_pledge_sector.sh

15 Filecoin 中文交流群

Filecoin 中文交流群 是目前国内最友好的 Filecoin 技术交流群, 欢迎广大 Filecoin 爱好者加入我们的技术交流群。 进群请加微信:max-yu-666

Filecoin 中文交流-1群(目前已满), Filecoin 中文交流-2群(目前还有空位)

Filecoin 中文交流-1群(目前已满) Filecoin 中文交流-2群

16 其它

16.1 币单位转换

$ 1 FIL = 10^{9} nanoFIL = 10^{18} attoFIL $

参考:【go-humanize】

16.2 钱包密钥导出与导入

# 查看钱包地址,一般是 t3 开头的一串数字(新版中使用的是 f3 开头)
./lotus wallet list
# 导出钱包的私钥到 mywallet.key 文件中(示例中的钱包地址为: t3w7r6dguggp62nbopehewt4amjh2iq2belz2u73q3k3z7zoarw44k6cra3og7yyvuy3f7gxh4omcmwpnuipaa)
# 你需要把这个钱包地址替换为你自己的钱包地址
wallet_addr="t3w7r6dguggp62nbopehewt4amjh2iq2belz2u73q3k3z7zoarw44k6cra3og7yyvuy3f7gxh4omcmwpnuipaa"
./lotus wallet export ${wallet_addr} > mywallet.key
# 导入钱包私钥
./lotus wallet import ./mywallet.key
# 导入之后,需要把该钱包地址设置为默认地址(当然,如果你有多个钱包地址,你可以自己选择)
./lotus wallet set-default ${wallet_addr}

16.3 参考文档

About

CoinSummer实验室Filecoin资源分享。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 97.0%
  • Shell 3.0%