本文由IPFS原力区 Steven Li(胡飞瞳) 原作
Filecoin
区块链小知识
1、Filecoin 区块奖励总量为14亿FIL,占全部总量的70%
2、Filecoin 网络第一轮区块奖励的数量为:153.856……
3、Filecoin 区块奖励线性递减,每轮调整,六年减半
4、Filecoin 区块奖励大约需要407年
摘 要
Filecoin采用创新的预期共识机制,但预期共识机制的设计有一个缺陷,那就是出块不稳定。
在最初的设计中,按照概率每一轮预期平均出一个区块;这也就是说,有些轮可能没有出块,而同时有些轮可能出现多块的现象。这会造成网络的不稳定,也会有人可以利用这种出块模式进行某种攻击。
有没有办法提高稳定性呢?
那就是目前正在讨论的 - 增加出块量,增加每轮的预期出块数。
预期共识的改进
协议实验室最新的共识设计中引入了一个新的术语 - BlocksPerEpoch(简称 e)。
Filecoin设计中把真正出块的轮次成为 Epoch;在引入这个参数之前,每一轮出块的预期为一个区块,引入这个术语后,每一轮预期的出块数就为 e 个。这个数应该是多少呢?目前还在实验和讨论中。在 Lotus Devnet/6 中:
BlocksPerEpoch (e) = 3
也就是说,按照概率,每一轮平均出三个区块。我们在文首的 Filecoin 小知识中提到了每一轮的区块奖励数。在之前的概念中,每个区块奖励数就等于每一轮的奖励数。而现在,要根据这个出块的数量来均分了。
也就是说,每个矿工的爆块概率增加了,但每个区块的奖励数按比例降低了。那么,为什么要这么做呢?
原方案 『 每轮出一块 』 太不稳定
在测试网的进行中,我们发现一个问题,那就是每一轮的出块率太不稳定,太多的时候有空块出现。再加上 go-filecoin 的设计没有特意去规避相关风险,我们不仅看到空块轮次比较多,而且看到很多合法区块没有能进入主链的情况。
关于这个问题,具体可以参见 filecoin-project/spec 的 issue #559:
在这个问题的讨论中, Steven 在一个简单的假设基础之上做了一个理论推导,结果有些出人意料。由于其中涉及到过多的数学知识,这里直接上结论:
在每轮预期出一个区块的情况下,假设系统里有n个矿工,每个人的算力均等,那么每轮出块数量的比例如何呢?理论上比例大致如下:
出现空块轮次的比例高达 36.78% (1/e,这里e为自然常数)
符合预期,出现且仅出现1个区块的轮次比例也仅有 36.78% (1/e)
同时出现 m 个区块的轮次比例为:1/(m!e)
具体运算结果参加下图:
也就是说,我们预期每次出一个块,但实际上,每次出一个块的概率刚刚超过 1/3。
解决之道
关于上述 issue #559 提到的问题,解决方法是多方面的。这里仅就出块率不稳定进行讨论。我们知道,概率论中的期望值实际上可以看成多次独立概率事件得到结果的平均值,次数也多,结果越准。
那么,这里自然想到的一个办法就是增加运算次数,反映到Filecoin的网络上来,那就是增加出块量。这就是为什么引入了 BlocksPerEpoch 这个常数。
当 e=1 时,也就是最初的方案,每轮一个区块,空块率超过 1/3;
当 e=2 时,理论上可以计算出,空块轮次出现的概率将降低到 1/8 ~ 1/7;
当 e=3 时,空块轮次出现的比例将降低到 1/20
看起来是一个很好的办法,可以很好地提高网络出块的稳定性。这个稳定性是以在链上保存更多的区块数为代价的,同样,每个节点也需要做更多的同步和验证工作。毕竟万事都有代价,天下没有免费的午餐的。
P.s. 关于如何增加每个矿工的爆块量,目前已经提出了多种方案,包括直接考虑修改算法提升比例,也有提出进行 e 次计算,每次单独验证。最后的方案正在敲定之中,敬请等待。
为什么Lotus出块 出奇的稳定
有些细心的参加 Lotus 测试的同学可能会提出一个问题,为什么现在Lotus devnet/6出块非常稳定,每轮都出,而且完全遵循设定的出块时间。也就是每 10s (当前的临时设置)一次。
这里,每轮出3个区块的设置起到了一定的作用,但同时有其他方面的改进也起到了很大的作用,比如等待和出块时间设定等;还有一个关键因素,因为现在网络中有超级矿工。
一个矿工占据了绝大部分算力。这种情况,如果这个矿工不作恶,网络往往非常稳定,但这破坏了去中心化的原则,是我们不愿意看到的。因为任何矿工占据独霸地位,他就几乎可以控制做任何事。包括排挤其他人的出块,独占收益,选择消息打包,甚至回滚等等。
希望下周 Lotus 新版本上线后,我们能看到更多的矿工能够增大自己的算力,真正形成一个去中心化的网络。
网友评论