SPV是什么
何为SPV
文章的开头首先要明确一个问题,什么是SPV?
SPV是一个典型的区块链的领域知识,SPV的全称叫做 Simplified Payment Verification翻译成中文就叫做“简单支付认证”。
其实对应简单支付认证的是不是还有一个叫做复杂支付认证的东西呢?答案是肯定的。虽然说对应的知识叫做不叫做”复杂支付认证“但是我们还有有必要来了解其概念。 我们都知道,SPV是去中心化的分布式存储结构,一个完整的区块链节点包含以下四个部分(这种节点叫做full Node)
- W -> Wallet
- M -> Miner
- B -> Full Blockchain
- N -> (Network) Routing Node
以上四个节点分别代表了钱包,矿工,完整的取款链数据库和网络路由。虽然是分布式,完全公平的节点,但是受限于网络,机器等具体情况,并不是每个节点都具有完整的这四个部分。特别是Full Blockchain。一个完整的比特币数据库,在比特币网络不断膨胀的今天,已经有数百G之多。实际情况中,很多比特币的节点都运行在老旧的设备上,或者是移动设备上,没办法保存完整的比特币数据库。因为完整的比特币节点可以独立的完成所有交易的校验,对应这种不完整的比特币节点的校验,就就产生了SPV,也就是简单支付验证。
没有完整的比特币数据库的节点就叫做SPV节点,他的验证方式称之为SPV,这种节点相对于Full Node,被称之为轻量级节点。
SPV的认证方式
区别于Full Node,SPV没有完整的比特币数据库,所以他在原理和认证方式上区别于全节点。在Mastering Bitcoin的8.8节,简单支付认证的一节中有这样一句话
SPV 节点只需下载区块头,而不用下载包含在每个区块中的交易信息。由此产生 的不含交易信息的区块链,大小只有完整区块链的 1/1000。
这个说明了,spv如何用更小的空间来保存交易信息。在SPV之前我们有必要回顾一下 区块的数据结构,一般来说一个完整的区块包含如下信息
数据项 | 字节大小 | 字段 | 说明 |
---|---|---|---|
Magic NO | 4 | 魔数 | 常数 |
Blocksize | 4 | 区块大小 | 用字节表示的该字段之后的区块大小 |
Blockheader | 80 | 区块头 | 组成区块头的几个字段 |
Transaction counter | 1-9 | 交易计数器 | 该区块包含的交易数量,包含coinbase交易 |
Transactions | 不定 | 交易 | 记录在区块里的交易信息,使用原生的交易信息格式,并且交易在数据流中的位置必须与Merkle树的叶子节点顺序一致 |
而SPV节点值保存其中的区块头,按照Mastering BitCoin的说法,只保存区块头,可以使的区块大小缩减到完整节点的1/1000以下。
回顾之后开始确认,如何进行SPV
SPV 节点则不能验证 UTXO 是否还未被支付。相反地,SPV 节点会在该交易信息和它所在区块 之间用 merkle 路径建立一条链接。然后 SPV 节点一直等 待,直到序号从 300,001 到 300,006 的六个区块堆叠在该交易所在的区块之上, 并通过确立交易的深度是在第 300,006 区块~第 300,001 区块之下来验证交易的有 效性。
SPV的主要缺点就是只能验证一个交易是存在的,可以通过markle路径来验证,但是它无法验证一个交易是不存在的。
什么是Merkle Tree
在此之前,先解释下上一节中提到的,“通过merkle 路径去验证”。那这个和markel tree有关的信息保存在哪?
答案:保存在区块头中。
区块头中有以下信息
- Version
- Previous Block Hash
- Merkle Root
- Timestamp
- Difficulty Target
- Nonce
解释其中几个概念
区块链,顾名思义就是像链表一样的结构,所以这个Previous Block Hash指向前置区块的Hash,也就是指向父区块
Nonce属于挖矿的知识,可以自行查阅一下。(也叫随机数,是挖矿过程中控工暴力破解出来的随机数)
这里的Merkle Root就是构建Merkle Tree验证路径的关键因素。Merkle Tree是一个二叉树数据结构,不过多解释二叉树。Merkle Tree是在二叉树基础上添加了Hash,所以说这是一种哈希二叉树。
在比特币网络中,Merkle 树被用来归纳一个区块中的所有交易,同时生成整个交 易集合的数字指纹,且提供了一种校验区块是否存在某交易的高效途径。生成一 棵完整的 Merkle 树需要递归地对哈希节点对进行哈希,并将新生成的哈希节点插 入到 Merkle 树中,直到只剩一个哈希节点,该节点就是 Merkle 树的根。在比特 币的 Merkle 树中两次使用到了 SHA256 算法,因此其加密哈希算法也被称为 double-SHA256。
值得注意的是,具体的交易信息hash,都是储存在markle Tree的叶子节点上的,通过两两归并向上,直到归结成一个merkle root。(如果是奇数个节点,则最后一个节点的hash再复制一份,形成偶数节点。)所以一个merkle root就包含了区块中所有交易的信息。需要强调的另外一点是,哪怕是区块中有数万个交易最后求解出来的merkle root也只有32个字节。验证节点(也就是交易存在)的方法就是从root到子节点的搜索过程。
以上述构建的merkle树为例描述这个验证过程(这是个人理解的算法)
假定需要验证的交易是HK
SPV向一个Full Node发送 Block信息和 TXID,查询这笔Txid是否存在在这个Txid里面,Full Node根据Block.Hash值,先找到这个Block,然后遍历Block的Transactions数组(这一点请参考之前的Transactions的解释),可以理解为遍历Transaction.Txid是否一样,如果没有,就直接返回SPV交易不存在,如果有的话,那么就要根据上图的信息,传输HL、HIJ、HMNOP 和 HABCDEFGH的值
所以在难度为logn的状态下验证了交易存在。
相关概念Bloom.
下一篇文章介绍相关概念,布隆过滤器。