本文深入探讨了最大可提取价值(MEV)的概念及其对以太坊的影响,详细介绍了MEV的类型、交易过程、涉及的风险以及如何通过Flashbots和QuickNode的Merkle.io插件保护用户交易的隐私和安全。该指南不仅包括技术原理的解释,还有实际操作示例,使用户能够有效地应对MEV带来的挑战。
如果你对 MEV(最大可提取价值)感兴趣或者想要深化理解,你来对地方了!
在本指南中,我们将探讨 MEV 的主题,并发现它如何塑造并影响今天的以太坊。之后,我们将讨论如何通过使用来自 QuickNode Marketplace 的 Merkle.io 附加组件 保护自己免受 MEV 的影响。
依赖项 | 版本 |
---|---|
node.js | 18.13.0 |
ethers | ^6.9.0 |
在我们深入了解 MEV 之前,先介绍一些关于以太坊上交易和区块处理的基础概念。
当用户启动区块链交易,比如转移代币或执行智能合约上的某个函数时,他们会指定收件人的地址、交易费用以及一些任意数据。这笔交易会通过节点(如 QuickNode)广播到区块链网络,网络节点会验证其基本参数。验证后,交易进入节点的内存池,这是所有未确认交易的保存区域,节点开始将这笔交易广播给其部分节点。
从内存池中,矿工(在工作量证明系统中)、验证者(在权益证明系统中)或构建者(即 MEV 机会搜索者)选择要包含在下一个区块中的交易,通常偏好那些费用较高的交易。一旦一组交易被包含在区块中并且该区块被挖掘,区块会被广播到网络中的其他节点进行验证,并将继续在其上进行构建。
MEV,也被称为最大(或矿工)可提取价值,现在在工作量证明或权益证明的区块链中都很明显(例如,比特币和以太坊)。简单来说,MEV 可以被描述为从交易排序中无权限提取的总价值的衡量(即,没有任何特殊特权)。
通过这种能力,矿工/验证者(在不久的将来我们将发现谁还参与其中)可以在生成区块时提取额外的经济收益,超出所产生的费用和收入。额外收益从何而来呢?实际上,通过重新排序区块、插入自己的交易或排除(审查)一些交易,你可以发现可以利用的套利机会。
你可能会想,这些区块生产者怎么会这么聪明,能发现这些套利机会?在大多数情况下,并不是他们。相反,这些机会是由其他实体(即第三方如“搜索者”)竞争而来的,他们在链上和链下运行自动化机器人(算法),计算哪个交易排序将最大化他们的利润。今天,大多数套利机会都来自个人/实体与 DeFi 协议(如 Aave、Uniswap、Balancer 或类似分叉)互动的场景。
现在,让我们深入了解今天 MEV 捕获的不同套利机会。
在深入我们今天看到的常见 MEV 类型之前,我们应该注意,并非所有 MEV 尝试都成功,而且大多数情况下,机会是与其他 MEV 搜索者竞争的。
假设你是一位计划在去中心化交易所(DEX)上购买大量某种加密货币的交易者(即,无论是什么你内心的渴望)。当你的交易被发送到节点并广播后,你的交易进入内存池,但仍然保持未确认状态,直到矿工或验证者将其包含在区块中。交易的候补区是 MEV 搜索者(或为简便在本指南中的"搜索者")的用武之地。这些搜索者不断监控内存池,寻找潜在的套利机会。当他们发现你的大型交易正在待处理时,可以执行称为抢跑的策略。其技术的展开如下:
这一利润本质上是通过利用你待处理交易的信息实现的套利机会。他们利用交易启动和确认之间的时间差来为自己谋取利益,常常以普通用户诸如你面临糟糕交易执行为代价。也很可能,这个搜索者是许多意识到潜在利润并且必须与其他搜索者竞争的其中之一(减少他们的利润,因为可以预见出现Gas出价战,将利润减少到潜在的零)。
尽管上述示例展示了通过交易套利可能获得的收益机会,区块提议者还会寻找其他抢跑机会,例如,当用户调用某个智能合约的方法后,发现其所拥有的资金比开始时要多。这通过模拟用户所调用的交易实现(即使区块提议者并不完全理解交易),检查用户是否最终会拥有更多资金,然后尝试在用户之前进行抢跑以首先捕获机会。
提示
你还可以通过调用 RPC 方法 - txpool_content 实时查看以太坊内存池中的待处理和排队交易(或其他支持 Geth 的区块链)。
尾随是抢跑的相反,区块提议者将他们的交易 positioned 在重要交易之后,利用潜在的价格差异和交易所之间的套利机会。
以下是成功的套利交易案例,其中一位投资者通过利用 Uniswap 和 Sushiswap 之间 ETH/DAI 交易对的价格差异将 1,000 ETH 转换为 1,045 ETH - Etherscan 链接。
以太坊和其他区块链上的链上借贷协议通常是开源的,有清算引擎可以被任何人执行。帮助促进协议正常运作的用户通常会从其需要偿还的抵押品中获得一些收益。在此过程中,MEV 搜索者利用与抢跑相同的技术,搜索内存池,分析并试图首先捕获这一套利机会。
JIT 流动性的核心是指在交易所需的确切时刻为 DeFi 协议或流动性池提供流动性的策略,而不是将资金无限期地锁定在池中。
它是如何工作的?这类似于搜索者过滤内存池以找到可能显著影响流动性池价格的大型交易。一旦识别,搜索者迅速执行交易以向相关池添加流动性(因此称为“准时”)。一旦大型交易使用搜索者提供的流动性得以执行,搜索者可以从池中提取流动性,并获得交易费用和/或滑点的收益。
要查看 JIT 交易的实际例子,请检查 Etherscan 上的一组交易。1. 添加流动性 2. 交换 3. 移除流动性。在这种情况下,这三笔交易发生在同一个区块,第 13733864 号区块,并以连续的方式执行。JIT 流动性提供者将这些交易组合在一起,并通过 Flashbots dispatch 方法发送。通过对交易规模和此特定时期流动性分布的先前了解,JIT 提供者能够,也可推测准确确定预计的费用收入以及这一交易活动对其持仓的影响。
上述提到的 MEV 类型只是部分清单,其他类型的机会可能仍会被发现。也就是说,MEV 搜索者利用 MEV 的一个巨大优势是 延迟。搜索者或机器人不断减少延迟,为那些想借此获利的参与者创造竞争环境。
另一种类型的 MEV 攻击称为“时间强盗攻击”。顾名思义,这种 MEV 套利试图重写历史,以利用 EVM 的状态。如果矿工/验证者发现他们所提议的区块收益远低于该区块可以产生的 MEV,那么矿工/验证者可以尝试破坏共识并重写区块,以便为自己获取生成的 MEV。
现在,你可能已经意识到 MEV 的风险以及它如何影响最终用户,但让我们重述一下。
网络拥堵和交易成本增加:MEV 策略通常涉及区块空间的竞拍,因为 MEV 行为者竞争希望首先包含他们的交易。这可能导致网络拥堵和交易费用增加,影响所有网络用户。失败的 MEV 交易占比很大,浪费了区块空间和高昂的Gas费。
中心化与审查风险:MEV 可能导致权力在少数复杂参与者(如矿工、验证者或大规模机器人)之间的集中。这种集中与区块链的去中心化理念相悖。MEV 已经提取了数十亿美元的价值,并将继续如此。尽管新的研究公司和协议正在开发解决方案以减轻此问题,但今天的问题依然存在。例如,今天运行中间件(以最大化他们的 MEV 利润)的大量验证者拥有 OFAC 制裁的地址列表,从而审查交易并妨碍以太坊的中立性。查看 MEVWatch 创建的仪表板,该仪表板显示了当前审查交易的验证者。
隐私损失:由于 MEV 行为者监控内存池中的机会,用户的隐私可能面临降低的风险。交易细节暴露,用户的意图可能被预测并可能被利用。
虽然这一切看起来很危险,你可能会想...我对加密和 Web3 整个玩累了!等一下;还有一些解决方案。让我们来深入研究。
Flashbots 是一个研究和开发组织,处于 MEV 的前沿,旨在减轻其负面外部性。
Flashbots 已构建出一套 RPC 套件,允许以太坊用户获得抢跑保护、可配置的隐私和执行能力,并能够内化他们创造的 MEV。他们是怎么做到的呢?他们筛选所有交易并检查它们是否需要 MEV 保护。如果交易类型通常不会产生 MEV,它将自动发送到公共内存池。相反,如果交易有可能产生 MEV,则只与 Flashbots Builder(仅构建部分所有以太坊区块)共享。此外,如果交易生成了任何 MEV,你将通过 MEV-Share 得到多达 90% 的回报。MEV-Share 是 Flashbots 开发的一款产品,旨在将 MEV 重新分配回创造它的方。
Flashbots 还构建了另一个重要部分以确保以太坊上的 MEV,名为 SUAVE(价值表达的单一统一拍卖)。SUAVE 将内存池和区块提议者角色从现有的区块链中解绑,并提供一种专门的去中心化即插即用替代方案。随着时间的推移,SUAVE 将逐步去中心化,加强其可信性,并扩展其功能。
你可以通过以下 MEV-Explore 仪表板 查看和分析以太坊上生成的 MEV。探索页面,你会看到有许多有利可图的 MEV 机会(历史最高达到 300 万美元+),同时也意识到很多搜索者为非常少的钱(比如说 5-10 美元)竞争。
Flashbots 还提供了一个开源客户端(从 Geth 派生)叫做 MEV-boost,该客户端允许验证者通过将区块空间出售给开放市场的构建者来最大化他们的质押奖励。
幸运的是,QuickNode 用户可以轻松地将 MEV 保护集成到他们的交易工作流程中。由 Merkle.io 提供的 MEV 保护与私密强化交易 RPC 附加组件 易于集成,并抽象出了将交易发送到受保护的隐私敏感交易内存池的复杂性。只需将 RPC URL 添加到你的 Web3 钱包(例如,MetaMask、Coinbase Wallet、Rabby),它就会用其各自的等效方法覆盖他们的 eth_sendRawTransaction
RPC 调用(请查看支持的方法列表 这里)。
提示
在这里注册 可免费使用 QuickNode Merkle MEV 保护与私密强化交易附加组件
此外,一些 DeFi 项目正在开发抵抗 MEV 攻击的智能合约和后端。这些协议可以包括如交易批处理、随机交易排序或加密交易等方法,以防止抢跑。目前实际上实施 MEV 保护的项目包括 matcha.xyz 和 CowSwap。
使用私密和 MEV 保护的交易网络(内存池)的主要目的是保护你的交易免受 MEV 引起的负面外部性。并非所有交易都需要 MEV 保护。例如,如果你想将 ETH 发送或转移 NFT(或可替代代币)给他人,你不需要担心 MEV。然而,正如我们在上面讨论的那样,如果你正在进行一些金融活动(即,交换代币,或在借贷协议中借出资金),则应该保护自己(或你的用户)。
现在,实践一下,演示如何创建一个在 Uniswap 上交换代币的交易,并通过 QuickNode 通过 Merkle.io 发送以便获得 MEV 保护。如果你不知道 Uniswap 是如何工作的,建议查看他们的 文档 和此 QuickNode 指南。
首先,确保你已启用 附加组件。你可以通过创建一个新终端并在创建过程中添加附加组件,或通过导航至你的终端的 附加组件 选项卡来启用它。请注意,在撰写本文时,该附加组件目前仅在以太坊主网、BNB 链主网和 Polygon (PoS) 主网上受支持。
接下来,打开终端窗口并运行以下一组 bash 命令:
mkdir defi-swap-protect && cd defi-swap-protect && echo > index.js
初始化一个 npm ESM 项目:
npm init es6
然后,安装所需的依赖项。我们将使用 Ethers.js 来帮助构建我们的交易并将我们的区块链编码值转换为可读格式。
npm install ethers
打开我们之前创建的 index.js 文件,插入以下代码:
import { ethers } from 'ethers';
import link_abi from './link.json' assert { type: 'json' };
import swap_abi from './abi.json' assert { type: 'json' };
// 设置提供者
const provider = new ethers.JsonRpcProvider(QUICKNODE_HTTP_URL);
// 使用私钥和提供者设置钱包
const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
// 合约详细信息
const swapContractAddress = '0xE592427A0AEce92De3Edee1F18E0157C05861564'; // 主网地址
const wethAddress = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'; // 主网地址
const linkAddress = '0x514910771AF9Ca656af840dff83E8264EcF986CA'; // 主网地址
const swapContract = new ethers.Contract(swapContractAddress, swap_abi, wallet);
const linkContract = new ethers.Contract(linkAddress, link_abi, wallet);
// 交易参数
const fee = 3000;
const amountIn = ethers.parseEther('1');
const amountOutMin = 0
const deadline = Math.floor(Date.now() / 1000) + 60 * 10; // 10 分钟后
const sqrtPriceLimitX96 = 0;
// 交换负载
const payload = {
tokenIn: linkAddress,
tokenOut: wethAddress,
fee: fee,
recipient: wallet.address,
deadline: deadline,
amountIn: amountIn,
amountOutMinimum: amountOutMin,
sqrtPriceLimitX96: sqrtPriceLimitX96
}
// 准备交换和批准数据
const transactionData = swapContract.interface.encodeFunctionData('exactInputSingle', [payload]);
const linkApprovalData = linkContract.interface.encodeFunctionData('approve', [\
swapContractAddress,\
amountIn\
])
// 发送交易
async function sendTransaction() {
try {
let count = await provider.getTransactionCount(wallet.address)
const chainId = await provider._network.chainId
const approve_sign = await wallet.signTransaction({
to: linkAddress,
data: linkApprovalData,
gasPrice: ethers.parseUnits("25", 'gwei'), // 根据网络当前Gas费调整
gasLimit: 300000, // 硬编码的Gas上限,可能需要更改
chainId: chainId,
nonce: count
})
await provider.send('eth_sendPrivateTransaction', [approve_sign])
console.log("批准交易已发送")
count = await provider.getTransactionCount(wallet.address)
const swap_sign = await wallet.signTransaction({
to: swapContractAddress,
data: transactionData,
gasPrice: ethers.parseUnits("25", 'gwei'), // 根据网络当前Gas费调整
gasLimit: 300000, // 硬编码的Gas上限,可能需要更改
chainId: chainId,
nonce: count
})
await provider.send('eth_sendPrivateTransaction', [swap_sign])
console.log("交换交易已发送")
} catch (error) {
console.error('发送交易时出错:', error);
}
}
sendTransaction();
请花点时间查看代码注释,以更好地理解正在发生的事情。如前所述,如果希望更好地了解在去中心化交易所(如 Uniswap)上交易,请查看我们的 DeFi 指南。
稍后,请将 QUICKNODE_HTTP_URL 和 YOUR_PRIVATE_KEY 替换为我们实际的端点和私钥(持有 ETH 用于支付Gas费)。请注意脚本顶部的 ABI 导入。你需要在同一目录下添加这些文件,并将 ABIs(以 JSON 格式)添加到该文件中。你可以从 Etherscan 的合约选项卡中获取 ABI。此外,正如之前所述,你的 QuickNode 端点应该已启用 Merkle.io MEV 保护附加组件。通过导航到你的终端的 附加组件 选项卡并验证它是否在“已安装的第三方附加组件”列表中来确认。
现在,是时候让脚本投入使用了。在项目目录中的终端窗口中运行以下命令。
node index.js
你可以通过查看交易发送者的地址在区块浏览器(如 Etherscan 或 beaconch.in)验证交易是否已确认。
如果你想了解更多关于 DeFi 的内容,请查看此 策划列表 的指南。
尝试进行简短的测验,以测试你的知识!
🧠知识检查
最大可提取价值 (MEV) 主要关注区块链交易中的什么?
仅从交易费用中提取的总价值 从交易排序中提取的总价值的衡量 由区块链挖矿活动产生的价值 加密货币交易的收入
现在就到这里!但我希望你的 MEV 旅程不会到此结束!如果你渴望更多,请告诉我们。无论是进行的一部分 2 深入探讨,还是构建自己的 MEV 机器人操作指南,你的反馈会影响我们未来的内容 ❤️
订阅我们的 新闻通讯,以获取更多关于 Web3 和区块链的文章和指南。如果你有任何问题或需要进一步的帮助,请随时加入我们的 Discord 服务器或使用下面的表单提供反馈。通过关注我们的 Twitter(@QuickNode)和 Telegram 公告频道 保持信息通畅和连接。
让我们知道 如果你有任何反馈或新主题的请求。我们很想听到你的声音。
- 原文链接: quicknode.com/guides/eth...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!