摘 要
- 预期共识就是上帝掷飞镖
- 预期共识的优点在于简单,而且每一次选举胜出者数量的平均数为1
- 但预期共识不能保证每次选举的胜出者数量,这是其最大的问题
- 期待有更好的基于可验证随机函数的共识算法出现,设计者可获得20万美金奖赏
预期共识 就是 上帝掷飞镖
为了不使此文显得枯燥乏味,今天一上来先用最简单的方式来解释预期共识,保证高中生能够看懂。
预期共识(EC:Expected Consensus)是一种 PoS (这里S可以理解为 Storage Service,及存储服务的贡献)的实现。目标是是的矿工出块的权益与自己对存储的贡献成正比,也就是说,矿机被使用的存储空间在整个网络中的总使用空间中所占比例,就是此矿机能够出块的概率。这是大家都了解的,也认为这是非常公平,且对整个网络起到良好促进作用的设计。
我在文章《让上帝掷骰子 - 对共识机制的浅层分析》一文中对区块链共识机制的要素和共同特点已经有过描述,这里不再重复,但是,要知道的是,无论什么共识机制,一定要具有公平性、不可预知性、可验证性和可行性(不能太复杂)。预期共识,作为Filecoin目前采用的共识算法,是一种简单的共识算法,基本符合上述要求。那么它是如何做到的呢?
这里我为了形象说明,不使用骰子这个比喻,而采用另一个方法:掷飞镖。预期共识的每一轮出块最重要的一个步骤就是选举,这里的选举实际上就是自己进行计算,其实不需要大家投票。按照掷飞镖的来看,基本上分成以下几个步骤:
- 每一个矿工面前有一个大飞镖盘,面积与整个网络的总算力相当(这是已知的),每个人都一样;
- 每一个矿工的算力各有差异,仅占总算力的一小部分。每一个矿工的飞镖盘上都有一块材料是木头的,面积与此矿工的算力相当;而其他部分都是金属的;
- 但是飞镖盘上面蒙上了一层纸,哪一部分是木头的不知道,也就是说,只有上帝知道(这有系统的可验证随机函数确定,主要通过散列和签名实现)
- 每一个矿工自由掷出飞镖到飞镖盘,命中木头部分,上靶(胜出),否则,掉落(等待下一轮继续)。
- 下一轮重复,但注意,木头部分每一轮都会换地方,只有上帝知道换到了哪里。
每一轮上靶者称为这一轮的 Leader,即选举胜出者,有资格出块。我们来看一下是否符合上面说到的几个特点:
- 公平性:没问题,算力大的矿工命中的机会大, 机会与算力成正比
- 不可预知性:只有上帝知道木头材料分布在哪些地方,不能预知(实际上是利用hash算法的不可逆来实现的)
- 可验证性:这个就涉及到VRF(可验证随机函数)的问题了。简单地着,前面所谓的木头部分在哪里,其实不是随意的,而是通过密码学算法确定的,只是这些密码学算法的不可逆性,保证了对网络来说的随机性
- 可行性:预期共识仅仅需要每个矿工在本地计算就可以了,非常简单,实现起来很容易,计算复杂度低。没问题。
为什么还有人说不够好
看了上文,是不是觉得这么棒的东西,太好了!但你要知道,协议实验室对这个算法是不满意的,只是在没有新的更好的算法出来之前,考虑使用此算法。而且,协议实验室悬赏20万美金给更好的算法的提出者。那问题在哪里?
问题就在于,上面的每一个飞镖盘都是独立的,每个人的运气也是独立的。也就是说每个人命中的可能性也是独立的。那是不是在每一轮中,有可能所有人都不上靶,一个人也选不出来;当然也有可能有好几个人都上靶,这样就会有好几个人出块了。再想一想,是不是存在这样的概率所有人都上靶,理论上有,但如果人比较多,概率极低。
这就不是很理想了,因为有些轮没有人出块,交易(消息)的过程就会延长;如果有些轮有多个人出块,这些块中的消息信息基本上都是重复的,占用区块空间,浪费。
所以呀,更好的算法当然是最好每轮都能出块,而且每一轮都只有一个矿工上靶(具有出块资格)。可以想象,这样的算法当然需要整个网络进行协调,进行真正的选举,那这样是不是复杂度提高了,是不是可行呢?目前有好些算法被提出来,可以查询CoA, Snow White, AlgoRand等。但是,有些过于复杂,有些不适合Filecoin。
希望各位算法高手,看在奖金的份上,加油吧!
为什么叫预期共识?
回到一个傻傻的问题,为什么这个共识被称为预期共识(Expected Consensus)。高中生一定还记得概率论中学过数学期望(Mathematical Expectation)。这里 Expectation 是 Expect 的名词形式。也就是说一种期望,表明一种概率情况下的平均值。
再回到我们前面的掷飞镖游戏,想像每一个矿工的算力加起来是不是等于总算力?在这种情况下,每一轮掷飞镖的胜出者数量的数学期望值就是 1,即平均下来就是一个人中靶。
因为期望每一轮一个人中靶,而实际上预期共识算法仅实现平均下来一个人中靶,就叫它预期共识(Expected Consensus)吧。
真正的算法(前方高能)
具体可参见白皮书或相关文档,这里简单做一些解释,欢迎探讨。
如果一个矿工在一轮计算中下式成立,中靶,具有出块资格。
不等式左边:H 为不可逆hash函数(比如 SHA256); L为 H 函数值的所占二进制的位数,这里保证了左边是一个0%到100%之间的一个值;
H 函数内的 <t||rand(t)>是在第 t 轮的一个全网统一的随机数,这个在第 t 轮才会公布。
不等式右边:分子为第 t 轮本矿机所拥有的算力;分母为第 t 轮全网的总算力;当然整个式子就是本矿机在全网中算力的占比。
这个不等式就相当于,后边是你飞镖盘木质部分的占比,而左边是你的运气,如果人品不错,就击中了木质部分(中靶)
那么,如何保证每个矿工的木质部分位置随机呢?就靠下面这个定义:
也就是对上面的随机数进行签名,而签名函数本身是不可逆也是不可预知的,每个人都不同。这就只有上帝知道木质部分放到哪里了。