作者:Kiara Bickers
比特币内核的安全模式依赖于这种基本的博弈理论 —— 矿工会拿着自己的电子镐子、无情地追逐利润;并且,正是这种追逐让网络安全。标准的挖矿作业需要生产区块来赚取区块奖励和交易手续费,但你是否想象过矿工可能有别的办法来从区块链中抽取价值?区块链上是否有别的获利机会,是矿工可以凭借自身的优势地位来利用的?
什么是 “MEV”?
在工作量证明系统中,“矿工可抽取价值(Miner Extractable Value,MEV)” 指的是矿工可以通过在自己挖掘的区块中排序、排除、重组和替换交易来获得的收益。不过,因为以太坊升级到了 “以太坊 2.0”,将网络迁移到了 “权益证明(proof-of-stake)” 系统,MEV 的概念就得到了一个新的名字,现在在权益证明系统中,指的是 “最大可抽取价值”。在这个语境下,取代了矿工的区块的提议者(block proposer)—— “见证者” —— 有机会抽取这些价值。
在这些网络中,矿工(或者以太坊 2.0 中见证者)在以区块形式确认交易时有特殊的角色。他们的位置,让他们可以抢在其他用户前面,并且让他们可以决定区块链上的交易的 最终 排序。在区块内,交易一般来说是根据从高到低的手续费来排序的,但总是有那么一些时候,矿工可以通过策略性地改变交易排序来获得 额外 的利润。
你可能会问,这有什么坏处呢,只是矿工赚取了额外的一点利润而已?仅在一部分矿工装备了更高级的分析能力和更强大的计算能力、可以比其他人更高效地定位和利用 MEV 利润机会时,问题才会浮现。
这些机会不会永远唾手可得,但是,通过分析区块链可以获得的收益越大,装备了机器人的研究团队就越有动力去做这样的分析。长此以往,矿工盈利能力的差异会在网络中创造出中心化的趋势。最终侵蚀区块链的核心原则:去中心化。
这正是比特币的开发者社区思考如何在比特币上释放更强的表达能力时希望避免的事情。
为什么我们想要可编程的货币?
以往,比特币一直以相对简单的智能合约来运作。但是,哪怕是处理稍微复杂一点的交易,这种模式也会束手束脚。Bitcoin Script 只能验证身份鉴证数据,并没有能力为交易施加速率限制,也不能定义资金的最终目的地,因为 Bitcoin Script 不能访问交易数据。
另一个某种程度上独立的问题是,开发和编写比特币智能合约对于没有完全掌握其安全要求的用户来说会很难。一个提议中的特性,叫作 “保险柜(vault)”,致力于通过引入带有时间锁条件的交易来解决这一痛点。本质上,保险柜可以作为一种紧急的 “逃生舱”,让用户可以在私钥被盗时复原资金。但这样的特性,仅在我们的编程语言拥有更强的表达能力时才能实现。
以太坊协议就因为其高度灵活的脚本编程能力而知名,但也明显受困于 MEV 。绝大部分用户一般假设比特币没有 MEV,即与以太坊截然相反:以太坊被视作狂野的边疆。但真是这样的吗?
更有表达力的智能合约是否一定带来更多 MEV 场景?
已知有多种因素催生了 MEV:(1) 透明的交易池;(2)透明的智能合约;(3)智能合约的表达能力。每一个因素都给 MEV 打开了新的窗口;我们会逐一辨析。
坏的:(1)透明的交易池
与比特币网络的 “交易池” 一样,绝大部分区块链的交易池是完全透明、开放、可见的,每个人都能看到哪些交易在等待区块确认。比特币区块一般来说要花 10 分钟才能挖出,理论上,矿工有同等的时间来抢跑(front-run,抢在其他用户前面)。
但在现实中,比特币区块链没有 MEV 的源头,因为:(1)比特币交易足够简单,矿工之间不会有巨大的分析能力差异;(2 )比特币交易一般来说不会执行多种资产的交易,比如资产互换和可以被抢跑的开放式交易。
以太坊则相反,其区块链上的公开去中心化交易所(DEX)可以执行一些最复杂的多资产交易。一般来说,以太坊的出块时间是 15 秒钟,但在交易池流量高涨的时候,要让交易立即得到确认所需的 gas 费用(以太坊类型的系统中的交易手续费)可以轻松超过 100 美元。结果是,低手续费的交易的等待时间会以分钟甚至小时为单位。这就给了这些邪恶的抢跑活动很长的时间窗口,又因为以太坊上的各种 layer-2 token 包含了巨大的价值,这样的活动已经变得非常普遍。
译者注:在本文中,关于 “token”,作者一直使用同一种表述 “layer-2 token”,这个词应该更倾向于我们所说的 “链上 token 协议” 的意思,而非 “代表 layer-2 项目价值的 token” 的意思(在以太坊等平台,这样的 “layer-2 项目” 很多)。
译者注:作者在这里的论证是没什么道理的。交易池透明或不透明,并不决定是否会出现 MEV 机会,只是决定这些机会向哪些人开放。设想一种完全不透明的交易池(比如一种侧链的交易池),也完全可以想象其中存在 MEV 机会,但只有能够看见交易池的区块打包者才能看见并利用这样的机会。
坏的:(2) 透明的智能合约
比特币的 “智能合约” 是得自 Bitcoin Script 的简单锁定和解锁机制。交易的细节(价值、发送者、接收者),在区块链上都是公开可见的。虽然从隐私的角度看,这种完全透明很不理想,但这也是比特币能让网络的所有参与者都验证区块链的完整状态的原因之一。任何观察者都能分析这些合约细节,可能让特定的 MEV 策略有机可乘。
但比特币的脚本编程语言,是有意设计得非常局限的,主要关注发送和接收资金的基本功能,以及用签名或者哈希锁来验证交易。这种简单天生限制了 MEV 的施展空间,让这样的机会相对(其它区块链)来说更加少见。
像以太坊、Solana 和 Cardano 这样的平台,都有完全透明的智能合约,但它们与比特币不同的是,它们都有非常复杂、富有表达能力的脚本编程语言。它们的 “图灵完备” 的系统在理论上可以执行几乎任何计算任务,包括:自执行的合约、通过断言机集成真实世界的信息、去中心化应用(dApp)、token、DEX 中的资产互换,还有自动化做市商(AMM)。它们加在一起,给 MEV 带来了肥沃的土壤。基于零知识证据的方案,例如 STARKex,理论上可以避免部分问题,但需要付出额外的复杂性。
丑陋的(3):智能合约表达能力
在某些区块链上,MEV 机会是如此丰裕,以至于一些 “MEV 交易公司” 的月利润高达 “五六位数”。这个趋势是如此显著,以至于出现了公开的数据网站,专门扫描以太坊和 Solana 区块链上的获益机会。他们的盈利能力来自于执行全套 MEV 策略:抢跑、尾随、三明治攻击(结合抢跑交易和尾随交易,将受害者的交易夹在中间)、token 套利,以及清算,等等。每一种策略都利用了不同的原理。
在 layer-1 和 layer-2 上都可以用的部分 MEV 策略:
- 广义的抢跑:机器人扫描交易池中的可以获利的交易,然后在原交易前抢先执行一笔交易,获得收益。
- 三明治攻击:攻击者在一笔大额交易的前面和后面各安排一笔交易,通过操纵资产价格来获得收益。这种策略利用了大额交易所导致的可预测的价格变动。
仅对 layer-2 token 和智能合约有用的特定策略:
- 在不同 DEX 之间套利:机器人利用同一资产在不同 DEX 之间的价格差异来获利,即低买高卖。
- 尾随 DeFi 自适应价格曲线(Bonding Curve):MEV 机器人通过尾随在自适应价格曲线上的大额交易之后成交而获利;在自适应曲线上,大额交易会对价格产生可预测的影响;MEV 机器人可以在价格上涨趋势中买入,在有利可图时卖出。
- DeFi 清算:MEV 机器人瞄准 DeFi 借贷协议中的机会:在这些借贷协议中,担保品的价值如果低于某个门槛,他人就可以用更低的价格免到这些被清算的担保品。
合约的复杂性还显著催生了与 MEV 相关的难题。
- 重入攻击:这种攻击利用了智能合约账户的逻辑漏洞,让攻击者可以在调用智能合约账户的一个函数完成之后重复调用,从而多次取出资金。在 MEV 语境下,有经验的攻击者可以从中获得巨量收益,尤其是在那些保管了大量资金的合约中。
- 互联的合约与全局状态(Global State):在以太坊这样的平台中,智能合约账户是可以互动的,因此一笔交易就可以触发多个合约账户之间的连锁反应。这种互联特性让复杂的 MEV 策略成为可能:发到一个合约账户的一笔交易可能影响另一个合约、带来了获益机会的连锁反应。
这里,部分问题在于,由 token 以及建立在这些 token 之上的 dApp 的总价值可能会超过区块链在 layer-1 上的原生资产的价值,从而减少出块者仅仅基于手续费来挑选和确认交易的激励。
让事情变得更糟糕的是,许多这样的机会并不严格属于出块者。其他拥有 MEV 扫描机器人的参与者也可以竞争同一个机会,导致网络拥堵、gas 费用飙升。这种情形给网络和用户带来了负外部性 —— 所有人都受到更高的交易手续费的影响,因为区块链变得更加低效、用起来更贵。DeFi 中的 MEV 机会极为普遍,以至于用户已经几乎接受了它、把它当成了对所有人的一种隐形税收。
那么,这些 MEV 机会是高表达能力的智能合约的天然副产品吗,还是说,有别的路径可以走向完全可编程的货币的梦想呢?
除了远离高表达能力的智能合约和 layer-2 token 协议,用户还可以通过使用支持 “机密交易” 的协议(比如 Liquid)来避免部分风险;这种技术会隐藏交易的细节。但与这些拥有更高表现力编程语言的平台不同,比特币还缺乏实现我们所期待的可编程货币的能力。
好的:可编程货币的取舍
在考虑比特币上的智能合约的进化时,我们拥有的选择有:(1)将复杂性放到链下;(2)谨慎地集成狭窄的、或者说局限的 “限制条款(covenant)” 功能;或者(3)拥抱最大表达能力路线。我们再逐一辨析。
(1)链下合约的一种新结构:ANYPREVOUT
链下的解决方案,比如闪电网络,旨在强化比特币的可扩展性和功能性,而避免加重主链的负担,保持链上交易快捷且便宜。这些目标听起来都很好。
SIGHASH_ANYPREVOUT(APO)是一项关于新型公钥的提议,这种公钥让对交易的某些调整可以在签名后发生(而不使签名作废)。这一提议简化了更新交易的方式,让交易可以更容易地索引前序 UTXO,让闪电网络通道可以更快、更便宜、更安全,也更直接(尤其在解决通道参与者分歧的时候)。
说到底,APO 是一种新的 sighash 标签。每一笔比特币交易都必须有一个数字签名来证明其合法性。而在创建签名的时候,你会使用 “sighash 标签” 来说明自己签名的是交易的哪些部分。有了 APO,发送者可以只签名交易的所有输出,而不签名交易的输入,从而只固定交易的输出,但不固定资金来自哪笔前序交易。
APO 带来了 Eltoo,它让用户可以在链下交换预先签名的交易(译者注:具体来说,它实际上是让用户不必保留对手以往签过名的交易,只需保留最新一笔)。不过,因为 APO 让交易可以重新排序,它可能会意外带来 MEV。只要你允许一个签名绑定到一个交易图,那么你就有能力切换交易。输入是可以切换的,只要新的输入依然跟签名兼容。
(2)限制条款:CAT + CSFS 和 CTV
限制条款让用户可以控制资金转移到哪里去,可以为交易中的资金施加取款速率约束或设置特定的目的地。有两种类型的限制条款:递归的、非递归的。
- 递归的限制条款让资金可以回到同一类型的限制条款的约束下。
- 非递归的限制条款限制了这种控制能力,要求预先完整定义资金的未来转移路径。
CAT + CSFS 是一种限制条款提议,让脚本可以构造(或者说定义)未来一笔交易的特定部分。CHECKSIGFROMSTACK(CSFS)会验证对一个数据的签名,而 OP_CAT 可以构造这样的数据。通过使用 CSFS 来要求签名与 OP_CAT 动态构造出的数据相匹配,我们可以定义这些 UTXO 在未来可以如何花费,并创造出一种递归限制条款(虽然有些笨拙)。
OP_CHECKTEMPLATEVERIFY(CTV)则是一种创建非递归的限制条款的方法。它不会定义和验证一笔交易的特定部分,只是约束资金可以如何花费。它定义的是下一笔交易必须符合的 “模板”。
递归限制条款的一个风险在于,它可能会带来一种情形:资金必须服从一组规则,并且困在一个循环中不断重复、不得逃脱。另一个风险在于,因为限制条款是透明的,也是自执行的,可能会在比特币上打开一些已经在其它链上看到过的 MEV 机会。
那么好消息是什么呢?
好消息是,这些提议都会带来新的表达能力!
那么,我们可以得到的表达能力极限在哪里?
(3)全面表达能力:Simplicity
Simplicity 是一种基于区块链的编程语言,它跟其它脚本编程语言都不同,它是非常底层的。它不是建立在 Bitcoin Script 之上的一种语言,也不是 Bitcoin Script 中的一种新的操作码,而是 Bitcoin Script 的一种替代。理论上,Simplicity 内部可以实现所有的限制条款提议,并实现密码朋克们希望可编程货币拥有的许多其它合约,但其负外部性会比以太坊更少。
视频:https://youtu.be/n4iLNNF3sU0
Simplicity 保持了比特币的自包含交易(self-contained transactions)的设计哲学,即,程序不能访问交易之外的任何信息。从最强表达能力和安全性的设计目的触发,Simplicity 支持形式化验证和静态分析,给了用户更加可靠的智能合约。
Simplicity(Simfony) | CAT + CSFS | CTV | 以太坊 | Solana | Cardano | |
---|---|---|---|---|---|---|
模式 | UTXO | UTXO | UTXO | 账户 | 账户 | EUTXO |
图灵完备性 | 否 | 否 | 否 | 是 | 是 | 是 |
支持递归合约 | 是 | 是 | 否 | 是 | 是 | 是 |
允许静态分析 | 是 | 部分 | 部分 | 否 | 否 | 部分 |
允许形式化验证 | 是 | 否 | 否 | 否 | 否 | 是 |
Bitcoin Script 的限制条款提议,虽然比 Simplicity 更加简单,但也缺乏在 Script 中处理手续费估计的表达能力,因为比特币缺乏算术函数。Bitcoin Script 没有乘法和除法,也没有条件或堆栈操作操作码;为给定的一个合约(或者限制条款)估计合理的手续费也非常困难。用户最终会得到意大利面条一样的代码,其中 80% 的逻辑都用来推测合理的手续费是多少。这会让这些限制条款合约非常复杂并且难以分析。
以太坊虚拟机有循环构造,让 gas 用量的静态分析非常困难。但在 Script 和 Simplicity 中,你只需统计有多少操作码,或者说递归地把每一个函数的代价加起来,就可以了。因为 Simplicity 有一个形式化模型,你可以形式化分析程序的行为。但在 Script 中,这是做不到的,虽然你可以静态分析资源的用量。
Simplicity 将给用户提供最大程度的表达能力,以及其它有价值的特性,比如静态分析和形式化验证。用户会被鼓励(而非限制)开发抵抗 MEV 的智能合约。此外,不同合约的结合可能会带来 MEV,即使它们中的每一个自身都不会。这代表了一种根本的取舍。
视频:https://youtu.be/rv1YNI-0BXk
增强比特币的智能合约功能的想法无疑前景光明,而且令人兴奋。但重要的是知道,所有这些提议都会带来一定程度的 MEV 风险 —— 虽然不至于到其它区块链的那个程度。在我们思考如何为比特币加入更多可编程特性时,我们要回答这些问题:
- 我们能够开发出没有 MEV 风险的协议吗,还是说这是一个无法企及的理想呢?
- 给定许多提议的内在的 MEV 风险,何种程度是可以接受的?
- 最后,最简单、但能带来最大表达能力的提议是哪一个?
每一项提议都会有自己的优点和缺点。但是,不论我们采取什么方向,我们的分析都应该最先考虑安全性、支持去中心化的原则。
注:本文最初发表于 Bitcoin Magazine。
(完)