比特币
比特币内存池:为何我们需要过滤器
在我之前关于内存池的文章中,我为理解内存池的基本功能以及比特币网络中不同类型用户如何使用它提供了一个简单的概念框架。在本文中,我将探讨中继策略与共识规则之间的差异,并解释为何比特币节点默认不中继某些类型的比特币交易,尽管这些交易在共识层面是有效的。
首先,无论点对点网络是否拒绝中继某些共识有效的交易,如果这些交易最终进入矿工的内存池并被选中纳入区块,它们将在节点收到该区块时被接收和下载。除非通过共识规则的变更使这些交易类在共识层面无效,否则没有任何因素能阻止这一过程。
存在不同类型的过滤器,用于不同的目的。三种常见的过滤器类型分别是:保护节点(因此也保护网络)免受拒绝服务(DoS)攻击的过滤器、保护未来软分叉升级钩子的过滤器,以及温和地劝阻一些比特币用户可能不喜欢但对个别节点或网络没有严重危害的行为的过滤器。
拒绝服务攻击向量
比特币节点是运行在计算机上的计算机程序。这意味着它们有着任何计算机上运行的程序的技术限制,包括存储、内存、处理能力等限制。这也是引入并维持区块大小限制的根本原因,目的是为了创建一个全球性的限制,使得对普通设备的验证成本保持在合理范围内。
这一类过滤器的设计目的就是确保即使在区块空间有限的情况下,单个交易的创建也不会消耗过多节点资源。
这类过滤器的一个简单例子就是交易传播所需的最低费用率,以及替换支付费用(RBF)规则,规定何时可以用同一交易的不同版本替换之前的版本,也就是说,只有在支付比上一个版本更高的费用时才可以替换。一旦你为一笔交易签名并支付费用,你就承担了这个费用。除非你进行双重支付,否则任何接收到该交易的矿工都可以将其挖掘并收取这笔费用。唯一避免支付该费用的办法就是先在其他交易中花费你的UTXO(这同样需要支付费用)。
这样做的原因是为了防止拒绝服务攻击。如果没有必须支付的费用,用户就可以随意创建无数个交易的变种,并向网络中每个节点的内存池发送垃圾信息,从而消耗带宽和内存。如果不加以限制,他们就可以永远这样做下去。网络中的节点要么会直接崩溃,要么带宽费用会变得如此高昂,以至于用户无法承受。
另一类交易受到中继策略过滤的例子是验证费用高昂的交易。有些交易可能会非常昂贵,验证起来需要大量的计算资源。有些区块的创建会导致普通消费级硬件上的比特币节点花费超过一个小时来验证。这是通过创建大量自定义脚本来完成的,这些脚本会尽可能多地进行签名检查,并将区块填满这些交易。
这样的脚本结构已经被构造出来,并在不同类型的机器上进行了验证时间测试,但由于显而易见的原因,开发者并没有公开这些脚本的确切结构。这些交易实际上有可能让整个网络陷入停滞。
另一个拒绝服务保护的例子是尘埃限制。创建低于尘埃限制的UTXO的交易不会被中继,因为花费该UTXO的费用将高于该输出的比特币数量。这使得花费这些UTXO没有经济效益,并且不太可能被花费,意味着UTXO集合将永远存储这些输出。这可能会导致UTXO集合膨胀,使得区块验证变得更加计算密集。
未来软分叉
所有比特币协议的重大升级都通过软分叉进行,软分叉是一种允许以兼容方式向协议添加新脚本功能的升级机制,这样未升级的节点仍然能接受这些新功能作为有效。
这是可能的,因为比特币脚本中包含“未定义”的操作码,这意味着它们的任何使用都自动被认为是有效的,因为当前没有为其定义验证规则。当人们升级他们的节点来强制执行新规则时,升级后的节点将会应用这些新规则,而未升级的节点则会接受这些操作码的任何使用。只要矿工在所有节点都完成升级之前不挖掘违反新规则的交易,每个人就能保持在同一条区块链上,一切都是向后兼容的。
使用这些未定义操作码的交易会被中继策略过滤。这么做是为了确保比特币协议在未来能够继续升级。
如果用户创建了使用这些未定义操作码的UTXO,例如与已定义的操作码组合在一起,这样它们就无法被任何人花费,那么如果这些未定义操作码在软分叉中被赋予验证规则,那么这些UTXO将变得无法花费。交易脚本的结构将无法满足软分叉期间应用的新验证规则。
允许这些交易传播并被确认,可能会使使用未定义操作码的UTXO引发未来的软分叉升级哲学难题,即是否进行升级,或者使某些用户的比特币无法花费。
劝阻
有些类型的交易,尽管不会对网络上的节点造成实际危害,即不会导致节点崩溃、不会使用过多的内存或资源,但仍然被网络中大量用户视为不受欢迎或违背比特币主要目的的行为。
这样的交易的例子包括利用大规模OP_RETURN输出或在见证字段中进行铭文操作,向区块链写入任意信息。这些交易被劝阻,因为它们不被视为比特币网络的主要使用案例。
并非所有事情都是相同的
这些不同类别的过滤器在中继策略中是非常清晰且截然不同的。并非所有的中继过滤器存在相同的原因,也并非所有的过滤器都涉及相同的激励机制来鼓励矿工挖掘(或不挖掘)它们。每种过滤器都有其特定的目的,旨在保护你的节点或区块链免受不同类型的损害,或是避免一些不受欢迎的行为。
所有过滤器并不相同,它们所过滤的内容也有巨大的差异。从可能导致网络崩溃的问题交易(这些应该在共识层面解决),到仅仅是劝阻那些人们觉得不受欢迎但不会造成实际危害的交易。
理解这些差异非常重要。例如,如果用户支付费用,矿工可能会挖掘一个简单的不受欢迎的交易,但没有理智的矿工会构建并挖掘一个充满可能导致整个网络崩溃的交易的区块。这将破坏他们的投资。