这是一篇技术文章,获取比特币的工做知识。html
一个完整的节点,好比比特币核心,知道如下几点:后端
这须要大量的数据被下载,存储和索引。 可是,若是不须要完整的块链,则有一些快捷方式能够减小冗余信息的数量。网络
SPV提供了一种方法,能够肯定某个特定的事务处在块链中的块中,而不须要整个块链被下载。 它这样作以下:区块链
一个梅克尔树是一种数学模型,其中块是在顶点,全部的交易获得安置在一个树状结构。网站
一个梅克尔树证实是全部的顶点(块),叶(交易)之间的散列的列表。 梅克尔树证实的一点是,您只须要一小部分的块来证实交易在块中。code
所以,当一个钱包说它使用SPV时,它意味着在它相信一个交易以前,它会检查:htm
交易是“好”,将被添加到钱包。索引
不少人都问咱们,为何咱们只支持HD账户(即在正常的说法账户1)。事务
主要缘由是因为咱们如何从比特币核心节点得到咱们的交易。 咱们使用一种称为布隆过滤的技术。 咱们不要求直接交易,而是咱们给比特币核心节点,咱们知道会匹配全部咱们感兴趣的(加上一些误报把任何间谍失去了线索一点点)交易的过滤器。get
仅支持一个账户就意味着为主地址和更改地址的地址数量不断增长建立过滤器。 这开始为“数百”,随着钱包的使用,将变成“数千”。
将其扩展到支持任意数量的账户意味着建立匹配的过滤器:
帐户数量x(主要地址+更改地址)
所以,咱们必须过滤以匹配更多的地址(咱们认为),咱们几乎能够得到完整的块。 这使得咱们至少像比特币核心节点同样慢,并且咱们上传很是宽泛的过滤器的速度更慢。
咱们认为这样作太慢而无用,因此咱们将使用限制在一个帐户中。
咱们没法访问使用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
收购了。