区块链块 什么是区块链:块的结构

在本文中,我尝试描述一个块的结构。我将使用比特币区块链来解释区块。这些概念将有一些共同点。

块的结构

块(Block)是一个容器数据结构。在比特币世界中,一个区块平均包含500多个交易。平均块大小约为1MB(源)。在比特币现金(比特币区块链的一个分支)中,区块大小可以高达8M,每秒可以处理更多交易。

无论如何,一个块由一长串的标题和事务组成。让我们从标题开始。

块标题

标头包含有关块的元数据。有3种不同的元数据集:

上一个块哈希。请记住,在区块链中,每个块都继承自前一个块,因为我们使用前一个块的哈希来创建新块的哈希。对于每个N块,我们为其提供N-1个块哈希。

采矿比赛。为了使区块成为区块链的一部分,需要给它一个有效的哈希。这包括时间戳,随机数和难度。采矿是区块链技术的另一个重要组成部分,但它不在本文讨论范围之内。

第三部分是Merkle根树。它是用于汇总块中事务的数据结构。我们将在后面详细讨论。

块标识符

要识别一个块,您将获得一个加密的哈希值和一个数字签名。这是通过SHA256算法对块头进行两次哈希处理后创建的。

例如,这是一个块:

在本文中,我将以该块为例。

此块的标题哈希为(右列):

0000000301fcfeb141088a93b77dc0d52571a1185b425256ae2fb

我们还可以转到上一个块的哈希(右列):

请记住,我们使用第二个哈希来创建第一个。每个块都使用前一个块的哈希来构造自己的哈希。块哈希是唯一的标识符,您将找不到具有相同标识符的哈希块。

识别特定块的另一种方法是块高度。这是为了指示区块在区块链中的位置。我们的示例块位于500312。这意味着在此之前有500,311个块。换句话说,自2009年创建比特币区块链以来,已经创建了500,312个区块。(截至撰写本文时)。

块的高度不是唯一的。使用分叉时,某些区块的位置可能相似,例如Bitcoin Cash。

默克尔树

该块中的事务包含在称为Merkle树或二进制哈希树的结构中。我认为通过这种方式(即对描述进行编码)会更容易理解。通过对节点对进行递归散列直到只有一个散列(称为根或merkle根)来构造Merkle树。如果我们停留在比特币世界中,则使用的密码哈希算法为SHA256。每次申请两次。

例如:我们有4个交易区块。为了简单说明,每个事务都是一个字符串:

const tA =’你好’

const tB =’你好吗?’

const tC =’今天是星期四’

const tD =“新年快乐”

为了构建我们的Merkle树,我们获取每个交易并进行两次哈希处理。我们在这里使用js-sha256包。如下:

const sha256 = require(’js-sha256’)。sha256

//双重哈希

const hA = sha256(sha256(tA))

const hB = sha256(sha256(tB))

区块链块_数字金 区块链_ipv9 区块链

const hC = sha256(sha256(tC))

const hD = sha256(sha256(tD))

//结果

52c87cd40ccfbd7873af4180fced6d38803d4c3684ed60f6513e8d16077e5b8e // hA

426436adcaca92d2f41d221e0dd48d1518b524c56e4e93fd324d10cb4ff8bfb9 // hB

太好了。现在请记住,我写了一个merkle树来构造哈希对节点。因此,我们将交易与其哈希值(双哈希)进行匹配。我们将使用哈希值hA和hB创建一个哈希值,以及其他哈希值hC和hD。然后,我们重复此过程,直到只剩下一个散列并且不再有要处理的对。最后的哈希值是我们的Merkle根。

由于我们只有4笔交易,因此将很快处理它们。

//配对hA和hB

consthAB = sha256(sha256(hA + hB))

//配对hC和hD

consthCD = sha256(sha256(hC + hD))

//我们再做一次。我们将hAB和hCD配对

//这是我们的根!

consthABCD = sha256(sha256(hAB + hCD))

根节点是merkle树的顶部节点。它用于在区块链中存储每个区块的标题信息。这也是一种汇总每个区块交易的方法。在前面给出的示例块中,merkle根可以在右列中找到。

a89769d0487a29c73057e14d89afafa0c01e02782cba6c89b7018e5129d475cc

一个块中包含多少交易无关紧要,它们始终是32字节的聚合哈希。

注意:merkle树是二叉树。如果事务数量奇数,将复制最后一个,因此我们可以构建自己的树。

由于树上的所有叶子都依赖于其他叶子,因此如果不更改其他叶子就无法更改叶子。如果仅更改一个叶子(一个事务),则哈希值将发生变化,因此与另一片叶子配对构成的哈希值将发生变化,因此merkle根也将发生变化。

您可以通过创建身份验证路径或Merkle路径来证明该区块中包含任何交易。您只需要知道日志2(N)个32字节哈希。

例如:

-对于我的4笔交易的merkle树:

log base 2(4)= 2 =>如果我有4个交易树的2个哈希路径,则可以尝试证明交易是否属于此merkle树。

对于16笔交易的merkle树:

log base 2(16)= 4 =>如果我有4个哈希路径和16个事务树,则可以尝试证明一个事务是否属于此merkle树。

对数基数2(1500)= 10.55 =>如果我有1500个事务树的11个哈希的路径,则可以尝试证明事务是否属于merkle树。

也许下面的图片对您有帮助。

这棵树有16片叶子。我们通过配对每片叶子从下到上构建树。

现在,任何人都可以使用绿色路径来证明叶子(橙色)是此块的一部分。我们只有4个散列,但是这些足以知道我是否属于这里的叶子。这是因为有了这些信息,我们可以构建所需的每片叶子(黄色)。我们可以创建IJ,IJKL,IJKLMNOP和根,并检查这些哈希是否对应。这就是为什么在区块链上作弊非常复杂的原因。改变一件事意味着您必须改变一切。

以上是比特币区块链中区块的定义。

标签:, ,