比特币开发指南——操作模式

当前作为客户端主要有两种验证区块链的方法:完整节点和SPV客户端。其他的如服务器信任方法,因为不建议使用暂不讨论。

完整节点

第一个也是最安全的模型是比特币核心遵循的,也被称为“厚”或“全链”客户端。该安全模型通过下载和验证从创世区块到最新发现的区块确保区块链的有效性。使用特定区块的高度验证客户端对网络的看法。

如果要欺骗客户,对手需要提供一个完全不同的区块链历史,这要比当前的“真”链困难得多。该“真”链是基于具有最大工作证明的链被定义成“真”链的事实的计算力扩展。

由于要求生成新区快的计算力困难,六个确认之后欺骗完整节点代价非常昂贵。这种验证形式可以高度防止女巫攻击——为了接收和验证“真”区块链的完整状态,只要求一个独立网络节点。

《比特币开发指南——操作模式》 image.png

简化的支付验证

在中本聪白皮书中提出的一个替代方案是客户端在初始化同步过程只下载区块的头部,如果需要的话从完整节点请求交易。每个区块头只有80个字节,或高达4.2M每年,而不用管区块总大小。

正如白皮书描述的,区块头部中的merkle root和merkle分支可以证明当前陷入纠纷的交易是被嵌入到区块链上的区块中。这并不能保证被嵌入交易的有效性。相反它展示了实现双花攻击要求的工作量。

区块链中区块的深度对应于构建特定区块顶部花费的累积困难度。SPV客户端知道merkle root和相伴随的交易信息,并从完整节点中请求各自的merkle 分支。一旦merkle分支被检索,证明了区块中交易的存在,SPV客户端然后可以把区块深度看做交易有效性和安全性的代理。插入无效交易的恶意节点攻击用户的成本随着该区块顶部的困难的累积而增加,因此恶意节点独自挖矿这条伪造的链。

潜在的SPV弱点

如果真的实现,SPV客户端有一些重要的缺陷。

首先,SPV客户端不会轻易地被愚弄,认为一个不在区块中的交易是存在的,反过来也不是真实的。完整节点可以简单地省略,导致一个SPV客户端详细交易没有出现。这可被视作拒绝服务的形式。一个缓和策略是连接到大量的完整节点,并给每个节点发送请求。然而这可能被网络分割或巫女攻击打败,因为身份基本上是免费的,并且可以是带宽密集型的。必须注意确保客户端没有和诚实节点切断联系。

其次,SPV客户端只请求与其秘钥对应的完整节点的交易。如果SPV客户端下载所有区块,然后丢弃不需要的,可能会是极度带宽密集型的。如果他们简单地向完整节点请求含有特定交易的区块,这允许完整节点查看与用户对应的公共地址的完整视图。这是非常大的隐私泄露,而且允许拒绝为不被这些运行中的完整节点所喜的客户端、用户或地址服务。客户端可能简单地发送许多伪造的交易请求,但是这在SPV客户端造成了很大的压力,最终可能达到破坏瘦客户端的目的。

为了缓和后一问题,布鲁姆过滤器作为一个混淆和区块数据请求压缩实现。

布鲁姆过滤器

布鲁姆过滤器是一种空间有效的概率数据结构,用于测试元素的成员关系。数据结构以规定的假阳性率为代价,实现了很好的数据压缩。

布鲁姆过滤器开始作为一个n位全部设置为0的数组。一系列k随机hash函数被选择,每一个函数都输出一个独立的从1到n的整数。

当添加一个元素到布鲁姆过滤中时,元素被独立地hash k次,每一次的输出,对应的布鲁姆过滤器位索引被设置成1。

布鲁姆过滤器查询通过使用和之前相同的hash函数实现。如果布鲁姆过滤器中的所有的k 位都被设置成1,说明元素极有可能位于集合中。通过添加域中其他元素的组合,k索引可被设置成1,但是参数允许用户选择可接受的为阳性率。

去除元素只能通过曲线布鲁姆过滤器并从头开始重新创建它来完成。

布鲁姆过滤器的应用

不是把假阳性率视为责任,它适用于创建一个可调的参数,呈现了目标隐私级别和带宽权衡。一个SPV客户端创建自己的布鲁姆过滤器并使用消息filterload发送给完整节点,filterload设置了想要哪些交易的过滤器。命令filteradd允许将想要的数据添加到过滤器上而不需要发送一个全新的布鲁姆过滤器,而且filterclear允许连接到恢复到标准区块的发现机制。如果过滤器已被,全节点将发送一个修改过的区块形式,叫做merkle 区块。merkle区块是简单地具有merkle分支的区块头部和设定的布鲁姆过滤器。

一个SPV客户端不能仅添加交易作为元素到过滤器中,也要公钥、来自签名脚本的数据和公钥脚本以及更多。这使得P2SH交易被发现。

如果用户具有更高的隐私意识,他会设置布鲁姆过滤器添加更多假阳性,以牺牲用于发现交易的带宽为代价。如果用户具有严格的带宽预算,可以把假阳性率设置低一些,不过要知道这将允许完整节点对他的客户端具有什么样的交易一清二楚。

未来提议

这有一些未来的建议,例如区块链中未花费交易输出(UTXO)委托发现一个更令人满意的中间地带,对于需要完整的区块链备份或信任大量已连接的节点没有撒谎的客户端来说。UTXO委托使得一个非常安全的客户端使用有限数量的存储,该存储使用了在区块链中认证的数据结构。这些类型的建议是,然而,在非常早的阶段,将要求网络中的软分叉。

直到这些操作模式的类型被实现,模型应基于可能的威胁模型、计算和带宽限制、比特币值的责任选择。

点赞