区块链与共识机制演变史

简单聊聊

维基百科这样定义区块链:

区块链(英语:blockchain[1][2][3]或block chain[4][5])是借由密码学[1][6]串接并保护内容的串连文字记录(又称区块)。

每一个区块包含了前一个区块的加密散列、相应时间戳记以及交易资料(通常用默克尔树(Merkle tree)算法计算的散列值表示)[7],这样的设计使得区块内容具有难以篡改的特性。用区块链技术所串接的分布式账本能让两方有效记录交易,且可永久查验此交易。

——维基百科词条:区块链

这样的定义固然很正确,但是,一方面,这样的定义依然难以被普通人所理解;另一方面,我们也难以通过这个定义去理解「区块链技术为什么是赛博世界的重要基石」这个命题。

所以,我打算通过一个关于「王国、国王与黑暗国王」的寓言故事,来聊聊「到底什么是区块链」。

寓言故事中的对应关系说明:

王国——系统

外界——用户

国王——节点程序(国王和臣民共同构成节点服务器)

臣民——计算资源

黑暗国王——恶意节点程序

角色间关系简述:

  • 外界向国王发送请求,请求包含「存储」和「计算」两个部分。
    • 「存储」的例子:帮我存储一个数字/帮我读取一个你之前存储的数字。
    • 「计算」的例子:告诉我 5 + 1 等于几。
  • 国王将任务拆解,统筹臣民去完成任务。 例如外界给国王的请求是国王你帮我计算1*2*3*4*……*100,国王将任务拆解成很多小任务,臣民A负责计算1*2、臣民B负责计算3*4…… 暗黑国王可能会实施多种破坏行为例如拦截国王的信使、收到外界的请求后,故意给出错误的回答。如外界问 5 + 1 等于几,故意回答等于 8。

角色关系图 (1)

1 单体时代——独裁统治

在很久很久以前,有一个王国,这个王国的国民秩序井然地从事着工作与生活,并向外界提供服务,这个王国仅有一个国王,国王负责给所有臣民下达指令,统筹完成一个个目标。

一切看上去很Okay,直到有一天,国王吃了绿色的蘑菇,食物中毒了。国民失去了指挥,王国陷入瘫痪,提供给外界的服务中断。在上帝救活国王之前,整个国家是停止运作的。

在 1946 年,计算机最初诞生的时候,我们的计算机系统大部分为单体系统。单体系统的最大问题是只要因为各种原因出现单点故障,那么这个系统就会停止运行,直到程序员处理了问题为止。

2 分布式系统时代——共同决策

为了解决这个问题,一个叫做 Lamport 的上帝发明了一种被称为 Paxos 的机制,让多个国王共同治理王国。

治理方式为:外界(用户)向身份为「提议人(Proposer)」的国王发出提案,例如提议调整税率。提议人国王将提案发送给其它的所有国王。其他的国王收到提案后,进行投票表决。多数一致的提案,则通过。因为所有国王都是可信的,所以臣民有疑问的时候,只要咨询任意状态正常的国王即可。

分布式系统时代(正常) (1) (2)

这样的话,即使有一个或几个国王食物中毒,其他的国王依然能按照机制维持王国的运转,王国解决了单体时代存在的问题,迈入了被称为「分布式系统时代」的新时代。

但是,一些新的问题浮现了——

黑暗国王问题:

国王之中出现了「黑暗国王」(可能是原有的国王被邪恶势力劫持)。黑暗国王会恶意伪造信息,例如,即使判断提案合理,依然投出否决票。

信使拦截问题:

国王之间通过信使传递信息。即使没有「黑暗国王」,也可能出现信使被截杀,从而伪造信息的情况。

因此,制度需要进一步升级,可以在存在「黑暗国王」与「信使拦截」问题的情况下,也确保整个国家正常运行。

分布式系统时代(异常) (1) (1)

专业术语版:

1990年,Lamport 发表了一篇论文,提出了 Paxos 共识协议(Paxos Protocols),可以确保在分布式系统在存在非拜占庭错误的情况下,只有有超半数的节点正常运作,那么这个系统就能正常运作。

非拜占庭错误:出现故障( Crash Failures,即不响应)但不会伪造信息的情况称为「非拜占庭错误」( non-byzantine fault)或「故障错误」( Crash Fault)。

拜占庭错误:伪造信息恶意响应的情况称为「拜占庭错误」( Byzantine Fault),对应节点为拜占庭节点<sup>[1]</sup>。

3 分布式系统 2.0 时代——允许黑暗

王国在进一步发展,上帝 Castro 和 Liskov 在 Paxos 机制的基础上,提出了新的机制,这种机制被称为 PBFT。这种机制依然是基于投票表决,但是和上一个时代的机制有如下差异:

  • 因为有「可能存在黑暗国王」这种前提假设,所以在投票过程中国王会相互通信。这样,假设有黑暗国王A,告诉国王B我同意提案α,但告诉国王C我不同意提案α。在上一个时代,这种行为无从被察觉。但是,现在在B和C收到了A的回答后,由于B和C会互相通信,那么他们核验之后,就会发现A给他们两个的回答不一致。
  • 每个国王在收到 2/3*国王总数+1 个其它国王的相同的答复后,会告知提案请求人(Client)自己的答复。
  • 当提案请求人接收到 1/3*国王总数+1 个相同的答复后,便确定自己的提案被正确处理了。

分布式系统 2.0 时代(正常) (1)

这种新的制度无疑是长足的进步,但是依然存在两方面的问题:

  1. 国王间需要频繁通信,在国王很多的情况下效率急剧下降;
  2. 很难做到让国王随意地加入和退出。

专业术语版:

1999年,Castro 和 Liskov 提出了 PBFT 实用拜占庭容错算法(Practical Byzantine Fault Tolerance Replication Algorithm),该算法可以容纳拜占庭错误和非拜占庭错误。在 PBFT 的假设中,恶意节点可能做出如下行为:

  • 可能做出随机的或错误的答复或请求;
  • 可能延迟或拒绝应答;
  • 可能通过拒绝服务攻击正常节点,使之不能正常提供服务。

设总节点数为 N 个,在恶意节点 < (N-1)/3 的情况下,PBFT 系统可以确保正常运算,不出现节点无法达成一致的问题,

4 区块链时代——自由世界

最终,王国到达了「区块链时代」。一个叫 Satoshi 的上帝引入了一种新的机制,这种机制叫做基于工作量的证明(PoW:Proof Of Work)。然后,Satoshi 给这个王国设立了一个具体的目标——记账

任何外界人人都可以到这个王国来开设自己的账户,他们所拥有的钱,以及他们的每一笔转账记录,都会被记录到同一个大账本上。国王们只有一个使命:维护账本的唯一性且无前后矛盾

  • 账本唯一——确保能存在一个账本被大家共同认可。
  • 无前后矛盾——不会有一笔钱花了两次,例如:小明不能拿五块钱买了冰棍,又拿同一笔钱买了辣条。

需要注意的一点是,和传统的中心化的记账系统不同的是,国王无需关心用户的密码问题。通过被称为密码学的自然法则,国王可以在不知道用户密码的情况下,验证用户是不是花的自己的钱。

简单来说,他们是通过如下机制来达成他们的使命的:

  • 外界将他们的交易(交易举例:我要把10块钱转给小明)寄送给任意一个在线的国王。
  • 收到交易的国王将这些交易寄送给其它的国王。

区块链时代 (1)

  • 所有收到交易的国王要做出一道算术题,才可以将交易打包进一个区块里。区块是这个大账本中的基本单元,多笔交易包含在一个区块里。

    这个算术题有两个特点:

    1)算术题的难度是动态调整的,调整根据是最近2016个区块的叠加速度,如果过去区块叠加速度快了,那么就把算术题难度调大;如果过去区块叠加速度慢了,就把算术题难度调小。任意国王根据自己本地的账本就能计算出来。正是这个动态调整机制,确保了记账速度平均是 10 分钟出一个区块。也就是你发一笔交易,平均来说10分钟左右,你的交易会被记录到大账本里。

    2)交易的「身份证号」和上一个区块的「身份证号」是这个算术题中的变量之一,这样确保没有人能「抢跑」,提前把算术题算好。

    信息的「身份证号」:通过一种被称为哈希的方法,任意信息都能生成一串固定长度的「身份证号」。一堆交易可以生成一个身份证号,一个区块也可以生成一个身份证号。每一块数据的身份证号都是独一无二的。如果别人同时给我们数据和身份证号,那么我们可以用数据算出身份证号,然后看下我们自己计算出的数据的身份证号和别人给的是否一样,从而判断数据是不是被篡改过。

  • 做出算术题的国王,把新的区块放到上一个区块的上面,也即给大账本添加了一些包含在区块中的新的交易,同时把新的区块寄送给其它国王。
  • 其它国王收到区块后,验证区块的正确性——验证区块里面的交易是不是正确、算术题的答案是不是正确等等。如果验证通过,那么其它国王也会把这个区块放在他们本地的上一个区块上面。这时,他们再做算术题,就要依据新的区块的「身份证号」了。

    区块链中的链式结构:每一个区块中都包含了上一个区块的「身份证号」。

    一方面,这种结构让我们可以从最后一个区块追溯到最开始的那个区块。

    另一方面,这种结构也让过去的区块不能改动。因为一旦发生改动,这个区块的身份证号就变了,和已经保存在下一个区块里的这个块的身份证号就对不上了。

  • 在整个过程里,所有国王坚持一个原则:始终把区块数量最多的账本视为唯一账本。这样,一方面确保了有一个被所有国王都认同的唯一账本;另一方面,即使偶然出现了出现了两个具有相同区块数量的账本,那么就让各个国王在自己收到的账本上,继续叠加区块,那么最终一定会有一个账本「脱颖而出」,成为包含区块数量最多的账本。
  • 做出算术题的国王是有奖励的。这个奖励作为一笔特殊的交易写在这个国王打包的区块里。这个交易的内容用大白话就是:「系统奖励给打包这个区块的国王 α N元」。国王们在最开始的时候已经商量好了,这个 N 每四年减半,所以,这个系统里的钱的总量是固定的。

如果你是通过本文第一次接触区块链,那么上面的机制会有些复杂,可以先略过不看,仅领略这件事情达到的目标就行了,也就是——

「实现了一个所有国王共同维护的大账本,记录所有用户的交易记录,这个大账本可以确保全世界只有唯一的一份」。

在这个新的机制下,分布式系统 2.0 时代的问题被解决了。我们现在可以:

  1. 容纳无数个国王。不管国王有多少个,1 个或 100000000 个,记账速度始终是平均 10 分钟一个块。
  2. 国王可以随意上线或下线。因为只要有 1 个国王能做出系统出的计算题,那么这个系统就能正常运行。

专业术语版:

中本聪(Satoshi Nakamoto)在 2008 年发布了题为《比特币:一种点对点式的电子现金系统》的论文,该论文中提出了一种和传统的 BFT 共识机制不同的思路,通过工作量证明(PoW),可以让系统在能容纳拜占庭错误与非拜占庭错误的前提下,将通信复杂度从 BFT系列共识算法 的O(N^2)降低到O(N),确保无论节点有多少,全网打包出块的速度是平均 10 分钟一个块。

在该论文中,这种新的共识机制被用于一个被称之为「比特币」的分布式记账系统。记账系统中的货币被称之为比特币。同时,为了确保会有节点自愿加入系统,参与区块打包,该论文中还设计了货币发行机制兼出块奖励机制。

2009 年,比特币系统正式开始运行,这是历史上第一个区块链系统。

5 新区块链时代——群雄逐鹿

在上一个时代,区块链这个概念正式登上了历史舞台。

但是,第一个区块链系统——比特币的目的非常纯粹,就是记账。此外,它还存在一个问题:因为国王们都在争做计算题,所以对计算资源与电力都会造成大量消耗。

因此,上帝们又有了新的想法:

1)区块链这种链式结构很好,我们不仅能用它来记账嘛,我们还可以用来做些别的什么,例如在交易里带上指令,在让所有的国王同时运行一个程序?——这个想法被付诸实践,也就成为了现在被人们所熟知的智能合约技术。

2)我们能不能在PBFT(分布式系统 2.0 时代)这类机制的基础上做改进,或者用另一种方式来确认哪个国王能出块?——这个想法被付诸实践,也就成为了现在五花八门的共识机制,除了 PoW、BFT 以外,还有 PoS(基于权益的证明)、PoC(基于容量的证明)等等等等。

3)系统中一定要有代币作为奖励吗?如果没有代币,只是做一个相较于传统的「分布式系统」具有更高自由度、开放度的「超级分布式系统」(我们依然称之为区块链),可以吗?——这个想法被付诸实践,也就成为了现在我国新基建的重要组成部分——「联盟链」。

群雄逐鹿的新区块链时代 (1) (1)

6 总结

笔者认为,放到分布式系统发展的整个历程中去看,我们会发现区块链实际上是计算机技术发展的必然产物,从而真正地理解「区块链是什么」这个命题。

而「区块链是什么」这个命题,正是「为什么我们需要区块链」、「区块链究竟有哪些落地应用」、「为什么我国将区块链视为新基建的重要组成部分」等等关于区块链的命题的基础与原点,就像是直角坐标系中的(0, 0)。

理解了原点,便可以说,我们已经迈入了「区块链世界」的大门,这个世界里有许多新的机会、可能与想象空间。

欢迎来到区块链世界:)。

- [1] [区块链技术指南

本文作者: 李大狗

简介: 李骜华(李大狗),上海对外经贸大学区块链技术与应用研究中心副主任,柏链教育CTO,首批FISCO BCOS(微众银行区块链框架)区块链认证讲师,5年区块链工程师,北京大学硕士

研究领域包括:区块链系统、共识机制、智能合约、区块链应用、数字身份等。

个人二维码:

<img src="https://tva1.sinaimg.cn/large/008i3skNgy1gsgjc1rjccj30e80eaadk.jpg" alt="qr_code2" style="zoom:50%;" />

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
李大狗
李大狗

上海对外经贸大学区块链研究中心副主任

45 篇文章, 6001 学分