随聊区块链(三)

比特探微
• 阅读 1610

区块链中的默克尔树

上节我们提到区块的头信息中是包含了一个默克尔根的字段
区块链的头信息中为什么要存在这个字段呢?使用默克尔树这种数据结构是为什么呢?接下来我们就来解释一下。

默克尔树也常被称为二叉哈希树。是由默克尔在1979年时候提出来的,默克尔树常常作用于快速的比较数据及检验某个元素是否存在的业务场景中。之所以默克尔树擅长做这几个场景,和它自身的结构特性密不可分。我们来看下它的数据结构

这个就是存储在区块头信息中的默克尔根的数据结构
随聊区块链(三)

我们看到最下面的数据Tx0、Tx1、Tx2、Tx3的是区块链上的交易数据,首先他们会被哈希。在比特币中,哈希算法使用的是sha256,并且哈希是会做两次的,是双重哈希。
那为什么要用双重哈希?这个之后可以单独展开研究下,目前比较可靠的说法,比特币网络使用双重哈希的算法,其实并不是为了避免哈希的生日攻击,比较有说服力的分析是因为双重哈希是用来防御长度扩展攻击的,

通过对交易数据的哈希,我们得到了hash01和hash23,这个哈希值的产生是通过连接两个子节点的值哈希后得到的

比如 hash01 = sha256(sha256(hash0+hash1))

我们通过这种方式可以生成任何层级的默克尔树,最后的哈希值就是一个根节点,我们称为默克尔根
我们可以通过默克根很方便的对比两组数据是否相同,同时如果树中关联的数据有变更,那么我们通过哈希值也能很快定位到修改的数据。

还有重要的一个作用就是拥有“零知识证明”的能力。什么是“零知识证明”,根据wiki的解释零知识证明是一方(证明者)向另一方(检验者)证明某命题的方法,特点是过程中除“该命题为真”之事外,不泄露任何资讯。回到我们区块链的网络上,假如我们需要验证TX0是否存在,我们除了TX0的本身信息以外,我们只需要获取Hash1,Hash23和Root hash就能证明TX0是否存在,我们在证明的过程中并没有依赖其他的交易信息数据。

默克尔树在区块链中提供了所有交易的信息摘要

默克尔树的应用-简化了支付的验证

默克尔树在比特币网络中的一大应用就是简化了支付的验证。特币中的节点一类是完全节点,它维护着完整的区块链信息。而有些节点是轻量化的,并不会维护完整的区块链信息,它们是轻量级的节点,这类节点在验证交易的时候就会使用到简化支付验证(SPV)

那默克尔树和这个SPV有什么关系?我们来看下SPV的大致过程可以分为下面几步:
第一步:我们获取到一个需要验证的交易哈希,其中交易相关的区块链消息头和认证路径,节点是通过类似于订阅的merkleblock消息获取到,merkleblock简单的说就是SPV通过布隆过滤器接收了自身感兴趣地址的相关交易的消息

第二步:我们获取一个最长区块链的区块头信息,这个最长链的区块信息可以向其他节点询问以保证获取了最长的区块信息

第三步:我们获取到交易的认证路径,认证路径就是通过X个节点形成一条从交易到根的路径。这个X的确认公式就是 log2(T) = X,T就是对应就是交易的数量。比如我们拥有16笔交易,那么通过 log2(16)=4 只需要4个节点就能确认这笔交易。这4个节点就构成了认证路径。相较于全节点数据,这个数据量要小的多

第四步:计算默克尔根证明交易确实包含在这个区块中,再确认这个区块是否在最长区块链中,以此来验证交易的有效性

所以基于默克尔树的验证,大大减少了数据的依赖以及逻辑的复杂度,降低了存储的成本,但同时由于缺少全部信息的副本,也存在连接虚假节点被恶意攻击的风险,便捷与风险往往是一把双刃剑

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
NEO从源码分析看UTXO交易
_0x00前言_社区大佬:“交易是操作区块链的唯一方式。”_0x01交易类型_在NEO中,几乎除了共识之外的所有的对区块链的操作都是一种“交易”,甚至在“交易”面前,合约都只是一个小弟。交易类型的定义在Core中的TransactionType中:源码位置:neo/Core/TransactionType
Wesley13 Wesley13
3年前
MySQL面试(二)
1、为什么索引遵循最左匹配原则?  当B树的数据项是符合的数据结构,比如(name,age,sex)的时候,B树是按照从左到右的顺序建立搜索树的。比如当(张三,20,F)这样的数据来检索的时候,b树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
11个默克尔树开源项目
Merkle树是一种可以有效验证部分数据存在于指定数据集并且未被篡改的高效的哈希树结构,作为一种底层技术广泛应用在各种区块链的实现当中,对于商品溯源、知识产权确认、区块链公证等区块链应用起着重要的作用。本文介绍11个主流的merkle树开源实现,你可以在自己的项目中应用。区块链开发教程链接:以太坊(https://www.oschina.net/
Wesley13 Wesley13
3年前
1区块链底层技术
  每次在讲解区块链时,都会收到很多关于底层技术问题,感觉很有必要对区块链的底层技术进行分享,这也是我写这一系列文章的动力。  2015年接触比特币(可惜当时没有囤币),作为一个在IT行业摸爬滚打多年,并且是技术出身的人,成功的被比特币底层技术区块链所吸引。区块链与其说是新兴技术,不如说是新的理念、新的概念或者说是一种架构应用,是对目前中心化系统存在问
Wesley13 Wesley13
3年前
NEO从源码分析看网络通信
_0x00前言_NEO被称为中国版的Ethereum,支持C和java开发,并且在社区的努力下已经把SDK拓展到了js,python等编程环境,所以进行NEO开发的话是没有太大语言障碍的。比特币在解决拜占庭错误这个问题时除了引入了区块链这个重要的概念之外,还引入了工作量证明(PoW)这个机智的解决方案,通过数学意义上的难题来保证每个
搭建平台吧 搭建平台吧
2年前
哈希竞猜游戏技术方向-区块链技术游戏
哈希是区块链技术和防篡改潜力的核心基础和最重要的方面,通过哈希算法可以保持记录以及查看数据的真实性和区块的完整性。这就是区块计数最重要技术特征的一部分。区块链指的是一个又一个区块组成的链条,该链条被保存在所有的服务器中,但凡整个系统中有一台服务器可以工作,那么整条区块链就是安全的;这些服务器在区块链系统服务中被称为节点,是为整个区块链系统提供储存空间和算力支
搭建平台吧 搭建平台吧
2年前
爆火游戏--哈希竞猜游戏
哈希值是区块链技术不可变的和确定的潜力核心基础和最重要的方面。它保留了记录和查看的数据的真实性,以及区块链作为一个整体的完整性。这是一个更技术性的方面,然而,理解区块链如何工作以及它所具有的不可估量的潜力和价值是更坚实的一步。区块链已经出来这么长时间了,有人就在讨论这个东西到底有没有未来,然后这东西的未来又是什么呢?区块链现在的确是有着很多的应用,就比如这种