主页 > imtoken安卓版钱包 > 区块链中的区块数据结构

区块链中的区块数据结构

imtoken安卓版钱包 2023-02-11 05:36:57

前言:

比特币系统底层采用的是区块链技术,学习区块链技术的第一个问题就是搞清楚区块的数据结构。 后续的工作量证明(挖矿算法)、智能合约等都与此密切相关。 关系。

在比特币系统中,交易数据以区块的形式存储,新产生的区块会被添加到之前的区块中,从表面上形成一条长长的链条,这条链条称为区块链。

每个区块分为区块头和区块体两部分。 区块体负责记录从前一个区块产生到新区块产生的所有交易或部分交易信息,但区块链的大部分功能都是由区块头实现的。

区块头主要包含六个部分:版本、前一个区块头的哈希值、Merkle根哈希值、时间戳、难度、随机数Nonce,以及经过数字签名的交易信息记录在区块体中。

在区块链中,第一个区块比较特殊。 这个块被称为“创世块”。 这个区块的重要性,光看名字就可以看出。 作为区块链A区块的第一个区块,比特币的发明者中本聪在里面留言:“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks”,这句话是前面的标题当时时代周刊的版面文章。 这句话的作用不仅是为了证明在这个日期之前没有比特币被创造出来比特币的区块头中包含的重要参数,还可能隐喻中本聪对当时银行系统部分准备金制度造成的不稳定性的讽刺评论。

上图是从btc.com网站上查询到的创世块信息。 从总结中我们可以看出,在创世块中,没有前一个块的信息比特币的区块头中包含的重要参数,因为它本身就是第一个块。 在创世块的交易信息中,只有一笔交易,这笔交易就是Coinbase交易,即铸币交易。 因为是第一笔交易,所以也可以称为创世交易,交易金额为50个比特币。 但是这笔交易比较特殊,里面的比特币是不能花的。 这种情况可能是中本聪为了纪念这次创世交易而故意做的。

上图显示截取的是普通块。

前半部分是区块的摘要信息,后半部分是比特币的交易记录信息。

每个区块分为区块头和区块体两部分。 后面会详细介绍区块头和区块体的内容。

块头

区块的识别:区块高度和区块哈希

有两种方法可以有效地唯一标识一个区块,一种是通过区块高度,另一种是通过区块的哈希值。

每个区块都有一个唯一的数字ID,称为区块高度(height)。 每产生一个区块,区块高度就会增加1。上图中的区块高度为531111。在旧版本中,创世块的区块高度为1,但在新版本中,创世块将被更改。

之所以用数字表示区块高度,是为了标识区块在区块链中的位置。 虽然一个区块的区块高度是唯一的,但也可能存在两个区块高度相同的情况。 是一样的,但是需要在区块链中争夺同一个位置,最后在区块链的主链上只会有一个。

区块哈希,简称区块哈希,是由当前区块的区块头通过两次SHA256哈希运算生成的。 区块哈希除了用来标识当前区块外,主要作用是将一个区块指向当前区块,从而形成区块链,这也是区块链的一个重要特征。

版本(块版本号)

区块中的版本号用于标识当前区块是在哪个版本的比特币客户端比特币核心系统软件版本下生成的。

目前区块链主链上有两个版本的区块:v1版本和v2版本。 在 v2 版本中,区块高度参数是在 coinbase 升级后添加的。

版本参数在块的数据结构中占用 4 个字节。

hashPrevBlock(前一个块的哈希值)

当一个新的区块产生时,前一个区块的区块头的哈希值将被存储在当前区块头中,从而添加到区块链的链中。 大小为 32 字节。

时间(时间戳)

块中的时间戳与计算机中的时间戳是同一个概念。 是一个整数值,记录从1970年1月1日0点到现在的秒数,用于记录当前区块数据。 写时间。 大小为 4 个字节。

时间戳技术本身并不复杂,主要是因为每个后续区块的时间戳和前一个区块中的时间戳形成一条时间递增链,相当于给区块数据增加了一个时间维度,更方便数据的溯源和交易信息。 这对某些时间敏感的领域(例如专利注册)具有特殊的影响。

Merkle Root(Merkle根节点的Hash值)

在区块的区块体中,存储了大量的实际交易信息,而在区块头中,则将当前区块的所有交易以默克尔树的形式打包记录。 Merkle Root是Merkletree根经过SHA256运算后的哈希值,大小为32字节。

Bits(当前目标的Hash值Target_bits)

bits是当前挖矿难度系数的Hash值,标记当前区块被“挖出”的难度,或者说哈希碰撞的难度,大小为4个字节。

在比特币系统中,挖矿难度由全网算力决定。 每产生2016个区块后,数据区块的计算难度会调整一次,调整难度的算法是固定的。 随着大量矿工的加入,比特币挖矿提供的算力越来越强,但比特币系统通过自动调整挖矿难度,每10分钟只能出一个区块。

Nonce(随机数)

比特币的挖矿过程,其实就是通过不断的哈希计算,进行哈希碰撞的结果。 通过不断调整哈希运算的输入值,可以产生新的哈希值,而区块头中的随机数Nonce是调整输入值最重要的因素。

在比特币系统中,采用的共识算法基于工作量证明机制,随机数是当前区块工作量证明的重要输入参数。

结合上文所说,关于Merkle Root\Bits\Nonce在比特币挖矿过程中的作用,这些参数将在后续章节《工作量证明机制与挖矿算法》中详细介绍。

块体数据结构

幻数(幻数)

幻数是一个不变的常数值,始终为0xD9B4BEF9,是比特币客户端在解析区块数据时使用的识别码。 大小为4字节,不同币种的幻数一般不同(莱特币主网幻数为0xDCB7C1FC)

Blocksize(块大小)

BlockSize用于记录当前大小,大小为4字节。

交易柜台(交易笔数)

TransactionCounter用于记录当前区块中打包的交易数量,大小为1~9字节。 原则上,当前区块包含的交易应该是从上一个区块创建到当前区块产生的所有交易,但也允许矿工只包含部分交易或生成空块。

交易

区块体的最后一部分,也可以说是区块的最后一部分,存放的是当前区块中的所有交易信息,即交易列表。

交易信息中记录了每一笔交易的详细信息,这些交易数据所使用的数据存储结构是Merkle树。

在交易明细中,记录了比特币转账的输入输出地址、转账的比特币数量、本次交易的Merkle节点值、转账人的数字签名等信息。

----------------------

结束!