需要PoW+PoS混合共识的原因
采用PoW共识算法的典型例子有Bitcoin和Ethereum,但两者又有所不同,Bitcoin的PoW共识通常被称为Nakamoto算法,而Ethereum的PoW共识做了一些改变,被称为GHOST算法。后来又出现了Conflux项目,在GHOST的基础上融合了DAG并行出块技术,将系统的吞吐量提高到网络带宽极限。这些系统虽有细节差异,但凡属PoW一类,则必包含PoW的一些普适性特征,这些特征通常会展示出两面性:其优点是通过缺点来体现的,没有那个缺点,就不能展现出那个优点。比如,缺点:区块铸造代价高、能源消耗大;优点:包含了计算历史轨迹和能源消耗轨迹,历史惯性强,外部力量很难篡改账本或摧毁系统。PoW能够保障系统安全的前提是:攻击者难以控制超过51%的算力。而矿池的出现实际上已经破坏了这个前提,不同矿池之间可能会签订商业协议,形成可一致行动的矿团,具备发动51%攻击的能力。比如在BCH-ABC与BCH-SV的分叉事件中,外界难以确认是否真的发生了算力攻击战,但是在分叉刚开始的一段时期内,BCH的两条分叉链很明显都处于矿团的控制之下。区块链系统的参与者大致可分三类角色:出块者(矿池)、持币者(用户)、开发者。在PoW系统中,持币者是最弱势的群体,区块链系统的理想目的应该是服务用户,数字资产既不属于矿工,也不属于开发者,而属于用户,但在大算力攻击、系统分叉等情况下,用户并没有任何选择权,其权益得不到有效保障,这是不合理的。所以在新系统的设计中,有必要同时引入PoW和PoS,形成混合共识机制,使用户能够通过持有的币权进行投票,以消除大算力攻击制造出的分叉链,使矿池只能作为出块者提供服务,而不能成为系统的实际控制者,对开发者也形成一定程度上的制衡,而不是让区块链系统成为开发者的技术试验田和游乐场。采用PoW+PoS混合共识的区块链新项目是比较多的,我在这里给出一个简单的设计方案,其核心思想是:矿工只负责出块,若算力攻击制造了达到一定长度的临时分叉链,持币者可投票进行分支选择与交易合并,分叉链区块可以被包容到整个区块链账本中(可增加账本的累积工作量计算轨迹)。若持币者不关心系统运行情况,可以选择弃权,或将投票权委托给权益代理人,由权益代理人进行投票表决。权益代理人系统之间可通过BFT类或其他低能耗的共识算法对投票结果达成一致意见。在区块链系统的设计中,只要拥有防止某种攻击的有效方法,实际上发生这种攻击的概率就变得很小。因此PoS子系统只需要进行少量的干涉,就能确保整个系统正常运行。
PoW算力分叉攻击的过程分析
从普通人视角看,区块链是一个线状链式结构,但从实际角度看,区块链是一个树状机构,随着区块高度的增长,对于每个区块,以其是否处于最长链为依据,竞选出唯一的主干(如图1中的黑色区块),没有成为主干的其他区块分支则被淘汰出局,成为孤枝孤块(如图1中的蓝色区块)。而主干末端的多个分支仍然处于竞争状态(如图1中的绿色区块),某分支能否成为主干,取决于后续产生的大部分区块是否追随扩展该分支,而处于竞争态的区块所包含的交易都处于待确认的不稳定状态。
最长分支上的任何区块被后续M个区块所追随,则可认为基本处于稳定态。但M并不是一个绝对常量值,而取决于诚实算力和恶意算力的占比。若恶意算力占比超过51%,就可以选择「近期的任意某个区块位置」新起一条链进行分叉,并以更快的出块速度扩展分叉链,最终超越并推翻原先的主干,如图2中的两条紫色分叉链。从101处分叉的难度要比从105处分叉的难度大,假设在105处恶意分叉成功,则原链干支106.a、107.c、108.b等区块包含的任何交易都可能被否认。若攻击者用大量的算力从较远期的(比如1个月前)某个区块点实施分叉攻击,大概率不会成功,原因1:长分叉链的铸造成本昂贵,而且网络中的大部分节点拒绝接收时间戳偏离当前时间N小时的区块广播(或根据当前最长链包含的区块时间戳序列计算出一个参照时间值);原因2:对区块链账本的共识中,包含一定程度上的「人的共识」,若原先的账本状态已经得到大部分参与者的认同,仅通过大算力强力操纵是行不通的。
算力分叉攻击是一种「让时间短暂倒流,修改既定交易事实,再回到当前」的暴力攻击。有人认为这种攻击需要耗费大量算力资源,攻击者会得不偿失,这种观点是经不起分析的。由于矿池的出现,矿池之间可能形成矿团,算力租赁市场也在不断发展,使得发动这种攻击的可能性越来越大,给人们对虚拟货币的信心带来较大的负面影响。比如Alice给Bob支付了一笔大额交易,然后Alice可能通过临时租用的大算力进行恶意分叉并否认掉这笔交易,给Bob造成巨额损失。通过预测攻击事件对市场心理的影响力,还可能在虚拟货币期货交易市场中选择做空或做多,有计划的操纵市场,获得攻击之外的收益,因此把系统安全性完全寄托在算力之上,目前已经不太可靠了。
如上所述我们已经分析了单一的PoW共识存在的分叉攻击问题,以及引入PoW+PoS混合共识解决分叉攻击的大体思路。分叉攻击在现实中已经出现过,比如BTG和ETC被攻击事件。所以本篇将对PoW+PoS混合共识的过程进行分析。总体上可以将「PoS投票子系统」看成是一个观察者,这个观察者在持续监视并确定「PoW记账子系统」的走势,以避免大算力分叉攻击的发生。PoS投票子系统自身可以利用BFT类共识算法、VRF等机制,对投票结果达成一致。如下图所示,黑色和红色区块构成PoW链,紫色区块表示恶意攻击的分叉链,PoW链负责处理转账交易和执行智能合约。绿色和蓝色区块构成PoS链,绿色区块包含了对PoW区块的51%以上的币权投票确认,蓝色区块是PoS投票子系统自身的更新,比如持币用户重新选举投票代理人等等。而无论对于哪条链,每追加一个新区块,账本数据就迁移到一个新状态。每个新区块都是对前一时刻账本数据的状态更新。
PoS链会每隔4个PoW区块进行一次确认,30号PoS区块对60号PoW区块进行币权投票确认(分别简称S30与W60),其包含51%以上的币权投票交易;PoS链故意延后于PoW链,S30在W63~W64的时间点,才对W60进行投票确认,以提高准确率。PoW链最多隔7个区块就必须对PoS链的投票结果做引用确认,例如W67或之前(比如W65)对S30的引用确认;S31内包含了PoS系统自身的某些变更(比如用户Alice更换投票代理人);S32对W64进行币权投票确认,其包含51%以上的币权投票交易;PoS子系统观察到紫色区块广播明显晚于黑色区块广播(比如接收到A0的时间和接收到W66的时间非常靠近),因此S32将A0认定为分叉区块,所以W70可以引用接续A3区块,进行分叉融合:两条链上没有冲突的交易全部生效,冲突的交易,以黑色链为准,紫色链矿工不能获取到任何区块奖励和交易手续费。分叉融合不是必选设计,这里只说明其可行性。假设S33不能被正常产出,则PoW链会在W75或之前的位置悬停,无法继续前进,必须等待PoS子系统再次稳定运行后,才能继续前进。若PoW链悬停时间较长,会导致传统的挖矿难度调整算法不够精准,因此新算法可参考PoS链所包含的时间戳序列,以扣除悬停时间。PoW+PoS混合共识解决了PoW区块的概率确定性问题,可以实现最终确定性,大算力矿工必须同时持有51%以上的币权,才可对系统发起分叉攻击,这是极其困难的。这里所介绍的混合共识本质上是将「算力分叉攻击的隐患」转化成「PoS投票子系统不能正常运转的隐患」。但PoS投票子系统运转失败后可以通过社群活动,重新再次启动运行,不会给用户带来账面上的任何财产损失,而51%算力攻击带来的双花交易及其对真实交易的否认却无法补救。所以在设计公链系统时,PoS+PoW混合共识值得考虑,混合共识也有助于一个公有链自举成功,纯PoW链在自举过程中很容易被外部恶意算力杀死。