BTC devguide(3)

Operating Modes

比特币软件具有不同级别的安全性和权衡,以验证区块链

Introduction

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

Full Node

第一个也是最安全的模型,其次是Bitcoin Core,也就是“加厚型”或“全链”客户端。 该安全模型通过从创世区块一直下载到最新发现的区块并对其进行验证来确保区块链的有效性。 这被称为使用特定块的高度来验证客户端对网络的看法。

为了使客户蒙骗,对手将需要给出完整的替代区块链历史记录,其历史难度要大于当前的“真实”链,这在计算上是昂贵的(如果不是不可能的话),原因是带有 根据定义,最累积的工作证明是“真实”链。 由于在链的最末端生成新块所需的计算难度,在经过6次确认后,使整个节点处于愚弄状态的能力变得非常昂贵。 这种形式的验证高度抵御sybil攻击-只需一个诚实的网络对等方即可接收和验证“真实”区块链的完整状态。

Simplified Payment Verification(SPV)

原始比特币论文中详细介绍的另一种方法是,客户端仅在初始同步过程中下载块的标头,然后根据需要从完整节点请求交易。 这与块链的高度成线性关系,每个块头仅80字节,或者每年高达4.2MB(与块总大小无关)。

如白皮书中所述,区块头中的merkle根以及merkle分支可以向SPV客户端证明所涉及的事务已嵌入到区块链中的一个区块中。 这不能保证所嵌入事务的有效性。 相反,它演示了执行双花攻击所需的工作量。

区块链中区块的深度对应于在特定区块之上构建的累计难度。 SPV客户端知道merkle根和相关的交易信息,并从完整节点请求相应的merkle分支。 一旦检索到merkle分支,证明了该交易存在于区块中,SPV客户端便可以将区块深度视为交易有效性和安全性的代理。 插入无效交易的恶意节点对用户的攻击成本随着在该块之上构建的累积难度而增加,因为仅恶意节点将挖掘此伪造链

Bloom Filters

布隆过滤器是一种节省空间的概率数据结构,用于测试元素的成员资格。数据结构以规定的误报率为代价实现了很好的数据压缩。

布隆过滤器以n位均设置为0的数组开始。选择了一组k个随机哈希函数,每个函数都输出一个介于1和n之间的整数。

将元素添加到Bloom过滤器时,该元素将分别散列k次,并且对于k个输出中的每一个,该索引处的对应Bloom过滤器位都设置为1。

通过使用与以前相同的哈希函数来查询Bloom筛选器。如果将在Bloom Bloom过滤器中访问的所有k位都设置为1,则很有可能证明该元素位于该集中。显然,可以通过在域中添加其他元素的组合将k个索引设置为1,但是参数允许用户选择可接受的误报率。

元素的删除只能通过废弃Bloom Bloom过滤器并从头开始重新创建来完成

P2P Network

首次启动时,程序不知道任何活动的完整节点的IP地址。 为了发现一些IP地址,他们查询一个或多个硬编码到Bitcoin Core和BitcoinJ中的DNS名称(称为DNS种子)。 对查询的响应应包括一个或多个DNS A记录,其中包含可以接受新的传入连接的完整节点的IP地址

DNS种子由比特币社区成员维护:其中一些提供动态DNS种子服务器,该服务器通过扫描网络自动获取活动节点的IP地址。其他提供静态的DNS种子,这些种子可以手动更新,并且更有可能为非活动节点提供IP地址。无论哪种情况,如果节点在默认的比特币端口(主网络8333或测试网络18333)上运行,都将添加到DNS种子中。

DNS种子结果未经身份验证,恶意种子运营商或网络中间人攻击者只能返回由攻击者控制的节点的IP地址,从而隔离了攻击者自己网络上的程序,并允许攻击者提供虚假交易和块。因此,程序不应仅依赖DNS种子。

一旦程序连接到网络,它的对等方就可以开始向其发送addr(地址)消息以及网络上其他对等方的IP地址和端口号,从而提供了一种完全分散的对等方发现方法。 Bitcoin Core在永久的磁盘数据库中保留了已知对等项的记录,该数据库通常允许它在后续启动中直接连接到那些对等项,而不必使用DNS种子。

但是,对等方通常会离开网络或更改IP地址,因此在成功建立连接之前,程序可能需要在启动时进行几次不同的连接尝试。这会大大增加连接网络所需的时间,从而迫使用户在发送交易或检查付款状态之前要等待。

为了避免这种可能的延迟,BitcoinJ始终使用动态DNS种子来获取被认为当前处于活动状态的节点的IP地址。比特币核心还试图在最小化延迟和避免不必要的DNS种子使用之间寻求平衡:如果比特币核心在其对等数据库中有条目,则它会花费长达11秒的时间尝试连接至少其中之一,然后再返回种子。如果在此时间内建立连接,则不会查询任何种子。

比特币核心和比特币J都还包含到几十个节点的IP地址和端口号的硬编码列表,这些节点在该软件的特定版本首次发布时就处于活动状态。如果没有任何DNS种子服务器在60秒内响应查询,则Bitcoin Core将开始尝试连接到这些节点,并提供自动回退选项。

Reference