从零开始搭建 Filecoin 主网挖矿集群

如果你是一个 Filecoin 小白,但是略懂 Linux 运维,那么读完这篇教程,你应该可以自己动手搭建一个 Filecoin 挖矿集群。

> 一个人生命中最大的幸运,莫过于在他的人生中途,还年富力强的时候,发现了自己的使命。-- 茨威格 今天的这篇文章,是对之前的 [《Filecoin 系列10-搭建 Lotus 测试网集群挖矿》](http://www.r9it.com/20191217/lotus-cluster-mining.html) 一文的补充。Filecoin 主网已经上线,但是部署的细节跟之前测试网的略有差异,所以写了这篇文章。如果你是一个 Filecoin 小白,但是略懂 Linux 运维,那么读完这篇教程,你应该可以自己动手搭建一个 Filecoin 挖矿集群。 ## 环境说明 * 操作系统:Ubuntu-18.04LTS * Golang 版本:1.15.5 * Rust 版本:1.46 * Lotus 版本:1.2.1 ## 搭建编译环境 1. 安装 go 语言环境以及编译所需要的依赖库 ```bash 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`。 ```bash 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` 可能会比较慢,如果发现特别慢的话,建议你使用下面的方法手动安装: ```bash 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` ```bash export GOROOT=/usr/local/go export GOBIN=$GOROOT/bin export GOPKG=$GOROOT/pkg/tool/linux_amd64 export GOARCH=amd64 export GOOS=linux export GOPATH=/golang/ export PATH=$PATH:$GOBIN:$GOPKG ``` 运行下面命令使环境变量生效 ```bash source ~/.bashrc ``` 2. 安装 Rust 编译环境 > 提示: 本步骤需要一把梯子,没有梯子的话,过程可能很漫长。 ``` bash curl https://sh.rustup.rs -sSf | sh ``` 上面脚本会让你选择安装方式,直接选择 1, 回车。安装完成之后运行下面脚本使 rust 环境变量生效: ```bash source $HOME/.cargo/env ``` ## 编译 lotus 源码 1. 下载源代码,并切换到指定的分支。 ```bash # clone 源码到本地 git clone https://github.com/filecoin-project/lotus.git # 切换到你想要分支或者 tag 版本,如: cd lotus && git checkout v0.10.2 ``` 2. AMD 机器编译命令 ```bash FFI_BUILD_FROM_SOURCE=1 make clean all lotus-bench ``` 3. 对于旧的 Intel 的机器,可能由于兼容性原因(比如,执行过程中出现非法指令:`illegal instruction`),需要添加相应的参数: ```bash FFI_BUILD_FROM_SOURCE=1 CGO_CFLAGS="-O -D__BLST_PORTABLE__" make clean all lotus-bench ``` ## 启动 lotus daemon 由于 `Lotus` 需要通过设置环境变量的形式来修改节点的默认配置,而使用全局的环境变量又容易污染系统环境,有时还会导致一些莫名奇妙的错误。所以为了避免每次使用 lotus 命令之前都要 输入一大堆环境变量,因此我们建议重写 lotus 命令。 首先,新建脚本 ```bash vim /usr/local/bin/lotus ``` 脚本内容如下 ```bash export IPFS_GATEWAY=https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/ export LOTUS_PATH=/data/lotus /opt/lotus/lotus $* ``` * `/data/lotus` lotus 区块存储地址 * `/opt/lotus/lotus` lotus 可执行文件的路径 启动 lotus daemon ```bash lotus daemon > daemon.log 2>&1 & ``` <div class="custom-block warning"> Note: 上面的命令是启动全节点,从 0 开始同步区块,这样会比较慢,以目前的高度 `286186` 来说,网络好的话,估计也得同步 5 天到 1 个星期。 但是通常如果你不是做钱包或者交易所的话,你并不需要全节点,你可以直接从官方提供的快照来同步,或者从其他节点导出快照,再导入到当前 daemon. </div> 可以使用以下方式创建完整的 CAR 快照: ```bash # usage lotus chain export <filename> # e.g lotus chain export lotus-chain-2020-12-02.car ``` 通过上面的命令你可以导出一个完整的 lotus chain 快照。不过这个快照比较大,可能超过 100 GB。所以更常用的方式是使用下面的命令导出一个阉割版的快照, 就是只导出最新的区块,跳过以前的旧消息。 ```bash # usage lotus chain export --skip-old-msgs --recent-stateroots=<stateroots-num> <filename> # e.g lotus chain export --skip-old-msgs --recent-stateroots=2000 lotus-chain-2020-12-02.car ``` `--recent-stateroots` 参数指定要导出的状态根数,**最小快照 --recent-stateroots 为 900,小于 900 的快照可能导入失败**。 `--skip-old-msgs` 参数表示只导出那些 `stateroots` 直接引用的区块。 然后在首次启动 daemon 的时候执行导入快照。(只是第一次需要导入,后面再启动 daemon 就不需要了)。 > Note: 如果导入失败的话,请试着加大 `--recent-stateroots` 的值,不过通常情况下 2000 足够了。 ```bash # Without verification lotus daemon --import-snapshot <filename> # With verification lotus daemon --import-chain <filename> ``` 如果你希望在快照导入之后就立即退出守护进程,(例如在docker环境中很有用),请在命令中添加 `--halt-after-import` 标志: ```bash lotus daemon --import-snapshot --halt-after-import <filename> ``` ## 初始化矿工 进行这个操作之前,你最好先等 lotus daemon 完成区块同步,使用下面的命令检查区块是否同步完成 ```bash lotus sync wait ``` 该命令会显示当前同步多少区块了,还有多少没有同步完成,以及你现在的同步速度。如果没有同步完成,会一直处于阻塞状态,等待同步完成了该命令才会退出。 同样的,我们也需要重写 `lotus-miner` 脚本 ```bash vim /usr/local/bin/lotus-miner ``` 脚本内容如下 ```bash export FIL_PROOFS_PARAMETER_CACHE=/gamma/filecoin-proof-parameters # proof 参数路径 export IPFS_GATEWAY=https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/ export LOTUS_PATH=/data/lotus # daemon 数据根路径 export LOTUS_MINER_PATH=/data/lotus-miner # miner 数据存储跟路径 export FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1 # 启用 GPU加速 COLUMN hash 计算 export FIL_PROOFS_USE_GPU_TREE_BUILDER=1 # 启用 GPU 构造 Merkle 树 export RUST_LOG=Info export FIL_PROOFS_MAXIMIZE_CACHING=1 /opt/lotus/lotus-miner $* ``` 1. 创建钱包: ```bash lotus wallet new bls ``` 输出钱包地址: `f3xxxx`。 <div class="custom-block warning"> 警告:创建好钱包先不要急着充值,而是要先备份钱包私钥!!! </div> ```bash lotus wallet export f3xxxx ``` 2. 充值,如果只是创建矿工的话,充值 1 个FIL 足够了。 3. 创建矿工。 ```bash # usage lotus-miner init --owner=<address> --sector-size=<val> # e.g lotus-miner init --owner=f0xxxx --sector-size=32GiB lotus-miner init --owner=f0xxxx --sector-size=64GiB ``` ## 修改 Miner 配置 miner 的配置文档在 `$LOTUS_MINER_PATH/config.toml`,如果你是跑单节点的话,那么无需修改配置文档,但是如果你是需要跑集群的话, 那么你需要修改下面几个地方: 1. 修改 API 连接配置,主要用于 worker 连接 miner. ```ini # e.g [API] ListenAddress = "/ip4/xxx.xxx.xxx.xxx/tcp/2345/http" RemoteListenAddress = "xxx.xxx.xxx.xxx:2345" ``` `xxx.xxx.xxx.xxx` 替换成你 miner 的内网 IP 地址。 2. 修改 `[Storage]` 选项,将密封相关的任务全部分配给 worker 去做。 ```ini [Storage] # ParallelFetchLimit = 10 AllowAddPiece = false AllowPreCommit1 = false AllowPreCommit2 = false AllowCommit = false # AllowUnseal = true ``` ## 使用远程 lotus daemon 如果你的 miner 和 lotus daemon 是跑在不同的机器上,那么你需要做一些额外的配置: 1. 配置你的 lotus daemon config.toml 文件: ```ini # 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 地址。 2. 拷贝 lotus dameon 的 api 和 token 文件到 miner 机器的 `$LOTUS_PATH` 目录下。 ## 启动 lotus-miner ```bash lotus-miner run > miner.log 2>&1 & ``` ## 启动 lotus-worker 同样的,我们也需要重写 `lotus-worker` 脚本 ```bash vim /usr/local/bin/lotus-worker ``` 脚本内容如下 ```bash export FIL_PROOFS_PARAMETER_CACHE=/gamma/filecoin-proof-parameters # proof 参数路径 export IPFS_GATEWAY=https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/ export LOTUS_WORKER_PATH=/data/lotus-worker # worker 数据存储目录 export LOTUS_MINER_PATH=/data/lotus-miner # 保存 miner api 和 token 的目录 export FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1 # 启用 GPU加速 COLUMN hash 计算 export FIL_PROOFS_USE_GPU_TREE_BUILDER=1 # 启用 GPU 构造 Merkle 树 export RUST_LOG=Info export FIL_PROOFS_MAXIMIZE_CACHING=1 /opt/lotus/lotus-worker $* ``` 1. 拷贝 miner 的 api 和 token 文件到 `$LOTUS_MINER_PATH` 目录下。 2. 启动 worker 程序,可以根据传入不同的参数来定义 worker 的类型。 (1) 启动一个只接 P1 任务的 worker ```bash 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 ```bash lotus-worker run --listen=11.11.11.11:2345 --precommit1=true --precommit2=true -commit=false ``` (2) 启动一个只接 C2 任务的 worker ```bash lotus-worker run --listen=11.11.11.11:2345 --precommit1=false --precommit2=false -commit=true ``` worker 启动之后会自动通过我们在 `lotus-worker` 脚本里配置的 API 信息,连接到 miner 领取任务,你可以通过下面的命令查看已经连接到 miner 的 worker 列表。 ```bash lotus-miner sealing workers ``` Worker 也启动了,那么接下来我们就可以开始质押扇区,启动挖矿了。 ```bash lotus-miner sectors pledge # 质押一个随机数据的扇区,开始密封 ``` 查询当前集群的任务分配情况: ```bash lotus-miner sealing jobs ``` ## 集群常规运维操作 集群操作请参考 [Filecoin 运维(2) - 环境变量和常用运维操作](https://learnblockchain.cn/article/1465),此处不再赘述。

一个人生命中最大的幸运,莫过于在他的人生中途,还年富力强的时候,发现了自己的使命。-- 茨威格

今天的这篇文章,是对之前的 《Filecoin 系列10-搭建 Lotus 测试网集群挖矿》 一文的补充。Filecoin 主网已经上线,但是部署的细节跟之前测试网的略有差异,所以写了这篇文章。如果你是一个 Filecoin 小白,但是略懂 Linux 运维,那么读完这篇教程,你应该可以自己动手搭建一个 Filecoin 挖矿集群。

环境说明

  • 操作系统:Ubuntu-18.04LTS
  • Golang 版本:1.15.5
  • Rust 版本:1.46
  • Lotus 版本:1.2.1

搭建编译环境

  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=$GOROOT/bin
    export GOPKG=$GOROOT/pkg/tool/linux_amd64
    export GOARCH=amd64
    export GOOS=linux
    export GOPATH=/golang/
    export PATH=$PATH:$GOBIN:$GOPKG

    运行下面命令使环境变量生效

    source ~/.bashrc
  2. 安装 Rust 编译环境

    提示: 本步骤需要一把梯子,没有梯子的话,过程可能很漫长。

    bash curl https://sh.rustup.rs -sSf | sh

    上面脚本会让你选择安装方式,直接选择 1, 回车。安装完成之后运行下面脚本使 rust 环境变量生效:

    source $HOME/.cargo/env

编译 lotus 源码

  1. 下载源代码,并切换到指定的分支。
    # clone 源码到本地
    git clone https://github.com/filecoin-project/lotus.git 
    # 切换到你想要分支或者 tag 版本,如:
    cd lotus && git checkout v0.10.2
  2. AMD 机器编译命令
    FFI_BUILD_FROM_SOURCE=1 make clean all lotus-bench
  3. 对于旧的 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

脚本内容如下

export IPFS_GATEWAY=https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/ 
export LOTUS_PATH=/data/lotus 
/opt/lotus/lotus $*
  • /data/lotus lotus 区块存储地址
  • /opt/lotus/lotus lotus 可执行文件的路径

启动 lotus daemon

lotus daemon > daemon.log 2>&1 &

<div class="custom-block warning">

Note: 上面的命令是启动全节点,从 0 开始同步区块,这样会比较慢,以目前的高度 286186 来说,网络好的话,估计也得同步 5 天到 1 个星期。 但是通常如果你不是做钱包或者交易所的话,你并不需要全节点,你可以直接从官方提供的快照来同步,或者从其他节点导出快照,再导入到当前 daemon.

</div>

可以使用以下方式创建完整的 CAR 快照:

# usage 
lotus chain export &lt;filename> 
# e.g
lotus chain export lotus-chain-2020-12-02.car

通过上面的命令你可以导出一个完整的 lotus chain 快照。不过这个快照比较大,可能超过 100 GB。所以更常用的方式是使用下面的命令导出一个阉割版的快照, 就是只导出最新的区块,跳过以前的旧消息。

# usage
lotus chain export --skip-old-msgs --recent-stateroots=&lt;stateroots-num> &lt;filename>
# e.g
lotus chain export --skip-old-msgs --recent-stateroots=2000 lotus-chain-2020-12-02.car

--recent-stateroots 参数指定要导出的状态根数,最小快照 --recent-stateroots 为 900,小于 900 的快照可能导入失败--skip-old-msgs 参数表示只导出那些 stateroots 直接引用的区块。

然后在首次启动 daemon 的时候执行导入快照。(只是第一次需要导入,后面再启动 daemon 就不需要了)。

Note: 如果导入失败的话,请试着加大 --recent-stateroots 的值,不过通常情况下 2000 足够了。

# Without verification
lotus daemon --import-snapshot &lt;filename>
# With verification
lotus daemon --import-chain &lt;filename>

如果你希望在快照导入之后就立即退出守护进程,(例如在docker环境中很有用),请在命令中添加 --halt-after-import 标志:

lotus daemon --import-snapshot --halt-after-import &lt;filename>

初始化矿工

进行这个操作之前,你最好先等 lotus daemon 完成区块同步,使用下面的命令检查区块是否同步完成

lotus sync wait

该命令会显示当前同步多少区块了,还有多少没有同步完成,以及你现在的同步速度。如果没有同步完成,会一直处于阻塞状态,等待同步完成了该命令才会退出。

同样的,我们也需要重写 lotus-miner 脚本

vim /usr/local/bin/lotus-miner

脚本内容如下

export FIL_PROOFS_PARAMETER_CACHE=/gamma/filecoin-proof-parameters  # proof 参数路径
export IPFS_GATEWAY=https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/ 
export LOTUS_PATH=/data/lotus  # daemon 数据根路径
export LOTUS_MINER_PATH=/data/lotus-miner   # miner 数据存储跟路径
export FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1  # 启用 GPU加速 COLUMN hash 计算
export FIL_PROOFS_USE_GPU_TREE_BUILDER=1  # 启用 GPU 构造 Merkle 树
export RUST_LOG=Info 
export FIL_PROOFS_MAXIMIZE_CACHING=1 
/opt/lotus/lotus-miner $*
  1. 创建钱包:

    lotus wallet new bls

    输出钱包地址: f3xxxx

    <div class="custom-block warning"> 警告:创建好钱包先不要急着充值,而是要先备份钱包私钥!!! </div>

    lotus wallet export f3xxxx
  2. 充值,如果只是创建矿工的话,充值 1 个FIL 足够了。
  3. 创建矿工。

    # usage
    lotus-miner init --owner=&lt;address> --sector-size=&lt;val>
    # e.g
    lotus-miner init --owner=f0xxxx --sector-size=32GiB
    lotus-miner init --owner=f0xxxx --sector-size=64GiB

修改 Miner 配置

miner 的配置文档在 $LOTUS_MINER_PATH/config.toml,如果你是跑单节点的话,那么无需修改配置文档,但是如果你是需要跑集群的话, 那么你需要修改下面几个地方:

  1. 修改 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 地址。

  2. 修改 [Storage] 选项,将密封相关的任务全部分配给 worker 去做。

    [Storage]
    #  ParallelFetchLimit = 10
    AllowAddPiece = false
    AllowPreCommit1 = false
    AllowPreCommit2 = false
    AllowCommit = false
    #  AllowUnseal = true

使用远程 lotus daemon

如果你的 miner 和 lotus daemon 是跑在不同的机器上,那么你需要做一些额外的配置:

  1. 配置你的 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 地址。

  2. 拷贝 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

脚本内容如下

export FIL_PROOFS_PARAMETER_CACHE=/gamma/filecoin-proof-parameters  # proof 参数路径
export IPFS_GATEWAY=https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/ 
export LOTUS_WORKER_PATH=/data/lotus-worker  # worker 数据存储目录
export LOTUS_MINER_PATH=/data/lotus-miner   # 保存 miner api 和 token 的目录
export FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1  # 启用 GPU加速 COLUMN hash 计算
export FIL_PROOFS_USE_GPU_TREE_BUILDER=1  # 启用 GPU 构造 Merkle 树
export RUST_LOG=Info
export FIL_PROOFS_MAXIMIZE_CACHING=1 
/opt/lotus/lotus-worker $*
  1. 拷贝 miner 的 api 和 token 文件到 $LOTUS_MINER_PATH 目录下。
  2. 启动 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

集群常规运维操作

集群操作请参考 Filecoin 运维(2) - 环境变量和常用运维操作,此处不再赘述。

区块链技术网。

  • 发表于 2021-04-20 21:02
  • 阅读 ( 3115 )
  • 学分 ( 102 )
  • 分类:FileCoin

评论