通俗易懂,揭秘比特币区块的内部结构
0 引言
我们通过前面几期的学习基本对区块链网络中各节点的外部协作有了一个宏观认识,接下来将从更加微观的角度开始学习区块链。你有没有思考过区块链中每个区块内部是什么样的呢?全网如此复杂的数据它会怎么去存储的呢?本期就带你一探究竟!
1 区块链的总体结构
区块链之所以叫做区块链是因为它真的就是一堆由包含交易信息的区块通过前后首位相接起来的链式结构,每个区块都是链式结构中的一节。
为什么区块之间能够实现前后连接的呢?因为每个区块都通过一个数值(父哈希值,下节即将解释)指向前一个区块,以此类推,区块与区块连成一个链条,可以一直追溯到创始区块。这又是一个大规模协作的例子,每个区块只需执行自己的简单的规则,就能形成一个复杂的系统。
2 一个区块的整体结构
每个区块主要包含了两部分,区块头和区块体。区块头主要用来存储本区块的一些相关属性,区块体则用来存储真实的交易数据记录。一个区块前后分别连接了父区块和子区块,如下图。
3 区块体
我们先从区块体说起,看看它是如何将交易数据进行存储的。下面是一个区块体的结构图。
区块体包括当前区块经过验证的、 区块创建过程中生成的所有交易记录。这些记录通过默克尔( Merkle)树的哈希过程生成唯一的默克尔根并记入区块头.
什么是默克尔根呢?
首先了解一下默克尔(merkle)树,默克尔树是一种哈希二叉树,它是一种用作快速归纳和校验大规模数据完整性的数据结构。这种二叉树包含加密哈希值。术语“树”在计算机学科中常被用来描述一种具有分支的数据结构。
在比特币网络中,默克尔树被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹,且提供了一种校验区块是否存在某交易的高效途径。生成一棵完整的默克尔树需要递归地对哈希节点对进行哈希,并将新生成的哈希节点插入到默克尔树中,直到只剩一个哈希节点,该节点就是默克尔树的根。
说人话,默克尔树可以理解为一颗倒立的树,这棵树每个树杈只能分两个树枝出来,最终每个最小树枝上都会挂两片叶子。这里的每片叶子就是一笔交易记录,每个树杈的分叉点就是一个哈希值,每个哈希值都是根据树杈分出的两个树枝的分叉点或者叶子的哈希值计算出来的。这些这些分叉节点的哈希值向上一级分叉点汇聚再进行哈希计算生成一个哈希值,以此类推,最终汇聚到树根上,这个树根计算出来的哈希值就是根哈希值。通通过这种结构能够快速对其中的某笔交易进行定位。
默克尔树的特点是,底层数据的任何变动,都会传递到其父亲节点,一直到树根。
理解了默克尔树,相信你会对上图的区块体结构图有一个更加深刻的认识。
4 区块头
区块头主要由三组数据组成,第一组是父区块的哈希值,父哈希值用来将该区块与它的前一区块相连接。第二组数据和矿工竞争挖矿有关,即难度、时间戳和Nonce(随机数),第三组是由刚才我们讲到的区块体中计算出来的根哈希值,即默克尔树根。
字段 | 描述 |
---|---|
版本 | 区块版本号 |
父区块哈希值 | 区块链中上一个区块的哈希值 |
默克尔根 | 该区块中交易的merkle树根的哈希值 |
时间戳 | 该区块产生的时间 |
难度目标 | 该区块工作量证明算法的难度目标 |
Nonce | 用于工作量证明算法的计数器 |
这里要着重了解一个概念,什么是父哈希值?
对区块中的区块头的数据进行哈希运算会生成一个哈希值,区块头中的任何数据改变都会导致这个哈希值改变,所以这个哈希值可以作为这个区块独一无二的标志。
通过这个哈希值就能在区块链中找到对应的区块。而这个哈希值对于连在后面的一个新的区块来说就是父哈希值。
这里需要注意的一点是:本区块不会存储自身的哈希值,只存储它的父区块的哈希值,自身的哈希值将会存储在子区块中,作为子区块的父哈希值。
因为每个区块的区块头中都包含了它的父哈希值,并且只有一个父哈希值(因为区块链只有一条最长链)。所以每个区块通过它的父哈希值就能一直追溯到创世区块(第一个区块)。
引入了父哈希的概念不仅将区块与区块连接到一起,而且还能保证区块链的不可篡改性。
由于区块头里面包含父区块哈希值,所以当前区块的哈希值也受到该数值的影响。如果父区块中的数据发生改变,那它的哈希值必然也会改变,导致子区块就无法再通过原始父哈希值连接到上一个区块。
所以,如果想要改变一个区块的数据,那就要将它后面的所有区块再重新运算一遍。正是因为这样的重新计算需要耗费巨大的计算量几乎是无法实现的,进一步保证了区块链网络的安全性。
区块头中的第二组数据,难度、时间戳和Nonce我会在后面讲解挖矿的时候详细介绍,这里我们只需要知道区块头中包含这些东西就行,方便前期建立整体概念。
5 为什么区块要设计成这种结构
对于区块的内部结构基本剖析完了,但你有没有想过区块设计成这种结构有什么好处吗?
首先我们要知道区块头是80字节,而平均每个交易至少是250字节,而且平均每个区块至少包含超过500个交易。因此,一个包含所有交易的完整区块体比区块头的1000倍还要大。
区块链是一个分布式网络,所以数据需要存储在各个节点当中,但是比特币网络的完整数据加起来可能有几十上百个G,这不是一个普通的终端能够承受的起的,许多比特币客户端被设计成运行在空间和功率受限的设备上,如智能电话、平板电脑、嵌入式系统等,它们是没有办法存储比特币网络的所有数据的,该怎么办呢?
这个时候就能看到区块结构的高明之处了。比特币网络中的很多节点主要是用来验证交易的,它们只需要下载区块头,不需要下载包含在每个区块中的交易信息就能完成交易验证。这样的不含交易信息的区块链,大小只有完整区块链的几千分之1,大大节约了终端的使用空间。
正是因为区块的内部结构才可以实现一个终端只需要通过区块头的数据就能对某笔交易进行验证,这就是简单支付验证(SPV),这样的节点就叫做SPV节点,具体实现原理将会在下期讲解。
6 总结
区块体和区块头的紧密连接,区块头和父子区块的前后配合,各个节点环环相扣,实现了一个坚不可摧的链条,对比特币研究的越深,越能体会到它的强大之处,各种巧妙的思想让人叹为观止。
我们不研究代码,只是从整体设计思想来观察比特币区块的内部结构,希望这篇文章能让你看明白。
版权声明:
数字签名: Press.one
作者微信:w4533001
转载请联系作者
我是liheng,区块链探索者、互联网产品经理,超级个体修炼中,只创作对用户有价值的内容。要做100期《小白入门区块链系列》,希望我们能共同见证,这是第006期。原创不易,你的支持是我持续创作的动力。