主页 > imtoken官网下载3.0版本 > 六年前比特币 Merkle 树和 SPV 机制

六年前比特币 Merkle 树和 SPV 机制

imtoken官网下载3.0版本 2023-03-06 06:24:11

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

什么是 Merkle 树1.比特币中的 Merkle 树

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

查看区块的链接地址:

2.默克尔树概念

Merkle Tree,又名Hash Tree,是Ralph Merkle在1979年申请的专利。它是一种树状数据结构,用于快速归纳和检查大规模数据的完整性。

它具有以下特点:

注意:如果叶子节点的初始个数是奇数,可以复制最后一个叶子节点补一个偶数。

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

3.默克尔树的应用

Merkle树的应用场景如下:

比特币的简单支付验证 (SPV) 1.什么是 SPV

简单付款验证,或简单付款验证,简称 SPV。SPV 的目标是验证某笔交易支付的存在以及从比特币网络中获得了多少确认(多少块)。比特币中的 SPV 功能应用于 Merkle 树的属性。

2.为什么需要SPV机制

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

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

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

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

3.比特币网络节点类型

以下是比特币网络中一些常见的节点类型:

(1)全节点

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

(2)SPV 节点

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

另外还有独立矿工等其他类型的节点,这里就不一一介绍了。详情请参考《精通比特币》一书中比特币网络第6章。

4.SPV 验证流程

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

那么,用户A在购买商品时用比特币付款,声称自己已向商家转账1 BTC,到商家验证付款有效(SPV验证)的流程是怎样的呢?

5.默克尔路径

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

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

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

在这里,由于区块中的交易数量很少,我们可能看不到默克尔树结构的优势。接下来,让我们逐步增加区块中的交易数量,看看 Merkle Tree 的优势。

交易数量

近似块大小

哈希数

默克尔路径大小

16 笔交易

4KB

log2(16)=4

4*32 = 128 字节

512 笔交易

128KB

log2(512)=9

9*32 = 288 字节

2048 笔交易

512KB

log2(2048)=11

11*32 = 352 字节

65536 笔交易

16MB

log2(65536)=16

16*32 = 512 字节

注意:散列大小为 32 字节

从上表可以看出,当交易数量呈几何增长时,Merkle 路径的成本增长非常缓慢。因此,通过 Merkle 路径,SPV 节点可以以很少的开销快速定位交易。