本文章探讨了在去中心化金融(DeFi)项目中,交易排序问题所带来的新挑战,特别是前跑和采矿可提取价值(MEV)的相关性。文章从技术角度分析了这些问题的机制,通过具体代码示例说明如何利用交易排序带来的盈利机会,同时,也探讨了反MEV的解决方案,如Flashbots项目,并强调在去中心化环境下代码安全的重要性与挑战。文章结构清晰,内容丰富,适合对以太坊和DeFi有一定了解的读者。
作者:MixBytes团队
本文讨论了 DeFi 项目面临的新挑战之一。在以前的金融现实下,这些问题只困扰非常狭窄的一小部分专家,他们对交易所服务器有优先访问权限。在 DeFi 中,任何用户都可以访问金融 API。在传统交易所,这些 API 通常使用高速通信线路、大量资金的特权访问和专业软件。而在 DeFi 中,任何拥有至少 1 wei 的人都可以算法上获得相同的访问权,API 规范完全开放,所有内容均可免费使用。因此,现在在区块链世界中,同样的交易排序问题适用于所有用户,而且各种以智能合约形式存在的金融工具为不同层次的获利机会提供了许多利用的机会。
目前,以太坊的每日交易量以数十亿美元计,而在区块中占位的竞争已经达到了巨大的价值。在 "Gas拍卖" 中,可以看到交易,其佣金以数万美元计,并且自动交易基金的数量每天都在增加。
这里有一些有趣的内容,我建议深入探讨这个问题...
本文讨论的交易排序问题充分展示了 "黑暗森林" 的概念 - 该术语出现在刘慈欣的《三体》中,我对此书非常钦佩,一个出色的文章(“以太坊是一个黑暗森林”)中对此概念的很准确的提及,激励我写下这篇文章。在这本书中,主要观点是,我们没有看到宇宙中的数百万个发达文明,并不是因为它们不存在,而是因为一旦一个文明揭示了它的存在,它就会立即被更发达的文明摧毁。在 "黑暗森林 "中,只需大喊一声或打开手电筒,恐怖的怪物就会立刻吞噬无防备的流浪者。
区块链网络已经多次表明,如果某种东西可以被利用以获取利润,这种情况迟早会发生。这正是以太坊网络的交易排序所发生的状况,其中任何 "暴露出来 "的获利机会都会立即被更大财力和基础设施的参与者迅速利用。我们来谈谈...
本文要求读者理解以太坊网络和智能合约的运作。
假设我们有这样一段简单的 Solidity 代码(你绝对不应该写出类似的代码):
pragma solidity >=0.7.0 <0.9.0;
contract Test {
bytes32 private hash_of_secret;
constructor (bytes32 _hash_of_secret) {
hash_of_secret = _hash_of_secret;
}
receive() external payable {
// 此函数接收 ETH
// 到合约余额
}
function claim_eth_by_secret(bytes memory secret) public {
// 前提是发送了一个
// 先前保存的哈希的前像
// 将整个余额发送给交易的发起者
// 并销毁合约。
require (keccak256(secret) == hash_of_secret);
selfdestruct(payable(address(msg.sender)));
}
}
当合约被部署时,它将存储仅合约创建者所知道的秘密行的哈希。合约部署后,可以向它发送任何数量的 ETH,这些 ETH 将累积到余额中,并在发送秘密(保存哈希的前像)后,所有余额上的以太币将发送给交易的发起者,然后合约将被销毁。可以认为它是一种“储蓄罐”,里面藏有秘密。
在以太坊中,如果你不是矿池成员,几乎没有机会获得这些 ETH。即使是选择自己如何形成区块的矿池,算法上也存在更强大的参与者 "超越 "区块的机会,如果奖励值得这样做的话。事情是这样发生的:
包含秘密的交易将被发布到内存池,并通过 P2P 网络在整个网络中分发
该交易将被自动分析程序分析,该程序将确定 "是否可以从我自己的地址执行完全相同的交易并获得利润?"。对于我们的交易,答案是肯定的。"秘密 "现在是公开的,任何比我们早发送它的人都将从合约中获得以太。
没有对矿池的访问权限,攻击者只需收取高额的佣金,以确保他的交易将率先发布
直接访问矿池的攻击者保证将其置于块中高于我们的交易
尽管示例中的验证很简单,但你很容易想象可以用任何允许某个 "幸运 "地址获得以太的证明(即:“每一百笔交易中有一笔是赢”的机会,或“最后一个参与者关闭合约并获得该操作的奖励”)。
结果是,一旦网络中出现了某个交易可以获取利润,它将立即被“扫除”,这些想法在很多地方已经游荡了。前段时间,我甚至写过一篇文章《以太干洗工》,关于那些利用“弱”地址上找到的任何代币或以太币的机器人。
随着 DeFi 和套利机会的出现,这种机会大量增加,因为在 DeFi 中也可以通过有利的交易操作获得利润。而金融工具越复杂,套利越复杂,抢跑交易的机会就越多。我们来考虑一个更现实的例子:在两个去中心化交易所(DEX)之间进行套利。
例如,一个套利机器人看到某些 SHITCOIN 在 DEX1 和 DEX2 上的汇率有很大差异,并想同时在两个 DEX 上交换,借用 100ETH 的闪电贷以支付少量佣金(这将允许他们以更大的金额进行交易,获得更大的利润)。该机器人使用一个之前已部署的特殊合约来进行这些操作。它接受来自机器人的多种操作,并在一笔交易中全部执行,步骤如下:
function perform_trade(bytes[] operations) {
// 操作包含序列化
// 对多个 DEX 的调用,
// 交换、闪电贷等,例如:
// 1. 获取 100 ETH 的闪电贷
// 2. 用 DEX1 交换 100 ETH 为 100k SHITCOINS
// 3. 用 DEX2 交换 100k SHITCOINS 为 120 ETH
// 4. 检查滑点(确保 120 ETH > 100 ETH)
// 5. 归还 100 ETH 的闪电贷(利润:20 ETH)
// 6. 将剩余的 20 ETH 转移至机器人地址
}
第四条尤为重要(股票交易中的“滑点”)。通过这种方式,交易者可以防范在交易完成期间价格突变的风险,从而无法获得利润。如果这个检查失败,则整个交易将会被回滚。
在执行第2和第3步操作后,DEX1 上的 SHITCOIN 汇率将上升,而在 DEX2 上将下降,因为 DeFi 中在购买某种代币时,交换池算法上会提高其价格,而卖出时会降低其价格。两个池之间的价格差异将减少,套利可获得的收益也将减少(甚至可能完全消失)。因此,如果在这之前有人执行了类似的交易(可能数量不等),那么后续操作将以不同的价格进行,并且可能会导致滑点检查失败。如果不使用滑点,甚至在价格相反回调时交易时还有损失资金的可能性。
交易分析程序越先进,它能够检测到的潜在利润交易就越多。为了利用出现的“盈利机会”,你可以简单地重复相同的操作(逐字复制调用的字节码),但将地址和签名替换为你自己的。而且,越有可能将你的交易置于所需交易之上,就越有可能将利润提取到自己口袋。
从一方面看,这个软件 “偷走” 了交易者的 “利润机会”,而另一方面,它只是套利的发展 - 因此,又出现了 DeFi 中的一个 "层" ,市场套利者可以在这个层上为交易排序进行博弈。主要受益者当然是矿工 - 对他们而言,这是一块全新的市场和收入,像矿业一样,有时带来巨大的收益。
由于这类市场活动,出现了 MEV 一词。它代表“矿工可提取价值”(Miner Extractable Value),或者更普遍的软件机制是“最大可提取价值”(Maximum Extractable Value)。这个数值意味着通过操纵区块中交易的顺序可以获得的资金量。换句话说,这是一个区块矿工可以获得的利润,前提是他最大化其重新排序交易的能力。
在重新排序交易时,可以采取几种方式:恶意的、公平的和良好的(关于发布交易的用户)。我们想象 txpool 中准备区块的情况,最初是这样的:
[区块开始]
...先前的交易...
tx_orig: profit = 10 ETH, slippage = 3%, gasprice = 20Gwei, result=Success
...接下来的交易...
[区块结束]
然后:
[区块开始]
...先前的交易…
tx_mev: profit = 10 ETH, slippage = 3%, gasprice = 20Gwei, result=Success
tx_orig: profit = 0 ETH, slippage = 3%, gasprice = 20Gwei, result=Failure
…接下来的交易...
[区块结束]
用户希望执行一笔滑点为 3% 的交易,如果未满足该条件,交易失败。抢跑交易者进行了相同的交易,并将其交易置于更高位置。这可以通过设置更高的煤气价格实现,从而实现以太坊上的抢跑交易,而不需要访问矿工的机器。但是一个细心的读者会看到,在我们的示例中,煤气价格并未更改。为什么随后生成的交易被放置在区块中高于原始交易?这是故意为之,用于展示矿工可以根据自身判断更改交易顺序,而不必考虑交易费用,只要来自这些交易的收益高于通常的矿工奖励即可。
这种方法被称为毁灭性的,因为用户受到伤害,他的交易被回滚(尽管他支付了佣金)。这会对市场制造者产生强烈的不必要感,因此,社区正在积极寻找遏制毁灭性 MEV 的办法。不过稍后再说...
[区块开始]
...先前的交易…
tx_mev: profit = 5 ETH, slippage = 3%, gasprice = 20Gwei, result=Success
tx_orig: profit = 5 ETH, slippage = 3%, gasprice = 20Gwei, result=Success
…接下来的交易...
[区块结束]
在这种情况下,用户的交易得以完成。用户没有赚到预计的 10 ETH,但他仍在滑点范围内执行了交易,获得了 5 ETH。其余的利润 (5 ETH) 归抢跑交易者,因为抢跑交易者选择了他的交易参数来不“打破”对于“下一笔”的交易的操作。例如,他操作的小额代币正好使得下一笔交易的滑点标准不会被打破。这是一种“适中”方式,用户感受到的情况远远好于之前的选项。通过毁灭性 MEV,矿工们可能会失去市场,而没有活跃的市场制造者将导致对所有人产生不利影响。因此合作 MEV 选项在长期来看对于我们所有人更为可取。
[区块开始]
...先前的交易…
tx_orig: profit = 10 ETH, slippage = 3%, gasprice = 20Gwei, result=Success
tx_mev: profit = 1 ETH, slippage = 3%, gasprice = 20Gwei, result=Success
…接下来的交易...
[区块结束]
在这种情况下,用户执行了自己的交易并获得了利润,但在其交易被模拟后,可以发现“捡漏”是有可能的。例如,用户并没有所需的金额来将两个池的价格保持在 100% ,在他的交易之后仍然有机会重复相同的操作并获得有保证的利润。这是一种最好得方式,因为它对用户的交易没有影响,所有人都满意。在这种情况下,MEV 作为网络内的套利推动者起到了作用。
在其他文章中,交易排序剥削的类型有所不同 - 有人将“夹击”分离,没有区分合作和毁灭性的方法,但所有这些都是交易排序的剥削。这里我仅提供了一些示例。
每个人都希望打击 MEV。交易者对新“利润机会”的盗取和抢走的利润表示愤慨。用户对那些如果没有在合约中规定的向特定地址发放奖励的交易也感到愤怒。许多矿工也明白,过多的 MEV 会使用户远离 DeFi,导致费用减少。用户错误的剥削占据了不小的影响 - 如果用户例如不小心输入了一个有多余零的金额,而抢跑交易者立刻利用这一点来获取利润,使用户失去了最小的纠正机会。
在集中世界中,抢跑交易是“证券交易委员会禁止的”,每个人都在虚假摇头说不存在 - 你可能在谷歌上找不到任何相关内容。同时,中介可以通过任何方式告知朋友客户的交易信息,而发现这种抢跑交易几乎不可能。在区块链行业中,法律并不在字面上发挥作用,而唯一有效的方法是算法与经济机制,使诚实的行为变得有利可图。只要存在足够的财务激励,矿工从交易排序中获利;如果有机制使获取可比收入变得更加容易和可靠,它就会发挥作用 - 例如,交易者直接支付佣金以保证交易的区块位置,确保更多的收益机会来自煤气拍卖、合作 MEV 等。
这些思想正被嵌入着解决 MEV 问题并确保公平交易排序的项目中。为此方向所做的最重大步骤是在 Flashbots 项目下进行的。在他们的GitHub 上,你可以找到许多有用材料、关于 MEV 交易的分析、一个修改过的 Geth 客户端,允许矿工接受预构建的交易包以获取额外的奖励,以及其他丰富的信息。
Flashbots 的想法如下 - 而不是参与 MEV,矿工可以选择通过交易者的直接支付获得有保证的附加收入,而交易在单独的服务上进行排序 - 中介在哪里,交易者无需看到其他交易即可交易,以此直接支付给矿工(贿赂)之外的煤气资价格。交易结束后,所有交易被打包成一个单一包,矿工必须尽早将其加入区块,而不可以改变任何交易的顺序。一条非常重要的要求是,捆绑中的交易不能回滚,这意味着交易者在未赢得排序拍卖时不会把资金浪费在失败的交易佣金上——因为这些佣金,使新手算法交易者受到了很多伤害。
贪婪的矿工、聪明的黑客、狡猾的算法交易者,所有这些在 DeFi 中的交易排序怪物都是可怕的。他们将吞噬一切,并不允许任何人在去中心化金融的世界中安宁。这真的那么可怕,毫无希望吗?当然,不是!在描述与毁灭性 MEV 抵抗的方法时,常常被忽视的就是,这些只是算法,它们必须对特定情况快速且可预测地做出反应,这意味着它们也可以从相反的方向攻击。因此,要小心,野兽们,即使是更可怕的家伙们会去猎捕,黑暗森林中并非每一个发光的手电筒都是受害者!
任何在金融上的可预测的算法行为都是一个漏洞,可以被利用。了解到抢跑交易者将在某些刺激下采取相同的行动,你可以欺骗他们。一个典型的示例是项目 salmonella。这一技术的作者相当恰当地称之为“有毒代币”,可以用于对 DeFi 算法的其他攻击。其主要思想是创建一种代币,其操作根据调用其函数的对象不同而不同。在 Salmonella 中,transfer() 函数是“中毒”的:
// ...
if (sender == ownerA || sender == ownerB) {
_balances[sender] = senderBalance - amount;
_balances[recipient] += amount;
} else {
_balances[sender] = senderBalance - amount;
uint256 trapAmount = (amount * 10) / 100;
_balances[recipient] += trapAmount;
}
emit Transfer(sender, recipient, amount); // !!! amount !!!
// ...
换句话说,这种代币仅在作者的地址中正常工作,对于其他所有人则仅向接收者的余额转账 10% 的代币,同时发出一个正确的金额事件。MEV 分析器将此代币的交易视为有利可图,因为它依赖于事件中的数据(这比读取余额方便得多)。然后在 Uniswap 和其他项目中用该代币创建了交换池,并融资平衡,以便为 MEV 分析器创造“利润机会”。最终,作者的交易引发了 MEV 抢跑交易者的反应,他们留下了大量以太币在池中,供攻击者提取。这是白帽黑客可观的收入。
当然,抢跑交易者会改善他们的分析工具,并尝试处理这样的攻击,但 DeFi 中的算法正在发展,代币和 DEX 只是首批示例,因为在巨大的 NFT 领域,金融交易同样在进行,MEV 仍有余地。
逻辑中的每一个新复杂性都会为双方利用漏洞打开新机会 - 所以我们将在技术行业中看到 "壳与铠甲" 的持续战斗。与中心化交易所的世界不同,这里没有特权方、中介和纸面机制。这意味着没有限制,任何攻击者都可以随时对任何人发起攻击。在 DeFi 中,任何新攻势都是公开的,并催生越来越多的保护方法,如 Flashbots、保护隐私的算法、声望系统等 - 因此情况并不全是悲观。
即便从道德的角度来看,所有上述内容不能恰当地归类为黑客攻击或合法活动,因为我们无法对矿工规范在区块中包括交易的顺序,也无法阻止程序分析 p2p 网络中的交易并发送我们的交易。法律在这里无能为力,任何用传统方法追击攻击者只会困难、无效,它只是会延迟对抗性算法的开发,因为在这里攻击并不可能被隐藏,它们正被全球大量黑客研究,他们不仅在攻击,也在保护。
如果你认为上述内容都是可怕而难以克服的问题和黑客操控,那么你可能不应进入 DeFi - 去银行把钱存入定期存款。如果你考虑协议破坏的风险或匿名项目团队意外离开的问题,那么去银行更为妥当。如果你认为集中的交易所和银行的承诺比开源的、公开审计的代码更安全,那么你去银行。也许在 DeFi 中,你根本没有立足之地。现在我只想补充几点。
在 DeFi 中,代码安全性无处不在。面对 DeFi 的工作条件,无法如此。它是一个完全开放的环境,无法信任任何一方,无法隐藏任何一点信息。DeFi 发生许多黑客攻击?这是自然:攻击者拥有巨大优势 - 他们能看到 100% 的代码,并能以极大准确性模拟任何攻击,但我们无法将其阻止。攻击者只需找出一个漏洞,而开发者和审计员则需要预见所有问题。任何劣质代码立即被攻击,任何错误都是致命的。真正 - “代码即法律”。
但与此同时,只有在“黑暗森林”的环境中,真正稳定的金融协议才得以诞生。它们将经历严酷的自然选择,而不会有“SEC禁止”、“交易所迅速关闭”、“新闻稿简要提到...”这样的作弊帮助。可悲的是,少数 DeFi 机制将在其中生存下来,但幸存者绝对应当在信息技术时代中操作财政。
免责声明
本网站所载信息仅供教育和参考之用,不应被理解或解释为财务或投资建议。
MixBytes 是一个专家区块链审计和安全研究团队,专门为 EVM 兼容和 Substrate 基于项目提供全面的智能合约审计和技术咨询服务。与我们一起在 X 上关注行业最新趋势和见解。
- 原文链接: mixbytes.io/blog/mev-def...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!