这篇文章是关于区块链中Merkle树的深入介绍。文章详细阐述了Merkle树的结构、功能及其在区块链中的应用,并通过示例阐明了为何Block需要Merkle树来确保交易的完整性和安全性。作者还讨论了Merkle树的优势以及Merkle证明的概念,以便提高数据验证的效率。
欢迎来到区块链100部分系列的第五部分。
区块中的数据/交易并不是以明文存储的;相反,它们存储在一种称为Merkle树的数据结构中。换句话说,Merkle树作为区块中所有交易的摘要。区块中的每个交易通过像MD5、BLAKE2、SHA-1、SHA-256等哈希函数进行唯一哈希生成整个交易集的数字指纹。每对哈希过的交易被哈希函数一起哈希,直到整个区块有一个哈希为止。
从结构上看,Merkle树是一种二叉树,其中最底层的交易数据哈希被称为“叶节点”,中间的哈希称为“分支”,而顶部的哈希称为“根”。Merkle树也被称为哈希树。区块链中的每个区块都有一个Merkle根。
交易A、B、C和D的Merkle树;哈希ABCD是Merkle根/根哈希
为了更容易理解,我们通过一个例子来了解Merkle树。
假设区块中有四个交易,如上图所示。每个交易(A、B、C和D)都有一个唯一的哈希(哈希A、哈希B、哈希C和哈希D)。然后每对哈希过的交易结合在一起生成另一个哈希。在这个例子中,哈希过的交易A与哈希过的交易B配对生成新的哈希AB。另一方面,哈希过的交易C与哈希过的交易D配对创建新的哈希CD。哈希AB和哈希CD是Merkle树的分支。随后,哈希AB和哈希CD由哈希函数组合在一起,生成哈希ABCD,这是此Merkle树的Merkle根/根哈希。Merkle根随后存储在区块头中。
但现在问题来了,这个区块头是什么?
一个区块由一个头和一个体组成。区块头包含Merkle根、时间戳、区块版本号(指示遵循哪个区块验证规则)、难度目标、随机数(Nonce)和前一个哈希。另一方面,区块体包含区块内所有已确认的交易。
Merkle根存储在区块的区块头中
上述例子阐明了Merkle树的基本情况。在每个层次上恰好有正确数量的Merkle叶子来形成精确配对。如果你有奇数个交易,导致形成奇数个Merkle叶子,会发生什么情况?例如,假设区块中有五个交易。每个交易(A、B、C、D和E)都有一个唯一的哈希(哈希A、哈希B、哈希C、哈希D和哈希E)。哈希过的交易A和B配对哈希生成哈希AB。类似地,哈希过的交易C和D配对哈希生成哈希CD。但哈希过的交易E没有配对哈希到新的分支。由于Merkle树的二叉特性,要求叶节点数量为偶数才能工作。因此,如果出现未配对的哈希,则该哈希会被复制并与自身配对。 在这个例子中,哈希E被复制并配对自身以产生哈希EE。之后,哈希AB和哈希CD被组合并哈希生成新的哈希ABCD。另一方面,哈希EE被复制并配对自身以突出生成哈希EEEE。哈希ABCD和EEEE进一步组合并哈希生成一个哈希,即Merkle根。
交易A、B、C、D和E的Merkle树;哈希ABCDEEEE是Merkle根/根哈希
此区块的根哈希随后用于查找区块的唯一有效哈希(前导0)。例如,区块#72608的Merkle根/根哈希为a1c6d67c992a70fca66188e178d9ca7c20d5c775393948f19955be7f0952c0f。随后将根哈希与区块的其他信息(区块编号、前一个区块的哈希、时间戳、难度目标和随机数)结合,并通过哈希函数生成该区块的唯一有效哈希(前导0):00001a03b7328189f5f7154681c5827a1b2fce2fcb5301a8e412e22ea9a7859。一旦区块得到了有效哈希,它就成为区块链的一部分,而新的区块可以进一步添加到该区块中。
每个区块都有一个唯一的哈希值,该值由Merkle根计算而来。区块还包含前一个区块的哈希,从而将一个区块链接到区块链中的另一个区块。如果任何交易发生变化,则该交易的哈希也会发生变化。这一变化级联到Merkle根,更改Merkle根的值,从而使区块无效。然后这一变化在后续区块中反映出,导致其哈希发生变化,从而使余下的区块链无效。因此,Merkle树在区块中创建了不可变的交易记录。
区块链通常由成千上万的区块组成,每个区块可以包含多达数千个交易,因此在验证数据时,内存空间和计算能力是两个主要问题。如果区块链没有Merkle树的概念,那么网络上的每个节点就必须保持每个在区块链上发生的交易的完整副本。在确认交易时,一个节点必须逐行对比每个条目,以确保自己的记录与网络记录完全一致。如果记录之间存在任何差异,都会危及网络的安全性。因此,用于验证数据的计算机需要更高的处理能力来比较记录,以确保没有更改。另一方面,Merkle树通过大大减少必须维护的验证数据来解决此问题。它们将账本中的所有记录进行了哈希,这有效地将数据的证明与数据本身分离。用户可以验证单个区块,也可以通过使用哈希来检查交易。因此,减少了验证交易所需的计算能力。
Merkle树有助于消除区块链中修改交易记录和双重支付。例如,如果有人试图黑入区块链上的一条记录,使其看起来好像他有比现实中更多的加密货币,那么任何这样的虚假记录都不符合Merkle树中其他哈希,因此将被网络拒绝。这是因为,当在区块链上发生交易时,它并不是以那样的形式存储;而是被验证。该交易通过哈希函数进行哈希,然后其哈希与区块链上的每个其他哈希进行验证,以证明没有任何内容被更改或篡改。
由于哈希函数被认为是确定性的,每当相同的输入经过它时,它都会生成相同的哈希。因此,如果某个个人试图双重支付他的数字货币,将会为该交易生成一个哈希。如果该哈希与区块链上现有的记录匹配,该交易将被拒绝。因此,双重支付得以防止。
Merkle证明允许在大量数据中验证特定交易/内容。区块链系统中有两种类型的节点:
(i) 保存区块链完整历史的节点称为“完整节点”。
(ii) 另一种节点称为“轻量节点”。轻量节点仅包含区块链的部分列表,通常仅包括区块头(包含Merkle根),而不是其整个交易历史。轻量节点可以验证包含在区块中的交易,而无需下载整个区块链。
当轻量节点想要验证特定交易时,它使用哈希函数获取该交易的哈希值。完整节点根据Merkle树的结构向轻量节点发送所有所需的哈希值以进行验证。接下来,轻量节点重复哈希操作以计算根哈希值。然后,将通过该过程获得的根哈希值与完整节点发送的根哈希值进行比较。
假设轻量节点想要验证交易D是否已丢失或被篡改。为此,完整节点将哈希值哈希C、哈希AB、哈希EFGH和Merkle根发送给轻量节点。首先,轻量节点使用哈希函数找出交易D的哈希,即哈希D。然后哈希D与哈希C、哈希AB和哈希EFGH一起重新计算以生成Merkle根/根哈希。如果计算出的Merkle根和原始Merkle根匹配,则可以验证哈希D是Merkle树的一个有效叶子,因此交易D是Merkle树的一部分。相反,如果计算出的Merkle根和原始Merkle根不匹配,则可以确认交易D已被篡改。
交易D的Merkle证明
如果你喜欢这篇文章并想了解更多关于区块链、NFT、元宇宙及其应用的信息,请点击下面的链接。
区块链的50+个实际应用:初学者对区块链基础的完整指南... \ \ 区块链的50+个实际应用:初学者对区块链基础、共识的完整指南...\ \ www.amazon.com
学习愉快!
- 原文链接: medium.com/techskill-bre...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!