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收购了。

【比特币】SPV是如何工作的的更多相关文章

  1. Rust 实现一个简单的区块链

    一.背景 近期用 Rust 实现了 Jeiwan/blockchain_go,与原项目相比没有加入新的功能,只是换了一个编程语言实现了一遍,源码放在 Github 上. 开发这个项目,花费了好几个周末 ...

  2. cpp 区块链模拟示例(四) 区块链工作量证明

    本文主要在之前的区块链原形上添加了工作量证明,并且为后继的交易功能做好准备. 上一个章节我们已经创建了区块链的基本原形,但是区块的哈希计算和加入太过于简单,如果按照这种速度添加区块那么区块链估计一个小 ...

  3. 比特币运行原理[z]

    https://baijiahao.baidu.com/s?id=1581755535769652543&wfr=spider&for=pc 这篇文章主要讲解比特币是什么?它的运行原理 ...

  4. 比特币_Bitcoin 简介

    2008-11   Satoshi Nakamoto  Bitcoin: A Peer-to-Peer Electronic Cash System http://p2pbucks.com/?p=99 ...

  5. 比特币钱包应用breadwallet源码

    breadwallet是一款安全.可靠和便捷的比特币钱包,可使用户免于恶意软件和其他应用中常见的安全问题的骚扰,充分利用了iOS提供的安全功能,包括AES硬件加密.app沙盒和数据保护.代码签名以及k ...

  6. 什么是比特币(bitcoin)

    一.什么是比特币? 比特币是一种由开源的P2P软件产生的电子货币,是一种网络虚拟货币.比特币使用遍布整个P2P网络节点的分布式数据库来记录货币的交易,并使用密码学的设计来确保货币流通各个环节安全性.比 ...

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

    在比特币网络中,不是每个节点都有能力储存完整的区块链数据,受限于存储空间的的限制,很多节点是以SPV(Simplified Payment Verification简单支付验证)钱包接入比特币网络,通 ...

  8. 利用vanitygen生成比特币个性地址的教程

      比特币怎么生成地址?大家都知道比特币地址都是以1开头的一串乱码,很多朋友会新建过一排地址然后在里面挑选,下面小编为大家分享下比特币生成个性地址方法. 其实就是使用vanitygen软件来生成个性化 ...

  9. Tinychain 是比特币的一个简易口袋实现

    Putting the rough in "rough consensus" Tinychain is a pocket-sized implementation of Bitco ...

随机推荐

  1. C++ primer 第四版 练习3.13,3.14

    读一组整数到 vector 对象,计算并输出每对相邻元素的 和.如果读入元素个数为奇数,则提示用户后一个元素 没有求和,并输出其值. vector<int> ivec; int ival; ...

  2. android开源项目集合

    ZXing http://code.google.com/p/zxing/ 条形码.二维码 K-9 Mail http://code.google.com/p/k9mail/ 邮件客户端 Sipdro ...

  3. MyEclipse CI 2018.8.0正式发布(附下载)

    MyEclipse线上特惠,在线立享专属折扣!火热开启中>> MyEclipse 2018最终版日前正式发布,新版本通过构建Eclipse Photo.支持Java 10和Java EE ...

  4. DevExpress v17.2新版亮点—.NET Reporting篇(一)

    用户界面套包DevExpress v17.2日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了.NET Reporting v17.2 的新功能,快来下载试用新版本! All ...

  5. Java数字签名算法--RSA

    签名具有的特性: 安全性 抗否认性 数字签名:带有密钥(公钥.私钥)的消息摘要算法(使用私钥进行签名,使用公钥进行验证) 数字签名算法:RSA.DSA.ECDSA 数字签名特性: 验证数据完整性 认证 ...

  6. NBUT 1223 Friends number 2010辽宁省赛

    Time limit  1000 ms Memory limit   131072 kB Paula and Tai are couple. There are many stories betwee ...

  7. Vue2.0 分页插件pagination使用详细说明

    Vue2.0 分页pagination使用 插件下载地址:Vue_Pagination 插件描述:基于jQuery的分页插件大家都用过很多了吧,今天分享一下基于Vue的分页插件pagination.j ...

  8. Home Kit框架简介

    重要:本文是针对开发过程中使用的API或者技术的初步文档.苹果提供该文档旨在为开发者使用该技术和苹果产品上的编程接口提供帮助.这些信息可能会发生变化,依据该文档开发的软件应该使用最新的操作系统软件和最 ...

  9. bug20170125

    1s定时请求接口,接口不响应(接口挂掉),浏览器崩溃

  10. poj-1170 (状态压缩形式下的完全背包)

    #include <iostream> #include <algorithm> #include <cstring> using namespace std; ; ...