比特币的共识机制


BFT拜占庭容错不是指一种算法,而是解决拜占庭将军问题的一类算法。分布式一致性算法选择最简单的BFT拜占庭容错,作为一致性算法入门一定能事半功倍。在分布式(一)中我们了解了一些基本理论,我们知道在有分区存在的情况下不能能出现完美的可用性和数据一致性,我们在项目中必须要最大限度做到分布式一致性,同时又要保证系统性能,所以必须了解分布式一致性算法。

拜占庭将军问题
拜占庭将军问题(The Byzantine Generals Problem)提供了对分布式共识问题的一种情景化描述,由Leslie Lamport等人在1982年首次发表。拜占庭将军问题描述的场景:
拜占庭帝国n只军队驻扎在敌城外,敌人虽然不如拜占庭军队,但是可用抵抗n/2的拜占庭军队同时进攻,少于等于n/2军队进攻一定会失败。基于一些限制条件,拜占庭的n只军队不能汇集一点进攻,必须分散开来。每支军队都有各自的将军和指挥,并且每支军队之间都不能直接通信,只能使用信使间接通信。

在观察敌情之后,他们必须制定一个共同的进攻或撤退计划,只有当半数以上的将军共同发起进攻时才能取得胜利。其中有一些将军或指挥是叛徒,他们虽然不能截获或修改其他人的消息,但是他们可用使用假情报(如有利进攻时发撤退等),试图阻止忠诚的将军达成一致的行动计划。

拜占庭将军问题中并不去考虑通信兵是否会被截获或无法传达信息等问题,即消息传递的信道绝无问。Lamport已经证明了在消息可能丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。所以,在研究拜占庭将军问题的时候,我们已经假定了信道是没有问题的,并在这个前提下,去做一致性和容错性相关研究。如果需要考虑信道是有问题的,这涉及到了另一个相关问题:两军问题。

我们将拜占庭将军问题简化成了,所有忠诚的将军都能够让别的将军接收到自己的真实意图,并最终一致行动;而形式化的要求就是,“一致性”与“正确性”。

一致性:每个忠诚的将军必须收到相同的命令值vi(vi是第i个将军的命令)
正确性:如果第i个将军是忠诚的,那么他发送的命令和每个忠诚将军收到的vi相同。
Lamport 对拜占庭将军的问题的研究表明,当 n > 3m 时,即叛徒的个数 m 小于将军总数的 n 的 1/3 时,通过口头同步通信(假设通信是可靠的),可以构造同时满足“一致性”和“正确性”的解决方法,即将军们可以达成一致的命令。

两将军问题
拜占庭问题前,就已经存在两将军问题(Two Generals Paradox):两个将军要通过信使来达成进攻还是撤退的约定,但信使可能迷路或被敌军阻拦(消息丢失或伪造),如何达成一致?
根据FLP不可能原理,两将军问题无通用解。

与分布式对应关系
在分布式系统领域, 拜占庭将军问题中的角色与计算机世界的对应关系如下:
将军, 对应计算机节点;
忠诚的将军, 对应运行良好的计算机节点;
叛变的将军, 被非法控制的计算机节点;
信使被杀, 通信故障使得消息丢失;
信使被间谍替换, 通信被攻击, 攻击者篡改或伪造信息。
如上文所述,拜占庭将军问题提供了对分布式共识问题的一种情景化描述,是分布式系统领域最复杂的模型。此外, 它也为我们理解和分类现有的众多分布式一致性协议和算法提供了框架。现有的分布式一致性协议和算法主要可分为两类:

  • 一类是故障容错算法(Crash Fault Tolerance, CFT), 即非拜占庭容错算法,解决的是分布式系统中存在故障,但不存在恶意攻击的场景下的共识问题。也就是说,在该场景下可能存在消息丢失,消息重复,但不存在消息被篡改或伪造的场景。一般用于局域网场景下的分布式系统,如分布式数据库。属于此类的常见算法有Paxos算法、Raft算法,、ZAB协议等。
  • 一类是拜占庭容错算法,拜占庭将军问题之所以难解,在于任何时候系统中都可能存在多个提案(作恶成本很低),并且要完成最终的一致性确认过程十分困难,容易受到干扰。但是一旦确认,即最终确认,概率上是100%。简单的说就是解决分布式系统中既存在故障,又存在恶意攻击场景下的共识问题,一般用于互联网场景下的分布式系统,如在数字货币的区块链技术中。属于此类的常见算法有PBFT算法、PoW算法。

BFT 算法
拜占庭将军问题提出后,有很多的算法被提出用于解决这个问题。这类算法统称拜占庭容错算法(BFT: Byzantine Fault Tolerance)。BFT从上世纪80年代开始被研究,目前已经是一个被研究得比较透彻的理论,具体实现都已经有现成的算法。

拜占庭将军问题是对现实世界的模型化,由于硬件错误、网络拥塞或中断以及遭到恶意攻击等原因,计算机和网络可能出现不可预料的行为。拜占庭容错技术被设计用来处理现实存在的异常行为,并满足所要解决的问题的规范要求。
区块链网络环境符合拜占庭将军问题模型,有运行正常的服务器(忠诚的拜占庭将军),有故障的服务器,还有破坏者的服务器(叛变的拜占庭将军)。共识算法的核心是在正常的节点间形成对网络状态的共识。
通常,发生故障的节点被称为拜占庭节点,而正常的节点为非拜占庭节点
拜占庭容错系统是一个拥有n台节点的系统,整个系统对于每一个请求,满足以下条件:
  A、所有非拜占庭节点使用相同的输入信息,产生同样的结果;
  B、如果输入的信息正确,那么所有非拜占庭节点必须接收这个信息,并计算相应的结果。
拜占庭系统普遍采用的假设条件包括:
  A、拜占庭节点的行为可以是任意的,拜占庭节点之间可以共谋;
  B、节点之间的错误是不相关的;
  C、节点之间通过异步网络连接,网络中的消息可能丢失、乱序并延时到达,但大部分协议假设消息在有限的时间里能传达到目的地;
  D、服务器之间传递的信息,第三方可以嗅探到,但是不能篡改、伪造信息的内容和验证信息的完整性。
原始的拜占庭容错系统由于需要展示其理论上的可行性而缺乏实用性。另外,还需要额外的时钟同步机制支持,算法的复杂度也是随节点增加而指数级增加。

拜占庭将军问题是:n个将军要在充满了奸细的环境下传输情报(即有价值的信息),并保证不泄露。

比特币做到的是:n个持币人要在充满了黑客的环境下传输金钱(即代表价值的字符串),并保证不被双花。

莱斯利·兰伯特提出了“拜占庭将军问题”,但真正解决这个难题的是中本聪。

区块链的解决方案

互联网的存在,首先降低了信息的流通成本。每个将军配一台电脑,就解决了”书面协议“中骑马通讯造成时间延迟的问题。如果10个将军中的几个同时发起消息,势必会造成系统的混乱,造成各说各的攻击时间方案,行动难以一致。谁都可以发起进攻的信息,但由谁来发出呢?中本聪巧妙地在系统加入了发送信息的成本,即:一段时间内只有一个节点可以传播信息。

它加入的成本就是”工作量“——节点必须完成一个计算工作才能向各城邦传播消息,当然,谁第一个完成工作,谁才能传播消息。当某个节点发出统一进攻的消息后,各个节点收到发起者的消息必须签名盖章,确认各自的身份。中本聪在这里引用现代加密技术为这个信息签名。

加密技术
  • 非对称加密算法的加密和解密使用不同的两个密钥
  • 这两个密钥就是我们经常听到的”公开密钥”(公钥)和”私有密钥”(私钥)
  • 公钥和私钥一般成对出现, 如果消息使用公钥加密,那么需要该公钥对应的私钥才能解密
  • 同样,如果消息使用私钥加密,那么需要该私钥对应的公钥才能解密.

非对称加密的作用是:保护消息内容, 并且让消息接收方确定发送方的身份。由此,一个不可信的分布式网络变成了一个可信的网络,所有的参与者可以在某件事在达成一致。

POW

写到这里,同时终于明白了工作量证明(Proof Of Work)的意义。有人说挖矿浪费了巨大的社会资源,但建立信任的成本可不是0,挖矿是维护比特币网络可靠性的最好办法。

如何保证公平?

在拜占庭的系统里,加入工作量证明,其实就是简单粗暴地引入了一个条件:大家都别忙着发起消息,都来做个题,看谁最聪明,谁就有资格第一个发起消息。这个题必须是绝对公平的,中本聪在设计比特币时,它采用了一种工作量证明机制叫哈希现金,在一个交易块这要找到一个随机数,计算机只能用穷举法来找到这个随机数,可以说能不能找到全靠运气,所以对于各个节点来说,只有随机才是真正的公平,实现随机的最好办法是使用数学,所有的将军在寻找共识的过程,借助了大家都认可的数学逻辑。

如何保证时效性?

如果不同的将军先后解出了题,各自先后向这个网络发布消息,于是各个节点都会收到来自不同节点发起的进攻或者不进攻的消息,那怎么办的?只有时间最早的发起者才是有效的。中本聪巧妙的设计了一个时间戳的东西,为每个将军在解好题的时间(出块时间)盖上时间印章。

如何进行工作证明?

将军们那又凭什么要一起做工作量证明呢?中本聪也完全可以设置一个奖励机制,比特币的奖励机制是每打包一个块,目前是奖励6.25个比特币,当然,拜占庭将军问题的奖励机制可以是瓜分拜占庭获得的利益。

如何处理背叛问题?

对了,如果有出现背叛怎么办?在这个分布式网络里,每个将军都有一份实时与其他将军同步的消息账本。 账本里有每个将军的签名都是可以验证身份的。如果有哪些消息不一致,可以知道消息不一致的是哪些将军。 尽管有消息不一致的,只要超过半数同意进攻,少数服从多数,共识达成。
由此,在一个分布式的系统中,尽管有坏人,坏人可以做任意事情(不受protocol限制),比如不响应、发送错误信息、对不同节点发送不同决定、不同错误节点联合起来干坏事等等。但是,只要大多数人是好人,就完全有可能去中心化地实现共识(Consensus)。到这里也可以知道了,基于互联网的区块链技术,它克服了口头协议与书面协议的种种缺点,使用消息加密技术、以及公平的工作量证明机制,创建了一组所有将军都认可的协议,这套协议的出现,拜占庭将军问题也就完美的得到了解决。


Author: 顺坚
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 顺坚 !
评论
 Previous
对领域的认知比会写代码更重要 对领域的认知比会写代码更重要
本文转载,工作五六年后,越发感觉对行业的认知和理解,比提高代码的水平和技能要重要的多。这大概也是领域专家这么值钱的原因吧。所以转行的风险随着年龄的增长也会越来越大 很少有人从头开始构建代码在大学,他们会教你如何编写一个400行的程序,从头到
2023-02-11
Next 
比特币的数据结构 比特币的数据结构
比特币的区块数据里包含了比特币链上的核心信息,包括比特币如何交易,区块扩容等问题。比特币从诞生到现在,每10分钟诞生一个区块,访问 https://blockchain.info/ 查看最近的区块信息,可以看到当前的区块大小已经接近或超过中
2022-12-03
  TOC