基础课程第十二课 区块和区块链

第十二课 区块和区块链

前面几节课,我们讲了钱包和交易所这两个数字货币的私钥保存和交易工具,并介绍了目前常用的钱包和交易所。这节课我们继续回归技术,介绍一下区块和区块链。大家听到这个概念会觉得很奇怪,我们这个基础教程所讲的不都是区块链知识吗?像我们之前介绍的,我们常说的区块链是一系列技术的组合,不仅仅是一项单一的技术。不过这里我们就要具体介绍一下区块和区块链。

区块链(blockchain)是由一个个包含交易信息的区块(block)从后向前有序链接起来的数据结构。它可以被存储在文件中,或者存储在一个简单数据库中。区块链可以理解成一个分布式存储数据库,区块是存储数据的单元。每个区块都指向前一个区块。

1、 区块结构

区块包括两部分,区块头和区块主体,区块头一般是固定长度,包含元元素;区块主体一般是变长,包括一大串交易信息。以比特币为例,区块头是固定长度的80字节,而区块体则包含了多个交易。从所占存储空间大小来看,区块主体是区块头的N多倍,N一般是1000以上的数字。

区块结构:

2、 区块头

区块头由三部分区块元数据组成,首先是父区块哈希值,用来将该区块与前一区块链接;其次是,默克尔树(Merkle Tree)的树根,这是可以有效地验证区块中所有交易的数据结构;最后是与挖矿有关的元数据,包括难度、时间戳和nonce。(这个我们将在后面给大家仔细分析)

3、 区块标识

识别一个区块主要有两种办法:

第一种是通过区块哈希值,通过SHA256算法对区块头进行二次哈希计算,所产生的32字节哈希值被称为区块哈希值,当然更准确的名称应该是:区块头哈希值,因为只有区块头被用于计算,而非区块整体。需要注意的是,区块哈希值实际上并不包含在区块的数据结构中,无论该区块是在网络中传输,还是作为区块链的一部分被存储在某个节点上。区块的哈希值是当该区块从网络被接收时由每个节点自行计算出来的。区块的哈希值会作为区块元数据的一部分被存储在一个独立的数据库表中,以便于索引和快速检索。

另一种则是通过该区块在区块链中的位置,由于经常有人把区块链看成为一个堆栈,所以把这个叫做“区块高度(block height)”。第一个区块,其区块高度为0。区块高度和区块哈希值一样,也不是区块数据结构的一部分,并不被存储在区块里。当节点接收来自比特网络的区块时,会动态地识别该区块在区块链里的位置(区块高度)。区块高度也可作为元数据存储在一个索引数据库表中,以便于索引和快速检索。

区块可以通过两种方式被识别:区块哈希值和区块高度。区块哈希值是唯一确定的标识符,而区块高度并不是唯一的标识符。虽然每个区块都会有一个明确和固定的区块高度,但反之未必,一个区块高度并不总是识别一个单一的区块。两个或两个以上的区块可能有相同的区块高度,在区块链中争夺同一位置。(这就是区块链的分叉,将在后面给大家详细介绍。)

4、创世区块

比特币的第一个区块创建于2009年,被称为创世区块,它是比特币区块链里面所有区块的共同祖先,这意味着你从任一区块,循链向后回溯,最终都将回溯到创世区块。每个节点都“知道”创世区块的哈希值、结构、被创建的时间和里面的一个交易。因此,每个节点都把该区块作为区块链的首区块,从而创建了一个安全的、可信的区块链的根。

“比特币之父”中本聪在创世区块包含了一个隐藏的信息。在创世区块Coinbase交易的输入中,包含了这样一句话“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks.”(2009年1月3号,财政大臣站在对银行第二次救助的边缘),这句话是泰晤士报当天的头版文章标题。中本聪在这里用了这句话,既是对该区块产生日期时间的说明,也是对于政府的一种嘲讽。程序猿用自己的力量,尝试着改变原有的货币格局,一场前所未有的全球性货币革命由此产生。

5、 区块间连接

比特币的完整节点保存了区块链从创世区块起的一个本地账本,随着新的区块的产生,该节点的本地账本会不断地更新。当一个节点接送从网络传入的区块时,它会验证这些区块,然后链接到现有的区块链上。这里建立连接,所需要的查找该区块的“父区块哈希值”。

区块通过引用父区块的区块头哈希值的方式,以链条的形式进行相连。

6、 Merkle树(默克尔树)

区块链中的每个区块都包含了产生于该区块的所有交易,并且在区块头中,它是以Merkle树表示的。Merkle树是一种哈希二叉树,它用快速归纳和校验大规模数据完整性的数据结构。

生成一棵完整的Merkle树需要递归地对哈希节点进行哈希,并将新生成的哈希节点插入到Merkle树中,直到只剩下一个哈希节点,这个节点就是Merkle树的根。

当N个数据元素经过加密后插入Merkle树时,你至多计算2*log2(N)次就能检查出任意某数据元素是否在该树中,这使得该数据结构非常高效。

一个节点能够通过生成一条仅有4个32字节哈希值长度(总128字节)的Merkle路径,来证明区块中存在一笔交易K。该路径有4个哈希值(下图中由蓝色标注)HL、HIJ、HMNOP和HABCDEFGH。由这4个哈希值产生的认证路径,再通过计算另外四对哈希值HKL、HIJKL、HIJKLMNOP和Merkle树根(在图中虚线标注),任何节点都能证明HK(在图中由绿色标注)包含在Merkle根中。

7、 SPV(简单支付验证)

Merkle树被SPV节点广泛使用,SPV不保存所有交易,也不会下载整个区块,仅仅保存区块头。(这样轻量节点的数据量存储大概是全量节点的千分之一。)所以,SPV节点需要验证某笔交易的真实性,它将在节点间的通信链接上建立过滤取,获取一条连接目标交易与Merkle根的Merkle路径。SPV节点能够使用该路径找到与该交易相关的区块,进而验证交易的有无。

区块链基础教程讲了12节课,终于算是讲到区块链这个核心概念啦,这节课主要介绍了什么是区块,什么是区块链,区块内部的数据结构。在区块头中,有一个元数据集合(难度、时间戳和nonc)专门是为挖矿服务的,这说明对于区块链而言,挖矿是非常重要的一件事情。下一节课,我将给大家介绍,区块链挖矿。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180621G1B7Y800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券