【比特币】SPV是如何工作的
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是如何工作的的更多相关文章
- Rust 实现一个简单的区块链
一.背景 近期用 Rust 实现了 Jeiwan/blockchain_go,与原项目相比没有加入新的功能,只是换了一个编程语言实现了一遍,源码放在 Github 上. 开发这个项目,花费了好几个周末 ...
- cpp 区块链模拟示例(四) 区块链工作量证明
本文主要在之前的区块链原形上添加了工作量证明,并且为后继的交易功能做好准备. 上一个章节我们已经创建了区块链的基本原形,但是区块的哈希计算和加入太过于简单,如果按照这种速度添加区块那么区块链估计一个小 ...
- 比特币运行原理[z]
https://baijiahao.baidu.com/s?id=1581755535769652543&wfr=spider&for=pc 这篇文章主要讲解比特币是什么?它的运行原理 ...
- 比特币_Bitcoin 简介
2008-11 Satoshi Nakamoto Bitcoin: A Peer-to-Peer Electronic Cash System http://p2pbucks.com/?p=99 ...
- 比特币钱包应用breadwallet源码
breadwallet是一款安全.可靠和便捷的比特币钱包,可使用户免于恶意软件和其他应用中常见的安全问题的骚扰,充分利用了iOS提供的安全功能,包括AES硬件加密.app沙盒和数据保护.代码签名以及k ...
- 什么是比特币(bitcoin)
一.什么是比特币? 比特币是一种由开源的P2P软件产生的电子货币,是一种网络虚拟货币.比特币使用遍布整个P2P网络节点的分布式数据库来记录货币的交易,并使用密码学的设计来确保货币流通各个环节安全性.比 ...
- 比特币区块结构Merkle树及简单支付验证分析
在比特币网络中,不是每个节点都有能力储存完整的区块链数据,受限于存储空间的的限制,很多节点是以SPV(Simplified Payment Verification简单支付验证)钱包接入比特币网络,通 ...
- 利用vanitygen生成比特币个性地址的教程
比特币怎么生成地址?大家都知道比特币地址都是以1开头的一串乱码,很多朋友会新建过一排地址然后在里面挑选,下面小编为大家分享下比特币生成个性地址方法. 其实就是使用vanitygen软件来生成个性化 ...
- Tinychain 是比特币的一个简易口袋实现
Putting the rough in "rough consensus" Tinychain is a pocket-sized implementation of Bitco ...
随机推荐
- JProfiler性能分析
之前已经介绍过如何调试本地的JBoss.现在额外一篇文章关于如何远程调试Tomcat的,其实远程和本地的区别不大,主要区别只是,JProfiler的GUI运行在你本地,而JProfiler的Agent ...
- 前端必学库之bootstrap
想要成为一个全栈程序员,其实有很多技术线路.很多人说有了nodejs后,只学JAVASCRIPT就可以了.其实,会NODEJS后端开发,严格来说算是高级前端.就站长个人理解,后端的主流还是4P:jsp ...
- 使用MyEclipse开发Java EE应用:EJB项目开发初探(下)
你开学,我放价!MyEclipse线上狂欢继续!火热开启中>> [MyEclipse最新版下载] 三.EJB 3.x项目中的持久性支持 当创建EJB 3.x项目时,作为选项您可以添加JPA ...
- 逆向路由器固件之SQL注入 Part3
另寻他径 在前面的内容中,我们使用TEW-654TR路由器的tftp服务实现了获取目标的管理权限.但是要是tftp没有开放到外网怎么办?另寻他径:在这一篇中会我们来分析一个web应用上的漏洞. 初步分 ...
- NBUT 1223 Friends number 2010辽宁省赛
Time limit 1000 ms Memory limit 131072 kB Paula and Tai are couple. There are many stories betwee ...
- 在linux中使用终端浏览器w3m
w3m是一个基于文本的网页浏览器,支持多种操作系统,在命令行终端可以很好的支持中文.即使在没有鼠标支持的情况下也可以检查网页的输出. 1. 安装w3m $ sudo apt install w3m 2 ...
- SendTo MD5 - imsoft.cnblogs
SendTo MD5 is a small application that allows you to calculate and compare MD5 checksums of files an ...
- LuoguP4389 付公主的背包【生成函数+多项式exp】
题目背景 付公主有一个可爱的背包qwq 题目描述 这个背包最多可以装10^5105大小的东西 付公主有n种商品,她要准备出摊了 每种商品体积为Vi,都有10^5105件 给定m,对于s\in [1,m ...
- HDU 1232:畅通工程(并查集模板)
畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- CH4302 Interval GCD
题意 4302 Interval GCD 0x40「数据结构进阶」例题 描述 给定一个长度为N的数列A,以及M条指令 (N≤5*10^5, M<=10^5),每条指令可能是以下两种之一: &qu ...