# Lotus 本地安全操作

目前 lotus 运维都是采用远程运维的方式,机器放在远程机房。那么私钥的安全性就取决于下面几个因素:

  1. 机房人员不作恶,如果机房人员想要导出你的私钥你几乎是一点办法都没有。
  2. 集群运维人员。
  3. 私钥在线上-线下或者人与人之间传递。
  4. 黑客攻击服务器。

为了避免 owner 私钥泄露带来的灾难,我们之前强烈建议运维人员运用拔插的方式使用 owner 私钥:用完即删除,再用再导入。

然而,频繁地在线上 daemon 服务器上导入和删除 owner 私钥,确实有些繁琐,这很考验运维人员的专业素质。 而且运维人员跟老板之间的信任问题,几乎是无解的。 这里我们提供一种简单的思路:集群的所有者(这里我们称之为老板)在一个相对安全可控环境里(如自己家里或者办公室)运行一个 daemon 节点,凡是需要使用 Owner 私钥的操作,都由老板亲自操作。

使用场景

  1. 在本地创建好 Miner 账号,然后交付给第三方运维,避免 owner 私钥传递。
  2. 在本地执行其他需要 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. 网络配置

  1. 不需要公网 IP,如果网络已经配备公网 IP,请关闭除 P2P 接口以外的所有外网端口。
  2. 关闭 SSH 连接服务。

当然考虑到疫情可能需要远程办公,建议你在办公室和家里各备一台。如果你对安全级别没有那么高,那么你也可以打开 SSH 服务,但是要注意加强 SSH 连接安全,比如只能使用私钥连接,关闭密码登录等。

# 编译源码

  1. 安装 lotus 依赖

    sudo apt install make gcc git bzr jq pkg-config mesa-opencl-icd ocl-icd-opencl-dev libhwloc-dev -y
    
  2. 安装 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
    
  3. 克隆仓库到本地,并切换到最新的 REALSE 版本:

    git clone -b offline-miner https://github.com/lionsoul2014/lotus.git
    git check v1.15.0 # tag for a release
    
  4. 编译 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

  1. 导入节点快照

    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
    
  2. 启动节点

    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
  1. 创建一个新的 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)
    
  2. 提现 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
    
  3. 终止错误扇区

    # 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
    
  4. 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>
    
  5. 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>
    
  6. Post 私钥更改

    lotus-shed actor control set --really-do-it=true <address>
    
上次更新: 2022/4/24 15:24:55