区块是区块链的基本结构单元,甚至“区块链”的名称也由此而来,可见其重要性。本次我们就对区块进行分析解剖,看看里面到底都有哪些东西?
文 | 王映
图 | 闫燕
在区块链网络中,数据会以文件的形式被永久记录, 这些文件称为区块。区块是区块链的基本结构单元,由包含元数据的区块头和包含交易数据的区块主体构成。目前比特币区块链系统大约每10分钟会创建一个区块。
一个区块是一些或所有最新比特币交易的记录集, 且未被其他先前的区块记录。新区块会被加入到记录的最后, 一旦写上, 就再也不能改变或删除。
区块的主要参数如下表所示:
其中“魔法数”是比特币客户端解析Block数据时的识别码,比特币正式网络的魔法数是0xD9B4BEF9。不同币种的魔法数一般不同,比如莱特币的魔法数是0xDCB7C1FC。(注:前缀0x表示16进制)
区块头的大小为80字节,包括4字节的版本号、32字节(256位)的上一区块哈希值、32字节的Merkle根节点、4字节的时间戳、4字节的难度值和4字节的随机数。区块头包含三组元数据:
连接前一区块的哈希值数据
挖矿难度、工作量证明、时间戳
校验交易数据的Merkel树根数据
每个区块通过连接上一区块形成一个链式结构,如下图所示:
上图中的“区块1001”就指区块高度。区块高度相当于区块的编号,但由于分叉的可能,区块高度不能确定唯一的区块,即如果存在一个孤块,则这个孤块的区块高度,和主链上的另一个区块高度是相同的,所以不能仅仅用区块高度来识别一个区块。
头哈希值和区块高度都不保存在区块的数据结构中,但可以作为元数据存储在索引库中以便于快速检索。
头哈希值是对区块头经过两次SHA256计算得到的数字指纹,长度32字节。可以唯一地、明确地标识一个区块。一个区块的头哈希不包含在本区块中,但包括在下一个区块中。用这种方式就可以形成一个链状结构。
区块头的主要参数如下表所示:
其中bits是用指数形式表示的256位难度目标值,矿工计算的区块Hash值必须比bits值小。每个块存储一个十六制的目标Hash值的压缩表达式(称之为Bits)。例如Bits值:0x1b0404cb,对应的十六进制的目标Hash值就为如下形式:
时间戳从区块生成的一刻就存在于区块之中。对应每次交易记录的认证。时间戳直接写在区块链中,不可篡改。每个时间戳会将前一个时间戳纳入哈希值中,依次相连,形成完整链条。
区块体包含10分钟内选定的交易记录,第一笔交易(coinbase交易)是用于奖励矿工比特币的特殊交易,由矿工自己添加进区块。
目前区块的大小是1M,即1048576个字节。每个交易信息所占的空间大约是250字节。那么一个区块可以包含的交易总数约为41.94笔。比特币网络中每10分钟即600秒左右出一个块,那么一个区块每秒能处理的交易数量为4193/600,约为7个。由此可见,比特币网络处理交易的效率并不高,有时一笔交易需要等待很久才能被确认。2018年双11的峰值交易量是49.1万笔/秒,是比特币交易效率的7万倍。
既然相差如此悬殊,我们为什么还要使用区块链技术呢?从前面我们对区块链运行原理的分析可知,区块链的目标就是打造一个去中心化的自运转体系,用以解决中心化机构存在的信任问题。在区块链中,要想改动一个区块数据,必须同时改动该区块后面的所有区块,而将一个区块放入主链中需要消耗非常多的资源,成本非常巨大,随着后面添加的区块越来越多,要想改动某个区块几乎是不可能的。从这个角度来看,区块链是在用效率换信任。在效率和信任不能两全的时候,信任所占的权重更大一些。
本次我们学习了区块的结构,下一次我就将对区块内部的重要概念Merkle树进行分析,它是区块链的交易指纹,对于简化区块数据结构有着十分重要的意义,欢迎持续关注,谢谢!
(to be continued...)
作者:币布斯
链接:https://www.jianshu.com/p/a2f003d5fc6f
共同学习,写下你的评论
评论加载中...
作者其他优质文章