一本书读懂区块链
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

区块链技术:老技术成就新突破

在前面的章节中,我们用“乌特村”的例子形象地对比了传统货币和加密货币,并模拟了乌特币交易的过程。从本章开始,将介绍区块链核心技术的有关知识。由于比特币是区块链技术目前最有代表性的应用,在以下的介绍中,相关具体实例还将以比特币为主进行说明。

区块链并非一项创新技术,而是将许多跨领域技术集成在一起,从某种角度来看是一种架构的创新。其中涉及密码学、数学、经济模型、点对点网络等。为便于理解,我们不采取从底层到应用层的技术性的介绍方式,而是假设我们都是“中本聪”,以问题为导向,在寻找解决方案的过程中逐步深入地来理解。

在“乌特村”的例子中,我们看到,记账的形式代替了货币,村民每家每户都有账本来维持彼此之间的信任关系。区块链技术核心也是如此,通过让每个用户都掌握所有数据来创造信任。从信息技术的角度来看,这个“账本”本质上是一个数据库,而且是分散到每个用户的数据库,在计算机领域,通常称之为“分布式数据库”。

分布式数据库

我们使用的绝大部分程序都需要数据库来存储程序运行所需要的参数、用户所保存的各类数据。与分布式数据库相对应的是单机数据库,顾名思义,单机数据库一般是保存在一台主机上,分布式数据库则需要一个计算机网络系统来予以支持。

在分布式数据库的计算机网络系统中,每台计算机构成一个网络上的节点,且都有数据库的完整副本(有的情况下也可能是部分数据库的副本),这些位于不同地点的计算机通过网络相连,形成了在物理上分离、在逻辑上集中的完整的大型数据库。

分布式数据库当然不是因为区块链或比特币才出现的,它的出现是应对大数据时代海量数据处理的需求。能够满足人们需要的分布式数据库一般应具有以下特征:(1)较强的扩展性,能够动态地增加存储节点,这样才能适应数据容量海量增加的需要;(2)较高的并发性,也就是对于大规模用户的服务请求能够妥善安全地处理;(3)较好的容错性,分布式存储对数据保存的质量提出更高的要求,虽然当前的计算机通信速度已经很快,不同数据库节点的物理距离可以忽略不计,但是对于海量数据来说,其调度与处理必须有较好的容错性、备份和恢复机制来保障数据安全。

至此,作为“中本聪”的我们,想出了用分布式数据库作为“账本”的好主意。虽然通常意义上的“分布式数据库”在架构等方面和区块链意义上的“分布式数据库”特征不同,甚至有较大差异,但是在“分布”和“数据库”这两个基本方面是相似的。当然,这里“数据库”不是孤零零存在的静态数据文件,一般情况下也包括读取和写入等功能。

“账本”有了,我们可以自己“记账”(操作数据库)了,但是,目前只能操作自己的账本,要想影响到别人的账本,比如说告诉张三、李四有关交易信息,首要的前提是,张三和李四得有沟通的渠道。那么,从目前来看,解决问题的方案大致有两种:一种是以第三方的服务器作为中转,服务器作为中介负责把每个人的记账信息传给其他所有人,就类似在张三和李四之间设立一个邮局,在里面交换信息;另外一种是,节点之间直接通信,张三和李四之间通过信鸽直接沟通交流。

第一种方案显然又回到了传统“中心化”的路上,同时,第三方服务器还需要付出很多额外成本。因此,第二种显然会成为我们这些“中本聪”们的选择。实现这种节点之间的直接通信,在计算机领域叫作点对点(Peer to Peer)技术,也有人称之为对等计算。

点对点技术

点对点技术一般被简称为“P2P”,看起来或听起来是不是有点熟悉?的确,不少人可能会想起互联网金融:不同客户通过专业网络平台实现借贷双方确立借贷关系并完成相关交易。“P2P”金融借用了点对点技术概念的一些内容,但更多的是指“客户到客户”,虽然没有专业的金融机构,还是存在某种程度中心化作用的第三方的撮合平台。我们下面要谈到的是真正的点对点技术,没有任何第三方存在,是完全意义上的一个节点对另外一个节点的信息传递。

传统的网络应用通常分为服务器端和客户端,在程序运行时,大部分数据保存在服务器上,根据用户的不同需要,客户端负责与服务器进行各类交互,按照一定的方式将数据或处理过的数据呈现给用户。

点对点技术形成的架构则不同,其不同节点之间是直接通信的,不存在一个中心化的服务器,每个参与的节点既是服务器也是客户端,都共享出其自身一部分计算资源,通过这些共享资源,对等的每个节点(Peer)彼此间能够直接访问,而不要另外中心化的服务器。

与分布式数据库一样,点对点技术同样不是新技术。自从网络产生以来就一直存在,由于网络带宽等客观条件,这种计算模式并没有被广泛应用。随着互联网传输速度的加快及个人计算机计算能力的增强,点对点技术开始发挥越来越重要的作用,许多基于P2P技术的知名应用应运而生,很多大家熟悉的软件,比如eMule、BT、QQ、Skype、PPLive等,都用到了点对点技术。

点对点技术的特点也是很明显的:首先就是去中心化,网络资源分散在不同的结点上,信息的传输直接在结点之间进行,可以无须中间环节和服务器的介入,避免了可能的瓶颈。去中心化的特点进而带来极强的扩展性、健壮性,从扩展性这方面来看,新加入的节点带来了需求,也带来了新的资源和服务能力。比如,就文件下载来说,如果用传统的下载方式,节点增加会使得下载速度变慢,但是,在点对点技术支持下的网络却不同,节点增多,反而提升了服务能力,下载速度反而会加快;在健壮性方面,由于资源和服务能力是分散在各个节点上的,因而各类风险也就自然分散,这使其具有更强的耐攻击性和高容错性,部分节点遭到破坏对其他部分的影响很小,一般情况下,在部分结点失效时能够自动调整。

除此之外,点对点技术实现的网络的性价比也比较高,它可以有效地将计算任务或存储资料分布到所有节点上,利用闲置的计算能力达到高性能计算和海量存储的目的。同时,由于信息传输分散在各节点之间,因而用户隐私信息被窃听和泄漏的可能性大大缩小。

通过点对点技术,我们解决了无中心服务器条件下信息传递的“桥梁”问题。搭建好了“桥梁”, “中本聪”们必须考虑所传递信息应该如何构成,这就得谈谈区块和链的问题。

区块和链

在人们的日常生活中,任何数据或信息的集合都需要一定的构成和排列方式,比如书信有书信的形式,不同的公文也有各自的内容和格式要求,程序代码更是如此。

在计算机的世界,同样如此。信息如何组合,数据库怎么构成,对于程序来说是很重要的问题。因此,大部分数据库都有一定的结构,只有这样才能更好地对数据进行管理。就区块链说,“结构”的设计不仅是要有利于数据存取,更要能实现区块链无法篡改、不可逆等需求。

对于区块链来说,每个节点拥有的分布式数据库的基本单位可以看作是“区块”,区块之间根据一定的规则,以一定的方式链接起来形成了链状结构。每个区块主要包括:区块大小、区块头、交易数量、交易构成。区块头又包括:区块版本号、前一个区块的哈希值、当前区块中所有交易的哈希值、时间戳、目标值、随机数等。这些概念看不懂也没关系,先明白每个区块大致构成即可。

我们先从整体上看看区块链交易的过程,为了理解方便,我们还是借用一下“乌特币”作为计量单位来举例说明。假设乌特村兴旺发达,人口总数增加到了1万人,使用乌特币作为数字货币,区块链上已经包含了100万条交易信息,占用了5000个区块,大家可以理解为:有一个账本,已经用了5000页,记载了100万个交易记录。

有一天,甲发起了某项交易,要向乙支付100乌特币,区块链的广播机制将这个信息通知给了其他人,同样地,10分钟之内,其他人之间也有99项交易的广播信息,这些交易在没完成前姑且称之为“未验证的交易”,总数量是100笔。可能有人会问,这个例子中为什么非得等10分钟或是100笔?因为:一从效能来考虑,积攒一定数量的交易请求后再统一操作节省计算资源;二从本书的角度来看,取100这个整数便于叙述和理解。

每个节点在收到100条新增交易信息验证请求后开始一系列处理:取得第5000个区块的哈希值(暂时不用理解其意思,只需要明白它是一种加密后的结果即可);取得操作时的具体日期和时间;取得包括最新100条交易信息在内的所有交易记录的哈希值;开始计算目标值和随机数构成的一道数学题。

最终,在1万个节点中,丙的节点最先计算出了数学难题,取得了所有节点的共识后,丙胜出了,获得了“记账权”,也就是说:由丙节点构造第5001个区块,其他9999个节点复制丙的。为了鼓励这种记账“劳动”,丙获得了若干乌特币。

到此为止,甲和乙的交易完成,1万个节点中的相关数据都进行了更新。从上面的过程可以看出“中本聪”或区块链的逻辑:通过哈希值对信息进行加密,通过记录时间戳为数据操作保留时间标记,再通过“后区块”记录“前区块”的哈希值确保块块相连的链状结构。这种结构与由时间戳构成的线性时序链,再辅之以分布存储等其他技术共同形成了区块链不可更改、不可逆的特征。当然,区块本身所涉及的哈希值、时间戳等,我们将在下面一一介绍。

哈希运算

不同的任务决定了不同的数据结构,对于区块链来说,在没有中心服务器的前提下,如何确保数据的准确、安全是很重要的。因此,“中本聪”想到了在区块结构中引入哈希运算和时间戳等内容。

这里所说的哈希运算可以简单地理解为一种加密手段,哈希值表示用来这种加密手段得到的结果;时间戳是一种时间表示方法,确保了交易先后顺序。进一步来说,哈希值是哈希函数运算的结果,它通过压缩数据的方式来提取摘要信息,进而将数据打乱混合后,通常用一个短的随机字母和数字组成的字符串来代表。举个简单的例子,任意大小的数据都可以被计算出一段哈希值,只要原数据有任何更改,哈希值也会变化。我们看看具体例子(以下哈希值用编程语言Python生成):

“bcstime.com”(不含引号)的哈希值是“8de72518d3a5b189cd 5d1cc3ed49ffd3dd717c14b36160f92634314af1c9de88”。

“ bcstime.com”(不含引号,注意b前面多了个空格)的哈希值是“8c4fb2d9d661a6fa073975c093bb1b3bf0b50bb25398dac9dc7046e9a7920433”。

经常下载软件的朋友,应该记得在很多软件网站的下载页面都能看到类似的一组数字,有的称之为校检码,就是为了确保软件没有被人动过手脚。事实上,即使是几十万字的文章,有一处变化,哈希值也会发生改变。

哈希值同样不是什么新技术,很多编程语言能够很方便地计算哈希值。对于区块链来说,哈希值的几个特点很重要:一是不可能从哈希值推出原来的数据;二是不管原始数据多么复杂,计算哈希值的时间是一样的;三是任何更改都会导致哈希值变化。

灵活地运用哈希值的这些特点,能够保障数据不被篡改,确保区块链数据的安全和正确。如前所述,区块链中不仅保存了原始数据、交易记录,还保存了与之相关的哈希值。

时间戳

在任何交易中,时间都是最重要的元素,比如合同什么时候生效,什么时候付款,什么时候交货等。对于区块链这样的分布式系统来说,时间因素更为重要,它表明了交易的前后顺序,对于维护区块链正常运行具有关键作用。

在这方面,“中本聪”想到了时间戳。所谓时间戳,指的是,一个能表示一份数据在某个特定时间之前已经存在的、完整的、可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。在当前绝大部分计算机系统中,时间戳具体是指从格林尼治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的秒数。比如“2018-04-05 00:00:00”转换为时间戳就是“1522857601”。

时间戳能为用户提供一份电子证据,以证明用户的某些数据的产生时间,广泛地运用在知识产权保护、合同、金融、股票交易等领域。当然,时间戳同样不是新技术。据媒体报道,2008年11月25日,深圳市龙岗区法院公开宣判一系列知识产权纠纷案,其中“利龙湖”一案系国内首例时间戳技术司法应用案例。对于区块链而言,每个区块的时间戳形成了一个时间递增的链条,为数据的运用增加了时间的维度,能够证实特定数据必然在某特定时刻是的确存在的,这同样保证了数据库的不可篡改,同时实现了信息的可追溯。

挖矿与共识机制

哈希运算和时间戳有利于防止区块中的数据被篡改,但是如何正常地修改数据,特别是更新全部节点的数据,是个颇为复杂的事情。作为一个分布式的数据库,成功更新数据的一个重要标志是保证数据的一致性。

这方面的挑战是,不同的节点所处的物理环境和计算环境不同,如果由每个节点自行修改数据的话,那么在庞大的节点量且网络环境不佳的情况下,就难以保证数据的统一完整。想象一下,假如有1万个节点,接收一个需要更新的交易数据包,任何掉线、断线或网路阻塞,都可能造成不同节点的数据不完整或不一致。且自行修改数据还面临潜在的道德风险。

为了解决这个问题,“中本聪”想到了一个解决方案,它的基本逻辑是这样的:由一个节点负责根据交易信息构造区块数据,然后,其他节点“复制”其区块数据。能够修改区块数据的资格,人们称之为“记账权”。

实现这个方案首先要确定由哪个节点来构造新的区块数据,如果固定地由某个节点来进行,就破坏了区块链技术“去中心化”的特点,形成了新的中心化的服务器节点。但如果没有固定节点来修改,那么如何选择节点呢?“中本聪”的做法是让每个节点都有权修改,但前提是通过一定的竞争机制来获得记账权。那么,怎么保证节点有兴趣参与记账工作呢?答案就是,给予成功实现记账的节点一定的奖励,用比特币系统来举例子就是奖赏一定的比特币。“挖矿”的含义主要也来源于此,可以简单理解为,通过争夺记账权来获得相关区块链系统所发行的加密货币。

如上所述,如果有很多节点都想要参与记账,必须有一种竞争机制来选择出一个节点,这种机制至少要满足两个基本要求,一是筛选出有意挖矿的节点,二是在诸多挖矿的节点中最终确定一个节点获得记账权。在计算机的世界中,这种机制当然与“计算”有关。最初被区块链技术运用的机制为“工作量证明机制”(Pow),通俗点说,就是必须证明某个节点完成工作任务了,然后才能给予记账权。那么这个工作的要求是什么呢?就是解一道题,举个例子来说:

给定一个字符串,假设是“bcstime.com”。问:这个字符串加上什么数字后的哈希值,是以“0”开头的?

在前面我们已经谈过哈希值了,它的一个特点是不可逆的。也就是说,得到一个哈希值,是不可能反过来推出原始数据的。但是如果只是反求出某种特征的数字,范围就大大缩小,还是很可行的。比如,找前几位是“0”的哈希值(当然,位数越多难度越大)。那么,怎么找呢?只能一个个计算,也就是逐个“猜”,专业点的说法叫“哈希碰撞”。

从下图可以看出,假如是按照顺序测试的话,“bcstime.com12”是第一个符合条件的,节点测试出符合要求的结果,就表明它已经有了工作量,之后这个节点就要对其他节点进行广播,也就是告诉大家,“找到了答案,完成了计算结果,请大家见证一下”。

(字符串“bcstime.com”和不同数字组合生成的哈希值)

其他节点接收到信息后首先进行验证,然后根据时间戳等看看信息是否完整,如果没有问题,就把新的区块数据追加到已有的区块链上。

上述谈到的“工作量证明机制”是共识机制的一种。共识机制主要解决由谁来构造区块和如何维护区块链数据一致性的问题,也就是说某个节点完成了工作量后,必须告诉其他节点新的区块数据,在上述过程中,还存在一个问题:在一个分布式的网络节点环境中,信息在传递中会出现各种各样的情况,比如有的是网络堵塞,有的是节点硬件损坏,此外还存在各种人为的风险。

解决这个问题的理论基础就是拜占庭容错(Byzantine Fault-Tolerant, BFT),这是一个从20世纪80年代开始被研究,目前已经比较成熟的理论,而且有不少算法已经实现了这个理论。从区块链的角度来通俗地理解,就是在多节点的信息传递过程中,通过一定的算法来确保正确的信息被大部分节点所接受。除了工作量证明机制之外,还有权益证明机制、股份授权证明机制和Pool验证池。由于工作量证明机制是区块链技术第一个应用——比特币所使用的,因此,我们对此进行了简单介绍,因为本书不是技术书籍,其他机制就不再展开,有兴趣的读者可以参阅其他资料。

分叉

通过挖矿等运算,区块链增加了新的区块数据,区块链的链条变“长”了。但是,也会出现一种特殊的情况,就是“分叉”。这个很好理解,“区块链”是一个链条,前后区块紧密相连,那么如果有不同的节点同步挖矿,又同时完成了工作量,他们各自生成了新的区块,比如新区块a、新区块b……这样就形成了分叉,一个区块链分成了两个区块链,甚至更多。

在一般情况下,区块链应该是包含最多区块的那个链,但是在分叉的情况下怎么办呢?对于这种情况,区块链系统并不会马上确认,哪个节点合理、哪个节点不合理,而是保留这些分支,然后在后续挖矿的活动中,通过计算得出分叉的区块链哪个工作量最大,就选择哪个,从而保持区块链最长链的唯一性,进而成功地解决分叉问题。

分叉问题还涉及区块链的区块间隔时间,比特币的区块间隔时间是10分钟,大致上可以简单地理解为:每10分钟做一次记账操作,这一操作中形成的区块数据中包括了区块链系统中这10分钟所有的交易。之所以如此设定,是因为要平衡记账确认的速度和低分叉概率,也就是说,时间越短,就有可能产生更多的分叉,这对于区块链来说并不是好消息,相应地,更长的间隔虽然会减少分叉数量,却会导致更长的清算时间。

加密货币

可以把加密货币理解为区块链的一种应用,但区块链不等于加密货币或比特币。截至目前,区块链最大的应用是在加密货币领域,区块链的特点、优势及风险等很多都体现在加密货币上。因此,在本书的相关章节中,特别是第一部分有关区块链基础知识的介绍中,很多例子都与比特币或加密货币有关。需要说明的是,本书统一用“加密货币”来指称以区块链技术为基础的非法定的数字货币。至于加密货币及相关具体概念,会在“区块链与货币”这一章详细介绍。

钱包

前面提到了挖矿,那么挖矿的“成果”放在哪里?获得的收益又在哪里保存呢?回答这个问题就不得不引出在区块链中的一个重要角色:“钱包”。这个概念虽然很符合人们日常生活中的经验,也就是存放“钱”的地方。但是,就区块链而言,“钱包”的概念不是那么简单。

钱包本质上就是计算机程序,主要负责维护管理区块链系统的每个节点,虽然不少人也称之为区块链的“客户端”,但严格地说,这样理解并不准确,因为“服务器—客户端”通常是指传统的中心化的架构,在区块链系统中,每个节点既担负着服务器的功能,也实现着客户端的作用。这样看来,用非技术性的概念——“钱包”称之还算合适。当然,作为一个比喻性的概念,“钱包”即使在区块链技术出现之前也被使用,在传统的互联网支付领域,也不排除借用这一概念。但在本书中,除非特殊说明,“钱包”指的是区块链节点的密钥和地址等管理工具。

理解钱包还必须弄清与之有关的概念。“钱包地址”,可以理解为银行卡号,在计算机的世界中,信息的传输在底层技术层面都是以“地址”来标识接收和发送方的,一个人可以拥有多个钱包地址,每个钱包地址只能对应一个私钥。在一个钱包中,可以拥有多个钱包地址。“密钥”是密码学上的概念,公开密钥的算法属于不对称加密算法,该算法拥有两个密钥:公钥和私钥,通过公钥可以算出钱包地址,使用私钥加密的数据可以用公钥解密,反之亦可。在区块链系统中,私钥的持有者就是加密货币的所有者。

钱包有不同的分类。冷钱包是离线状态下的钱包,即私钥存储的位置不能被网络所访问,如硬件钱包等;热钱包则是把私钥存储在能被网络访问的位置,例如,交易所的账户、在线钱包网站、手机App钱包等,这些都可以看作是热钱包。通常而言,冷钱包更加安全,热钱包使用更加方便。还有“全节点钱包”和“轻钱包”的分类,前者除了保存私钥外还保存了区块链上所有的数据,后者则没有保存所有区块数据,只保存跟自己相关的数据。此外,还存在一种“中心化的钱包”,也就是把相关数据保存在加密货币交易所或线上区块链保险柜(一种在线的网络服务)的钱包。此外,根据钱包运行的终端环境不同,可以分为电脑端钱包、手机钱包及在线钱包。

上述介绍的具体技术或概念看起来有些散,但却是对于理解区块链特点最为关键的。通过以上内容,我们可以大概总结出区块链的主要特征:一是具有分布式特点的数据库;二是通过加密算法、时间戳实现防篡改、可追溯;三是通过共识机制确保新增数据的正确和一致性。用工信部区块链白皮书的解释就是,区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术在互联网时代的创新应用模式。《中国区块链技术和应用发展白皮书(2016)》第1页。

需要说明的是,在不同的上下文环境中,“区块链”的内涵及其外延可能稍有不同,有时指的是区块链这种包含其他具体技术的底层技术集成或模式,有时指的是具体的区块链应用所形成的网络系统,有的人还把区块链等同于比特币或加密货币……为了统一表述,方便读者理解,有必要在这里约定一下有关概念的内涵:在本书中,“区块链”“区块链技术”指的就是区块链这种集成技术,前者侧重总称,后者更强调技术;“区块链网络”指的是基于区块链技术构建的分布式数据库系统。相应地,“比特币”指的是总称,“比特币网络”指的是由分布在全世界比特币节点构成的网络系统。

此外,需要特别说明的是,区块链的确可以实现去中心化的架构,但区块链并非完全排斥中心,“去中心化”不等于完全的无中心化,还有“多中心”等可以选择。采用何种具体架构完全依赖于不同的应用场景;同时,从严格意义上来说,区块链生态本身也存在不少另类“中心化”的可能,比如算力越来越集中等问题。为了表达统一,本书总体上,在笼统的概念层次,认同“去中心化”是区块链的一个相对明显的特点和优势。此方面的内容,在后续相关章节中也会有具体说明。