作者:Gloria Zhao
来源:https://bitcoinops.org/zh/newsletters/2023/06/14/
本文为 Gloria Zhao 在 Optech Newsletter 上编写的 “交易池” 系列周刊的第五篇。
在本系列文章的开篇,我们提到,比特币的隐私和抗审查特性,都来自于网络的去中心化。用户运行自己的节点的习惯,减少了单点故障、监视和审查。这又来自于比特币节点软件的首要设计目标:运行节点是非常轻松的。如果每个比特币用户都需要购买昂贵的硬件、使用特定的操作系统、每个月支出数百美元的运营成本,那网络中的节点数量可能会大大减少。
此外,比特币网络中的节点就是一台计算机,它使用互联网跟陌生人的节点相互连接;这些陌生人可能会对这个节点发送 “拒绝服务式(DoS)” 攻击:发送会导致这个节点耗尽内存然后宕机的消息、使用无意义的数据耗费这个节点的运算资源和带宽从而使之不能接收新区块。因为这些陌生人都是匿名的(系统本身就是这样设计的),节点无法在连接之前预先断定哪个对等节点是诚实的、恶意的;而且在观察到攻击之后也无法有效地绝交。所以,实现保护节点免受 DoS 攻击的交易池规则,不仅是一种理想,更是一种现实需要。
节点实现中内置了通用的 DoS 保护措施,以防止资源耗尽。举例来说,如果一个 Bitcoin Core 节点从单个对等节点处收到许多消息,那么它会仅处理第一条收到的消息、将其余的消息放到一个待处理队列中,等其他对等节点的消息到达之后再处理。类似地,节点一般会先下载一个区块头,待验证完这个区块头的 “工作量证明(PoW)” 之后,才下载和验证完整的区块。因此,任何希望通过区块转发来耗尽这个节点的资源的攻击者,都必须先花费不成比例的大量资源计算出一个有效的 PoW ,然后才能施行攻击。PoW 的高昂计算成本和微不足道的验证成本,提供了一种应对区块转发 DoS 的天然方法。但这种特性无法延伸到 未确认的 交易的转发中。
通用的 DoS 保护措施并不能提供足够多的抗性,让一个节点的共识引擎可以放心地暴露在点对点网络中接收输入。攻击者可以尝试制作一个计算任务极为繁重、但在共识上有效的交易,就像区块 #364292 处出现的这笔 1MB 的 “巨型交易” 一样,因为签名验证中的哈希运算量呈平方级膨胀的问题,它需要反常的长时间来验证。攻击者也可以制作一个只有最后一个签名无效的交易,让节点在这笔交易的验证上花费大量的时间,直到最后才发现它是个垃圾。在这样浪费时间的时候,节点会推迟处理新的区块。你可以想象,某个矿工可以针对自己的对手发起这样的攻击,从而在下一个区块的挖掘中获得 “起跑优势”。
为避免处理计算量非常繁重的交易,Bitcoin Core 节点为每一笔交易施加了一个体积限制和签名操作(“sigop”)数量限制,这个限制比共识规则在区块层面实施的限制更为严格。Bitcoin Core 节点也对祖先交易包和后代交易包的体积施加限制、让区块模板的生产和驱逐算法更加高效,同时还会约束交易池插入和删除操作的计算复杂度(更新一笔交易的祖先和后代集合就涉及这样的操作)。虽然这意味着一些合法的交易可能不会被接受和转发,但预计这样的交易是罕见的。
这些规则都是 “交易转发规则” 的案例 —— 节点在共识规则要求之上,对未确认的交易施加的额外验证规则。
默认情况下,Bitcoin Core 节点不会接受手续费率低于 1 聪/vb 的交易(“minrelaytxfee”),也不会在检查完这个要求之前验证任何签名,也不会在交易池接受一笔交易之前转发这笔交易。从某种意义上说,这个手续费率的规则,是在为网络验证和转发的工作设置一个 “价格” 的下限。不挖矿的节点不能收到手续费 —— 交易只会给确认它的矿工支付手续费。但是,手续费代表了攻击者的成本。如果有人要通过发送大量的交易来 “浪费” 网络的资源,那么 TA 最终将因为手续费而耗尽资金。
Bitcoin Core 所实现的 “手续费替换(Replace by Fee)” 规则要求替换交易支付比跟它直接冲突的任一笔交易更高的手续费率,同时还要求它所支付的手续费总额也要比任一笔竞争交易更高。而且,额外支付的手续费除以替代交易的虚拟体积,必须至少是 1 聪/vb 。换句话说,无论原版交易和替代交易的手续费率的绝对水平如何,新交易都必须为自身所耗费的网络带宽支付至少 1 聪/vb 的 “新” 手续费。这个手续费规则的首要顾虑不是激励兼容性。相反,它是为重复的交易替换施加一个成本下限,以阻止浪费带宽的攻击,比如,每笔替换交易只多付 1 聪手续费的攻击。
完全验证区块和交易的节点,需要包括内存、运算力、网络带宽在内的资源。我们必须保证资源要求处于较低水平,从而让节点容易运行,并保护节点免受轰炸。通用的 DoS 保护措施是不够的,所以节点需要在验证未确认交易时,在共识规则之上应用交易转发规则。但是,因为这样的规则不是共识的一部分,两个节点可能会使用完全不同的规则,但依然能对链的最新状态达成共识。下周,我们会讨论作为个人选择的交易池规则。