CoinSummer 实验室 Filecoin 资源分享。
-
主网相关
-
实时币价查看网站
-
Lotus官方文档
-
代码下载地址
-
浏览器
- 官方浏览器 stats - 官方
- Filscout - 星际联盟团队开发
- 官方 Filscan
- 1475ipfs - 1475 团队开发
- FilFox - 6Block 团队
- Filplorer - 未知
-
水龙头地址
-
Benchmark 数据
-
Proof证明文件国内下载
- JDCloud(v25)参数下载 -
env IPFS_GATEWAY=https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/
- 国内专用v26参数下载 - 群友 Daniels 提供,白天效果不错,晚上较慢
- 最新版Proofs发布地址 - 最新发布 Proof 参数的地方【官方】
- JDCloud(v25)参数下载 -
-
rust 和 rustup 的安装环境配置(Cargo)
-
使用 GPU 计算 Precommit2
-
Filecoin Discover
-
Filecoin 经济解读
- Branch: master
- tag: 最新:2020/09/26 - 3:20 PM 【v0.8.0】
- 版本更新要求: 强制更新
- 链同步数快照:【Spacerace_pruned_stateroots_snapshot_latest.car】,参考
- 填表取币:【Miner Reimbursement Form】
- 博客:
由于某些需求,主网上线之后,官方依然保留测试网,用于测试:
- 网络列表
- 【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.
-
Branch: master
-
tag: 最新:2020/08/29 - 10:05 AM 【v0.5.6】, v0.5.5 夭折了
-
矿工联通性检查: https://spacerace.filecoin.io/check
-
Slack 宣布地址: https://filecoinproject.slack.com/archives/C0179RNEMU4/p1598299269304500
-
浏览器:: 【官方 Stats】, 【Filscan】, 【Filfox】, 【Filscout】, 【Filblock】, 【IPFS.GUIDE】
(1). 2020/08/21: 【宋江之 Filecoin Discover 硬盘拷问】
(2). 2020/08/21: 【宋江之 硬盘与数据探讨】
(3). 2020/08/22: 【宋江之 Filecoin 灵魂拷问】
(4). 2020/08/25: 【宋江之 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
机器上:
- 修改远程 daemon (192.168.1.100)上
~/.lotus/config.toml
中的ListenAddress
为:
# Default config:
[API]
ListenAddress = "/ip4/192.168.1.100/tcp/1234/http"
- 将远程 daemon (192.168.1.100) 上
~/.lotus
目录下的api
和token
拷贝到 miner 机器(192.168.1.101)的~/.lotus
目录下; - 重启 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
# 从 【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>
由于误删、调度错乱等各种原因,导致扇区已提交到了链上,但时空证明失败的问题,可以合并1475-IPFS提供的方案,一次性删除链上失败的扇区。
在lotus目录下执行:git cherry-pick 023cec4d7fa438bceda331dbcc046f7a094ecfc4
即可将该commit合并到自己的代码中,然后重新编译,运行:
# 删除链上错误的扇区
lotus-miner proving terminate --sectors xxx,xxx,xxx
该命令将会发送一条消息,一次性删除错误扇区(注意:会扣币)。
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需要注意以下几点:
- 要给 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\" '"
- 首先通过官方提供的Ping工具看看能否ping通自己Miner的公网IP;
- 其次,通过[Port-chk]查看自己Miner的公网端口是否开放;
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
目录(即:~/$
) - lotus 可执行文件的默认目录在:
/home/tears/filecoin/official/lotus
- 创世节点所在的主机名称默认是:
tears
(你需要修改为你自己的主机名称) - 创世节点所在的主机地址默认是:
192.168.1.11
(你需要修改为你自己的主机地址) - 扇区大小默认是:
2KiB
- 节点启动 daemon 的时候会删除
home
目录下的旧文件,请检查:start_genesis_daemon.sh
和start_daemon.sh
脚本文件:
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
效果如下:
如果因为编译的时候卡住,症状如下图所示:
解决方法:可以试试更改 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
, 然后把以上中的任意一个添加进去,保存好,然后再重新编译一次即可。
参考
如果在编译的时候因为下载代码子模块的时候卡住(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 有用,修改立即生效):
# 修改为 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的四种解决办法】
由于某种原因,可能由于 .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
中正常的导出钱包地址了
同步链错误,由于本机的时间与网络时间不同步导致,解决方法如下所示:
# 同步本机时间
ntpdate ntp.aliyun.com
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]"
例如,当前链同步的高度是 6100,但是同步的时候出现某个块是坏块,因此,会导致同步失败,失败信息如下所示:
Error: chain linked to block marked previously as bad ([bafy2bzacedwp2ciwsjirnxc5gdtehddjurpp7qijzal32su7ob5vh4ons2sm2],
解决方法:先把高度往前调一些(比如,当前高度在 6100, 往前调到 6000),然后再手动标记某些坏块:
lotus chain sethead --epoch 6000
# 重启一下 daemon
lotus sync mark-bad bafy2bzacedwp2ciwsjirnxc5gdtehddjurpp7qijzal32su7ob5vh4ons2sm2
- CPU: AMD 3970x (32核心64线程)
- GPU: RTX 2080Ti
- 内存: 256GB (2133MHz)
- 硬盘: NVMe 1TB * 2
# 命令
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
- CPU: AMD 3970x (32核心64线程)
- GPU: RTX 2080Ti
- 内存: 256GB (2133MHz)
- 硬盘: NVMe 1TB * 2
# 命令
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
脚本中默认每 15 分钟添加一个扇区,总共添加 2000 个扇区(你可以自己修改),此外,使用次脚本你需要手动指定 lotus 的路径,即:脚本中的 lotus_path
参数。
Filecoin 中文交流群 是目前国内最友好的 Filecoin 技术交流群, 欢迎广大 Filecoin 爱好者加入我们的技术交流群。 进群请加微信:max-yu-666
Filecoin 中文交流-1群(目前已满), Filecoin 中文交流-2群(目前还有空位)
$ 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}