自学区块链:原理、技术及应用
上QQ阅读APP看书,第一时间看更新

1.1 什么是区块链

区块链是近年来社会上的一个热门词汇,经常在各种新闻媒体上可以看到区块链的相关报道。但在区块链被广泛谈论的过程中,人们对区块链这个新鲜事物在认知上还存在不少的误区的。这里将常见的认知误区整理如下。

●区块链是比特币,比特币也就是区块链。

●区块链很值钱。

●区块链可以运用在任何领域。

●区块链是免费的。

●区块链是非常安全的。

下面,分别对以上的误区进行分析和澄清。

比特币和区块链是有很深的渊源(在区块链发展历程中会有详细介绍),但比特币和区块链两者不能等同。实际上,区块链是比特币的底层技术,好比用面粉可以做包子,但不能说面粉等于包子,包子等于面粉。这里的区块链相当于面粉,而比特币相当于包子。除了比特币外,还有很多其他的基于区块链技术的应用。

区块链的确是一种很神奇的技术,很有可能就像当初互联网技术改变世界一样再次重构整个世界,但区块链本身只是一种技术,真正产生价值的是应用区块链技术产生的落地服务。

区块链不是万能的,当前区块链只会对某些领域,如金融、供应链等区块链适用的行业产生重大影响,区块链在其他行业的使用场景还有待研究。

区块链是有成本的,区块链中的每一个“区块”通常都需要用大量的运算来解决,为支持区块链服务的所有设备的耗电量成本相当不菲。

和传统的互联网相比,区块链在安全性方面有着天然的优势。非对称加密保证了交易数据的安全性;分布式存储和记账显著降低了数据被篡改、网络受攻击以及网络瘫痪的可能性。但区块链现在还处在初步发展阶段,其技术本身可能还存在一些漏洞,这些漏洞会被那些恶意的黑客利用去实施一些破坏行为,所以说区块链的安全是相对的,并不是绝对安全。

实际上应该还会有一些其他的思维误区,这里就不再一一讨论了。澄清了这么多误区,那么,回过头来看,究竟什么是区块链呢?

1.1.1 区块链的概念

“区块链”这个概念是一个网名为中本聪的人在2008年发表的《比特币:一种点对点的电子现金系统》中提出的。其描述如下。

时间戳服务器对以区块(Block)形式存在的一组数据实施随机散列并加上时间戳,然后将该随机散列进行广播,就像在新闻或世界性新闻组网络(Usenet)的发帖一样。显然,该时间戳能够证实特定数据于某特定时间是的确存在的,因为只有在该时刻存在了才能获取相应的随机散列值。每个时间戳应当将前一个时间戳纳入其随机散列值中,每一个随后的时间戳都对之前的一个时间戳进行增强(Reinforcing),这样就形成了一个链条(Chain),即区块链,如图1-1所示。

图1-1 区块链的链条结构

构成区块链的区块是基于密码学生成的,每一个区块包含了前一个区块的哈希值(由加密算法生成的)、对应的时间戳记录以及交易数据等信息(对区块结构的详细介绍参见下一节相应内容)。本质上,区块链是包含这些交易记录的分布式系统,类似于一个账本。所以,区块链也被称为分布式账本系统。

这个分布式账本系统是由分布式系统中的诸多结点共同创建和维护的一个链表。链表由基于密码学原理生成的一个个区块组成。其中每个区块包含了交易者的公钥、金额、时间等交易信息,区块链的链表结构如图1-2所示。

图1-2 区块链的链表结构

不过,分布式账本系统是区块链狭义上的含义。广义上来说,区块链是一个统称,除了基于区块链结构的分布式账本系统,它还包括共识机制、智能合约、点对点网络、自治社区等一系列和分布式账本相关的功能。可以将区块链看作是很多个技术的组合。

了解了区块链的概念后,接下来认识一下构成区块链的区块到底是什么。

1.1.2 区块的概念

区块是区块链的组成单元,就像金字塔是由一块块石头组成的一样,区块链就是由一个个区块组成的。

1.区块

从本质上说,区块链中的区块是由一系列特征值和一段时间内的交易记录组成的一个数据结构。这里以比特币区块为例进行说明。

登录比特币区块查询网站:https://webbtc.com/可以看到最新生成的比特币区块信息。本节截取了2016年12月17日生成的十几个区块的列表信息,如图1-3所示。

图中的3列信息依次为区块的高度(Height)、区块的哈希值(Hash)和区块的生成时间(Time)。单击第一个区块可以查看这个区块的详情,如图1-4所示。详情信息包括区块的哈希值(Block)、高度(Height)、父区块哈希值(Prev Block)和一系列交易信息(Transactions)。详情信息中,前一个Transactions后面跟的数字是这个区块包含的交易总量,下面的Transactions则显示了一个个具体的交易数据)。

图1-3 比特币区块信息

图1-4 比特币区块详情

单击Formats中的“json”项可以以Json格式显示这个区块的信息,如图1-5所示。

图1-5 比特币区块的详情以Json格式显示

这个区块的数据结构看上去有点复杂,但没关系,通过接下来的详细解释后就很容易理解了。

2.区块的结构

区块的数据结构由区块头和区块体组成。区块头包含了当前区块的特征值,区块体中包含的是实际的交易记录数据。

(1)区块头

区块头由80个字节组成,主要由版本号、前一个区块的哈希值、Merkle根、时间戳、bits、Nonce这几项区块的特征值组成,如图1-6所示。

图1-6 区块头

其中ver(版本号)表示本区块遵守的验证规则;prev_block(父区块哈希值)就是这个区块连接的上一个区块的哈希值,mrkl_root根是该区块链交易的Merkle树根的哈希值(Merkle是一种哈希树的数据结构,在第2章中会详细讲解),时间戳是区块生成的时间,bits是区块的难度值Nonce是一个随机数,其中各个字段的长度和详细说明如图1-7所示。

图1-7 区块头组成

(2)区块体

区块头下面的部分是区块体,如图1-8所示。

图1-8 区块体

区块体主要包括交易数量(n_tx)、区块大小(size)和长度不定的交易记录(tx字段包含的交易列表)等信息。但这只是比特币中的区块体结构,实际上区块体中可以包括任何内容,比如以太坊中的区块体中除了交易数据还包含智能合约。

了解了区块结构,再来看看区块的特点。

3.区块的特点

区块的一个特点是,它是由计算机通过加密算法生成的。如果成功地生成一个有效的区块,该计算机(或者说结点)就能获得一定的奖励,这个奖励就是加密数字货币。这一过程就像是在开采有价值的矿产,故而被形象地称为“挖矿”,执行操作的计算机被称为“矿机”,用矿机挖矿的人也就被称之为“矿工”了。

除此之外,区块还有一个特点,若区块是有效的,则该区块的哈希值必须满足一定的条件。这个条件就是能够使得区块头中特征值相加生成的哈希值符合一定格式,比如以000开始。由于哈希值随着输入的不同而不同,故计算机要不断尝试改变区块头的Nonce值直至最终生成的哈希值满足条件才算生成了一个有效的区块,如图1-9所示。

图1-9 生成有效区块

寻找特定Nonce值生成有效区块的机制叫作工作量证明。工作量证明是常见的共识机制之一,关于共识机制的内容将在第3章中详细讲解。

在区块结构中各个字段也有其各自的特点和作用,如图1-10所示。

图1-10 区块中的字段

区块结构中字段的说明如下。

●索引标示了区块在区块链中的位置,其中第1个区块——创世区块的索引为0,第2个区块的索引为1,第3个区块的索引为2,依次累加。

●时间戳表示的是该区块生成的时间,根据时间戳可以判断区块链中各个区块生成的先后顺序。

●哈希值是每个区块的唯一标示,也可称为区块的“数字指纹”。哈希值的长度是固定的,而且和区块内容紧密关联,一旦区块内容发生改变,该区块的哈希值也会发生改变。而且,区块中的哈希值还有有效和无效之分,满足特定条件的哈希值是有效的,否则就是无效,这个特定条件一般称之为困难度(Difficulty)。父区块哈希值就是区块链中特定区块前一个区块的哈希值。

●区块中的数据可以是任何内容,比特币区块链的区块中的数据为一串串交易记录。

●Nonce是一个随机数,用来生成一个有效的哈希值。Nonce会根据区块数据的不同而不同,每个区块都需要经过大量计算才能找到对应的Nonce值。关于Nonce值的概念会在下一节详细介绍。

●创世区块。区块链中的第1个区块叫作创世区块,它没有父区块,故创世区块的父区块哈希值为空或者为0。

以上就是区块的特点,区块链的很多特性都是基于区块的这些特点。接下来介绍区块链的运行原理。

1.1.3 区块链的运行原理

如1.1.1节所述,区块链是一个链表,这个链表由一个个区块组成,这些区块依次连接,形成一个不可篡改的链条。每个区块包含了索引、时间戳、父区块哈希值、交易数据、Nonce值、本区块的哈希值等信息。那么这个链表具体是怎么生成和维护的?

首先是构成区块链的去中心化网络中的第1个结点初始化,并生成区块链中的创世区块;然后通过“挖矿”生成的新区块被添加到区块链中;新的结点加入到去中心化网络后会先同步一份最新的区块链数据;随后每个结点生成的区块都会向网络中的其他结点进行广播;其他结点接收到这个结点的广播后会判断自己是否已经收到过这个区块,若已收到就忽略,若未收到过则先验证这个区块的有效性,有效的区块会被收到广播的结点添加到自身结点的区块链中。

对于区块链的运行原理通过文字的描述有点过于抽象,下面读者结合一个区块链的演示网站自己动手模拟生成一个区块链,这样可以对区块链有一个更加直观的认识。

1.1.4 模拟生成一个区块链

这个区块链演示网站的网址是https://blockchaindemo.io/,下面介绍生成一个模拟区块链的具体操作。

1)在浏览器中输入网址https://blockchaindemo.io/,打开该网站,可以看到其页面包括4个区域,左上角是区块链中的所有结点信息,右上角有一个“Add Peer”按钮可以往区块链中添加结点,中间部分是区块链中的区块信息,最下面的“ADD NEW BLOCK”按钮可以添加一个新区块。默认区块链中有一个结点“Satoshi”(中本聪的英文名)和一个创世结点,如图1-11所示。

图1-11 区块链演示网站的操作界面

这个模拟区块链的区块中,包括数据、父区块哈希值、当前区块哈希值、索引、时间戳、Nonce这6个字段,如图1-12所示。

图1-12 模拟区块的结构

其中创世区块的索引是0,这里没有显示索引值而是显示了“GENESIS BLOCK”;判定哈希值有效的标志是以000开头。下面再添加几个区块。

2)创建两个新的区块。两个区块中填写的数据分别是“The Second Block”和“The Third Block”,输入数据后单击数据下面的“ADD NEW BLOCK”按钮,该网站会为这两个新区块自动生成有效的哈希值并与之前的区块连接起来,如图1-13所示。

图1-13 新增两个区块

图中可以看到本区块的父区块哈希值(PREVIOUS HASH)即为上一个区块的哈希值,索引值依次增加。

3)修改区块信息使其无效。由于区块的哈希值由区块的数据、父区块哈希值、区块索引、时间戳、Nonce一起生成的,其中任何一个数据的改变都会导致哈希值改变,而哈希值改变会导致区块的无效,即哈希值不以000开头。比如将创世区块的内容后面加上“It changed.”,那么哈希值会变成无效的,区块的颜色也由绿色变成红色(绿色代表有效,红色代表无效),如图1-14所示。

因为后面的区块用到了前面区块的哈希值,故一个无效区块也会导致连接在该区块后面的区块无效。若要修复这些区块,则需要单击每个区块右下角的修复按钮对每个区块再重新进行一遍计算,或者说“挖矿”,如图1-15所示。

图1-14 修改区块值导致区块无效

图1-15 修复区块链

修复后的区块又会变成绿色,恢复有效状态。这是添加和修复区块的方法。但当前区块链中只有一个结点,下面演示多个结点的情况。

4)增加新结点。单击右上角的“Add Peer”按钮生成一个新的结点,这样区块链中就有了两个结点,如图1-16所示。

图1-16 创建新结点

想要切换结点只要单击相应的结点就可以了。结点有3种颜色显示,蓝色表示当前结点,绿色表示和当前结点相连,红色表示未和当前结点相连。红色的结点下面有一个按钮,用来进行连接,鼠标悬浮到这个按钮上显示绿色,单击此按钮进行连接。

5)连接结点。单击结点“Rita”下的连接按钮进行连接后,可以看到“Rita”结点颜色变成了绿色,表示已连接,并且结点下面多了一个按钮,即消息列表按钮,结点右上角的数字表示消息的个数,如图1-17所示。

图1-17 连接结点

单击消息列表按钮可以显示消息记录,如图1-18所示。消息列表中会显示每个连接、区块请求、区块发送等信息。

图1-18 消息列表

6)同步区块信息。结点之间会互相同步区块信息。单击“Rita”结点,可以看到“Rita”结点下也包含了“Satoshi”结点中的3个区块,如图1-19所示。

通过上述模拟生成区块链的过程,可以让读者对区块链的运行原理和区块同步过程有很直观的认识。区块链中的结点始终都将最长的链条作为正确的链,并持续延长和维护这条链。当结点发现有更长的链条并且本身的链条不是最新时,就会使用最长的链条替换当前结点的链条。若一个结点判断出本身的区块链是最新的,再收到新的区块信息时,结点就会把新的区块添加到自身链条的最后。

值得注意的是,当一个区块链的结点掌握了整个区块链中51%以上的计算能力时,它就可以重写整个区块链。基于这个原因,区块链中的计算能力过度集中会很危险。只有一个庞大且均匀分布的区块链才比较安全。

图1-19 同步区块信息

通过模拟生成一个区块链真实感受了区块链的特性之后,接下来介绍区块链的技术构成和逻辑架构。