大话区块链
上QQ阅读APP看书,第一时间看更新

1.3 玩转区块链,搞定密码学、分布式、共识机制和P2P网络即可

区块链起源于密码学,毫不夸张地说,密码学占据了区块链的半壁江山。

区块链是分布式系统,但不是说分布式系统都是区块链。

共识机制不是区块链的特权,但共识机制的确是区块链的灵魂,共识算法也必然要经历一个不断完善、不断进化的过程。

密码学、分布式、共识机制固然重要,但P2P才是区块链的根基。

1.3.1 密码学——密码极客的最爱,区块链的起源

密码学是一个大家熟悉又陌生的学科。提到密码大家一定会想到银行卡密码、WiFi密码、手机密码等,毫不夸张地说,我们的生活已经离不开密码了。

密码学可以分为古典密码学和现代密码学,分水岭是第二次世界大战。一般情况下,我们将第二次世界大战之前出现的密码学称为古典密码学,第二次世界大战之后的密码学称为现代密码学。

古典密码学只关注信息的保密书写和传递,通常会比较依赖于设计者的创造技巧。

古典密码学中经常会用到两个重要的技巧,分别是将字母重新排序和替换字母(符号)。例如,blockchain可以倒序就成为niahckcolb,将每个字母用下一个字母代替就成了cmpdldibjo。但这些都只是技巧性的,不足以保证信息的机密性,一旦敌人明白了原理就很容易破解。在第二次世界大战之前,由于战争和国家安全的需要,还出现了维吉尼亚加密法、恩尼格玛密码机(ENIGMA),其中恩尼格玛密码机就是被计算机科学家、数学家图灵破解。

第二次世界大战以后,计算机技术的发展促使了更为复杂的密码算法。由于计算机可以加密任何二进制形式的数据,不再限于书写的文字,以语言为基础的加密技术因此失效。在密码学领域,加密和解密一直是不断较量的一个过程,正所谓“道高一尺魔高一丈,魔高一尺道高一丈”。

现代密码学除了关注信息的保密书写和传递,还涉及信息的完整性、不可抵赖性,以及分布式计算中内部和外部攻击者的所有信息安全问题。由于更注重理论研究,也使密码学成为一种系统而严格的学科。

密码学在区块链中的应用非常广泛,占据了区块链的半壁江山。例如,在链状数据结构和工作量证明机制中使用了哈希算法,保证了数据的不可篡改性;在交易数据上加盖时间戳,确保了交易的唯一性,有效防止双重攻击;对交易数据使用私钥进行数字签名,保证交易身份的唯一性;采用加密算法对交易数据进行加密,有效保护数据隐私。总之,区块链与密码学的血缘关系非常近,所以才有人怀疑比特币的发明者有可能是一群密码领域造诣极深的专家。

密码学属于数学和计算机学科的分支,也是专门研究密码算法和密码破译的技术学科。在密码学中,目前常用的密码算法有哈希(Hash)、对称加密、非对称加密、数字信封、时间戳、零知识证明等技术,这些都属于密码算法的应用。密码学是一群高智商人群的博弈,例如,MD5哈希算法、RSA(1024)算法都已经被破解,未来量子密码学(Quantum cryptography)会对现有密码算法造成威胁,但同时也会出现新的量子加密算法。

虽然密码学非常深奥,但对于大多人来说我们不需要过多了解密码算法的实现原理,只需掌握密码算法的应用就可以了。

1. 哈希(Hash)

哈希也称为散列算法、摘要,是对一段数据进行加密计算,形成一个定长的字符串,由于哈希可以代表一段数据的唯一特征,有点类似人类的指纹,所以大家也经常把哈希称为数字指纹,常用的算法有SHA-256。

从图1-14中可以看出,无论输入的字符串有多长,最终输出的都是一个定长的字符串。图中的“你好”加上感叹号后,两者的哈希就彻底不同了。

图1-14 哈希算法

区块链是基于哈希指针构建的一个有序的、反向链接的交易块链表,也就是说在区块链中,每个区块都包含了上一个区块的哈希值(图1-15)。在区块链中使用SHA-256算法对区块进行哈希计算而得到的数字指纹(32个字节哈希值)被称为区块哈希值。图1-16中比特币第554347个区块中包含了第554346个区块的哈希。

图1-15 区块链数据结构

图1-16 第554347个区块中包含了第554346个区块的哈希(数据来源于blockchain.info)

由于每个区块都包含了大量的交易数据,随着时间的增长,区块的高度不断增加,导致交易信息查找变得异常低效,因此,区块链中采用了默克尔树(Merkle tree)的方式来组织区块内的交易数据(图1-17)。

图1-17 默克尔树

默克尔树有时候也被称为哈希树,顾名思义,就是存储哈希值的一棵树。默克尔树是一种二叉树数据结构,它的叶子是数据块,非叶子节点是两个子节点的哈希。一个默克尔树是自下而上构建的,通过不断计算两个节点的哈希值,直到头部只有一个默克尔树根。区块链中,这种数据结构的特点是通过数学算法,可以非常方便地验证区块中的交易数据。

2. 对称加密

密码学中有两类加密算法,分别是对称加密和非对称加密。我们可以将加密理解为家里的保险箱。对称加密与我们生活中的概念是相同的,使用同一把钥匙对保险箱进行上锁、开锁。非对称加密与我们日常生活不太一样,是用一把钥匙上锁后,用另外一把不同的钥匙来开锁。

对称加密的加密密钥和解密密钥是相同的。由于对称加密使用了相同的加密密钥对数据进行加密,因此加密效率非常高。但在实际使用中,由于很难保证密钥在传输、保存过程中不被截获,因此对称加密的安全性比较低。常用的加密算法有DES、AES、SM4。

实际应用中,有时候也会遇到一些让人哭笑不得的案例。有些安全厂商的软件宣称使用了非常安全的加密算法,但实际上就只是使用了对称加密算法。更有甚者还将密钥与密文存放在一起,一旦密钥被黑客攻击,所有密文实际上就变成了明文。看似安全的技术手段,实际上却非常脆弱。

图1-18采用了对称加密算法DES,使用了密钥1234567890将明文数据“你好”加密成密文U2FsdGVkX1/pez1V1Wa8LNCP9hlXhJFs,再用相同的密钥1234567890将密文U2FsdGVkX1/pez1V1Wa8LNCP9hlXhJFs解密成明文“你好”。

图1-18 对称加密

3. 非对称加密

由于对称加密非常脆弱,很容易被破解,因此,催生了非对称加密算法。顾名思义,非对称加密的意思就是加密密钥与解密密钥不同,这样就使加密的安全性大幅提高。

非对称加密是由椭圆曲线算法生成的一对公私钥对组成,公钥对外公开,任何人都可以获取,私钥自己持有,不能给任何人看。由于公钥是对外公开的,我们可以用接收者的公钥对数据进行加密,只有持有公钥对应私钥的人才能进行数据解密。反过来,如果使用自己的私钥对数据加密,用公钥进行解密,我们称为签名。由于私钥是自己持有的,公钥是对外公开的,因此采用私钥加密公钥解密的方式,可以验证身份的唯一性,确定某段数据已经得到某个特定组织、个人的认可,或者确定某段数据由某个组织、个人持有。常用的算法有RSA、SM2。

还是以安全保险箱为例。在非对称加密中,上锁和解锁使用了两把不同的钥匙,一把称为私钥,另一把称为公钥。当我们用公钥上锁安全保险箱时,只有对应的私钥才可以开锁,但由于私钥只有保险箱的主人持有,因此我们把这个过程称为加密。如果我们将上面的顺序反过来,用私钥上锁,公钥解锁,由于公钥是对外公开的,因此任何人都可以打开安全保险箱,这种方式就不能用作加密,但由于只有保险箱的主人持有私钥,所以只能由保险箱主人的私钥对应的公钥解锁,因此可以起到确认身份的作用。

图1-19使用了接收者的公钥对明文进行加密,接收者使用自己的私钥进行数据解密。

图1-19 非对称加密

如果发送者(签名者)用自己的私钥对数据加密,将数据发送给接收者(验证者),接收者(验证者)用发送者(签名者)的公钥进行解密,这个过程就是验证签名的过程。如果验证通过,代表这个数据没有被篡改,否则代表数据被篡改。图1-20就是一个完整的签名和验证签名的过程。需要注意的是,为了提高签名的效率,通常会对数据做一个哈希,用私钥对哈希进行签名。验证签名的时候,用对应的公钥对数据进行解密,将得出的哈希与原数据的哈希进行对比,如果哈希相同则代表验证通过,否则验证失败。

图1-20 验证签名

4. 数字信封技术

虽然非对称加密的安全性很高,但加解密的效率太低。实际应用中会采用数字信封技术对数据进行加密。数字信封技术是用对称加密算法对明文数据进行加密,用非对称加密算法对对称密钥进行加密,这样既可以提升加密效率,又可以有效保护数据安全。

数字信封技术主要包括数字信封打包和数字信封拆解两个过程。数字信封打包指的是信息发送方采用对称密钥加密信息原文,然后使用接收方公钥加密对称密钥,之后将密钥和密文一起发送给接收方;数字信封拆解指的是,接收方先用对应的私钥打开数字信封,得到对称密钥,然后使用对称密钥解开加密信息得到明文数据。具体过程见图1-21。

1.3.2 区块链是分布式系统,但不是说分布式系统就是区块链

对区块链最常见的误解是“区块链就是分布式系统”。虽然区块链是一种分布式系统,但不是说所有的分布式系统都是区块链。区块链作为一种分布式记账技术与传统的分布式系统相比,具有更好的容错性,具有数据难以篡改的特性,这是传统分布式系统无法媲美的地方。

图1-21 数字信封技术

传统的分布式系统是单组织(单中心)系统。例如,腾讯分布在全球各地的服务器都隶属于腾讯,这就导致腾讯的权利过大,利益比较集中。区块链是由很多组织(多中心)共同维护的一个系统,这些组织之间地位平等,可以很好地保护所有参与者的权益。

1. 传统分布式系统

在计算机理论科学中,CAP定理指的是系统的一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance)不能同时得到保证(图1-22)。

图1-22 CAP定理

» 一致性:每一次数据读取操作都是最新写入的数据,数据的读取不存在任何延迟,这里指的是数据的强一致性。

» 可用性:每次系统请求都会收到正常响应,但不确保是最新的数据。

» 分区容忍性:网络分解为相对独立的子网,节点之间的通信不可保障。

基于CAP定理,分布式系统在设计时需要弱化其中某个特性。由于系统设计上的缺陷、黑客攻击、服务器宕机等原因导致网络无法正常通信,我们把这类问题统称为网络故障。在网络故障的情况下,系统要么牺牲一致性,要么牺牲可用性。当对系统一致性要求很高的情况下,设计上要牺牲可用性,当对系统可用性要求比较高的情况下,设计上要牺牲一致性。

举一个例子,金融系统对系统一致性要求很高,当网络出现故障时,系统会拒绝向用户提供服务。对一致性要求不高的系统,当网络出现故障时,系统会牺牲一致性,继续向用户提供服务,待网络恢复正常,系统才会更新数据。我们经常使用的微信等社交网络就属于这类,在网络故障时,系统会放弃一些用户请求,但大部分用户的使用还是正常的。

理论研究往往和工程领域有所不同,理论研究是非常严密的学术研究。实际生活中,传统分布式系统在设计上对系统容错的要求都不是很高,除非一些极端情况,例如SpaceX的火箭发射系统。

实际上,信息系统的建设都会采用双线路方式、防火墙、负载平衡、冗余备份等手段确保网络的可靠性。

2. 拜占庭容错机制

传统分布式系统在设计时,只考虑系统中存在的故障,但不存在恶意攻击情况,因此,在共识机制上采用了非拜占庭的共识机制(例如Paxos、Raft)。

区块链在设计上采用了拜占庭容错机制(Byzantine Generals Problem,BFT),拜占庭容错是一种对一致性要求极高的共识机制,在完全开放的环境下,实现了数据的一致性和安全性,为业务提供了一个可信的环境。

1982年,Leslie Lamport提出的“拜占庭将军”问题是解释一致性问题的一个虚拟模型。拜占庭是古东罗马的首都,由于地域宽广,守卫的将军需要通过信使传递消息,达成一致的决定。但由于将军中可能存在叛徒,这些叛变的将军可能会发送错误的消息,干扰大家的决议。图1-23左图是所有将军达成一致的情况下攻城成功,右图是将军中存在叛徒的情况下攻城失败。

图1-23 拜占庭将军问题

拜占庭问题的提出是为了解决上述情况下,怎样让忠诚的将军们达成一致的决议。这个问题演变到计算机领域,就是在互联网中不同计算机通过通信怎样达成一致。与拜占庭将军类似,实际过程中有些计算机可能出现错误,有些计算机有可能被黑客攻击,怎样保证网络上的计算机对某个事物达成一致就是这个理论模型要解决的问题。拜占庭问题是区块链技术中共识机制的基础。正因为有了这样的理论基础,才使区块链技术有了发展的科学基础。

区块链是一种分布式系统解决方案,但不能说分布式系统就是区块链。除了两者采用的共识机制不同,数据隶属权也不同。区块链数据隶属于各个参与的节点,而传统分布式数据只隶属于单一的组织。

1.3.3 持续演进、持续进化的共识机制

前面我们已经提到了区块链与传统分布式最重要的区别——即采用了拜占庭共识机制。共识机制是区块链技术中一个很重要的技术,一条公链是否足够去中心化、足够可信,取决于共识算法的合理性,而共识算法是否合理取决于区块链使用场景的需要。

共识机制不只是区块链的特权,在人类历史发展的长河中,已经产生了许多的共识机制,例如国家、宗教、道德、科学等。我们对于一件事情好坏的判断,都基于各自的生活环境和认知水平,这也能很好地说明为什么价值观相同的人容易达成共识,同一个地域的人容易达成共识。

计算机中让不相干的人达成共识需要有一套新的理论模型。区块链中的共识机制可以让系统在限定时间内完成对交易的验证和确认,对一笔交易,如果利益不相干的若干个节点能够达成共识,我们就可以认为全网对此也能够达成共识。

区块链信任的特点主要体现在区块链上的用户无须信任交易的另一方,无须信任任何一个中心化的机构,只需信任区块链提供的软件系统就可以实现交易,这种自信任的基础就是区块链的共识机制。在一个互不信任的市场中,要使各节点达成一致,其充分必要条件是每个节点出于对自身利益最大化的考虑,都会自发、诚实地遵守协议中预先设定的规则,判断每一笔交易记录的真实性,最终将验证通过的记录写入区块链。区块链技术正是运用一套基于共识的数学算法,在计算机之间建立了一套“信任”的网络,通过技术背书而非中心化信用机构来进行全新的信用创造。

共识机制起源于拜占庭理论,经历了数字货币的历史演进,目前主流共识有工作量证明机制(Proof of Work,PoW)、权益证明机制(Proof of Stake,PoS)和代理权益证明机制(Delegate Proof of Stake,DPoS)。这些共识机制其实都是技术和经济的合体,在计算机世界中加入了现实世界的经济博弈。工作量证明机制锚定的是算力,权益证明机制和代理权益证明机制锚定的是权益(Token)。类似于工作量证明机制的挖矿机制,大家可以将权益证明机制想象为虚拟挖矿。

在工作量证明机制下,用户需要花费一定的金钱购买矿机,每天消耗着巨额的电费,其随机获得挖矿收益与消耗的电力大致成比例。在权益证明机制下,用户花费金钱购买代币(Token),在网络中分配一定的计算资源,系统验证区块产生的奖励大致与购买代币的成本成一定的比例,达到了与工作量证明机制同样的效果,而且不消耗电力,效率也会大幅度提升。

为了能够清楚地理解共识机制,我们需要搞清楚共识机制中的区块、生产者、验证者3个核心概念。以篮球比赛为例,在篮球比赛中比赛成绩就是区块,运动员是区块的生产者,裁判员是区块链的验证者。如果裁判徇私舞弊就会产生信任危机,无法保证比赛成绩的真实性,因此共识机制的关键就是保证区块生产和验证的安全。

共识机制的核心是记账权的争夺,设计思路是让恶意节点的攻击成本远远大于诚实节点的受益,基于利益的考虑,大家与其作恶白白损失金钱还不如老老实实地记账。

工作量证明机制(Proof of Work,PoW)中,全网通过竞猜随机数获取生产区块的资格,一旦某个节点作恶就会白白损失算力,无法成为合格的区块生产者,也无法获得奖励。工作量证明机制并非完美,其中被指责最多的主要有两点,一是浪费能源,二是风险和收益博弈必然导致联合挖矿,而大算力矿池可能会对系统的去中心化构成威胁。

比特币采用的是工作量证明机制。图1-24是比特币主要算力分布情况。由于比特币长期缓慢的发展,导致65%的算力已经被5个矿池所占有。理论上上讲,5大矿池联手可以对比特币网络发起51%的攻击。

图1-24 比特币主要算力分布图(来源于blockchain.info)

权益证明机制(Proof of Stake,PoS)中,节点被称为验证者,没有挖矿,节点通过验证交易则获取交易手续费,验证错误则没收押金。每次系统会根据抵押代币数量来随机选择验证者,抵押代币越多则被选为验证者的概率越大。举一个例子,如果A节点抵押了100个代币,B节点抵押了10个代币,那么A节点相对B节点就有10倍的验证机会。

为提高以太坊的工作效率,以太坊2.0将会采用权益证明机制。

代理权益证明机制(Delegate Proof of Stake,DPoS)有点类似人民代表大会制度,由持币者选取21个节点参与区块生产和验证,每次参与记账的区块生产者是由持有代币的人选举产生的,如果节点作恶,会被系统自动“投出”。在目前的区块链技术条件下,代理权益证明机制采用了部分“人治”弥补了区块链技术在效率上的缺憾。两害相权取其轻就是这个意思。

EOS采用的是代理权益证明机制,在目前已知的去中心化共识算法中,只有该算法经证明可以满足区块链应用的性能要求。

需要说明的是,现阶段脱离实际业务谈共识机制的优劣没有太大意义。对于一个去中心化的全球货币,工作量证明机制是目前最好的共识机制。对于一个去中心化应用平台,权益证明机制和代理权益证明机制是目前比较好的共识机制。工作量证明机制虽然效率低下,但由于节点匿名,使分布式拒绝服务攻击(Distributed Denial-of-service attack,DDoS)(通过大量合法的请求占用大量网络资源,以达到瘫痪网络的目的)变得非常困难。代理权益证明机制虽然效率比较高,但由于只有21个节点,有被DDoS攻击的可能性。

关于共识机制更全面的理解,将会在相应章节做进一步介绍。

1.3.4 区块链的根基——P2P网络

首先要澄清的是,P2P(peer to peer)网络是一种分布式应用架构,不是大家认为的P2P网络借贷,中文称为对等网络(也称点对点网络)。除区块链外,规模最大也最成功的P2P技术应用是在文件分享领域,Napster是该领域的先锋,BitTorrent是其架构的最新演变,国内的迅雷、快播都是P2P技术的领导者。

P2P网络中每一个节点彼此对等,各个节点共同提供服务,不存在任何特殊节点。P2P网络中不存在任何服务器、中心化服务及层级结构,P2P网络具有天生的伸缩性、去中心化和开放的特点。图1-25是P2P网络的示意图。

图1-25 P2P网络示意图

P2P网络中,节点之间可以直接使用资源(CPU、存储、带宽),而不需要中心服务器的协调。相对传统中心化架构(客户端/服务器)下资源供应者和消费者的分离,P2P网络中各个节点既是资源的供应者也是消费者。

举一个例子,你通过微信给朋友老王发了一句话“在吗?”,这时老王会在自己的手机上看到这条信息。你以为这条消息是直接发给了老王,其实背后的流程是:你先将这条信息发给了微信服务器,然后微信服务器再将这条消息发给老王。在你完全不知情的情况下,有一个中间人在参与你们的交流,这个人就是微信服务器,它在帮你转发那条消息。节假日,如果微信服务器繁忙,它有可能会罢工,这时候可能这条消息就一直无法发送。

但是,如果采用P2P网络,你和老王之间就可以直接通信了。由于在P2P网络中不存在特殊节点,因此,其他任何节点出现问题都不会影响你和老王之间的通信。

从上面的例子可以看出,P2P网络架构既是区块链去中心化核心特性的反映,也是该特性的基石。