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. 自己写的一个delphi正整数快速排序

    type   TIntArr= array of word; procedure MyQSort(var arr: TIntArr; low: word; high: word); //word可以改 ...

  2. Linux内核分析-使用gdb跟踪调试内核从start_kernel到init进程启动

    姓名:江军 ID:fuchen1994 实验日期:2016.3.13 实验指导 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/a ...

  3. ESET NOD32 Antivirus – 免费 3个月/ 3PC

    ESET NOD32 Antivirus 3个月/ 3PC俄罗斯活动,3用户3个月免费,仅用于EAV,不能用于ESS活动地址: 点此进入申请方法:一共2封邮件,第2封含3个月许可

  4. java设计模式 略版

    <转> 设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结 ...

  5. get_class

    <?phpclass foo {    function foo()    {    // implements some logic    }    function name()    {  ...

  6. 大龄码农那些事——也谈996.ICU

    1.背景 近期Github突然有一个开源项目火了,叫“996.icu”,开源地址:https://github.com/996icu/996.ICU ,目前star的人数截止我写这篇博文时已经高达17 ...

  7. caffe编译问题-src/caffe/net.cpp:8:18: fatal error: hdf5.h: No such file or directory compilation terminated.

    错误描述 src/caffe/net.:: fatal error: hdf5.h: No such : recipe 操作过程 step1: 在Makefile.config文件更改INCLUDE_ ...

  8. MVC 模型 视图, 控制器 写 三级联动

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  9. web 常用网址及资源

    一.web教程 w3school在线教程 菜鸟教程 二.学习路线 2017前端学习路线图,内附完整前端自学视频教程+工具经验-黑马程序员技术交流社区 三.工具 盘搜 百度地图 查物流 金山词霸 必应词 ...

  10. PHP 7.0 EOL (PHP 技术支持相关)

    PHP 7.0 EOL (PHP 支持相关) PHP 5.6 于 2018-12-31 结束(EOL) 从图表看出,PHP 7.0 是一个过渡版本,现在已经 EOL. 而 PHP 7.1 将于明年年底 ...