SPV是如何工作的
SPV, Bloom 过滤器和检查点
这是一篇技术文章,获取比特币的工作知识。
一个完整的节点,比如比特币核心,知道以下几点:
- 每一个当前正在围绕网络广播事务处理
- 每一个曾经被送到交易
- 所有未使用的交易产出(UTXO)
这需要大量的数据被下载,存储和索引。 但是,如果不需要完整的块链,则有一些快捷方式可以减少冗余信息的数量。
简化付款验证(SPV)。
SPV提供了一种方法,可以确定某个特定的事务处在块链中的块中,而不需要整个块链被下载。 它这样做如下:
- 每个事务都有一个散列
- 每个块都有一个散列
- 事务散列和块散列可以使用Merkle树证明来链接。
一个梅克尔树是一种数学模型,其中块是在顶点,所有的交易得到安置在一个树状结构。
一个梅克尔树证明是所有的顶点(块),叶(交易)之间的散列的列表。 梅克尔树证明的一点是,您只需要一小部分的块来证明交易在块中。
因此,当一个钱包说它使用SPV时,它意味着在它相信一个交易之前,它会检查:
- 有一个默克尔树树证明交易是在一个块
- 该块本身在块链的主链中
交易是“好”,将被添加到钱包。
Bloom过滤器和单一HD帐户支持
很多人都问我们,为什么我们只支持HD帐户(即在正常的说法帐户1)。
主要原因是由于我们如何从比特币核心节点获得我们的交易。 我们使用一种称为布隆过滤的技术。 我们不要求直接交易,而是我们给比特币核心节点,我们知道会匹配所有我们感兴趣的(加上一些误报把任何间谍失去了线索一点点)交易的过滤器。
仅支持一个帐户就意味着为主地址和更改地址的地址数量不断增加创建过滤器。 这开始为“数百”,随着钱包的使用,将变成“数千”。
将其扩展到支持任意数量的帐户意味着创建匹配的过滤器:
账户数量x(主要地址+更改地址)
因此,我们必须过滤以匹配更多的地址(我们认为),我们几乎可以获得完整的块。 这使得我们至少像比特币核心节点一样慢,而且我们上传非常宽泛的过滤器的速度更慢。
我们认为这样做太慢而无用,所以我们将使用限制在一个账户中。
我们没有UTXO集
我们无法访问使用Bitcoinj设置的未使用交易输出(UTXO),因此我们无法直接查看。 只有在其后端具有完整块存储的实现(可直接查询)才能使用UTXO集,这意味着要下载整个块链。
Bitcoinj只会讲比特币网络协议,不支持“给我所有的UTXO这个地址”等功能。
检查点
为了减少需要下载的块的数量,我们在安装程序中包含一个检查点文件,其中包含比特币难度级别变化(每个2015年的块)的每个块的标题。
这使我们只能从钱包出生日期前的检查点进行同步,这节省了大量时间,也是为什么我们要求您在创建钱包期间记录“日期戳”。 因此,如果钱包日期戳相当于块200,050,并且在块200,000处有检查点,那么我们可以同步50块。
由于检查点文件存储在本地,并通过我们的安装程序提供,它使我们能够检测到比特币节点何时试图欺骗使用分叉链(包含假交易)而不是真正的比特币区块链。
连接到本地比特币核心节点
如果MultiBit可以检测到,它将自动连接到在本地主机上运行的Bitcoin Core。 它还连接到其他节点,因为我们使用事务传播来确定事务何时正确发送以及何时可以使用事务更改。 如果我们纯粹依赖单个节点(即使它是可信的),我们也不能确信真正的外部比特币网络正在传递它。
原文地址
https://multibit.org/hd0.4/how-spv-works.html
这个网站对应的产品叫multibit
,现已经不再维护,原因是一年前被KeepKey
收购了。