2走进区块链-区块链内部结构

羊角牛 2019-05-29

算法 函数 数据安全 HASH 数据结构 数据存储

区块链根据不同的应用场景分为应用于公众的公有链,需要授权使用的私有链和联盟链,还有在原有区块链基础上进行扩展的侧链、跨链等,随着区块链的发展,相信还会有其他形式的应用出现。在开始之前我们需要先了解什么是哈希(Hash),哈希又称哈希函数或散列算法,简单的说,哈希函数是用于将任意大小(输入)的数据映射到固定大小输出的任何函数。散列算法应用于数据输入,并且得到的固定长度输出称为散列。
区块 —— 区块链中最基本的数据单元,可以理解为容器数据结构,多个区块连接在一起组成了区块链。
下面以比特币为例,一个区块一般包括魔法数(Magic no)、区块大小(Blocksize)、区块头(Blockheader)、交易数量(Transaction counter)、交易(Transactions)五部分。
魔法数:固定4字节常量,作为识别码使用。
区块大小:到区块结束的字节长度。
区块头:包含区块链处理的重要信息。
交易数量:当前区块所包含的交易笔数。
交易:交易列表,记录了当前区块保存的所有交易信息(交易列表也被叫做区块体)。
一个区块的基本结构如图1-1所示,图中区块标识区域是计算出来的,实际的数据存储时并不包含这些内容。

_2_1


图1-1 区块基本结构
区块标识起到区分不同区块的作用,可以通过区块哈希或区块高度来识别区块。区块高度是从0开始的整数,每产生一个区块,区块高度就会加1。区块哈希使用SHA256算法对区块头进行二次哈希计算而得到的结果(SHA256(SHA256(区块头))),在区块链中每个区块头都不相同,经过哈希后的值也一定不同。由于存在分叉的问题,区块高度可能会重复,所以通常采用区块哈希来标识一个区块。
每个区块前80个字节是区块头,区块头中记录了父区块哈希、版本、时间戳、难度、随机数、Merkle根。需要注意的是,在区块链中会存在一个创世区块,创世区块是第一个产生的区块,对于创世区块来说,父区块哈希是同等位数的0。区块头在整个区块结构中起到非常重要的作用。区块头内容如表1-1所示。
表1-1 区块头内容

_1


交易(也被叫做区块体)是一段时间内经过验证的所有交易记录,每一笔交易都经过签名->验签并且在之前没有存在过才会被纳入区块中。维护这些交易采用了Merkle(默克尔) 树的树形数据结构。Merkle树也被称为二元哈希树,Merkle 树是包含密码哈希的二叉树,能够高效、安全地验证大型数据结构的内容。
Merkle 树通过散列机制来验证任意大的数据集的完整性。每个叶节点用数据块的哈希作为标签,每个非叶节点用其子节点标签的加密哈希作为标签。按图1-1交易区域所示,把所有交易各自Hash值作为叶子节点,两个叶子节点Hash值合起来又进行一次哈希计算,生成父节点。例如Hash1和Hash2分别是数据块交易1和交易2的散列值,Hash1&2是Hash1和Hash2串行的散列,直到最终的树根。树根Hash值就是Merkle根。当交易记录发生篡改,这个值就会不一致。
比特币的Merkle树的实现允许修剪区块以节省空间。 这是仅将根哈希存储在块头中的结果,因此,可以通过去除Merkle树的不必要分支来修剪旧块,同时仅保留Merkle证明所需的内容。所以比特币终端的SPV(简单支付验证)节点只需下载区块头而不用下载全部的区块数据来验证交易。
最终区块的数据示例如图1-2。

_2_2


图1-2 区块数据示例
区块链中第一个区块被称为创世区块,任何一个区块都可以逆向追溯到创世区块,创世区块采用静态编码,无法更改。
网络中的所有节点都在本地维护一个区块链的副本,当有新区块传入,会检查区块头中父区块哈希,如果父区块哈希和上一区块的区块头哈希值一致,则认为是合法扩展,就会把此区块添加到区块链的末尾。每增加一个区块便更新本地副本,通过父区块哈希指针向后延续,从而形成如图1-3所示的一个链表式数据结构。

_2_3


图1-3 链表式数据结构
这种链表式的数据结构可以保证数据安全和无法篡改,前面我们介绍过,区块哈希是对区块头的哈希计算的结果,如果区块数据被篡改,哈希结果也会不同,对应的哈希指针就会出错,因此一旦有恶意篡改就会被发现。
登录 后评论
下一篇
冒顿单于
5395人浏览
2019-08-28
相关推荐
1走进区块链-认识区块链
401人浏览
2019-05-28 20:58:33
区块链学习路线及资料索引
5996人浏览
2018-03-07 13:05:03
1.2 区块链基础知识
624人浏览
2018-06-03 21:49:00
0
0
0
365