比特币区块结构Merkle树及简单支付验证分析

在比特币网络中,不是每个节点都有能力储存完整的区块链数据,受限于存储空间的的限制,很多节点是以SPV(Simplified Payment Verification简单支付验证)钱包接入比特币网络,通过简单支付验证可以在不必存储完整区块链下对交易进行验证,本文将分析区块结构Merkle树及如何进行交易验证。

区块结构

工作量证明中出现过一个区块信息截图:

细心的同学一定已经在里面发现了很多未讲的其他信息,如:时间戳,版本号,交易次数,二进制哈希树根(Merkle根)等。

我们来看看一个区块结构到底是怎样的:

如上图(下文称:区块结构图)所示:每个数据区块包含区块头和区块体。

区块头封装了当前版本号、前一区块哈希值、当前区块PoW要求的随机数(Nonce)、时间戳、以及Merkle根信息。

区块体则包括当前区块经过验证的、 区块创建过程中生成的所有交易记录。这些记录通过 Merkle树的哈希过程生成唯一的Merkle根并记入区块头.

区块哈希值实际上并不包含在区块的数据结构里,其实区块打包时只有区块头被用于计算哈希(从网络被接收时由每个节点计算出来),常说的区块哈希值实际是区块头哈希值,它可以用来唯一、明确地标识一个区块。

区块头是80字节,而平均每个交易至少是250字节,而且平均每个区块包含2000个交易。因此,包含完整交易的区块比区块头的4千倍还要大。

SPV节点只下载区块头,不下载包含在每个区块中的交易信息。这样的不含交易信息的区块链,大小只有完整区块链的几千分之1,那SPV节点是如何验证交易的呢?

哈希验证

上面先留一个引子,先来回顾下哈希函数,记账原理我们知道原始信息任何微小的变化都会哈希完全不同的哈希值。

简单文件验证

我们通常用哈希来检验下载的文件是否完整,我经常看到这样的下载页面:

可以看到下载链接后面提供了一个MD5(MD5也是一种Hash算法),这样我们可以在下载之后对文件计算MD5,如果MD5与提供的MD5相等,说明文件有没有被损坏,这个验证过程相信大家都能理解。

多点文件验证(哈希列表)

现在复杂度提高一点,在P2P网络中下载时,会把大文件切成小文件,同时从多个机器上下载数据,这个时候怎么验证数据呢?

以BT下载为例,在下载真正的数据之前,我们会先下载一个哈希列表的(每个下小块计算出一个哈希),如果有一个小块数据在传输过程中损坏了,那我只要重新下载这一个数据块就行了,这时有一个问题就出现了,那么多的哈希,怎么保证它们本身(哈希列表中的哈希值)都是正确地呢?

答案是把每个小块数据的哈希值拼到一起,然后对这个长字符串在作一次哈希运算,得到哈希列表的根哈希。只要根哈希校对比一样就说明验哈希列表是正确的,再通过哈希列表校验小数据块,如果所有的小数据块验证通过则说明大文件没有被损坏。

Merkle树

验证交易的过程和文件验证很相似,可以人为每个交易是一个小数据块,但比特币使用Merkle树的方式进行验证,相对于哈希列表,Merkle树是一种哈希二叉树,它的明显的一个好处是可以单独拿出一个分支来(作为一个小树)对部分数据进行校验,更加高效。

我们回看下上面的区块结构图,区块体就包含这样一个Merkle树,Merkle树被用来归纳一个区块中的所有交易。

每个叶子节点是每个交易信息的哈希,往上对相邻的两个哈希合并成字符串再哈希,继续类似的操作直到只剩下顶部的一个节点,即Merkle根,存入区块头。

因为Merkle树是二叉树,所以它需要偶数个叶子节点。如果仅有奇数个交易需要归纳,那最后的交易就会被复制一份以构成偶数个叶子节点,这种偶数个叶子节点的树也被称为平衡树。

简化支付验证

SPV节点不保存所有交易也不会下载整个区块,仅仅保存区块头,我们来看看它是如何对交易数据进行验证的。

假如要验证区块结构图中交易6,SPV节点会通过向相邻节点索要(通过Merkleblock消息)包括从交易6哈希值沿Merkle树上溯至区块头根哈希处的哈希序列 (即哈希节点6, 5, 56, 78, 5678, 1234 1~8 - 称为认证路径) 来确认交易的存在性和正确性。(在N个交易组成的区块中确认任一交易只需要计算log2(N)个字节的哈希值,非常快速高效)

大家明白了吗?

深入浅出区块链 - 系统学习区块链,打造最好的区块链技术博客

时间: 2024-09-30 22:29:20

比特币区块结构Merkle树及简单支付验证分析的相关文章

特币区块结构Merkle树及简单支付验证分析

在比特币网络中,不是每个节点都有能力储存完整的区块链数据,受限于存储空间的的限制,很多节点是以SPV(Simplified Payment Verification简单支付验证)钱包接入比特币网络,通过简单支付验证可以在不必存储完整区块链下对交易进行验证, http://p.baidu.com/itopic/main/qlog?qid=3cb46162633265383638322600&type=questionloghttp://p.baidu.com/itopic/main/qlog?qi

经常在比特币中看到的merkle树是什么?

区块基础-merkle树   Merkle tree中文叫做梅克尔树,这当然不是一棵真正的植物树,merkle tree是计算机数据结构中的一种树,是由计算机科学家 Ralph Merkle 提出的,并以他本人的名字来命名. Merkle tree是数据结构中的一种树结构,可以是二叉树,也可以是多叉树,他和数据结构中树的特点几乎一致,和普通树不同的是:merkle tree上的叶节点存放hash计算后的hash值,非叶节点是其对应的子节点串联的字符串的hash值.上图可知:hash0=hash0

[转帖]比特币区块链的数据结构解析

比特币区块链的数据结构解析 发布者: 无主之地 发表于: 2015-8-13 18:37 来自: 比巴克 16608 1 分享 http://8btc.com/article-1915-1.html 区块链(数据区块.数据块.数据块链)作为比特币的核心概念,对于理解比特币结构起着至关重要的作用.在<什么是数据区块>中,编者从数据区块分布式交易记录的角度简单的介绍了数据区块的概念.今天,编者从数据区块的程序结构上来详细的分析数据区块里面到底记录了什么信息. 数据区块文件的位置如果你用的是Bitc

区块链~Merkle Tree(默克尔树)算法解析~转载

转载~Merkle Tree(默克尔树)算法解析 /*最近在看Ethereum,其中一个重要的概念是Merkle Tree,以前从来没有听说过,所以查了些资料,学习了Merkle Tree的知识,因为接触时间不长,对Merkle Tree的理解也不是很深入,如果有不对的地方,希望各位大神指正*/ Merkle Tree概念 Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树.Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值.非叶节点是

1.3.2 区块链中的密码学——Merkle 树

在计算机领域,Merkle树大多用来进行完整性验证处理.在处理完整性验证的应用场景中,特别是在分布式环境下进行这样的验证时,Merkle树会大大减少数据的传输量以及计算的复杂度. Merkle哈希树是一类基于哈希值的二叉树或多叉树,其叶子节点上的值通常为数据块的哈希值,而非叶子节点上的值是将该节点的所有子节点的组合结果的哈希值. 如下图所示为一个Merkle哈希树,节点A的值必须通过节点C.D上的值计算而得到.叶子节点C.D分别存储数据块001和002的哈希值,而非叶子节点A存储的是其子节点C.

cpp 区块链模拟示例(七) 补充 Merkle树

Merkle 树 完整的比特币数据库(也就是区块链)需要超过 140 Gb 的磁盘空间.因为比特币的去中心化特性,网络中的每个节点必须是独立,自给自足的,也就是每个节点必须存储一个区块链的完整副本.随着越来越多的人使用比特币,这条规则变得越来越难以遵守:因为不太可能每个人都去运行一个全节点.并且,由于节点是网络中的完全参与者,它们负有相关责任:节点必须验证交易和区块.另外,要想与其他节点交互和下载新块,也有一定的网络流量需求. 在中本聪的 比特币原始论文 中,对这个问题也有一个解决方案:简易支付

搭建最简单的区块结构

最近准备用go搭一个简单的区块链项目,虽说有十分详细的教程,但是还是有些地方不太容易理解(个...个人原因?),下面是一个极其简易的区块结构,主要运用了go中结构体和切片的特性. 代码 // 结构体 + 切片 // 后续学习的简易框架 package main import "fmt" type information struct { name string age int home string } /* 这一步很关键 */ type list struct { informs [

如何将Bitcoin比特币区块链数据导入关系数据库

在接触了比特币和区块链后,我一直有一个想法,就是把所有比特币的区块链数据放入到关系数据库(比如SQL Server)中,然后当成一个数据仓库,做做比特币交易数据的各种分析.想法已经很久了,但是一直没有实施.最近正好有点时间,于是写了一个比特币区块链的导出导入程序. 之前我的一篇博客:在区块链上表白——使用C#将一句话放入比特币的区块链上  介绍了怎么发起一笔比特币的交易,今天我们仍然是使用C#+NBitcoin,读取比特币钱包Bitcoin Core下载到本地的全量区块链数据,并将这些数据写入数

第六章 比特币--区块链思想诞生的摇篮

一.比特币项目简介 特点: 去中心化:没有任何独立个体可以对交易进行破坏,任何交易请求都需要大多数参与者的共识 匿名性:账户地址是匿名的,无法从交易信息关联到具体的个体,这也意味着很难进行审计 通胀预防:发行量上限2100万个,无法超发,每四年减半. 1. 比特币大事记 2008.10.31,中本聪发布比特币白皮书 2009.1.3 18:15:05,中本聪挖出第一批50个币 2010.5.21 佛罗里达的程序员用1万个币买了价值25美元的披萨优惠券 2012.11.28 产量第一次减半 201