这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
课程内容与选题缘由
最近的课程中讲到了分布式系统相关的内容,其中拜占庭将军问题是所有分布式系统中都需要面临的问题,刚好最近也在学习比特币系统,因此将相关内容整理为一篇笔记。
拜占庭将军问题
当我们谈论分布式系统的共识机制时,就避不开一个问题——拜占庭将军问题。
这个问题的背景是这样的:
拜占庭城邦拥有巨额财富,其周边的 10 个邻邦早已对帝国的财富垂涎已久。
但是这10个城邦之间也互相觊觎对方的财富并经常爆发战争,然而面对拜占庭具有压倒性的军事力量,必须有一半以上的邻邦同时进攻才能击溃拜占庭帝国。只要其中有一个邻邦背叛盟军,那么该邻邦的所有进攻军队都会被歼灭,随后还会被其他邻邦劫掠。
那么,在这个由互不信任的邻邦构成的分布式网络里,各邻邦的将军如何找到一个分布式协议,通过信使进行与远程协商并约定最终的进攻时间?
拜占庭容错的协议
拜占庭容错和非拜占庭容错的协议的区别,就是对“恶意节点”的容忍程度不同
拜占庭容错的协议在设计时假定存在一些恶意节点,并通过算法来控制其对系统正常运作的影响;而非拜占庭容错的协议则不假设存在恶意节点,或者对恶意节点的容忍程度较低。因此,在一个系统中出现恶意节点时,前者可以继续保证系统的正常运作,而后者可能需要关闭系统。
我们熟知的分布式协议,如Paxos协议和RAFT协议,在私有的分布式系统或者说中心化的分布式系统中,能够很好的防范Faulty problem (指节点断网,节点崩溃之类的节点出错导致的节点失联的问题)对分布式共识的影响。
但是在去中心化的分布式系统的环境不一样,我们必须要明确一点:传递消息 ≠ 达成共识。去中心化网络中并不是所有节点都是正常运行的,节点之间并不是互相信任的。在中心化的网络中,Faulty node只会掉线,默认不会再网络中传递虚假的信息;但是在去中心化的网络中,Faulty node有可能会传递虚假信息来阻碍系统达成共识。
因此对于去中心化的分布式系统,我们就要设计新的协议来代替RAFT协议等非拜占庭容错的协议使得恶意节点和虚假信息无法阻碍系统达成共识。除了PBFT(Practical Byzantine Fault Tolerance)这种拜占庭容错算法之外,更为广为人知的拜占庭容错协议,就是比特币系统的PoW。与经典的共识协议相比,比特币所使用的PoW协议是基于密码学 和 算力 以及 一定的激励手段 来维持系统的共识达成的。
比特币 与 PoW协议
比特币简介
比特币是世界上第一个去中心化的电子现金系统,而”区块链技术“的概念也诞生自比特币的账本设计模式。
比特币是一个由不同节点共同参与的分布式数据库系统,是一个开放式的账簿系统; 整个区块链系统都是由一串 按照密码学方法产生的数据块或数据包(即区块) 组成的链,也就是我们熟知的“区块链”。
这个数据链中的区块与区块之间是根据一个哈希值进行索引相连的,每一个区块都会有一个哈希指针指向上一个区块,而这个哈希指针中的哈希值是通过前一个区块里面的内容计算出来的。因此如果有人在整个系统运行的时候修改了某个历史区块的数据,整个区块链的区块都会断链,因为被修改的区块之后的每个区块的哈希值都改变了。这种区块相连的方式赋予了比特币账本防止篡改的特性,也营造了一个让价值可以在网络中传输的先要条件。
密码学的加持使得每一个节点可以验证记账节点打包的区块是否合法、防止历史记录的篡改,而防止恶意节点攻击系统、使得系统正确地达成共识,则需要引入PoW协议以及挖矿(代币激励) 。
PoW协议
PoW协议(Proof of Work)是一种计算难度的协议,常用于比特币和众多区块链系统中的挖矿过程。PoW协议本质是一种工作量算法,变量是区块头中的nBits和nounce。
比特币系统会根据当前出块的速度调整难度nBits(计算新的哈希值所需的计算量),然后矿工需要不断地尝试一个随机数nounce,使得自己打包的候选区块中的所有数据与这个随机数一起计算的哈希值,能落在系统难度的范围内,从而获得发布区块的权力(记账权)。
当一个矿工计算出合法的nounce之后,就可以把这个区块广播给其他的节点,当其他节点验证了区块的合法性后,就可以把这个区块记录到区块链中,矿工也可以获得这个区块被成功打包后的区块奖励。
因为通过不断尝试随机数nonce从而获得奖励的过程,很像不断地在矿脉挖土淘金的矿工,因此争夺记账权的过程也被称为挖矿。
挖矿中产生的计算是没有实际意义的,但是挖矿的过程对维护区块链系统的安全是至关重要的。因为挖矿的过程是Progress free的,每一次尝试 nounce 的过程可以看作一次 Bernoulli Trial,据有无记忆性的特点,之前计算nonce所用的功对之后是否能成功计算出合法nonce并没有影响,因此获得记账权的可能性只在于你的**Hash Rate(哈希率)**有多少,如果你的设备算力足够强,那么你获得记账权的概率越大。
这就为系统中的所有节点提供了一种通过算力投票的手段,只要大部分算力是掌握在诚实的节点的手里,那系统的安全就可以得到保障
密码学使得比特币系统中的恶意节点无法篡改区块中的交易,只要区块中的交易被篡改或者计假账,这个区块就会无法通过其他节点的合法性验证而被抛弃,丢失区块奖励;PoW协议的挖矿过程,使得恶意节点通过掌握大部分算力去攻击系统的成本远大于诚实地进行区块打包。比特币系统的这两个特性保障了这个去中心化的分布式系统的节点之间能够达成共识。