FileCoin 挖矿教程 性能瓶颈分析

Posted weixin_46596227

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FileCoin 挖矿教程 性能瓶颈分析相关的知识,希望对你有一定的参考价值。


简要描述

Filecoin是存储挖矿,矿工根据其实际存储了多少数据并向链上提交了复制证明从而获得有效算力(有效存力),有效算力越高,矿工获得区块奖励的概率越大。

算力越大的矿工,获得区块打包的权利或者概率越大,这里就有赢票率和出块率的参数。赢票率就是赢得选票的概率,出块率就是获得区块奖励的概率。

与传统PoW不一样的是:

Filecoin网络的角色更多,提供数据存储或数据检索都可以获得收益
Filecoin有抵押挖矿机制,通过抵押代币来约束矿工保持长期存储
获得区块奖励也会有一部分放入锁定的资金,完成存储合同后才获得所有奖励


FileCoin挖矿流程

获取任务
瓶颈:网络和软件
瓶颈:算法+CPU/GPU+硬盘
获得打包权
瓶颈:算法优化+GPU+硬盘性能+网络配置
挖矿机器
挖矿任务
数据封存
复制证明 有效存力
时空证明
出块奖励
FIL钱包

相关流程说明

数据封存

封存客户提交的数据。须经过precommit和commit的过程(后续分析)。

复制证明

(Proof-of-Replication, 简称PoRep),挖矿者的自证。

有效存力

经网络验证的有效存储。

赢票率

赢得打包出块权的概率。

时空证明

(Proofs-of-Spacetime,简称PoST),挖矿者被验证。

其他相关说明

  1. 生成复制证明获得算力的过程与提交时空证明参与区块打包是两个独立的过程。
  2. 一般来说有效算力越大,占全网算力占比越高,则赢票率(获得打包权)越大,赢票率越大则出块率越高,获得区块奖励也就越多。
  3. 但是有效算力占比和出块率并不是绝对对应的,当矿工的有效算力达到一定量级的时候,出块才会相对稳定。

挖矿步骤说明

复制证明 PoRep

步骤描述相关硬件耗时详述
Precommit-P1单线程 PoRep SDR 编码CPU几个小时1. 取决于扇区大小和速度 2. AMD处理器SHA拓展可显著提高速度,或用Intel CPU+FPGA(算法定制)加速 3. 提高主频可提升速度
Precommit-P2Poseidon哈希生成Merkle树GPU60分内可用CPU替换但会显著拖慢速度,可用FPGA(算法定制)显著加速
Commit-C1准备好生成证明CPU几十秒-
Commit-C2生成 zk-SNARK零知识证明 并广播给其他的节点GPU30分内可用FPGA(算法定制)显著加速

PoRep算法流程分析

Filecoin系统中的证明算法最初源于存储证明(PoS)、数据持有性证(PDP)和可检索证明(PoRet)。
后面逐渐迭代、增强约束条件,才完善为如今工程中所采用的复制证明(PoRep)与时空证明(PoSt)。

一、PoRep算法解析【1,2】

PoRep方案的核心流程,是有效证明人P说服验证者V,数据D的一个P专用的独立物理副本R已经被存储。其协议是一个多项式时间算法的原组(Setup、Prove、Verify)

有效证明人P
验证者V
数据
存储
副本
1. PoRep.Setup 目标是生成副本Replica R

同时给予P、V必要的计算信息,以便后续的Prove、Verify可以进行。 这些信息是R的Merkle证明根,Root[R]和证明
Proof(R,SEAL)。
PoRep.Prove,目标是生成一个证明,证明在PoRep.Setup阶段,Setup算法通过SEAL密封算法,生成一个副本R,并且提供副本的证明Proof(πSEAL)。这个证明由证明人输出,发给验证者。注意,R不需要发给验证者。

Inputs:
-证明秘钥对(prover key pair):(pkP,skP)。
-密封证明私钥prover SEAL key: pkSEAL,这个和密封验证证明秘钥是一对。
-data D。这个是32G输入数据

Outputs:
-副本Replica R。
-R的默克尔证明根MerkleCRH,Merkle root rt of R
-证明Proof:πSEAL

Setup阶段的计算过程包括:
1. 计算hD=CRH(D),计算D的CRH 哈希值。
2. 计算R=Seal(D,skP)
3. 计算rt=MerkleCRH(R)
4. x=(pkP,hD,rt),w=(skp,D)
5. 计算πSEAL=SCIP.Prove(pkSEAL,x,w)
2. PoRep.Prover阶段

Prover算法生成副本R的存储证明Proof(πPOS)。
证明这收到来自验证者的随机挑战C,要求在树根为rt的Merkle树R中确认特定叶子节点Rc。
证明人生成从树根rt到叶子Rc的路径的知识证明来证明这点。

Inputs:
-存储证明私钥(prover Proof-of-Storage key):(pkPOS)。这个和存储验证证明秘钥是一对。
-副本Replica R。 
-随机挑战random challenge C。

Outputs:
-证明Proof:πPOS

Prover阶段的计算过程包括:
1. 计算rt=MerkleCRH(R),计算R的Merkle CRH 哈希值。
2. 计算path=从 叶子Rc到rt的Merkle路径
3. x=(rt,c),w=(path,Rc)
4. 计算πPOS=SCIP.Prove(pkPOS,x,w) 
3. PoRep.Verify阶段

Verify算法检查前面两个证明Proof(πSEAL)和Proof(πPOS)的有效性。证明本身是可以公开验证的。

Inputs:
-证明公钥 prover public key,pkP。
-SEAL/POS验证证明秘钥:vkSEAL/vkPOS
-数据D的hash,hD。
-R的默克尔证明根MerkleCRH,Merkle root rt of R。 
-随机挑战random challenge C。
-证明Proof(πSEAL)和Proof(πPOS)

Outputs:
-bit b。验证成功结果为1

Verify阶段的计算过程包括:
1. x=(pkp,hd,rt)
2. 计算b1=SCIP.Verify(vkSEAL,x,πSEAL) 
3. x=(c,rt)
4. 计算b2=SCIP.Verify(vkPOS,x,πPOS)  
5. output b1 and b2

二、PoRep实现架构【3,4】

在具体实现中,PoRep的Setup/Prover/Verify,可以分解成如下4个阶段。

Sealing preCommit的阶段1(P1)
在P1阶段,复制证明的SDR算法会进行编码运算。可以分解成2部分的计算。
1. 计算原始数据的merkle树(二叉树,sha256 hash计算)
2. label,也就是SDR的计算。
原始数据的merkle树(tree _d),树根为comm_d。
注意:由于SDR的算法特性,SDR的计算目前官网是采用CPU直接计算的,其计算效率和系统的CPU性能有关,是单线程运算(不能进行并行运算)。
这个阶段可能会长达若干小时,具体花费的时间和所封装扇区的大小及机器的配置有关。 
协议实验室的相应评估报告,支持SHA功能的AMD处理器在这方面有很大的优势,并且CPU的频率越高越好。
这个原因是AMD高端CPU直接带SHA加速指令。 
Sealing preCommit的阶段2(P2)
在P2 阶段,系统要用到Poseidon哈希算法产生默克尔树。可以分解成如下3个部分的计算。
1. column hash 
2. 针对column hash的计算结果生成merkle树(八叉树,poseidon hash计算)
3. 针对label的计算结果,再做一次encoding,生成merkle树(八叉树,poseidon hash计算)。
注意:这个阶段因为支持并行。官方推荐采用GPU实现。效率和系统GPU的性能有关,也可以用CPU替代GPU,但性能就差很多。使用GPU时,这个阶段大概要花45分钟到1个小时。
Sealing Commit的阶段1(C1)
C1是个过渡阶段,它为后续的证明工作进行各项准备工作,其性能与CPU有关,通常花费几十秒。
Sealing Commit的阶段2(C2)
这个封装过程要进行零知识证明运算,它会对前面产生的结果再次进行压缩,然后将其广播到区块链。
注意:这个过程支持并行计算,极度依赖GPU,通常要花费20至30分钟。 
协议实验室发现,P2、C1和C2这三个阶段可以在算力配置强,配置GPU的同一台机器上运行。

但是在preCommit阶段1和preCommit阶段2之间会进行大量的文件传输,主要是P1阶段的原始阶段SDR数据。
对32GB的Seal单元来说,至少需要352G的SDR。

如果处理这两个阶段的机器网络性能差,或者存储设备使用的是普通硬盘而非固态硬盘则会大大降低系统的整体效率。 
注意:SDR 352G文件在P2和C2的处理,如果可以考虑和P1合并进行预计算。
这样在不影响集群架构的情况下,降低网络数据传输要求。

时空证明 PoSt

步骤描述相关硬件耗时详述
Window-PoSt审核旷工的存储承诺GPU30分钟内(24小时至少1次/每个扇区)多核CPU可加速,8核勉强过关,24核轻松过关
Winning-PoSt在每一个epoch提交存力证明以获得挖出区块的机会GPU1个epoch内完成,目前为25s不需太多计算

算法部分的代码主要用Rust语言实现。

以上是关于FileCoin 挖矿教程 性能瓶颈分析的主要内容,如果未能解决你的问题,请参考以下文章

FileCoin 挖矿教程 Lotus 源码大致的结构目录

FileCoin 挖矿教程之三:发送与接收 FIL

FileCoin 挖矿教程之四:日常维护

FileCoin 挖矿教程之二:钱包设置的详细说明

FileCoin挖矿教程之六:自定义存储布局

FileCoin挖矿教程之六:自定义存储布局