区块链和加密货币中的前运行是什么?

  • cyfrin
  • 发布于 2024-11-03 16:36
  • 阅读 12

本文深入探讨了区块链和加密货币中的前运行(front-running)现象及其工作原理,介绍了最大可提取价值(MEV)和区块链内存池(mempool)的概念,并探讨了如何防止前运行攻击的策略。同时,文中还通过示例和代码分析了MEV的实际应用和潜在风险。

区块链与加密抢跑交易 - 什么是及其如何运作?

在加密或区块链中,抢跑交易发生在某人故意在你之前将交易放入区块,以试图提取一些价值。

在加密中,抢跑交易发生在某人故意在你之前将交易放入区块,以试图提取一些价值

例如,假设你在一家面包店排队,面包师傅的牌子写着:

“我将以50%的折扣出售下一块派!”

你感到兴奋,因为你是下一个!于是你走上前去订购并购买你的派,但在最后一秒,某人插队,在你说话之前,他们买下了最后一块派并走了!

这是一个在现实世界中被抢跑交易的例子,在区块链和加密货币世界中,这种情况时常发生,通常造成的损失不仅仅是错过一块派。

例如,如果矿工注意到某个特定加密货币代币的大额买单,他们可能会首先插入他们的买单,验证较大的买单,并因此获得套利。让我们探讨一下这是如何发生的。

在深入探讨加密抢跑交易之前,我们需要了解MEV,即最大可提取价值,这是加密和区块链中抢跑交易的主要原因和用例之一。

如果你愿意,可以前往Cyfrin Updraft课程,在那里我们将更深入地讨论什么是MEV和加密抢跑交易,并向你展示如何在智能合约代码库中发现该问题。

什么是加密中的MEV?

MEV代表“最大可提取价值”(之前称为“矿工可提取价值”),这是指 区块链节点运营商和验证者通过以特定顺序对区块中的交易进行排序来提取的价值

区块链上的节点最终被选中“构建区块”,这就是他们获得挖矿或验证区块的时刻。当轮到他们时,他们可以选择进入区块的交易顺序。

在EVM世界中,人们会在交易中发送小费以确保他们能够被纳入。节点想要那些小费,因此他们优先选择将交易放入区块。然而,他们并不保证将交易置于区块中的具体位置。

抢跑交易是MEV的经典例子。在抢跑交易中,区块构建者将他人的交易放在你的交易之前。值得注意的是,这个节点可能是抢跑交易你的那个人,或者另一位用户看到你的交易并贿赂一个节点(通过小费)将他们的交易放在你的前面。

一个人如何抢跑交易你的方法:

  1. 一个节点选择将区块链交易放在你的交易前(通常出于自利的动机)
  2. 用户支付给节点额外的钱,以使他们的交易在你的交易之前

现在,你可能会问:

“等一下,用户怎么可能贿赂一个节点,把他们的交易放在我的前面?他们能在交易被纳入之前看到我的交易吗?”

答案是,有时你的交易在 区块链内存池 中是公开信息

什么是区块链内存池?

一项交易被发送到一个节点,该节点将进行挖矿/验证并将其包含在一个区块中,这是加密抢跑交易的第一步

一项交易被发送到一个节点,该节点将进行挖矿/验证并将其包含在一个区块中。

正如我们在关于什么是内存池的指南中解释的,当区块链交易发起时,它被指向一个特定的节点,该节点没有立即将其集成到其区块中,而是将其放入其“内存池”或'mempool'。这构成了促进区块链架构所需的底层工作。

图像显示节点将他们的内存池列表发送到其他节点,以增加交易被挖矿/验证的可能性,这被抢跑交易机器人使用

节点将他们的内存池列表发送到其他节点,以增加交易被挖矿/验证的可能性。

如我们所知,以太坊是一个权益证明区块链,节点基本上“轮流”构建区块。因此,如果你将你的交易发送到一个节点,该节点将不得不等到它的轮次来将其包含在内!这可能需要几个月!因此,节点接受你的交易,并且通常会将你的交易“分发”给其他节点。

如果是其他节点构建区块的轮次,如果你在交易中带来了足够的小费(gas),该节点将把你的交易包含在区块中。

因此,这个“内存池”就像交易的等候室。

由于区块链节点会将他们的内存池传递给其他节点,世界上通常可以看到待处理的交易!因此,用户可以查看内存池,寻找即将盈利的交易,复制它们,并进行抢跑交易!

抢跑交易和MEV示例

让我们看一个例子。在下面的视频中,我们实时展示了如何被抢跑交易。你将看到一个MEV机器人拿走了50美元(他们花费了45美元的gas仅仅是为了拿走我的50美元)。

我没有被FLASHBOTS抢跑交易! - YouTube

Patrick Collins

162K 订阅者

我没有被FLASHBOTS抢跑交易!

Patrick Collins

搜索

信息

购物

点击静音

如果播放不开始,请尝试重启设备。

你已登出

你观看的视频会被添加到观看历史中并影响电视推荐。要避免此情况,请在计算机上取消并登录YouTube。

取消确认

分享

包含播放列表

检索共享信息时发生错误。请稍后再试。

稍后观看

复制链接

观看

0:00

/ •实时

在YouTube上观看

假设我们有以下代码库:

// SPDX-License-Identifier: MIT
pragma solidity 0.8.18;

contract WithdrawMe {
    error BadWithdraw();

    bytes32 public s_secretHash;

    event success();
    event fail();

    constructor(bytes32 secretHash) payable {
        s_secretHash = secretHash;
    }

    function withdraw(string memory password) external payable {
        if(keccak256(abi.encodePacked(password)) == s_secretHash){
            (bool sent, ) = msg.sender.call{value: address(this).balance}("");
            if(!sent){
                revert BadWithdraw();
            }
            emit success();
        } else {
            emit fail();
        }
    }

    function balance() external view returns(uint256){
        return address(this).balance;
    }
}

这个代码库有一个 withdraw 函数,其中 调用者 必须输入一个 密码,该 密码的哈希 必须与合约中存储的哈希匹配。

对于人们来说,强行破解密码是_非常_困难的,因此只有知道密码的人_应该_能够调用它。

然而,当某个人用正确的密码调用 withdraw 函数时,那笔交易数据将进入内存池,并且其他人可以看到它!如果一次withdraw涉及大量资金,其他人就会高度激励抢跑交易这个提取交易,使用相同的数据!

这张图片展示了它的样子:

一个MEV机器人在内存池中看到这笔交易,复制它,并贿赂一个节点进行抢跑交易,使他们的交易优先

这种通过扫描区块链内存池“预见未来”的能力使抢跑交易和MEV机器人成为可能。

抢跑交易是MEV最常见的形式之一,但还有其他形式,例如:

  • 尾随交易
  • 三明治攻击

要深入了解,请访问Flashbots.net,这是一个研究和开发组织,致力于对抗MEV的负面影响。他们的“初识MEV”页面尤其是一个出色的学习资源。

如何保护自己免受加密抢跑交易的影响

三种主要策略解决了如何保护自己免受MEV和抢跑交易的影响

  1. 设计你的协议以抵抗MEV
  2. 使用私有RPC
  3. 不将你的内存池分发给其他节点

设计你的区块链协议以抵抗MEV

所有协议至少应尝试设计其协议以抵抗MEV。对于我们上面的例子,我们可以添加一个访问参数,以使其更具MEV抵抗力。

address owner = ;

function withdraw(string memory password) external payable {
    if(msg.sender != owner) { revert(); }

访问控制可能并不适用于每个协议,因此协议通常需要更聪明。对于像Uniswap这样没有MEV预防的协议,交易容易受到巨大的MEV和抢跑交易攻击。在Cyfrin Updraft T-Swap课程中,我们讨论了滑点保护以及如何确保DEX和AMM的安全。

在Uniswap中,交换功能如下所示:

ISwapRouter.ExactInputSingleParams({
                tokenIn: DAI,
                tokenOut: WETH9,
                fee: poolFee,
                recipient: msg.sender,
                deadline: block.timestamp,
                amountIn: amountIn,
                amountOutMinimum: 0,
                sqrtPriceLimitX96: 0
            });

里面有很多参数,但其中许多参数是为了防止MEV而设计的。这个交换意图是将 amountIn 的DAI兑换为其等值的WETH,给recipient造成的WETH,并支付 pool fee。然而,仍然有更多参数;以下是每个参数的用途:

  • deadline : Unix时间,一旦过了这个时间,交换将失败,以防止长期待处理交易和价格剧烈波动。例如,恶意节点想等到找出从发送者交换中获利的方法之后再发送交换。
  • amountOutMinimum : 在我们的示例中,它被设置为零,这是一项重大风险,在任何审计中都应被标记。如果有人滥用AMM在我们的交易进行之前崩溃价格,我们可能会得到一个糟糕的汇率!因此,当我们交换时,我们希望说“我想发送 amountIn DAI,并期望至少获得 amountOutMinimum WETH的回报”。这将帮助保护我们免受试图给我们更糟糕价格的抢跑交易者。
  • sqrtPriceLimitX96 : 我们将其设置为零 - 这使得此参数无效。在生产中,此值可以用于设置交换将推动池的价格限制,这可以帮助保护价格影响或在各种与价格相关的机制中设置逻辑。

这些机制通常被称为“滑点保护”,在Solodit上搜索该术语会给你提供一个巨大的智能合约安全问题列表,这些问题可能源自不保护滑点。

有时,协议会发现调整智能合约不够,像CoW Swap这样的协议采取了更高水平的方法来预防MEV,这需要对交换的工作方式进行完全重新设计。

使用私有RPC

下一个最受欢迎的方法是使用“私有RPC”或“暗池”。

当你通过你的MetamaskTrezor或你使用的任何加密钱包发送交易时,钱包的幕后是一个端点或RPC,你的交易数据被发送到这里。这个端点连接到一个节点(例如,在Alchemy、Infura等),该节点将分发你的交易到其他节点。

相反,你可以将你的交易发送到一组承诺不进行MEV或抢跑交易的节点,这些节点不会与其组外的节点共享交易细节。这些不会查看你的交易或分发交易详细信息的节点的端点被称为“私有RPC”或“暗池”。

一些最受欢迎的私有RPC包括:

这些服务中的每一个对问题的解决方案略有不同,有些*仍然*****对你进行抢跑交易,但将大部分MEV的奖励发还给你。

初看,这可能似乎是你总是选择的选项,但有一些注意事项。

  1. 你的交易将更慢地被纳入,因为处理你交易的节点数量少得多
  2. 你必须对这些服务相互信任,它们会如它们打算的那样行事,而不是抢跑交易你

摘要:加密中的抢跑交易是什么

在本文中,我们讨论了加密抢跑交易是什么及其如何运作,为了理解抢跑交易,我们不得不学习多个方面:

  • 什么是MEV
  • 什么是内存池
  • 如何保护自己免受MEV和抢跑交易的影响
  • 抢跑交易的一些示例

加密或区块链抢跑交易是指一个节点在你的交易之前将一个交易订单纳入区块。这通常是为了获得一些奖励或报酬。

  • 原文链接: cyfrin.io/blog/what-is-b...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
cyfrin
cyfrin
Securing the blockchain and its users. Industry-leading smart contract audits, tools, and education.