主页 > imtoken钱包官方版下载 > btc一个网络确认要多久 Merkle树和SPV机制

btc一个网络确认要多久 Merkle树和SPV机制

imtoken钱包官方版下载 2023-01-17 11:45:54

本文主要介绍默克尔树在比特币中的数据结构、原理特点及应用。 同时,我们还将介绍比特币轻钱包的实现基础——简单支付验证(SPV),并详细介绍其原理机制以及与默克尔树的关系。

什么是默克尔树

1. 比特币中的 Merkle 树

在说默克尔树之前,我们先来看看比特币上某个区块的结构。 我们可以看到里面有一个二叉哈希树的根。 这个哈希值是默克尔树结构中当前区块包含的所有交易生成的哈希值。

查看区块的链接地址:

2.默克尔树概念

Merkle Tree,也叫Hash Tree,是Ralph Merkle于1979年申请的专利,是一种用于快速归纳和验证大规模数据完整性的树型数据结构。

它具有以下特点:

它是一种树,大部分是二叉树,也可以是多叉树,具有树结构的所有特性。

Merkle Tree 的叶子节点是数据块的哈希。

Merkle Tree的非叶子节点的哈希值是根据它下面的所有叶子节点的哈希值计算出来的,如下图所示。

备注:如果开头有奇数个叶子节点,可以复制最后一个叶子节点做成偶数个。

可以发现,只要存储的叶子节点数据有变化,就会一步步向上传递到对应的父节点,最后Merkle树根节点的哈希值就会发生变化。

3. Merkle树的应用

Merkle树的应用场景如下:

快速比对大量数据:当两棵Merkle树的根哈希值相同时,表示它们代表相同的数据

快速定位修改:如上图所示,如果交易C发生变化,会导致N2、N5和Merkle Root发生变化。 因此,如果我们想要快速定位,只需要按照Root==>N5==>N2定位到事务C中的变化即可。

零知识证明:比如你想证明某笔交易A包含在一组交易中,但又不想让对方知道交易A的具体内容,你可以构建一颗Merkle树(如上图)并将N0、N1、N4通告给对方和Root,对方可以确认交易A的存在,但无法知道交易A的具体内容。

比特币的简单支付验证(SPV)

1.什么是SPV

简单支付验证,即Simple Payment Verification,简称SPV。 SPV 的目标是验证交易支付的存在以及它从比特币网络收到了多少确认(多少块)。 比特币中的 SPV 函数应用了 Merkle 树的特性。

2、为什么需要SPV机制?

我们知道,比特币网络中产生的所有交易都被打包成区块。 通常,一个区块包含数百或数千笔交易是很常见的。 2014 年 4 月,比特币网络中一个全节点需要占用 15GB 的空间来存储和处理所有区块的数据,并且以每月超过 1GB 的速度增长。 现在怎么样? 要完整下载比特币的所有区块数据,需要200GB以上的空间! !

如果一个用户想用手机来使用比特币,没有足够的空间来存储如此庞大的数据量,而且还会逐年增长。 于是中本聪在比特币白皮书中提出了SPV的概念:无需运行全节点即可验证支付,用户只需保存所有区块头即可。 用户虽然不能自己验证这笔交易,但如果他能在区块链某处找到匹配的交易,就可以知道这笔交易已经被网络确认btc一个网络确认要多久,也可以确认这笔交易从网络收到了多少次确认.

这里要注意,SPV强调的是支付的验证,而不是交易的验证。 这两个概念是不同的。 付款验证相对简单。 你只需要判断用于支付的交易是否经过验证,经过网络确认了多少次(即叠加了多少个区块)。 但是,交易验证要复杂得多。 需要验证账户余额是否足够支出,是否存在重复支付,交易脚本是否通过等,一般由全节点矿工完成。

如下图所示,我们知道比特币中的区块结构分为两部分,一个是区块头,包含了区块的必要属性,大小只有80字节。 另一个是区块体,包含了当前区块下的所有交易。 通常,一个区块包含数百或数千笔交易,每笔交易一般需要 400 多个字节。

3. 比特币网络节点类型

这里需要介绍一下比特币网络中几种常见的节点类型:

(1) 全节点

包含钱包(支付验证)、矿工、全区块链数据库、网络路由节点等功能。

(2) SPV节点

只是一个简单的支付验证功能

此外,还有独立矿工等其他类型的节点,这里不再一一介绍。 详见《精通比特币》一书比特币网络第六章。

4.SPV验证流程

在SPV节点上,不保存所有区块链数据,不下载区块内所有交易,只保存区块头数据。 所以这种节点不能验证所有的交易,只能用来验证支付(确认支付在区块链上,确认了多少次)。 截至目前,比特币的高度为:521283(时间:2018-05-05 15:41)btc一个网络确认要多久,按照区块头的80字节计算,总大小只有10MB(80*521283/1024/1024) ,从而大大降低了对整体存储容量的要求。

那么,从用户A购买商品通过比特币支付,并声称自己转了1个BTC给商家,到商家验证支付有效(SPV验证),这个过程是怎样的呢?

Step1:如果SPV节点只关心一笔支付给自己比特币地址的交易,可以建立Bloom filter(Bloom filter是一种高效的基于哈希的搜索结构,可以快速判断一个元素是否在一个集合内)进行限制只接收包含目标比特币地址的交易。

Step2:一旦比特币网络中的其他节点检测到一笔交易满足SPV节点设置的布隆过滤器条件,其他节点将以Merkleblock消息的形式发送该区块,消息包含区块头和连接目标交易的Merkle路径与默克尔根。

Step3:SPV节点通过Merkle路径找到交易相关的区块,并验证目标交易是否存在于对应的区块中。 SPV 节点接收到的 Merkleblock 数据量通常小于 1KB,大约只有一个完整区块大小的千分之一(约 1MB)。

5.默克尔路径

在上一节中,我们提到了 Merkle 路径可以证明区块中是否存在交易。 下面我们用一个例子来说明 Merkle 路径。

如下图所示,如果我们需要证明一个区块中是否存在交易C(如上图的区块结构,可以得到Merkle树根的哈希值),那么我们只需要N3和N4的哈希值形成的Merkle路径即可证明,过程如下:

Step1:获取交易C的哈希值,N2=Hash(交易C)

Step2:通过N2和N3的哈希值得到父节点的哈希值:N5=Hash(N2+N3)

Step3:同上,通过N4和N5的哈希值得到根节点的哈希值:Root=Hash(N4+N5)

Step4:然后将上一步得到的根哈希值与区块头中MerkleTree的根哈希值进行比较。 如果相同,则证明区块中存在交易C,否则不存在

也就是说,对于一个包含4笔交易的区块,我们只需要2个哈希节点来验证支付。

备注:一个散列大小为32字节

从上表可以看出,当交易数量呈几何级数增长时,Merkle路径的开销增长非常缓慢。 因此,通过 Merkle 路径,SPV 节点只需要很小的开销就可以快速定位到一笔交易。