# Lotus 本地安全操作
目前 lotus 运维都是采用远程运维的方式,机器放在远程机房。那么私钥的安全性就取决于下面几个因素:
- 机房人员不作恶,如果机房人员想要导出你的私钥你几乎是一点办法都没有。
- 集群运维人员。
- 私钥在线上-线下或者人与人之间传递。
- 黑客攻击服务器。
为了避免 owner 私钥泄露带来的灾难,我们之前强烈建议运维人员运用拔插的方式使用 owner 私钥:用完即删除,再用再导入。
然而,频繁地在线上 daemon 服务器上导入和删除 owner 私钥,确实有些繁琐,这很考验运维人员的专业素质。 而且运维人员跟老板之间的信任问题,几乎是无解的。 这里我们提供一种简单的思路:集群的所有者(这里我们称之为老板)在一个相对安全可控环境里(如自己家里或者办公室)运行一个 daemon 节点,凡是需要使用 Owner 私钥的操作,都由老板亲自操作。
使用场景
- 在本地创建好 Miner 账号,然后交付给第三方运维,避免 owner 私钥传递。
- 在本地执行其他需要 owner 私钥的操作,如提现,终止错误扇区等,自己动手,安全可靠
警告
即使是在本地操作,我们也建议你养成一个好习惯:先确认备份好 Owner 私钥,每次用完之后及时删除,需要用的时候再导入。 私钥的备份和删除请参考 钱包私钥的备份和删除
# 硬件环境
# 1. 机器配置
准备一台机家用台式机即可,daemon 和 Miner 都跑在这台机器上,下面给出一个样机配置:
配件 | 型号 | 数量 |
---|---|---|
CPU | AMD Ryzen 3950X | 1 |
RAM | 海盗船 32GiB | 4 |
系统盘 | 120G SSD | 1 |
数据盘 | 4TiB M.2 磁盘 | 1 |
主板 | 华硕 GAMING B550M-PLUS | 1 |
机箱 | 游戏机箱 | 1 |
电源 | 长城 500W 以上 | 1 |
上述机器装好 Ubuntu-18.04 LTS-Server
版系统,将 4TiB 的 M.2 SSD 磁盘挂载到 /data
备用。
# 2. 网络配置
- 不需要公网 IP,如果网络已经配备公网 IP,请关闭除 P2P 接口以外的所有外网端口。
- 关闭 SSH 连接服务。
当然考虑到疫情可能需要远程办公,建议你在办公室和家里各备一台。如果你对安全级别没有那么高,那么你也可以打开 SSH 服务,但是要注意加强 SSH 连接安全,比如只能使用私钥连接,关闭密码登录等。
# 编译源码
安装 lotus 依赖
sudo apt install make gcc git bzr jq pkg-config mesa-opencl-icd ocl-icd-opencl-dev libhwloc-dev -y
安装 golang, 你需要安装 Go 1.16.4 或更高版本:
wget -c https://golang.org/dl/go1.16.4.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local
然后将
/usr/local/go/bin
添加到环境路径中:echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc && source ~/.bashrc
克隆仓库到本地,并切换到最新的 REALSE 版本:
git clone -b offline-miner https://github.com/lionsoul2014/lotus.git git check v1.15.0 # tag for a release
编译 lotus
cd lotus # 这里我们只编译我们需要用的 lotus 和 lotus-shed 工具 FFI_BUILD_FROM_SOURCE=1 make clean lotus lotus-shed # 编译完成之后我们加入环境路径 cp lotus lotus-shed /usr/local/bin
更多编译方法请参考 编译 lotus 源码 (opens new window)。
# 启动 daemon
导入节点快照
cd /data # 1. 下载主网最新的最小快照 wget https://fil-chain-snapshots-fallback.s3.amazonaws.com/mainnet/minimal_finality_stateroots_latest.car -O lotus-chain.car # 2. 导入快照 export LOTUS_PATH=/data/lotus lotus daemon --import-snapshot=lotus-chain.car --halt-after-import
启动节点
export LOTUS_PATH=/data/lotus export GOLOG_LOG_LEVEL=error nohup lotus daemon > /data/daemon.log 2>&1 &
daemon 启动之后你就可导入或者创建钱包了:
# 创建钱包 lotus wallet new bls # 导入钱包 lotus wallet import <wallet.key> # 导出钱包 lotus wallet export <address>
# 使用 lotus-shed
lotus-shed 是一个非常强大的工具集合,它几乎包含了消息的构建,编码,解码,签名以及所有的跟chain,miner,market 等相关的操作。你运行 lotus-shed --help
就能列出所有功能,这里我们演示几种:
lotus-shed 工具依赖 FullNode Api, 所以我们先要把 LOTUS_PATH
或者 FULLNODE_API_INFO
环境变量导出来:
export LOTUS_PATH=/data/lotus
创建一个新的 Miner 账号:
export LOTUS_MINER_PATH=/data/miner lotus-shed miner create <sender> <owner> <worker> <sector-size>
- sender: 用来发送消息(签名)的钱包地址
- owner: Owner 钱包地址
- worker: Worker 钱包地址
- sector-size: 扇区大小,可选:32GiB, 64GiB
创建成功会输出类似如下日志:
2022-03-29T11:06:54.949+0800 INFO lotus-shed lotus-shed/miner.go:243 Pushed CreateMiner message: bafy2bzacedsgqhybdi6hoxuoaukshgcftpm5bctvmsgoqoqfixot5kubw6e7w 2022-03-29T11:06:54.949+0800 INFO lotus-shed lotus-shed/miner.go:244 Waiting for confirmation 2022-03-29T11:07:09.950+0800 INFO lotus-shed lotus-shed/miner.go:260 New miners address is: t01001 (t23wyhealysqoer27xavmitzfqollpcvqfy7fd3fq)
提现 Miner 收益到 Owner 钱包:
# usage lotus-shed actor withdraw --actor=<miner-addr> <amount> # e.g lotus-shed actor withdraw --actor=t01000 10 Requested rewards withdrawal in message bafy2bzacebnmtjdrtlu3oa7id4cv4wsasm4qpcjcpdmqbaetlkvyxhkwooqiu
终止错误扇区
# usage lotus-shed sectors terminate --actor=<miner-addr> --really-do-it <sector-number> # e.g lotus-shed sectors terminate --actor=t01000 --really-do-it 100 sent termination message: bafy2bzacebdsaqigefl7wl7l3j2dr3pxvuvuvpxtqrd6o5vkp5repw2zopdqk
Owner 私钥更改
# 1. 先用旧的 owner 私钥签名消息,发起更换 owner 请求 lotus-shed actor set-owner --really-do-it --actor=<miner-id> <new-address> <old-address> # 2. 再用新的 owner 私钥签名消息,确认更换操作 lotus-shed actor set-owner --really-do-it --actor=<miner-id> <new-address> <new-address>
Worker 私钥更改
# 1. 提交一笔更换 Worker 地址提案的消息 lotus-shed actor propose-change-worker --really-do-it --actor=<miner-id> <new-address> # 2. 经过一定的区块高度在会后,再发一起一笔确认提案的消息 lotus-shed actor confirm-change-worker --really-do-it --actor=<miner-id> <new-address>
Post 私钥更改
lotus-shed actor control set --really-do-it=true <address>