浅谈共识协议

什么是共识机制

先说共识,多个独立的个体对事物产生一致的认识.在计算机科学中,分布式系统中的一个基本问题是在存在多个故障进程的情况下实现系统的整体可靠性。这通常需要协调过程以达成共识,或就计算过程中需要的某些数据值达成一致。协商一致的示例应用包括约定将哪些事务以何种顺序提交到数据库、状态机复制和原子广播。通常需要共识的现实世界应用包括云计算、时钟同步、PageRank、意见形成、智能电网、状态估计、无人机控制(以及多个机器人/代理)、负载平衡、区块链等。

共识机制的思想均可在现实世界中找到对应的场景.认为总体可分为两类:

  • 无许可共识 一旦有结果出现正常情况下所有个体均认可结果.比如多劳多得,存款越多利息越多.区块链中常说的挖矿即PoW(Proof-of-Work)算法,可以理解为多劳多得,以太坊2.0使用的PoS(Proof-of-Stake)算法可以理解为存款越多利息越多.这些"规矩"是一开始大家都认同的,无需对每一次结果再次投票.
  • 有许可共识 有许可共识即所有的个体对每一次预产生结果进行投票,该结果获得多数投票才能最终落地. 常用的有许可共识也可分为两类:拜占庭容错和非拜占庭容错.

拜占庭将军问题(Byzantine Generals Problem),是由莱斯利·兰波特在其同名论文[1]中提出的分布式对等网络通信容错问题。在分布式计算中,不同的计算机通过通讯交换信息达成共识而按照同一套协作策略行动。但有时候,系统中的成员计算机可能出错而发送错误的信息,用于传递信息的通讯网络也可能导致信息损坏,使得网络中不同的成员关于全体协作的策略得出不同结论[2],从而破坏系统一致性[3]。拜占庭将军问题被认为是容错性问题中最难的问题类型之一。莱斯利·兰波特在其论文[1]中描述了如下问题:

一组拜占庭将军分别各率领一支军队共同围困一座城市。为了简化问题,将各支军队的行动策略限定为进攻或撤离两种。因为部分军队进攻部分军队撤离可能会造成灾难性后果,因此各位将军必须通过投票来达成一致策略,即所有军队一起进攻或所有军队一起撤离。因为各位将军分处城市不同方向,他们只能通过信使互相联系。在投票过程中每位将军都将自己投票给进攻还是撤退的信息通过信使分别通知其他所有将军,这样一来每位将军根据自己的投票和其他所有将军送来的信息就可以知道共同的投票结果而决定行动策略。

系统的问题在于,可能将军中出现叛徒,他们不仅可能向较为糟糕的策略投票,还可能选择性地发送投票信息。假设有9位将军投票,其中1名叛徒。8名忠诚的将军中出现了4人投进攻,4人投撤离的情况。这时候叛徒可能故意给4名投进攻的将领送信表示投票进攻,而给4名投撤离的将领送信表示投撤离。这样一来在4名投进攻的将领看来,投票结果是5人投进攻,从而发起进攻;而在4名投撤离的将军看来则是5人投撤离。这样各支军队的一致协同就遭到了破坏。

由于将军之间需要通过信使通讯,叛变将军可能通过伪造信件来以其他将军的身份发送假投票。而即使在保证所有将军忠诚的情况下,也不能排除信使被敌人截杀,甚至被敌人间谍替换等情况。因此很难通过保证人员可靠性及通讯可靠性来解决问题。

假使那些忠诚(或是没有出错)的将军仍然能通过多数决定来决定他们的战略,便称达到了拜占庭容错。在此,票都会有一个默认值,若消息(票)没有被收到,则使用此默认值来投票。

上述的故事映射到计算机系统里,将军便成了计算机,而信差就是通信系统。虽然上述的问题涉及了电子化的决策支持与信息安全,却没办法单纯的用密码学与数字签名来解决。因为电路错误仍可能影响整个加密过程,这不是密码学与数字签名算法在解决的问题。因此计算机就有可能将错误的结果提交去,亦可能导致错误的决策。

1.非拜占庭容错算法,现有的解决方案为Paxos或类Paxos算法如Raft

2.拜占庭容错则有pbft,ibft,hotstuff等

需要特别注意的是,在计算机领域的共识,是针对同一套程序即预期有特定输出结果的结果进行共识.也就是说理论上在节点通讯正常,节点运行正常,未被干扰的情况下所有的节点计算的结果是一致的.以太坊的EVM虚拟机即为保证在输入结果一致的情况下,输出也是一致而实现的.

无许可共识当前一般在币圈应用,本文不再讨论,下面仅针对有许可共识进行进一步研究.

Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计