“比特币挖矿越来越难了怎么办?”,“比特币存在的缺陷是否会造成自身的消亡呢?”,“比特币是否是一个注定失败的实验?”,人们对比特币的疑问有很多很多,甚至很多还有点悲观。作为一个软件程序,稳定运行这么多年已经是一个奇迹,然而我们也不得不承认它有一些不完美的地方。但是,事物都是在发展中的,我们一样也应以发展的眼光来看待它目前存在的缺陷的问题。今天不打算聊这些缺陷,而是探讨比特币在发展过程中的一种创新,因为创新才是不断解决问题的根本办法,这个创新就是简单支付验证(SPV,Simplified Payment Verification)。

1、为什么会有SPV

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

在之前的千聊课程“比特币的分叉之殇”里,我曾经提到过,Core团队坚持不扩容的一个支撑证据是“每个人应该具备运行全节点程序的能力”,但是即使个人拥有这个能力,也不一定见得要去这么做,更不会是大多数人的需求。这很容易理解,我们个人安装比特币钱包的目的是什么?是能够正常支付使用、收款,即日常的消费需求。

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

他提到的这个方案就是本文要介绍的SPV,简单支付验证。这是一个伟大的创新,解决了人们在支付验证时如何处理超大规模区块数据的难题。

2、回顾下区块结构及默克树

简单支付验证(SPV)充分利用了区块的结构信息及默克树(Merkle Tree)的强大搜索能力,从而能实现对交易信息的快速定位。这里面首先要理解的一点是:为什么要这么做?为什么要去定位一个交易的具体位置?

简单来讲,就是比特币网络里的节点在打包一个区块的时候,会对区块里所有的交易进行验证,并且,一个交易还会得到6至7次的确认来确保交易最后的完成。正是如此,在使用简单支付验证时,只要判断出一个交易在主链上的某个区块里出现过,则可以证明该交易之前已被验证过。

在进入下一部分讲解SPV的搜索过程细节时,需要你能回顾起区块的结构以及默克树的特点,这些在之前的课程里都有介绍过。这里再简单过一遍:

区块结构

对于以上的区块结构:前一区块Hash值用于将所有区块链接成一个链条,Merkle树根是通过默克树的组织方式将所有交易的信息映射成一个字段,时间戳证明了区块产生的唯一性及存在性,目标值也叫难度值,表明本次“挖矿”(打包区块)的难度,随机数则是“矿工”通过暴力破解算出的最终答案。

默克树呢?结构如下:

默克树结构

简单理解这个结构就是:所有的具体交易信息的哈希值都存放在叶子节点,将所有这些信息两两进行归纳,重复这样一个过程,最后归纳成一个节点,即根节点(如图中的节点0),通过一个根节点这样的哈希值就代表了所有打包到这个区块里的交易信息,所以大大减少了区块头部的大小。不仅如此,当要搜索某一个交易,比如上图中的23的时候,可通过几步,比如0-2-5-11即可以快速搜到。

如果你已经将上面这两部分内容都搞懂了,可进入下面这一部分。

3、SPV的神奇

通过上面的回顾,可以知道,Merkle树是一种哈希二叉树,它是一种用做快速归纳和校验大规模数据完整性的数据结构。SPV充分利用了Merkle树的这个特点,SPV节点在验证交易是否存在时不保存所有交易也不会下载整个区块,仅仅只是保存区块头。它使用认证路径或者Merkle路径来验证交易存在于区块中,而不必下载区块中所有的交易。

这有什么显著的作用呢?看下面一张表格:

Merkle树的效率

通过上表可以看出,当区块大小由16笔交易(4KB)急剧增加至65,535笔交易(16MB)时,Merkle的搜索路径长度增长却极其缓慢。这样一来,只需要一个区块头部结构,再加一个这样的搜索路径的开销,一个节点就能花费很小的代价快速定位一个交易。具体计算一下:

区块头部只有80字节。按照每小时6个的出块速度,每年产出52560个区块。当只保存区块头部时,每年新增的存储需求约为4兆字节,100年后累计的存储需求仅为400兆,即使用户使用的是最低端的设备,正常情况下也完全能够负载。

也就是说,一个普通用户如果目的仅仅是为了对支付进行验证,使用SPV方式能很好满足这种需求,完全不用担心区块数据量太大的问题。

但是,这里面还有一个问题:如何根据交易哈希定位在哪一个区块里呢?以往的比特币系统不支持SPV,完成这种定位只能下载所有区块,然后从头到尾遍历每一个区块,并通过Merkle路径找到对应的交易。

后来,比特币提供了一种叫做布隆过滤器(Bloom filter)的功能,节点会在通信链路上建立一个这样的过滤器,限制只接受含有目标地址的交易,从而能过滤掉大量不相关的数据,减少客户端不必要的下载量。比如,SPV节点会收到少于1KB的有关区块头和Merkle路径的数据,其数据量只约占一个完整区块(目前大约1MB)的千分之一。

这样一来,借助这个功能,“轻钱包”不用借助中心化的方式也可以实现,在手机上面运行也不是太大问题。


通过上面的讲解,其实你会发现,比特币在诞生的时候很“惊艳”,随着它的发展,以及人们研究的深入,又发现了其自身出现的很多问题,比如容量限制为1M等。但是,随着人们的继续深入,又不断找到了解决这些问题的办法,从而让它继续发展。

可见,事物的发展都是动态演变的,我们看待问题的方式更不能静止地看。比特币目前依然有很多问题亟待解决,但是过于悲观也是不必要的。

作者:higer
链接:https://www.jianshu.com/p/39be41dfb5fa
來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

简单支付验证(SPV)与创新相关推荐

  1. 简易支付验证:即时支付、签名的有效性和交易的完整性

    发表时间:2020年8月25日 作者:张伟 / Wei Zhang 信息来源:https://medium.com/nchain/simplified-payment-verification-48a ...

  2. 移动支付行业的技术创新策略

    作者:禅与计算机程序设计艺术 <移动支付行业的技术创新策略>技术博客文章 引言 1.1. 背景介绍 移动支付行业作为我国金融行业的"短板",在移动支付领域的技术发展上具 ...

  3. 【ADO.NET】2、各种版本的 简单登录验证

    一.简单登录验证(防SQL注入) GetString(序号) 返回某一列的值(当用户不记得列名序号时,可使用GetOrdinal()获取到序号) GetInt32(序号) 针对的是 int 字段,返回 ...

  4. 机器学习(MACHINE LEARNING)交叉验证(简单交叉验证、k折交叉验证、留一法)

    文章目录 1 简单的交叉验证 2 k折交叉验证 k-fold cross validation 3 留一法 leave-one-out cross validation 针对经验风险最小化算法的过拟合 ...

  5. jQuery ajax简单案例-验证用户名是否可用

    jQuery ajax简单案例-验证用户名是否可用 HTML <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  6. 使用Spring Security进行简单身份验证

    朋友不允许朋友写用户身份验证. 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK. 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护. 身份验证对于除了最基本的Web应 ...

  7. ios 支付验证 php,PHP验证IOS原生支付是否成功(代码全篇)

    前言 IOS原生支付后,需要调用服务端接口进行验证,检测是否真正的支付成功! class ApplePay { /** 环境配置(建议提成配置) * @var bool */ private $san ...

  8. java简单密码验证程序

    java简单密码验证程序 package demo01;import java.util.Scanner;/*** java模拟密码验证问题* 从键盘上录入6位密码,验证密码是不是6位,如果不是6位提 ...

  9. php get验证,PHP+Ajax简单get验证操作示例

    本文实例讲述了PHP+Ajax简单get验证操作.分享给大家供大家参考,具体如下: 1.显示页面代码 index.html XMLHttpRequest独对象使用实例 //第一步创建ajax引擎对象 ...

最新文章

  1. 云从科技3D人体重建技术刷新3项纪录!仅凭照片即可生成精细模型
  2. 传奇芯片设计大神Jim Keller又离职了,英特尔失了总设计师,网友喊话雷军:挖他!...
  3. android网络技术-WebView的用法
  4. 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
  5. VS2012+WDK8.0搭建WDF驱动开发环境
  6. Unity3D 入门 游戏开发 Unity3D portal game development
  7. ROS( C++ )订阅 robot 的 path 话题
  8. 用计算机画函数图象,信息技术应用 用计算机画函数图象优秀公开课教案
  9. html5学习笔记(7)
  10. python封装为php库,从PHP运行Python脚本作为库
  11. 如何快速更换ip地址?
  12. ubuntu安装pyaudio
  13. windows虚机使用IIS服务搭建ftp
  14. AES加密解密(C语言实现)
  15. linux系统 插优盘安装xvidcap,Linux屏幕录像软件xvidcap的安装方法
  16. 雷霆复鸣 决战巅峰 | 第七届XCTF国际网络攻防联赛总决赛即刻启航!
  17. 服务器断电mysql文件丢失_服务器断电了怎么恢复数据?
  18. pascal过程与函数
  19. 黏贴图片到word文档图片显示不全,只显示一行(保姆级图文)
  20. linux cred管理

热门文章

  1. 360董事长周鸿伟在新员工入职培训上的讲话
  2. Cygwin的安装,卸载,以及安装gdb
  3. soso街景开发——在移动应用(网站)中的应用
  4. C# dataTable 转 IList 问题
  5. Hadoop集群完全分布式模式环境部署
  6. 科大星云诗社动态20210330
  7. 科大星云诗社动态20201122
  8. python数据结构与算法第10讲_python数据结构与算法(10)
  9. Go进阶(2): 变量+数据类型
  10. OpenGL编程指南1:OpenGL简介