CoinSummer 实验室 Filecoin 资源分享目录
主网相关
实时币价查看网站、钱包
【群友项目】
Lotus官方文档
代码下载地址
浏览器
水龙头地址
Benchmark 数据
Proof 证明文件国内下载
export IPFS_GATEWAY=https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/
rust 和 rustup 的安装环境配置(Cargo)
使用 GPU 计算 Precommit2
Filecoin Discover
Filecoin 经济解读
由于某些需求,主网上线之后,官方依然保留测试网,用于测试:
使用 JDCloud 下载 32GB 的证明参数:
# v28 版本的参数
export IPFS_GATEWAY=https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/
./lotus fetch-params 32GiB
如果水龙头无法创建矿工,可以取一些 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
是不可用的。
# 查看本节点所监听的地址:
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
上述的节点是示例节点,当您在使用该命令的时候,您需要自己去找一个可以使用的节点。
# 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
源码编译底层 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 扇区有效。
export RUST_LOG=Debug
运行 miner 之前加入该参数可以在 miner 的日志中查看更详细的输出信息(底层 rust 代码的输出信息),Log 登记从低到高分别有: Trace、Debug、Info、Warn、Error,Trace 输出的信息最详细,Error 输出的信息最少,仅输入错误信息。
export FIL_PROOFS_PARAMETER_CACHE=/path/to/proof_params/v28/
# 导出同步数据(去除无用的消息,保证导出的 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】
# 列举所有扇区信息:
lotus-miner sectors list
# 查看某个扇区的历史状态
lotus-miner sectors status --log <SectorID>
lotus-miner sectors update-state --really-do-it <SectorID> <NewSectorStatus>
# 例如:手动修改扇区 1 的状态为 FaultedFinal 状态
lotus-miner sectors update-state --really-do-it 1 FaultedFinal
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
}
# 设置数据存储路径,该路径用来存储最终密封好的数据
# 执行该命令可能需要一点时间等待
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
默认的存储目录 ~/.lotusminer
可以移动到其他地方。
移动前最好先停掉 daemon 和 miner。
移动后,假设新路径为 /path/to/.lotusminer
,需要手动更改 /path/to/.lotusminer
目录下 storage.json
中的 StoragePaths
为新路径:
{
"StoragePaths": [
{
"Path": "/path/to/.lotusminer"
}
]
}
移动后,重启 daemon 和 miner,miner 会重新读取新路径下的所有 sector 信息。
假设daemon在 192.168.1.100
机器上,miner在 192.168.1.101
机器上:
~/.lotus/config.toml
中的 ListenAddress
为:# Default config:
[API]
ListenAddress = "/ip4/192.168.1.100/tcp/1234/http"
~/.lotus
目录下的 api
和 token
拷贝到 miner 机器(192.168.1.101)的 ~/.lotus
目录下;# 注意空格不能少【以下命令是使用 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
# 从 【Available】 中提取 10 个 FIL 到 【Worker Balance】 中
./lotus-miner actor withdraw 10
# 从 【Worker Balance】 中发送 10 个 FIL 到 【Available】 中(假设 minerID 是 t01000 )
./lotus send t01000 10
原来使用 pledge 命令质押的扇区是垃圾扇区,里面的数据都是垃圾数据,为了让这些扇区能够存储有效数据,可以把这些扇区标记为可存储有效数据的扇区:
./lotus-miner sectors mark-for-upgrade <sector number>
如何扇区出现问题,或者不想要某个扇区,可以把该扇区删除:
./lotus-miner sectors remove --really-do-it <sector id>
由于误删、调度错乱等各种原因,导致扇区已提交到了链上,但时空证明失败的问题,可以使用lotus-shed
,一次性删除链上失败的扇区。
# 编译 lotus-shed
make lotus-shed
# 删除链上错误的扇区
lotus-shed sectors terminate --really-do-it [sectorNum1 sectorNum2 ...]
该命令将会发送一条消息,一次性删除错误扇区(注意:会扣币,目前一个扇区大约扣0.1个FIL)。
lotus-miner sealing workers
6.2.1. 修改 miner
修改 miner ~/.lotusminer/config.toml
里面的 ListenAddress
和 RemoteListenAddress
,把这两个变量中的地址都改为 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
目录中的 token
和 api
到 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需要注意以下几点:
precommit1
、precommit2
和 commit
默认是启用的,如果想要禁用,可以设置为 false
,例如:
--precommit1=false
;commit
参数是配置 commit2
的,commit1
无法在 Worker 中启用。假设Miner的公网IP为123.123.73.123
,内网IP为10.4.0.100
。
修改$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。
这里的multiaddress即为上面第(1)步中配置的ListenAddresses
的地址。
lotus-miner actor set-addrs /ip4/123.123.73.123/tcp/1024
设置完等待消息确认后,可以通过以下命令查看结果:
lotus state miner-info [t0xxxx]
执行以下命令查看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
,应该就能看到不少节点了。
太空竞赛可以配置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\" '"
telnet 123.123.73.123 1024
(注意替换成自己的IP和端口)看看是否返回/multistream/1.0.0
。如果Miner机器没有公网IP,就需要在边缘网络设备(如路由器,或有公网IP和端口转发服务的服务器)上做公网IP和端口向内网IP和端口的转发,假设公网IP为123.123.73.123
,Miner的内网IP为10.4.0.100
。
修改$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。
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。
参照7.1中的设置multiaddress。
参照7.1中的设置Miner连接的节点。
# 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
# 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
如果你在执行 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 fetch origin interopnet:interopnet
# 再切换到 interopnet 分支
git checkout interopnet
# 如果你没有修改代码,直接执行以下两条命令
git fetch origin
git reset --hard origin/interopnet
如果你在使用本地测试网,发现 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
使用 GDB 调试 lotus 源码(包括上层的 go 语言代码和底层的 rust 语言代码),你只需要一个 GDB 工具就可以单步调试了,非常方便:
为了方便调试测试网,可以在本地自己搭建一个私有链,搭建教程参考 【官方教程】,
多 Miner 本地测试网的搭建教程可参考 【./scripts】 中的脚本,目录中有启动 genersis 节点的两个脚本:start_genesis_daemon.sh
和 start_genesis_miner.sh
,以及启动其它节点的两个脚本:start_daemon.sh
和 start_miner.sh
,这四个脚本中有一些默认的设置,如果你需要运行这些脚本,你可以自己进行修改:
home
目录(即:~/$
)/home/tears/filecoin/official/lotus
tears
(你需要修改为你自己的主机名称)192.168.1.11
(你需要修改为你自己的主机地址)2KiB
home
目录下的旧文件,请检查:start_genesis_daemon.sh
和 start_daemon.sh
脚本文件:
本教程适用于需要修改 bellperson 代码的朋友:
如果因为编译的时候卡住,症状如下图所示:
解决方法:可以试试更改 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://crates.rustcc.cn/crates.io-index"
使用方法:vi ~/.cargo/config
, 然后把以上中的任意一个添加进去,保存好,然后再重新编译一次即可。
参考
如果在编译的时候因为下载代码子模块的时候卡住(GO 代码),可能是 GOPROXY 没有设置,此时,设置一下 GOPROXY,然后再重新编译一遍即可:
export GOPROXY=https://goproxy.cn
lotus 的 interopnet 分支在编译的时候,如果检测到 go 的版本低于 1.14, 则会编译失败,如下图所示:
解决方法,安装新版本的 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
在编译最新版的 master 分支分支的时候遇到这个问题(2020年6月19号23点,master 的 commit 是: ffa7be86fe6ee738ab4b095469029b9fac51e090),编译的时候提示找不到 1.43.1-x86_64-unknown-linux-gnu
,错误信息如下所示:
解决方法是跳过这个版本,直接使用 nightly
的版本,即,替换以下这个文件中的 1.43.1
为 nightly
。
echo "nightly" > ./extern/filecoin-ffi/rust/rust-toolchain
然后再重新编译,即可正常编译。
使用 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 需要用到 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
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 有用,修改立即生效):
# 修改为 1048576 (默认修改的是 soft 值):
ulimit -n 1048576 # 等效于 ulimit -Sn 1048576
# 临时修改 hard 值为 1048576
ulimit -Hn 1048576
# 可同时修改 soft 和 hard 的值:
ulimit -SHn 1048576
# 针对正在运行中的miner进程,可以通过以下命令修改:
prlimit --pid <PID> --nofile=1048576:1048576
# 通过以下命令查看修改:
cat /proc/<PID>/limits
# 永久修改(重新登录或重启生效):
# 把文件 /etc/systemd/user.conf 和 /etc/systemd/system.conf 中的字段修改如下:
DefaultLimitNOFILE=1048576
# 并修改 /etc/security/limits.conf 文件,添加如下内容:
* hard nofile 1048576
* soft nofile 1048576
Ref: 【解决Too many open files问题】、【Too many open files的四种解决办法】
由于某种原因,可能由于 .lotus
目录下的某些文件损坏导致 lotus daemon
无法启动,此时,最关键的还是要先把钱包的密钥导出来备份好(如果之前有备份的话就可以不用往下看了),导出的方法如下所示:
假设出故障的机器叫做 机器A
,新的机器叫做 机器B
:
机器B
上启动一个干净的 daemon
进程(同一台机器上也行,但是要保证有一个新的 .lotus
目录,和旧 .lotus
目录不能冲突),启动之后,daemon
会自动创建一个新的 .lotus
目录机器B
上的 daemon
进程,删除 机器B
上的 .lotus
目录中的 token
文件和 keystore
文件夹。机器A
上的 .lotus
目录中的 token
文件和 keystore
文件夹到 机器B
的 .lotus
目录中机器B
中的 daemon,此时就可以在 机器B
中正常的导出钱包地址了同步链错误,由于本机的时间与网络时间不同步导致,解决方法如下所示:
# 同步本机时间
ntpdate ntp.aliyun.com
hwloc 是获取 CPU 硬件信息的有用工具,lotus 需要使用到这个工具,安装一下就可以:
# Ubuntu 上的解决方法:
sudo apt install hwloc libhwloc-dev
给自己的 github 添加一对公私钥就可以了,生成公私钥对的命令参考如下,生成之后,你还需要把公钥复制到 github 账号的 SSH Keys
中(这步需要在网页上操作),默认生成的公钥名称是 id_rsa.pub
, 私钥名称是 id_rsa
,私钥放在你的 ~/.ssh
文件夹中即可,公钥上传到 github 服务器中:
# 生成公私钥对,带 .pub 后缀的文件是公钥,是需要上传到 github 上面的
# 命令中 【your_email@email.com】 输入你的 github 账号
ssh-keygen -t rsa -C "your_email@email.com"
例如,当前链同步的高度是 6100,但是同步的时候出现某个块是坏块,因此,会导致同步失败,失败信息如下所示:
Error: chain linked to block marked previously as bad ([bafy2bzacedwp2ciwsjirnxc5gdtehddjurpp7qijzal32su7ob5vh4ons2sm2],
解决方法:先把高度往前调一些(比如,当前高度在 6100, 往前调到 6000),然后再手动标记某些坏块:
lotus chain sethead --epoch 6000
# 重启一下 daemon
lotus sync mark-bad bafy2bzacedwp2ciwsjirnxc5gdtehddjurpp7qijzal32su7ob5vh4ons2sm2
最新版 lotus-v1.2.1
需要使用最新版的 golang
(golang-1.15.5
) 来编译,否则会如下错误:
Makefile:10: Your Golang version is go 1.15.2
Makefile:11: *** Update Golang to version to at least 1.15.5. Stop.
目前在 Ubuntu 20.04
上可以直接使用 apt
安装最新版的 golang
(安装新版 golang
之前最好先卸载旧版的,否则可能会出问题),如果是使用 Ubuntu 18.04
,则需要手动下载 golang
手动安装:
安装参考命令:
tar -C /usr/local -xzf go1.15.5.linux-amd64.tar.gz
vi ~/.bashrc
# 在 ~/.bashrc 文件的末尾加上: export PATH=$PATH:/usr/local/go/bin
source ~/.bashrc
# 命令
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
# 命令
# 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
# 命令
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
# 命令
# 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
results (v28) SectorSize:(34359738368), SectorNumber:(1)
seal: addPiece: 10m48.240241696s (50.55 MiB/s)
seal: preCommit phase 1: 2h22m21.760639531s (3.836 MiB/s)
seal: preCommit phase 2: 24m51.560433206s (21.97 MiB/s)
seal: commit phase 1: 1.140462976s (28.06 GiB/s)
seal: commit phase 2: 47m29.898859543s (11.5 MiB/s)
seal: verify: 8.01946ms
generate candidates: 853.599µs (36.61 TiB/s)
compute winning post proof (cold): 2.128980727s
compute winning post proof (hot): 1.78541416s
verify winning post proof (cold): 61.022724ms
verify winning post proof (hot): 4.231715ms
compute window post proof (cold): 5m48.192993009s
compute window post proof (hot): 5m28.177627942s
verify window post proof (cold): 6.493587214s
verify window post proof (hot): 10.944523ms
磁盘最大消耗情况,其实不止 516.64GiB
,因为在每次生成 tree-r-last
的时候,都会临时保存中间的 4.6GB
数据磁盘中,例如: [4.6G] sc-02-data-tree-r-last-6.dat
,因此一次密封过程中的最大磁盘消耗,应该是 516.64GiB - 9.1MB + 4.6GB
,约等于 522GiB
。
具体情况如下所示:
[2020_12_23_04_01]: current size: 554741069840 (516.64GiB)
/home/gossip/disk_nvme1/lotus-bench
└── [4.0K] bench159597807
├── [4.0K] cache
│ └── [4.0K] s-t01000-1
│ ├── [ 64] p_aux
│ ├── [ 32G] sc-02-data-layer-10.dat
│ ├── [ 32G] sc-02-data-layer-11.dat
│ ├── [ 32G] sc-02-data-layer-1.dat
│ ├── [ 32G] sc-02-data-layer-2.dat
│ ├── [ 32G] sc-02-data-layer-3.dat
│ ├── [ 32G] sc-02-data-layer-4.dat
│ ├── [ 32G] sc-02-data-layer-5.dat
│ ├── [ 32G] sc-02-data-layer-6.dat
│ ├── [ 32G] sc-02-data-layer-7.dat
│ ├── [ 32G] sc-02-data-layer-8.dat
│ ├── [ 32G] sc-02-data-layer-9.dat
│ ├── [4.6G] sc-02-data-tree-c-0.dat
│ ├── [4.6G] sc-02-data-tree-c-1.dat
│ ├── [4.6G] sc-02-data-tree-c-2.dat
│ ├── [4.6G] sc-02-data-tree-c-3.dat
│ ├── [4.6G] sc-02-data-tree-c-4.dat
│ ├── [4.6G] sc-02-data-tree-c-5.dat
│ ├── [4.6G] sc-02-data-tree-c-6.dat
│ ├── [4.6G] sc-02-data-tree-c-7.dat
│ ├── [ 64G] sc-02-data-tree-d.dat
│ ├── [9.1M] sc-02-data-tree-r-last-0.dat
│ ├── [9.1M] sc-02-data-tree-r-last-1.dat
│ ├── [9.1M] sc-02-data-tree-r-last-2.dat
│ ├── [9.1M] sc-02-data-tree-r-last-3.dat
│ ├── [9.1M] sc-02-data-tree-r-last-4.dat
│ ├── [9.1M] sc-02-data-tree-r-last-5.dat
│ ├── [9.1M] sc-02-data-tree-r-last-6.dat
│ ├── [9.1M] sc-02-data-tree-r-last-7.dat
│ └── [1.5K] t_aux
├── [4.0K] sealed
│ └── [ 32G] s-t01000-1
└── [4.0K] unsealed
└── [ 32G] s-t01000-1
5 directories, 32 files
每过 5 秒统计了一次内存消耗情况,发现 P1
最大内存消耗大约是 73GB
,C2
最大内存消耗大约是 173GB
,如下所示:
# P1
[2020_12_23_03_18_01:]
total used free shared buff/cache available
Mem: 251Gi 73Gi 1.6Gi 4.0Mi 176Gi 175Gi
Swap: 2.0Gi 1.2Gi 823Mi
# C2
[2020_12_23_04_11_01:]
total used free shared buff/cache available
Mem: 251Gi 173Gi 1.9Gi 20Mi 76Gi 76Gi
Swap: 2.0Gi 1.2Gi 795Mi
注: 统计数据可能不是非常准确。
脚本中默认每 15 分钟添加一个扇区,总共添加 2000 个扇区(你可以自己修改),此外,使用次脚本你需要手动指定 lotus 的路径,即:脚本中的 lotus_path
参数。
Filecoin 中文交流群 是目前国内最友好的 Filecoin 技术交流群, 也是全球最大的、最活跃的 Filecoin 技术交流社区, 欢迎广大 Filecoin 爱好者加入我们的技术交流群。 进群请加微信:max-yu-666 【微信群管理员】
Filecoin 中文交流-1群(目前已满), Filecoin 中文交流-2群(目前已满), Filecoin 中文交流-3群(目前还有空位),
对于 32GB
的扇区,P1 计算过程是生成 11 层数据,每层数据都是 32GB
大小,并且除了第一层之外,剩下的 10 层数据的生成过程是完全一样的。
这里涉及到一个节点的概念,其实就是把一个 32 字节的数据当做一个节点,一层 Layer 由 1G
(1G=1024*1024*1024
) 个连续的节点组成,仅此而已。
P2 的运算过程其实也很简单,只是使用的哈希算法是 Poseidon
哈希算法而已,本质上还是进行哈希运算。
P2 分为两个阶段,一个是 Building column hash
(也叫做 Building tree c
),另一个叫做 Building tree r last
。
只不过,在 Building column hash
的时候,会把每层的 1G
个节点的划分为大小相等的 8
份,每一份都是 128M
个节点,最后生成一个 8 个 tree-c
(tree-c-0
~ tree-c-7
)(下图为了简洁,没有体现划分 8 份的操作)。
Building tree r last
和 Building column hash
基本一样,只是使用的数据不一样罢了,最后生成 tree-r-last-0
~ tree-r-last-7
。
$ 1 FIL = 10^{9} nanoFIL = 10^{18} attoFIL $
# 查看钱包地址,一般是 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}
htop 比系统自带的 top 界面更加友好,在 Ubuntu 上安装只需要执行:
sudo apt install htop
效果如下:
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
效果如下:
如果您觉得此文档对您有帮助,欢迎打赏哦 ---- 【Filecoin技术交流群-1/2/3群群主:TEARS】
【FIL 钱包地址】:f1vrpuagiiln7qqgfduph2qse7eo5zhriidekp6fq
【FIL QRCODE】:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。