简单支付验证-SPV

2023-11-10

 

     SPV的来源

     在比特币整个生态圈里,大部分都是普通用户,即只有基本的比特币投资及消费支付需要的用户,他们可能没有矿机,没有高端配置的电脑,那么他们是否也要运行一个全节点程序呢?要知道,现在官方显示的结果,比特币所有区块数据目前在120G左右,而且还是持续增长中。

    中本聪曾在比特币白皮书里提到,“不运行全节点也可以验证支付,用户只需要保存所有的区块头(Block Header)就可以了。用户虽然不能自己验证交易,但如果能够从区块链的某处找到相符的交易,他就可以知道网络已经认可了这笔交易,而且得到了网络的多个确认。

    他提到的这个方案就是SPV,简单支付验证。

 

    两种验证

    区块链支付验证与区块链交易验证的区别。SPV指的是区块链支付验证,而不是区块链交易验证。这两种验证方式存在很大的区别。区块链交易验证的过程比较复杂,包括账户余额验证、双重支付判断等,通常由保存区块链完整信息的区块链验证节点来完成。而支付验证的过程比较简单,只是判断该笔支付交易是否已经得到了区块链节点共识验证,并得到了多少的确认数即可。

没有SPV节点时,是如何验证的呢?

 

    如何验证

 

对比一下全节点和SPV节点的区别:

  存储数据 存储数据的大小 UTXO数据库 验证方法
全节点 全部区块 N*1M 未花费UTXO 参考交易在区块链中的高度来验证
SPV 全部区块头 N*80byte 通过参考交易在区块链中的深度来证明

全节点的验证方法,一个全节点,想要检查123号区块中的某个交易,你就要把从这个区块开始一直追溯到创世区块的123个区块全部连接起来,然后建立一个完整的utxo数据库,通过确认该utxo是否还未被支付来证实交易的有效性。

 

区块链节点利用SPV对支付进行验证的工作原理如下:

①计算待验证支付的交易哈希值;

②节点从区块链网络上获取并存储最长链的所有区块头至本地;

③节点从区块链获取待验证支付对应的默克尔树哈希认证路径;

④根据哈希认证路径,计算默克尔树的根哈希值,将计算结果与本地区块头中的默克尔树的根哈希值进行比较,定位到包含待验证支付的区块;

⑤验证该区块的区块头是否已经包含在已知最长链中,如果包含则证明支付真实有效;

⑥根据该区块头所处的位置,确定该支付已经得到的确认数量。

 

    上述第三部中,SPV在实现上涉及到一个问题,如何才能通过交易特征值(比如tx_hash)来定位到该支付交易所在的区块?原有协议中,可以通过getheaders命令来获取block headers,可以通过getdata命令支持获取指定的block, 但不支持通过tx_hash反向查找所在的block。为了定位block,客户端往往不得不下载整个区块链。

    比特币提供了一种叫做布隆过滤器(Bloom filter)的功能,节点会在通信链路上建立一个这样的过滤器,限制只接受含有目标地址的交易,从而能过滤掉大量不相关的数据,减少客户端不必要的下载量。

 

安全性

    spv由于没有全部的交易记录,不能验证某个交易不存在,这个漏洞会被针对spv节点的拒绝服务或者双重支付攻击利用。

 

    spv节点需要随机链接多个节点,增加与至少一个可靠节点相连接的概率,但是这种随机链接的需求也会容易受到网络分区和sybil攻击。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单支付验证-SPV 的相关文章

随机推荐

  • 爬取旅游网站

    完整代码如下 可直接copy from bs4 import BeautifulSoup import urllib request import sqlite3 import os import time import threading
  • Maven项目里的pom解析和nexus私服

    一 什么是pom POM 即Project Object Model 通过pom xml文件配置Maven2 然后Maven2根据此配置执行 作用类似ant的build xml文件 功能更强大 该文件用于管理 源代码 配置文件 开发者的信息
  • 【C++】类与对象上

    文章目录 1 auto关键字 1 1auto介绍 1 2auto使用规则 1 3auto不能推导的情况 1 4范围for循环 2 指针空值nullptr 3 类与对象 3 1类 3 2类的定义 3 3类的访问限定符和封装 3 4封装 3 4
  • 「信号与系统」语音信号的语谱图、尺度变化、带限处理、基音提取

    信号与系统 语音信号的语谱图 尺度变化 带限处理 基音提取 本文将简单介绍几种语音信号的处理方法 1 语谱图 语谱图是一种描述语音信号频率特征的方法 横轴表示时间 纵轴表示频率 颜色深浅表示能量 基本原理是将语音信号分帧 每帧10 30ms
  • 实现isNum()函数,参数是一个字符串,如果字符串属于整数、浮点数或复数,则返回True否则返回False

    实现isNum 函数 参数是一个字符串 如果字符串属于整数 浮点数或复数 则返回True否则返回False def isNum str1 try a eval str1 if type a type 1 or type a type 1 0
  • MQTT协议-心跳请求和心跳响应

    MQTT协议 心跳请求和心跳响应 心跳请求是客户端发送给服务器的 心跳响应是服务器回应给客户端的 作用是保持客户端与服务器之间的连接 CONNECT报文的可变报头是由协议名 Procotol Name 协议级别 Procotol Level
  • 9月13号魔兽服务器维护,魔兽世界怀旧服9月13日7点再次开放免费转服 11个转服新服务器一览...

    魔兽世界怀旧服官方在9月12日的中午发布公告 表示将会在9月13日 也就是中秋节的上午7点到9月16日的早上7点再次开放免费转服 其中新开放了11组新服务器 具体的内容如下 我们预计于 9 月 13 日07 00 至 9 月 16 日07
  • Qt 5界面修改无效的问题解决QtDesigner修改之后无效的解决办法

    第一篇 关于Qt Ui修改不起作的结局办法 我在网上找到的解决办法 ui源文件到界面显示的原理可以网上搜索 这里不再描述 简单讲就是先要从 ui生成ui h然后再编译 所以界面未更新实际上是因为ui h这个文件没有更新导致的 根治的方法 项
  • Web Spider 常见混淆EVAL、AA、JJ、JSFUCK

    文章目录 一 资源推荐 二 EVAL constructor 三 AA混淆 四 JJ混淆 五 JSFUCK 六 针对混淆的方法 简单hook 总结 混淆的原理 就是把原本清晰的代码故意搞得花里胡哨 让局外人看不懂 混淆的目的 让逆向者很难理
  • Python中使用input()无输入

    Python中使用input 无输入 sublime Text编译器因页面美观 插件众多 功能强大深受编程爱好者的青睐 然而在编程中由于插件忘记安装导致程序运行失败 使人颇为烦恼 问题描述 在sublime Text编译器中使用input
  • Git 如何压缩 commit

    今天同事突然问我 由于在给老大的开源项目提 pr 的时候 自己比较长时间没有 rebase 的老大的项目 master 分支了 而自己提交的 commit 又很多 有些 commit 又是实验性质的 乱七八糟的 其实就是没有用熟 git 还
  • Java工作流框架:探索流程引擎的实现和应用

    目前 市面上有很多基于SpringBoot Vue前后端分离的Java快速开发框架和工作流开发框架可供选择 以下是一些比较流行的框架 1 Spring Cloud Spring Cloud是一套基于Spring Boot的开发工具 用于快速
  • sqli-labs Less18 原理到实现详解

    目录 前期知识储备 一 初始思路 1 思路 2 user agent后加入 发现出现sql错误日志 3 我尝试了之前用的各种闭合方法 都已失败告终 4 新的问题 5 现在想的是如何利用mysql插入语句insert实现注入 前期知识储备 从
  • 【Qt styleSheet样式表】

    一 Qt styleSheet样式表语法 1 属性列表 下表列出了 Qt 样式表支持的所有属性 可以为属性赋予哪些值取决于属性类型 除非另有说明 否则以下属性适用于所有小部件 标有星号 的属性为Qt特定的 在 CSS2 或 CSS3 中没有
  • Python+PySide2:使用多线程处理界面卡死的情况

    本篇主要是梳理一下 在使用 Pyside2 模块的时候 利用多线程处理页面假死 exe未响应 的问题 一 这边举个例子吧 如下图所示 测试代码如下 class Stats def init self 从文件中加载UI定义 super ini
  • 32位 与64位编译

    为了适应现在越来越流行的64位系统 经常需要将代码分别编译为32位版和64位版 其次 除了需要生成debug版用于开发测试外 还需要生成release版用于发布 本文介绍了如何利用makefile条件编译来生成这些版本 而且不仅兼容Linu
  • 1、python调用java的jar包

    在python中调用jar包 最近的项目功能需要调用客户的java接口 在调用接口的时候需要使用配套的jar包生成一些参数 但是公司的项目是用django搭建的 经过无数血与泪的尝试 最终终于找到了合适的方法去调用 jpype包是一个Pyt
  • 解决dubbo问题:forbid consumer

    原文地址 http www jameswxx com e4 b8 ad e9 97 b4 e4 bb b6 e8 a7 a3 e5 86 b3dubbo e9 97 ae e9 a2 98 ef bc 9aforbid consumer 线
  • Win10环境python3.7安装dlib模块

    自己按照别人的博客安装了一下dlib 测试成功 在这里自己也稍微总结一下 博客原文 https blog csdn net zhang475546259 article details 84104368 1 安装VS201x 全称visua
  • 简单支付验证-SPV

    SPV的来源 在比特币整个生态圈里 大部分都是普通用户 即只有基本的比特币投资及消费支付需要的用户 他们可能没有矿机 没有高端配置的电脑 那么他们是否也要运行一个全节点程序呢 要知道 现在官方显示的结果 比特币所有区块数据目前在120G左右