比特币开发者指南--操作模式

来源:互联网 发布:新东方游学数据 编辑:程序博客网 时间:2024/06/06 13:21
操作模式

目前客户端验证块链主要有两种方法:全节点和SPV客户端。不讨论其他方法,如服务器信任方法,因为它们不被推荐。

全节点

第一个也是最安全的模式是Bitcoin Core,也被称为“厚”或“全链”客户端。该安全模型通过从创世块开始下载并验证块一直到最近发现的块来保证块链的有效性。这被称为使用特定块的高度来验证客户端对网络的视图。

去欺骗一个客户端,对手需要提供一个比当前真实的链更难的完整的替代性的区块链历史记录,这在计算上是昂贵的,因为最具累积工作量的链被定义为是真实的链。由于在链的尖端生成新的块所需的计算难度,欺骗一个完整节点想获得确认非常困难。这种形式的验证对于sybil攻击是高度抵制的 - 只需要一个诚实的网络 节点,以便接收和验证真实块链的完整状态。


简化支付验证(SPV)

在原始比特币白皮书里面详述的另外一种方式是在初始同步过程中只下载块头,当需要时候再从完整节点获取交易信息。与块链的高度线性匹配,每个块头只有80个字节,或每年就4.2MB,而不管块的总大小。

如白皮书所述,块头中的merkle跟以及merkle分支可以向SPV客户端验证嵌入在区块链中的一个区块的问题交易。这并不能保证所嵌入的交易的有效性。相反,它展示了执行重复花费攻击所需的工作量。

块链中的块深度对应于在特定块之上构建的累积难度。SPV客户端知道merkle根和关联的交易信息,并从完整节点请求相应的merkle分支。一旦检索到merkle分支,证明块中的交易的存在,则SPV客户端可以查看块 深度作为交易有效性和安全性的代理。插入无效交易的恶意节点对用户的攻击成本与构建在该块之上的累积难度增长,因为恶意节点需要单独将是挖掘这个伪造的链。

SPV潜在弱点

如果简单地实现,SPV客户端有一些严重缺陷。

首先,虽然SPV客户端不容易被欺骗,认为交易处于块中,但不是这样,反之亦然。完整节点可以简单地忽略,导致SPV客户端认为没有发生事务。这可以被认为是拒绝服务的一种形式。一个缓解策略是连接到一些完整的节点,并将请求发送到每个节点。然而,这可以被网络分区或Sybil攻击所击败,因为身份基本上是免费的,并且可能是带宽密集型的。必须注意确保客户端不会与诚实的节点切断连接。

其次,SPV客户端仅从与其拥有的密钥相对应的完整节点请求交易。如果SPV客户端下载所有块,然后丢弃不需要的块,这可能会带来极大的带宽。如果他们只是通过特定的事务向块请求完整的节点,那么这样就可以获得完整的节点公共地址 t3 >对应于用户。这是一个很大的隐私泄漏,并允许客户端,用户或地址的服务拒绝服务的策略,这些操作不满足运行完整的节点,以及琐碎的连结资金。客户端可以简单地垃圾邮件发送许多假事务请求,但这在SPV客户端上造成了很大的压力,最终可能会破坏瘦客户端的目的。

为了减轻后一个问题,已经实现了Bloom filter作为一种混淆和压缩块数据请求的方法。

布鲁姆过滤器

布鲁姆过滤器是用于测试元素成员资格的空间高效概率数据结构。数据结构以牺牲规定的假阳性率为代价实现了巨大的数据压缩。

一个Bloom filter作为一个n位的数组全部设置为0。选择一组k个随机散列函数,其中每个函数输出1和n范围之间的单个整数。

在Bloom filter中添加元素时,元素将分别进行哈希散列,而对于每个k个输出,该索引处的相应的Bloom filter位将被设置为1。

通过使用与之前相同的散列函数来完成Bloom过滤器的查询。如果在bloom filter中访问的所有k个比特被设置为1,则这很可能表明该元素位于该集合中。显然,通过在域中添加其他元素的组合,可以将k个索引设置为1,但参数允许用户选择可接受的假阳性率。

删除元素只能通过废除bloom filter并从头重新创建来完成。

布鲁姆过滤器的应用

而不是将错误的阳性率视为责任,它用于创建一个可调参数,表示所需的隐私级别和带宽权衡。SPV客户端创建他们的布鲁姆过滤器,并使用filterload消息将其发送到完整节点,该消息为需要的交易设置过滤。命令filteradd允许向筛选器添加所需的数据,而不需要发送一个全新的布隆过滤器,而filterclear允许连接恢复为标准块发现机制。如果滤波器已经被加载,那么完整的节点将发送一个块的修改形式,称为merkle块。merkle块只是块头和其中与设置 Bloom filter相关的merkle分支。

SPV客户端不仅可以将交易作为元素添加到过滤器,还可以将公钥,签名脚本和pubkey脚本等等。这使得P2SH事务查找成为可能。

如果用户更加隐私意识,他可以将布鲁姆过滤器设置为包含更多的误报,牺牲了用于事务发现的额外带宽。如果用户的带宽预算紧张,他可以将假阳性率设置为低,知道这将允许完整的节点清楚了解与他的客户端相关的交易。

资源: BitcoinJ是基于SPV安全模型和布鲁姆过滤器的比特币的Java实现。用于大多数Android 钱包。

Bloom filter通过BIP37进行标准化。查看BIP的实现细节。

未来建议

在区块链中有未来的建议,例如未花费交易输出UTXO承诺,为需要的客户找到更满意的中间地带块链的完整副本,或相信大多数连接的节点不在说谎。UTXO承诺将使使用块链中认证的数据结构的非常安全的客户端使用有限量的存储。然而,这些类型的提议是在非常早的阶段,并且将在网络中产生软分叉。

在实施这些类型的操作模式之前,应该根据可能的威胁模型,计算和带宽约束以及比特币值的责任来选择模式。

资源: UTXO承诺上的原始线程,经过身份验证的前缀树BIP提案。
原创粉丝点击