概要
区块链是建立在P2P网络,由节点参与的分布式账本系统,最大的特点是“去中心化”,在系统内彼此之间只需依靠区块链协议系统就能实现交易,然而目前流行的共识机制PoW、PoS、DPoS各有优劣。而路云区链却在其实验链Dpperin中,独创的DPoW共识机制却实现了安全与效率的兼得。
传统的PoW(Proof of Work)作为最经典的共识算法,秉持着长链优先原则,通过算力维护链的安全性和稳定性。参与挖矿的算力越大,链的安全性越高,因为随着总算力的增加,恶意节点作恶的成本也会直线上升。理论上来说,如果恶意节点的算力超过全链算力的51%,那么恶意节点就可以伪造一条更长的链替代原先的主链,这就是著名的51%算力攻击。正是因为有51%算力攻击的可能,所以PoW的区块不是立即确认的,它是概率性的确认。例如,比特币网络需要大约6个区块确认一笔交易。
针对PoW非立即确认这一缺点,路云区链在Dipperin研发中,独创了DPoW(Deterministic Proof of Work)共识算法,吸收了PoW和PBFT(实用拜占庭容错)的优点。另外,Dipperin使用了VRF(可验证随机函数)挑选可信验证者;防卡死机制解决大多数验证者不在线的问题。这样能够在获得高扩展性的同时保证安全性并且尽可能的去中心化。
Map Reduce挖矿算法
对于传统的PoW算法,路云区链的Dipperin做了一定的改进,使用了Map Reduce挖矿算法,它的特点是将挖矿过程分工,由Master(分片服务器)和Worker(矿工节点)协作完成,其基本原理如下:
1.Master将挖矿的整个搜索空间划分成多个部分,需要保证划分的各小区间之间不会有覆盖,然后将其分配给为其工作的Worker。
2.Worker将会在被分配的搜索空间上计算hash难题。在计算过程中,Worker需要定时监听Master的消息通知,以防Master更新挖矿搜索空间或重新分配任务。一旦Worker挖矿完成,便会将满足条件的区块提交给Master。
3.Master接收到Worker提交的区块后,将其提交给验证者集群,并等待验证结果。
PBFT流程
PBFT在共识算法中是强一致性和高效的代表。Dipperin使用PBFT算法旨在选取验证者对矿工挖出的区块进行投票确认,如果区块有超过三分之二的票数,那么区块会被立即确认。
如上图所示,PBFT过程分为以下几步:
1. 矿工广播挖到的区块给当前轮的22个验证者
2. 直接进入Propose阶段,由主验证者挑选共识区块后广播给所有验证者(主验证者轮流当选)
3. 验证者收到区块后进入Prevote阶段,对区块进行验证和投票并广播给所有验证者
4. 验证者收到2/3以上Prevote信息后进入PreCommit阶段,所有验证者再次对区块进行投票并广播给所有验证者
5. 验证者收到2/3以上Precommit信息后进入Commit阶段,验证者把区块和15个签名信息广播给所有节点
另外,PBFT过程中有几点需要特别注意:
1. 对当前区块的Commitlist(15个验证者的签名信息)放在下一个区块中
解释:不把Commitlist放在当前块,而是放在下一个块的目的是为了削弱主验证者挑选验证者的权利。所有验证者得到2/3的投票信息就可以广播区块,且这个区块是唯一的。矿工创建区块时有权利选择任意15个签名信息作为Commitlist。
2. 所有验证者都对相同区块进行了两次投票,且他们缺一不可
解释:Prevote的投票目的是确认所有的验证者在同一个Height(区块高度)和同一个Round(共识回合)上,并且确认验证者对该区块的投票意愿;Precommit的投票目的是对区块达成最终共识。如果只有一轮投票,那么很可能导致链分叉。假设有4个验证者节点A,B,C,D,他们共识出一个区块Block1,但是只有A上链了,其他验证者因为网络问题没有在规定时间内收集够投票而进入到了下一轮。在新一轮中B,C,D对Block2达成共识,此时在同一高度有了不同的两个区块形成分叉。
3. PBFT过程加入锁和解锁机制防止验证者作恶
解释:验证者一旦对某个区块A进行Prevote投票就会被"锁住",在同一个Height内无法对不同的区块B进行第二次的Prevote投票,同时该验证者只能对区块A进行Precommit投票。如果验证者收到有2/3以上的更高Round的其他验证者投票就会对区块A解锁。
基于VRF的验证者选取
然而,在PBFT的过程中,验证者集群必须有超过2/3的诚实节点才能保证系统的安全性;超过1/3的诚实节点才能保证系统的存活性。因此,如何从广大节点中选取出诚实节点作为验证者代表变得极为重要。路云区链在Dipperin中设计了一套基于VRF(可验证随机函数)密码掷签的验证者选取机制。为了抵御女巫攻击,对每个用户设定了权重,而这个权重则来源于用户自身的信誉。为了让新加入的节点有机会当选为验证者,引入了“幸运值”,且这个“幸运值”是可以被所有节点验证的。
信誉:Reputation=F(Stake,Performance,Nonce),衡量信誉的因子有3个,Stake(押金数)代表着作恶成本。其他数据相同的情况下,押金数越多,信誉值越高。Performance绩效代表着过去用户作为验证者时的业绩。在其他数据相同的情况下,绩效越高,信誉值越高。
决定绩效的有3个因子:
1. 作为验证者时,平均Commit率;
2. 作为Primary(主验证者)的出块率;
3. 被举报次数。
Nonce是该帐号相关的交易数,其他数据相同的情况下,交易数越高,信誉值越高。Stake和Nonce的引入是为了防止女巫攻击,如,对手将钱放入多个新建账户中试图参与竞选。如果是这种情况,每个账户的Stake和Nonce会很低,对信誉影响非常大。
要想了解幸运值的产生过程首先需要了解VRF算法,对于一个公认的输入(input),用户使用私钥SK和一个Hash函数可以产生一个Hash值和一个Proof。其他用户则可以通过这个Hash值和Proof,结合该用户的公钥PK,验证这个Hash值是否是由这个用户针对Input所产生的,并且在这个过程中,该用户的私钥自始至终没有泄露。这个Hash值其实就是Seed,矿工利用私钥SK和上一个区块头中的Seed可生成新的Seed和证明这个Seed的Proof,之后矿工只需把Seed、Proof、公钥PK放入新的区块头即可。所有节点都可以根据Proof和公钥PK验证Seed的合法性。
每个区块头的Seed连起来形成了链式结构,但是并不是每个区块头的Seed都是有用的。只有每一轮的最后一个区块中的Seed参与了幸运值的计算。例如,一轮有110个区块,0~109是第一轮,110~219是第二轮以此类推。那么前两轮的验证者是默认的验证者,即官方的验证者。非官方验证者则是从第三轮开始进行选取,且第三轮验证者的幸运值由109号区块的Seed决定。
总结
从比特币、以太坊,到EOS以及当前很多公链,效率与安全是一直存在的问题,并且长期困扰了区块链技术的落地应用。
路云区链Dipperin的DPoW的共识算法综合考虑了系统的去中心化程度和交易的效率问题,从目前的测试效果来看,可以达到秒级出块,3000TPS的效率,采用VRF密码掷签避免PoS算法中的公正性和DPoS中的中心化问题。
网友评论