环境说明
操作系统:Ubuntu-18.04LTS
Golang 版本:1.15.5
Rust 版本:1.46
Lotus 版本:1.2.1
搭建编译环境
安装 go 语言环境以及编译所需要的依赖库
sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt update
sudo apt install golang-go gcc git bzr jq pkg-config mesa-opencl-icd ocl-icd-opencl-dev -y
最新的 SDR 加速代码需要依赖 libhwloc,所以安装 libhwloc-dev。
sudo apt install libhwloc-dev -y
有的系统还需要创建 lib 库软链接
ln -s /usr/lib/x86_64-linux-gnu/libhwloc.so.5.7.6 /usr/lib/x86_64-linux-gnu/libhwloc.so.15
安装 golang-go 可能会比较慢,如果发现特别慢的话,建议你使用下面的方法手动安装:
wget https://golang.org/doc/install?download=go1.15.5.linux-amd64.tar.gz # 这里选择你需要的版本
tar -xvpzf go1.15.linux-amd64.tar.gz
mv go /usr/local
添加环境变量:vim ~/.bashrc
export GOROOT=/usr/local/go
export GOBIN=
G
O
R
O
O
T
/
b
i
n
e
x
p
o
r
t
G
O
P
K
G
=
GOROOT/bin export GOPKG=
GOROOT/binexportGOPKG=GOROOT/pkg/tool/linux_amd64
export GOARCH=amd64
export GOOS=linux
export GOPATH=/golang/
export PATH=
P
A
T
H
:
PATH:
PATH:GOBIN:$GOPKG
运行下面命令使环境变量生效
source ~/.bashrc
安装 Rust 编译环境
提示: 本步骤需要一把*,没有*的话,过程可能很漫长。
curl https://sh.rustup.rs -sSf | sh
上面脚本会让你选择安装方式,直接选择 1, 回车。安装完成之后运行下面脚本使 rust 环境变量生效:
source $HOME/.cargo/env
编译 lotus 源码
下载源代码,并切换到指定的分支。
clone 源码到本地
git clone https://github.com/filecoin-project/lotus.git
切换到你想要分支或者 tag 版本,如:
cd lotus && git checkout v0.10.2
AMD 机器编译命令
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
启动 lotus daemon
由于 Lotus 需要通过设置环境变量的形式来修改节点的默认配置,而使用全局的环境变量又容易污染系统环境,有时还会导致一些莫名奇妙的错误。所以为了避免每次使用 lotus 命令之前都要 输入一大堆环境变量,因此我们建议重写 lotus 命令。
首先,新建脚本
vim /usr/local/bin/lotus
脚本内容如下
IPFS_GATEWAY=https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/
LOTUS_PATH=/data/lotus
/opt/lotus/lotus $*
/data/lotus lotus 区块存储地址
/opt/lotus/lotus lotus 可执行文件的路径
启动 lotus daemon
lotus daemon > daemon.log 2>&1 &
Note: 上面的命令是启动全节点,从 0 开始同步区块,这样会比较慢,以目前的高度 286186
来说,网络好的话,估计也得同步 5 天到 1 个星期。 但是通常如果你不是做钱包或者交易所的话,你并不需要全节点,你可以直接从官方提供的快照来同步,或者从其他节点导出快照,再导入到当前 daemon.
可以使用以下方式创建完整的 CAR 快照:
usage
lotus chain export
e.g
lotus chain export lotus-chain-2020-12-02.car
通过上面的命令你可以导出一个完整的 lotus chain 快照。不过这个快照比较大,可能超过 100 GB。所以更常用的方式是使用下面的命令导出一个阉割版的快照, 就是只导出最新的区块,跳过以前的旧消息。
usage
lotus chain export --skip-old-msgs --recent-stateroots=
e.g
lotus chain export --skip-old-msgs --recent-stateroots=2000 lotus-chain-2020-12-02.car
–recent-stateroots 参数指定要导出的状态根数。 --skip-old-msgs 参数表示只导出那些 stateroots 直接引用的区块。
然后在首次启动 daemon 的时候执行导入快照。(只是第一次需要导入,后面再启动 daemon 就不需要了)。
Without verification
lotus daemon --import-snapshot
With verification
lotus daemon --import-chain
如果你希望在快照导入之后就立即退出守护进程,(例如在docker环境中很有用),请在命令中添加 --halt-after-import 标志:
lotus daemon --import-snapshot --halt-after-import
初始化矿工
进行这个操作之前,你最好先等 lotus daemon 完成区块同步,使用下面的命令检查区块是否同步完成
lotus sync wait
该命令会显示当前同步多少区块了,还有多少没有同步完成,以及你现在的同步速度。如果没有同步完成,会一直处于阻塞状态,等待同步完成了该命令才会退出。
同样的,我们也需要重写 lotus-miner 脚本
vim /usr/local/bin/lotus-miner
脚本内容如下
FIL_PROOFS_PARAMETER_CACHE=/gamma/filecoin-proof-parameters \ # proof 参数路径
IPFS_GATEWAY=https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/
LOTUS_PATH=/data/lotus \ # daemon 数据根路径
LOTUS_MINER_PATH=/data/lotus-miner \ # miner 数据存储跟路径
FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1 \ # 启用 GPU加速 COLUMN hash 计算
FIL_PROOFS_USE_GPU_TREE_BUILDER=1 \ # 启用 GPU 构造 Merkle 树
RUST_LOG=Trace
FIL_PROOFS_MAXIMIZE_CACHING=1
/opt/lotus/lotus-miner $*
创建钱包:
lotus wallet new bls
输出钱包地址: f3xxxx。
提示:创建好钱包先不要急着充值,而是要先备份钱包私钥!!!
lotus wallet export f3xxxx
充值,如果只是创建矿工的话,充值 1 个FIL 足够了。
创建矿工 bash # usage lotus-miner init --owner=
修改 Miner 配置
miner 的配置文档在 $LOTUS_MINER_PATH/config.toml,如果你是跑单节点的话,那么无需修改配置文档,但是如果你是需要跑集群的话, 那么你需要修改下面几个地方:
修改 API 连接配置,主要用于 worker 连接 miner.
e.g
[API]
ListenAddress = “/ip4/xxx.xxx.xxx.xxx/tcp/2345/http”
RemoteListenAddress = “xxx.xxx.xxx.xxx:2345”
xxx.xxx.xxx.xxx 替换成你 miner 的内网 IP 地址。
修改 [Storage] 选项,将密封相关的任务全部分配给 worker 去做。
[Storage]
ParallelFetchLimit = 10
AllowAddPiece = false
AllowPreCommit1 = false
AllowPreCommit2 = false
AllowCommit = false
AllowUnseal = true
使用远程 lotus daemon
如果你的 miner 和 lotus daemon 是跑在不同的机器上,那么你需要做一些额外的配置:
配置你的 lotus daemon config.toml 文件:
e.g
[API]
ListenAddress = “/ip4/xxx.xxx.xxx.xxx/tcp/1234/http”
RemoteListenAddress = “xxx.xxx.xxx.xxx:1234”
xxx.xxx.xxx.xxx 替换成你 lotus daemon 的内网 IP 地址。
拷贝 lotus dameon 的 api 和 token 文件到 miner 机器的 $LOTUS_PATH 目录下。
启动 lotus-miner
lotus-miner run > miner.log 2>&1 &
启动 lotus-worker
同样的,我们也需要重写 lotus-worker 脚本
vim /usr/local/bin/lotus-worker
脚本内容如下
FIL_PROOFS_PARAMETER_CACHE=/gamma/filecoin-proof-parameters \ # proof 参数路径
IPFS_GATEWAY=https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/
LOTUS_WORKER_PATH=/data/lotus-worker \ # worker 数据存储目录
LOTUS_MINER_PATH=/data/lotus-miner \ # 保存 miner api 和 token 的目录
FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1 \ # 启用 GPU加速 COLUMN hash 计算
FIL_PROOFS_USE_GPU_TREE_BUILDER=1 \ # 启用 GPU 构造 Merkle 树
RUST_LOG=Trace
FIL_PROOFS_MAXIMIZE_CACHING=1
/opt/lotus/lotus-worker $*
拷贝 miner 的 api 和 token 文件到 $LOTUS_MINER_PATH 目录下。
启动 worker 程序,可以根据传入不同的参数来定义 worker 的类型。
(1) 启动一个只接 P1 任务的 worker
lotus-worker run --listen=11.11.11.11:2345 --precommit1=true --precommit2=false -commit=false
注意: 11.11.11.11 需要替换成你 worker 的内网 IP 地址。
(2) 启动一个可以同时接 P1 和 P2 任务的 worker
lotus-worker run --listen=11.11.11.11:2345 --precommit1=true --precommit2=true -commit=false
(2) 启动一个只接 C2 任务的 worker
lotus-worker run --listen=11.11.11.11:2345 --precommit1=false --precommit2=false -commit=true
worker 启动之后会自动通过我们在 lotus-worker 脚本里配置的 API 信息,连接到 miner 领取任务,你可以通过下面的命令查看已经连接到 miner 的 worker 列表。
lotus-miner sealing workers
Worker 也启动了,那么接下来我们就可以开始质押扇区,启动挖矿了。
lotus-miner sectors pledge # 质押一个随机数据的扇区,开始密封
查询当前集群的任务分配情况:
lotus-miner sealing jobs