Filecoin技术文档学习12 共识算法
Filecoin的去中心化存储网络可以建立在很多共识协议上,只要能够实现存储证明的验证功能即可。本节推荐使用Proof-Of-SpaceTime这个机制来实现共识,而不是资源浪费很严重的POW机制。
关于现有共识机制的讨论:
保证区块链的安全性是至关重要的,但是POW通过猜数字的方式虽然解决了安全问题,但是导致了大了的算力浪费,无法重用。
无法重用:POW机制通过反向推测一个hash函数的方式,来确保区块网络的安全性,但是这个计算除了确保网络安全之外,并没有任何内在的价值。有很多方案尝试着复用这种计算能力,比如把一些计算工作夹在POW计算中,而有些则把POW计算转变为寻找大素数的算力,以太网要求POW执行同时要执行一些小的智能合约程序,有的还把算力用于数据的压缩工作。但是所有的这些尝试都无法避免算力浪费占压到性比例的问题。
算力浪费:pow的算法对设备和电力是极大的浪费,尤其是挖矿的算法都是可以并行执行的,这导致更严重的资源浪费。有许多方案尝试着减少这种浪费,比如有一种存储空间挖矿,通过填充垃圾数据到磁盘的方式提高算力,虽然减少了电力的浪费,但是也浪费了磁盘空间。还有一种是改进的拜占庭协议,使用POS投票的方式来根据自己手里的股票多少作为权重,随机选择投票者产生区块。
Filecoin的共识算法:
通过重用有意义的工作量作为共识协议,引导矿机投资于数据存储空间,并鼓励他们将磁盘用于存储有意有价值的数据。
1,算力容错能力: Filecoin重构了拜占庭容错机制。n表示全网所有算力,f表示恶意或者失败节点的算力。Filecoin设计并定义了一个容错能力为(f-n)的算力网络。
2,算力的特点:a,公开:因为每个矿机当前正在使用的磁盘空间全部保存在区块链上,因此所有人都知道矿机当前的算力和总算力;b,可公开检验:因为在之前的章节中我们说过,矿机需要根据Post协议,每隔固定的时间生成一个当前正在存储数据的证据到区块链上,那么这样所有人都可以通过检查Post证据的方式证明矿机的算力;
c,算力不固定:因为Filecoin采用的是当前正在使用的磁盘空间当做算力,因此不同的时刻,会有不同磁盘扇区释放掉或者重新被封存,因此每个矿机的算力在每个时间间隔都不是固定不变的。
通过Proof-of-SpaceTime的方式计算矿机的算力
因为在每一个生成区块的周期,旷工Mi都被要求生成一个存储证明到网络,只有被网络中的大多数验证通过,存储证明才会被添加到区块链上。然后所有Filecoin全功能节点更新磁盘分配情况,并将过期的记录删除和记录失效的分配记录。因此矿机Mi的算力可以通过累加并检验磁盘分配情况得到。
对于全功能节点,因为他拥有所有的交易记录,因此通过累计从创始区块到当前区块的关于Mi的有效磁盘存储就可以计算出Mi的算力
对于轻节点,他可以通过信任的全功能节点读取关于Mi的所有磁盘分配记录,一个关于最新区块的hash树路径,和一个从创始区块到当前区块的区块头信息。通过这种方式轻节点可以把验证Post证据的工作委托网络。
如果一个恶意节点想要伪造自己的算力,就需要伪造自己的存储时空证明,如果要伪造存储时空证明,就需要执行数据的setup阶段,在setup阶段需要伪造数据封存seal操作,并将seal操作的证据上传到区块链上。整套下来其实就是真实的存储了数据。真实的存储了数据就不是恶意算力攻击者了,由此可见Filecoin的算力计算安全性依赖于PoSt协议。而这个协议已经被前面几个章节证明是安全的。
Filecoin通过算力达成共识的方式
把矿机当前的有效存储算作矿机的股份,根据股份每一轮选举一个矿机进行出块,选举的概率与股份的多少成正比,因此这是一种改进的POS机制。叫做预期共识-EC。EC最直观的功能就是通过秘密并无法预测的方式,选举一些在某一个区块时间内的矿机领袖,我们期望最好能够选出1位领袖,但是有时会有0个领袖,有时会有多个领袖。领袖的作用就是在一个出块周期,创建区块并广播到全网。每个出块周期可能有1个或者多个区块被链接到主链上。在没有领袖的出块周期内,一个空的区块被挂在主链上。EC是个概率共识,数据块以DAG的数据结构管理,因此随着区块的增多,主链就会越来越安全,因为主链上累计的大多数人的共识随着链的加长在变多。
共识算法的实现:
矿机通过上面的不等式来确认自己是否是当选的出块领导。其中表达式1是根据当前区块的时间生成一个随机数。表达式2是本矿机的算力在全网中算力的占比。表达1的计算逻辑是:根据时间生成一个随机数,然后对随机数hash,Mi对hash值签名,然后再做一次hash2,将hash2的值除以2的L次方,得到一个0~1之间的数字。
各个变量不再赘述。这个公式有三个特点:
公平:每个参与者在一个区块周期内只有一次被选举机会,所有参数都是确定的无法被操纵的,并且rand(t)在时间t之前是无法被预测的,计算是无法并行的,因此也不会被矿池操控。
私密:恶意矿机是无法伪造其它矿机的签名的,因为他们无法获知其他矿机的私钥
公开可验证的:矿机如果计算自己是胜出者,那么他需要把证据交给全网去验证,而任何都可以验证矿机的算力和他产生的随机数hash值,因此这些公开的数据很容被验证并且与矿机的公钥计算,可以明确对证据进行私钥加密的矿机的身份。