区块链的成功在于其具有三大关键机制,分别是加密算法、Merkle树和共识机制,如图1-8所示。
图1-8 区块链的三大关键机制
对于传统的中心化数据库来说,安全性不是太大的问题,因为有多重数据防火墙阻挡,所以外网的黑客攻击内网的数据库的难度较大。但是对于区块链的分布式记账模式来说,数据保存在多个节点上,节点又通过互联网链接,没有了防火墙,自然成为黑客攻击的理想对象。在这种情况下,就有必要采用加密技术来保护区块上的数据,因此区块链三大机制中的第一个就是加密算法。
区块链上的加密算法很多,最重要的有两个,一个是哈希算法,另一个是非对称加密。
哈希算法是一类加密算法的统称,是信息领域中非常基础也非常重要的技术,输入任意长度的字符串,哈希算法可以产生固定大小的输出。通俗地说,我们可以将哈希算法的输出(也就是哈希值)理解为区块链世界中的“地址”,有了这个地址,就可以定位到任何区块,这就类似于在现实世界中,通过邮箱地址就可以定位到具体的某个物理地点。
哈希算法有一个很重要的特性,即“加密容易解密难”,将区块中的内容通过哈希算法加密是很简单的事情,但是想从加密后的数据中解密出原始数据,以目前的计算技术,几乎是不可完成的。就像在现实世界中,我们不太可能从“邮箱地址”倒推出房屋结构、家庭成员等隐私信息。
区块链上的数据一旦通过哈希加密,哪怕被黑客截获,想破解出其中的原始内容,也是极为困难的,这就保证了区块链节点上的数据安全。比特币诞生以来遭受过无数次攻击,但依然运作良好,这足以说明哈希算法的价值。
哈希算法还有一个重要的特征是“雪崩效应”,指即使对原始输入数据只进行小改动,结果也会有非常大的差异。我们来看一个哈希算法例子,使用SHA-256(一种常用的哈希算法)进行测试,如图1-9所示。
图1-9 一个哈希算法的例子
可以看到,即使只改变了输入的第一个字母的大小写(This变为this),输出哈希值也天差地别,没有任何相关性,因此破解哈希值十分困难。根据密码学的研究,按照目前的计算机算力,想彻底破解哈希值,需要经过上万年的计算,这就保证了哈希加密技术的可靠性。
可能有人会感到疑惑,将来量子计算成功后,是不是就可以破解哈希了?量子计算从理论到应用还有几十年的路程,短期还看不到实际应用的可能性。此外,即使量子计算真的出现了,肯定也会诞生新的加密算法,所谓“有矛就有盾”,普通用户大可不必为此担忧。
非对称加密是指加密和解密使用不同密钥的加密算法,又称公私钥加密,这是目前信息安全领域使用最广的加密模式。我们日常生活中的“用户名/密码”模式是对称加密,加密用的密码和解密用的密码相同,其效率高、简单易行,但是安全性不够,一旦密码泄露,内容就会被窃取。
非对称加密采用公钥和私钥两个密钥,在区块链网络中,每个节点都拥有唯一的一对私钥和公钥。公钥是公开的部分,就像银行的账户;私钥是非公开的部分,就像账户密码。使用这个密钥对时,如果用其中一个密钥加密一段数据,则必须用另一个密钥解密,即“公钥加密,私钥解密”或“私钥加密,公钥解密”。用户接收文件的非对称加密过程如图1-10所示。
图1-10 用户接收文件的非对称加密过程
非对称加密具有双向性,即公钥和私钥均可用于加密,同时另一个用于解密,于是不同加密方向便产生了不同的应用。
其中一个应用就是加密通信,其路径是:明文→公钥加密→密文→私钥解密→明文。例如,李四想利用非对称加密算法私密地接收张三向他发送的信息,步骤如下。
第一步:李四需要使用具体约定的算法(如RSA)生成密钥和公钥,密钥自己保留,公钥对外公布。
第二步:张三拿到李四的公钥后,便可以对想要发送的消息“张三已向李四转账1BTC,请查收”进行加密。
第三步:张三将密文(如“FH39kkJ+shi3dabcg35”)发送给李四。
第四步:李四收到消息后,用自己的私钥进行解密,还原出消息原文“张三已向李四转账1BTC,请查收”。
因为只有李四拥有私钥,所以黑客就算劫持了消息,也没有办法解密,保证了通信的安全性。加密通信过程如图1-11所示。
图1-11 加密通信过程
在这个过程中,发起方无须暴露自己的私钥,就可实现保密,只有拥有私钥的一方能解密信息。比特币交易的解密与验证过程与此类似,如图1-12所示。
图1-12 比特币交易的解密与验证过程
公钥有很多不同的实现方法,RSA算法是最知名的一种。RSA算法基于一个十分简单的数论事实:将两个大质数(素数)相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。例如,取两个简单的质数89、97,得到两者乘积8633很简单,但是对8633进行因式分解的工作量很大。
非对称加密技术是目前互联网信息安全的基石,它确保了区块链上的数据足够安全。
非对称加密的另一个重要应用是数字签名。在比特币系统中,类似“张三已向李四转账1BTC,请查收”这样的消息最终会被矿工记录在账本上,因为其与转账双方利益相关。这样一条消息的受益方是李四,那么如果李四一直向网络中广播张三给他转账的消息呢?因此,我们需要一种机制来证明张三是自愿的,也就是消息确实是张三发出的。怎么操作呢?只要反过来,先用私钥加密就可以了,因为只有张三拥有私钥。这就是数字签名的原理。
张三发出消息的同时将数字签名发出并将公钥公开,区块链上的矿工们收到消息和数字签名后,用张三提供的公钥解密,将解出来的结果与张三的消息明文对比,如果一致,则说明这个消息确实是张三发出的,这就验证了数据来源的可靠性。
总而言之,加密算法既要保证正常的交易数据不被黑客劫持和攻击,又要保证交易者不会出现互相欺诈的情况。因此,区块链使用加密算法是为了解决公共网络上的数据安全问题。
传统的数据中心只有一个节点,想提高数据处理能力很简单,增加磁盘阵列就可以了。区块链是“发动群众来记账”的,有了众多矿工的参与,整个系统就有了很多节点,例如,比特币社区就有几十万个节点。如果采用传统的数据模式,用不了多久,矿工们的硬盘就会被撑爆,这个游戏就没法继续了。
2014年4月,比特币网络中的一个节点要想存储所有区块数据,大概需要15GB的空间;2018年,超过了200GB。未来,随着比特币交易量的增加,该空间还将扩大,越来越难以接受。为了解决这个问题,中本聪提出了一个解决方案——简化支付验证(SPV)。
从理论上来说,数字钱包需要遍历所有区块并找到与该交易相关的所有交易,然后逐个验证谁才是可靠的,但有了SPV就不用这么麻烦了,用户只需要保存所有的区块头,区块头仅占用80B,而块身一般要占用400B。
SPV强调的是验证支付,而不是验证交易,因此只需要判断用于支付的那笔交易是否被验证过,以及得到多少次确认。为了实现SPV,需要用一种方法来检查一个区块是否包含了某笔交易,而不用下载整个区块,这就需要用到Merkle树技术。
Merkle树是一种Hash二叉树,是数据结构的一种,主要用于快速归纳和校验大规模数据的完整性。在比特币网络中,Merkle树被用来归纳一个区块中的所有交易,其树根(根节点)是整个交易集合的哈希值,最底层的叶节点是数据块的哈希值,非叶节点是其对应子节点串联字符串的哈希值。
有了Merkle树后,不需要对整个树进行验证,只需要记住根节点哈希值,因为只要树中的任意节点被篡改,根节点哈希值就会不匹配。从而实现了快速校验。
Merkle树是自下而上构建的。例如,同一时间发生A、B、C、D共4笔交易,刚开始所有交易都存储于基础节点,分别进行哈希计算,对于交易A,用Hash函数处理后,得到H A =SHA256(SHA256(交易A)),采用同样的方法可以得到交易B、交易C、交易D的哈希值,分别是H B 、H C 、H D 。
第一层完成后,可以创建第二层节点,得到H AB =SHA256(SHA256(H A +H B )),用同样的方法可以得到H CD 。然后创建第三层节点,也就是顶层的唯一节点H ABCD ,这样就完成了整个Merkle树的构建,包含4笔交易的Merkle树如图1-13所示。
图1-13 包含4笔交易的Merkle树
上面的例子是只有4笔交易的3层Merkle树。包含多笔交易的Merkle树如图1-14所示,共有16笔交易,是5层Merkle树。从4笔交易增加到16笔交易,交易数量增加了3倍,但Merkle树的层数只从3层增加到5层,数据存储效率得到极大提高。
图1-14 包含多笔交易的Merkle树
在比特币系统中,单个区块中有成百上千个交易是非常普遍的,无论有多少个节点,都可以通过Merkle树归纳为32B的Merkle根。在数据量小的时候,这种方式还看不出价值,随着交易数量的增加,计算量的变化就异常重要了。
Merkle树的效率如表1-1所示。当交易数从16笔增加到65535笔时,增加了400多倍,但是路径字节数只增加了3倍。可以看出,Merkle树在支持大规模交易方面,具有明显优势。有了Merkle树,比特币节点仅保存区块头就可以了,大大减少了对存储空间的需求。
表1-1 Merkle树的效率
去中心化的区块链不需要第三方参与,那么日常转账交易、系统维护由谁来完成呢?这是很多刚接触区块链技术的人最疑惑不解的地方。这么多人维护比特币这么大的系统,不可能总是义务劳动吧?中本聪是不出钱的,也没有机构出钱,那么怎么让矿工们自带机器来干活呢?这就需要共识机制了,通俗地讲,共识机制就是一种利益分配机制。
我们用地球生态环境来类比区块链,动物排放的二氧化碳会被植物吸收并产生氧气,太阳帮助植物进行光合作用,微生物净化废物,构成循环的生态系统,整个过程不需要任何中心化干预。区块链就像大自然,具有能实现自治的生态系统,之所以能运转良好,靠的就是共识机制。
从技术上来看,区块链共识机制要解决的第一个问题,也是最重要的问题,就是“谁有权写入数据”。无论是新数据写入,还是老数据升级,都是最核心的“数据权”。在区块链上,怎么解决“数据权”问题呢?目前主要有3个机制:PoW、PoS和DPoS,主要共识机制的比较如表1-2所示。
表1-2 主要共识机制的比较
这里的工作量指计算机计算随机数的工作量,在比特币系统中,矿工们想获得比特币就得去争抢“记账权”,这是通过寻找随机数来获得的。在一定时间内找到随机数具有难度,需要投入算力。
最先得到随机数的节点,将打包的交易区块添加到既有的区块链上,并向全网广播,由其他节点验证、同步,同时系统给该节点分配比特币。如果想获得更多比特币,唯一的方法就是多干活。通俗地讲,PoW机制就是“按劳分配”。
PoW机制最大的问题是浪费资源,很多人计算随机数只有一个节点可以成功,其他的算力都浪费了,白白消耗了很多资源,于是后来的开发者提出了PoS机制。
PoS机制类似现实中的股份制,如果共识机制主要是用来证明谁在挖矿这件事情上投入最多,那么为何不简单直接地把挖矿“算力”按比例分配给当前所有的持币者呢?在PoS机制中,持有更多比特币及相应时间(币天)的矿工将获得更多的投票权。通俗地讲,PoS机制就是“股权分配”。
PoS机制的问题是阻碍了新生力量的加入,因为后来的人持币时间肯定比先来的人短,这就会造成阶层固化,不利于整个区块链社区的发展,于是开发者提出了DPoS机制。在这种系统中,每个币都相当于一张选票,持有币的人可以根据自己的持币数量来选出自己信任的受托人,而受托人不一定需要拥有最多的系统资源。
DPoS机制的优势在于记账人数量大大减少,并且由授权的超级节点来轮流记账,从而大大提高了系统的整体效率,在理想环境中,DPoS机制每秒能够实现数十万笔交易。
共识机制的选择对区块链性能(如资源占用、处理速度等)有较大影响,也会决定区块链“去中心化”的程度。一般来讲,区块链的去中心化程度越高,效率越低,去中心化程度和效率在多数情况下难以兼顾。
PoW机制是由比特币提出的,比特币是去中心化程度最高的区块链,目前全世界有几十万个节点,但是速度非常慢,每秒只能处理7笔交易。PoS机制是由被称为区块链2.0的以太坊提出的,与比特币相比,其效率提高了很多,每秒可处理70笔交易。DPoS机制是由被称为区块链3.0的EOS提出的,全世界只有21个超级节点,每秒可以处理上万笔交易。
本节探讨了区块链的三大关键机制,分别是加密算法、Merkle树和共识机制。加密算法可以防止黑客窃取数据,Merkle树可以降低区块链阶段对存储空间的需求,共识机制是维持区块链社区运转的经济学逻辑。与中心化的数据模式相比,区块链采用了更复杂的技术,降低了效率,其根本目的是提高安全性。因此,区块链具有传统的中心化机制不具备的两大特征和五大作用。