作者:Gloria Zhao

来源:https://bitcoinmagazine.com/print/satoshis-exercise-for-the-reader

比特币白皮书对比特币的核心特性的说明非常清楚:它是免许可的。世界上的任何人,只要加入这个点对点网络并广播一笔交易,就能给另一个人支付(不管他是谁)。工作量证明共识机制甚至让任何人都能成为一个区块生产者,并且意味着:逆转一笔支付的唯一办法,就是控制超过其他所有人的算力。

但是,工作量证明只定义了如何在相互竞争的链条间挑出一个胜出者;它并不能帮助一个节点发现这样一条区块链。如果一个攻击者能够阻止目标节点们知道这些相互见证的链条,那么 “51% 攻击” —— 或者说 100% 攻击 —— 就容易多了。这个发现的工作,就落到了点对点模块上,它杂糅了许多自相矛盾的工作:在一个节点们总是来来去去的网络中,找出诚实的对等节点,但又不能依靠身份认证或者声誉机制;时刻留意区块和交易,但如果收到的大部分数据都是垃圾,也保持淡定;要强壮到能在最极端的敌意条件下生存,又要轻量到能够运行在树莓派(Raspberry Pi)单主板电脑上。

这个免许可的点对点网络的实现细节,在白皮书中毫无着墨,却成了今天的比特币节点软件的复杂性的大头。

过滤器与滥发

比特币白皮书承认公开交易的转发是比特币的抗审查性的基石,但是,关于它应该如何运行,就只有寥寥数语:“新交易会广播给所有节点。每个节点都会收集新交易、打包到一个区块中。每个节点都要持续运算,以为自己的区块找到一个工作量证明。” 1

许多人都觉得中本聪的这个想法很 “有趣”:每个节点都要挖矿。由于挖矿波动性的中心化压力,今天,网络中的绝大部分节点都不挖矿(寻找工作量证明)。也许,这是一个可以接受的结果(甚至是经济激励机制成功运行的结果),我们牺牲了一部分去中心化程度,换来了更多的哈希算力以及由此而来的安全性。然而,如果我们也放弃了交易转发的去中心化,比特币的抗审查性就会崩溃。

但是,我们对交易转发节点的宽阔暂存池的需求,必须根据计算机们每日暴露在免许可的网络中、处理来自匿名对等节点的数据的具体情形来取舍。这种威胁模型是独一无二的,并且需要非常谨慎的编程。

在区块下载方面,一个区块的工作量证明,已经优雅地充任了 “拒绝服务式攻击(DoS)” 的防范措施,以及一种衡量数据有用性的明确方法。相反,待确认的交易数据,是几乎可以免费创建的,而且可能是滥发的(spam)。 比如说,我们不可能知道一笔交易是否满足了其输入的花费条件,除非我们加载(这些输入所指向的)UTXO,这可能需要从磁盘中读取出来。攻击者几乎毫无成本,就能触发这种相对高时延的活动:他们可以创建大体积的交易,使用不属于他们自己的输入,甚至是完全不存在的输入。

对交易的验证步骤,比如签名签名,以及交易依赖性的管理,可以消耗大量计算。很著名的一个例子是,带有大量传统的(隔离见证以前的)签名的一笔交易 ,在某些硬件上可能需要几分钟来验证 2,所以绝大部分节点都会过滤掉大体积的交易。这些资源的消耗不会仅仅局限在节点内部:被一个节点(的交易池)接纳的交易通常也会传播给其它对等节点,使用的带宽将与网络中的节点数量成正比。

节点保护自己的手段是限制未确认交易和验证队列的内存用量、为每个对等节点限制交易的处理速度,并且在共识规则之上实施交易池规则。虽然这些限制,如果没有仔细设计的话,可能会带来审查界面。诸如不下载此前已经拒绝过的交易、限制一个对等节点传输的交易队列的体积、在下载失败之后抛弃请求,这样的简单逻辑都有可能导致节点无法看见某一笔交易。这些 bug ,一旦被有心的攻击者利用,就会变成意料之外的审查界面。

由此可见,虽然不保留彼此重复花费的未确认交易是完全符合逻辑的(因为最终只有其中一笔交易会是有效的), 但是,拒绝重复花费的交易,也就意味着早广播的那笔交易,就能阻止晚广播的那笔交易被挖出(得到区块确认)。而重复花费,也可能是伪造支付的有意之举;或者,当一个 UTXO(未花费的交易输出)属于多个人时,可能有人会利用节点的交易池策略来拖延或阻止其他人的二层协议结算交易被挖出,这被称为 “钉死攻击(pinning attack)”。 那么,节点应该怎么做呢?

这个问题向我们揭示了交易转发的第二个元素:激励兼容性 3。虽然交易手续费在共识上,除了限制一个矿工能拿走多少区块奖励,别无其它意义,但它们在交易池队则中,作为一个衡量有用性的指标,扮演了重大角色。假设矿工们是由经济激励驱动的,节点就能估计哪些交易是最吸引矿工打包的、然后将最不吸引矿工的交易抛弃。如果多笔交易花费了同一个 UTXO,那么节点可以保留最吸引矿工的(打包起来最有利可图的)那一笔。虽然节点并不能收到交易手续费,它们可以将零手续费的交易当成滥发:它们会可能会使用网络资源,但永远不会被挖出,也就是几乎不花费任何成本就能创造出来。

这两个设计目标 —— DoS 抗性和激励兼容性 —— 也有矛盾之处。虽然允许用更高手续费的版本来替换已经出现的交易版本,对矿工有吸引力,但是,只需追加少量手续费就能重复替换交易,也可能会浪费网络的带宽。考虑待确认的交易之间的依赖性,可以带来挖矿收益更高的区块(并启用 “子为亲偿(CPFP)” 特性),但在复杂的交易间拓扑中,也可能会消耗大量资源。

(译者注:CPFP 指通过携带更高费率的子交易来提高打包父交易的吸引力,也即提高父交易的确认优先级。)

在历史上,节点依赖于启发式分析和依赖性限制,它们导致了用户体验摩擦,并且带来了新的钉死攻击界面。跟踪交易族群(cluster)的交易池实现可以更准确地估计激励兼容性,但依然必须限制交易池内的交易间依赖。这些类型的限制为涉及互不信任的多方的交易创造了钉死攻击界面:攻击者可以通过独自用尽配额来阻止参与共同交易的其他人使用 CPFP。

这些问题很容易被轻视:钉死攻击是一种小众的审查攻击类型,只能运用在多方共享的交易中,而且通常只会导致短暂的推迟确认。为了帮助不挖矿的节点节约几个聪的手续费,值得付出努力吗?

那么 Mevil 呢?

多方共享的交易,是基于 UTXO 混合的隐私解决方案以及二层协议的骨架。许多开发工作,都是致力于在二层协议上创建可扩展、隐私和特性丰富的应用;而这些协议会回到一层(也就是区块链内)来结算。一种常用的模式是暂时推迟取款(或者说结算),从而允许参与者们在一个时间窗口内应对其他人的不轨行为。但许多设计 —— 也包括那些用来鼓吹共识变更的设计 —— 都忽略了在这些场景中如何为交易追加手续费的问题。

防止不轨行为的时间窗口,也是攻击者的机会窗口。这两个条件 —— 多方共享交易和防止不轨行为的截止时间 —— 创造了完美的风暴,让钉死攻击能够从暂时推迟交易确认(嗯哼?)升级成潜在的盗窃(不是吧!)。

钉死攻击已经是多年的研究和开发的主题,从中产生除了 “拓扑受限直至确认(TRUC)” 交易格式 4,“支付到锚点(P2A)” 输出类型 5, “临时粉尘”交易池规则 6,“族群交易池” 实现 7,受限的交易包转发 8,以及许多对交易转发可靠性的提升。这些特性的设计目的是为传播共享交易的更高手续费替代版本提高更加强壮的保证。

但是,合理的手续费管理也有代价,比如更大体积的交易、更复杂的钱包软件逻辑、对不太可能发生的罕见情形的处理。想要轻松的捷径,也有,那就是跟一个矿工达成交易:你支付手续费,矿工保证你的交易会被优先打包。这种解决方案可能比使用点对点网络更加可靠 —— 后者可能会因为网络中的节点使用不同质的交易池策略,而有更高的时延和更慢的传播速度。

直接提交给矿工这种手法,可能会被迅速采用,毕竟有商业利益。交易所需要发送大量以,而且,比起优化手续费,可能更偏好可预测的确认时机。热门的应用可能会对钉死攻击不胜其烦,或者希望使用通行的交易池规则所禁止的非标准交易格式。担心量子短程攻击(quantum short-range attacks)的公司们和托管商们可能会跟一个矿工达成私下交易。

随着隐秘的 “矿工可抽取价值(MEVil)” 9 成为矿工保持竞争力的必要手段,比特币网络可能会走向中心化的区块空间经纪人模式。这些服务可能会成为攻击者和政府指令的目标,从而动摇 “无需许可即可成为矿工” 的承诺。

如果交易转发网络对于节点的运营变得无关紧要,那么可能参与其中也会显得毫无必要。在这种假想的未来,我们会不会像今天看待中本聪的想法(每个节点都是一个矿工)那样,认为 “每个节点都转发待确认的交易” 同样不可思议?

讽刺之处在于,挖矿中心化的压力并不起源于串通或监管压力。它竟来自一些理性的捷径:更高效的合约、定制化的转发路径,或者对参与者们有好处的性能优化。没有人能阻止这些合约出现。但我们可以尝试削弱这些私有服务对公开网络的竞争优势:在考虑可能提高 MEVil 潜力的共识变更以前,先驱逐交易池的钉死攻击界面;让公开的交易转发网络,成为竞标区块空间(以及更新竞标)的高效市场。

点对点网络是让比特币的许多核心意识形态获得生命的场所。它也是一个持续的工程挑战,要在节点高效运行、抗审查性、激励兼容性和协议复杂性之间作出艰难的取舍。随着比特币的状态,它只会变得更难。应该如何协调这些相互竞争的设计目标,是留给读者的习题。

(完)

参考文献

1. https://bitcoin.org/bitcoin.pdf

2. https://delvingbitcoin.org/t/great-consensus-cleanup-revival/710中文译本

3. https://delvingbitcoin.org/t/mempool-incentive-compatibility/553

4. https://github.com/bitcoin/bips/blob/master/bip-0431.mediawiki

5. https://github.com/bitcoin/bitcoin/pull/30352

6. https://bitcoinops.org/en/topics/ephemeral-anchors/

7. https://delvingbitcoin.org/t/an-overview-of-the-cluster-mempool-proposal/393?u=glozow中文译本

8. https://bitcoinops.org/en/topics/package-relay/

9. https://bluematt.bitcoin.ninja/2024/04/16/stop-calling-it-mev/中文译本