首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

精通区块链,区块的数据结构

编辑:练泳庆 火箭资本公众号主理人

区块链的数据结构是由包含交易信息的区块有序链接起来的。区块是由一个包含元数据的区块头和紧跟其后的构成区块主体的一长串交易列表组成。

区块的数据结构被定义成下面这个样子。

这次我们重点讲解父区块哈希值和merkle树根。Nonce、难度目标和时间戳会用于挖矿过程,更多细节将在下篇文章中的工作量证明算法中讨论。

父区块哈希值

区块中的父区块哈希值是区块链中此区块的上一个区块的哈希值。

让我们假设,例如,一个节点在区块链的本地副本中有277,314个区块。该节点知道最后一个区块为第277,314个区 块,这个区块的哈希值为:00000000000000027e7ba6fe7bad39faf3b5a83daed765f05f7d1b71a1632249。

然后该比特币节点从网络上接收到一个新的区块,该区块的区块头中父区块哈希值为

节点会把这一新区块的父区块哈希值与第277314个区块的区块哈希值对比。如果相同,这个新区块是这个链条里的第277314个区块的子区块。节点将新的区块添加至链条的尾端,使区块链变长到一个新的高度277,315。

每一区块只有 一个父区块,这是因为一个区块只有一个“父区块哈希值”字段可以指向它的唯一父区块。

一个区块出现多个子区块的情况被称为“区块链分叉”。区块链分叉只是暂时状态,只有当多个不同区块几乎同时被不同的矿工发现时才会发生。最终,只有一个子区块会成为区块链的一部分,同时解决了“区块链分叉”的问题。

当父区块有任何改动时,父区块的哈希值也发生变化。这将迫使子区块的“父区块哈希值”字段发生改变,从而又将导致子区块的哈希值发生改变。而子区块的哈希值发生改变又将迫使孙区块的“父区块哈希值”字段发生改变,又因此改变了孙区块哈希值,以此类推。一旦一个区块有很多代以后,这种瀑布效应将保证该区块不会被改变,除非强制重新计算该区块所有后续的区块。正是这样的重新计算需要耗费巨大的计算量,所以一个长区块链的存在可以让区块链的历史不可改变,这也是比特币安全性的一个关键特征。

Merkle 树

在比特币网络中,Merkle树被用来归纳一个区块中的所有交易,提供了一种校验区块是否存在某交易的高效途径。

当N个数据元素经过加密后插入Merkle树时,你至多计算log~2~(N) 次就能检查出任意某数据元素是否在该树中,这使得该数据结构非常高效。

所有的交易都并不存储在Merkle树中,而是将数据哈希化,然后将哈希值存储至相应的叶子节点。这些叶子节点分别是H~A~、H~B~、H~C~、H~D~、H~E~、H~F~、H~G~、H~H~、H~I~、H~J~、H~K~、H~L~、H~M~、H~N~、H~O~、H~P~

比如交易A,把它进行两次哈希得到HA,HA = SHA256(SHA256(Transaction A))

将相邻两个叶子节点的哈希值串联在一起进行哈希,这对叶子节点随后被归纳为父节点。 例如,为了创建父节点H~AB~,子节点 A和子节点B的两个32字节的哈希值将被串联成64字节的字符串。随后将字符串进行两次哈希来产生父节点的哈希值:

HAB = SHA256(SHA256(H~A~ + H~B~))

继续类似的操作直到只剩下顶部的一个节点,即Merkle根。产生的32字节哈希值存储在区块头,同时归纳了16个交易的所有数据。

一个节点能够通过生成一条仅有4个32字节哈希值长度(总128字节)的Merkle路径,来证明区块中存在一 笔交易K。该路径有4个哈希值(在图9-5中由蓝色标注)H~L~、H~IJ~、H~MNOP~和H~ABCDEFGH~。由这4个哈希值产生的认证路径,再通过计算另外四对哈希值H~KL~、H~IJKL~、H~IJKLMNOP~和Merkle树根(在图中由虚线标注),任何节点都能证明H~K~(在图中由绿色标注)包含在Merkle根中。

有了Merkle树,一个节点能够仅下载区块头(80字节/区块),然后通过从一个满节点回溯一条小的Merkle路径就能认证一笔交易的存在,而不需要存储或者传输大量区块链中大多数内容。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181020B0CMOO00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券