主页 > imtoken怎么登录 > 什么是区块链:区块结构

什么是区块链:区块结构

imtoken怎么登录 2023-03-13 07:45:45

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

块状结构

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

无论哪种方式,一个块都由一个头部和一长串交易组成。 让我们从标题开始。

区块标题

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

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

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

第三部分是 Merkle 根树。 它是一种数据结构,用于汇总区块中的交易。 我们稍后会详细讨论。

块标识符

比特币区块链每个区块的组成_比特币交易链区块拥堵_哈比特币区块链

要识别一个块,你会得到一个加密散列,一个数字签名。 这是通过 SHA256 算法对块头进行两次散列来创建的。

例如这是一个块:

我将参考此块作为本文的示例。

这个区块的区块头哈希是(右栏):

000000000000000000301fcfeb141088a93b77dc0d52571a1185b425256ae2fb

我们还可以获取前一个块的哈希值(右列):

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

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

块高度不是唯一的。 有些区块在可以分叉时可以具有相似的位置,例如比特币现金。

Merkle 树 Merkle 树

比特币区块链每个区块的组成_比特币交易链区块拥堵_哈比特币区块链

区块中的交易包含在称为 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))

const hC = sha256(sha256(tC))

const hD = sha256(sha256(tD))

//结果

52c87cd40ccfbd7873af4180fced6d38803d4c3684ed60f6513e8d16077e5b8e//hA

426436adcaca92d2f41d221e0dd48d1518b524c56e4e93fd324d10cb4ff8bfb9//hB

伟大的。 现在请记住,我写了一个 merkle 树来构造哈希对节点。 因此,我们会将交易与连接它们的散列(双重散列)相匹配。 我们将使用散列 hA 和 hB 创建一个散列,并使用 hC 和 hD 创建另一个散列。 然后我们重复这个过程,直到我们只剩下一个散列并且没有更多的对要处理。 这个最终的哈希是我们的 merkle 根。

由于我们只有 4 笔交易,因此处理起来会非常快。

//配对hA和hB

constAB=sha256(sha256(hA+hB))

比特币交易链区块拥堵_比特币区块链每个区块的组成_哈比特币区块链

//配对hC和hD

constCD=sha256(sha256(hC+hD))

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

// 这是我们的根!

constABCD=sha256(sha256(hAB+hCD))

根节点是 merkle 树的顶部节点。 用于存储区块链中每个区块的头部信息。 还有每个块如何聚合交易,在前面给出的示例块中,默克尔根可以在右列中找到。

a89769d0487a29c73057e14d89afafa0c01e02782cba6c89b7018e5129d475cc

无论一个块中包含多少交易,它们总是通过 32 字节的摘要进行哈希处理。

注:默克尔树是二叉树。 如果有奇数个交易,最后一个将被复制,所以我们可以建立自己的树。

因为一棵树上的所有叶子都依赖于其他叶子,所以在不改变其他叶子的情况下改变叶子是不可能的。 如果只有一片叶子(一笔交易)发生变化,哈希值会发生变化,那么与另一片叶子配对构建的哈希值也会发生变化,因此默克尔根也会发生变化。

哈比特币区块链_比特币交易链区块拥堵_比特币区块链每个区块的组成

您可以通过创建证明路径或 Merkle 路径来证明块中包含任何交易。 您只需要知道 log 2(N) 32 字节的哈希值。

例如:

- 对于我的 4 笔交易的默克尔树:

log base 2(4) = 2 => 如果我有 4 个事务的树的 2 个哈希路径,我可以设法证明一个事务是否属于这个 merkle 树。

对于 16 个交易的 merkle 树:

log base 2(16) = 4 => 如果我有 4 个散列路径和 16 个交易的树,我可以设法证明交易是否属于这个 merkle 树。

Log base 2(1500) = 10.55 => 如果我有一个包含 1500 个交易的树的 11 个哈希的路径,我可以设法证明一个交易是否属于这个 merkle 树。

或许下图会对你有所帮助。

这棵树有 16 片叶子。 我们通过对每片叶子进行配对来自下而上地构建树。

现在,任何人都可以通过沿着绿色路径证明叶子(橙色)是块的一部分。 我们只有 4 个哈希,但这些足以知道我是否属于这里的叶子。 那是因为有了这些信息,我们能够构建我们需要的每一片叶子(黄色)。 我们可以创建 IJ、IJKL、IJKLMNOP 和 root 并检查这些哈希值是否对应。 这就是欺骗区块链非常复杂的原因。 改变一件事意味着你必须改变一切。

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