MEV,即最大可提取价值,是指区块生产者及其他网络参与者通过选择包含、排除或重新排序区块内交易,在标准区块奖励和手续费之外可获取的利润。它之所以存在,是因为区块空间稀缺,且交易顺序会改变其经济结果。本文解释其机制,梳理 DEX 套利、清算和三明治攻击等常见策略,并展示如何通过可复现的基于 RPC 的流程来衡量排序效应。文章还涵盖缓解方案的权衡,以及如何选择能让你一致地查看待处理交易的基础设施。
MEV 的定义与范围
最大可提取价值(MEV)是指通过包含、排除或重新排序交易,在标准区块奖励和 gas 费用之外,从区块生产中可获取的最大利润。该术语最初代表矿工可提取价值,因为工作量证明矿工控制区块内容。以太坊转向权益证明后,验证者接替了这一角色,因此更广泛的术语“最大可提取价值”现已成为标准。
MEV 不是特定智能合约中的漏洞。它是任何区块链的经济属性,只要某一方对交易排序拥有自由裁量权,且待处理交易在被打包前可见。这使得它与以太坊、Solana、具有中心化排序器的 L2 rollup 以及大多数其他执行环境相关,尽管具体机制有所不同。
本文侧重于机制、常见策略,以及使用标准 JSON-RPC 调用衡量排序效应的可复现方法。它不推荐特定的 MEV 策略,也不将提取行为视为商业模式加以认可。
假设与前提条件
本解释假设你了解交易如何进入内存池、gas 价格和优先费如何影响打包,以及区块如何组装。如果你需要复习交易排序,关于 nonce 和交易排序的指南是一个有用的起点。
你还应能访问目标网络的归档或全节点 RPC 端点。公共端点通常会对重建区块内容和待处理交易所需的调用进行速率限制,因此专用或付费端点对于测量工作更可靠。
- 目标网络的 JSON-RPC 端点,存储为 RPC_URL
- 基本熟悉 curl 或 Python 等脚本语言
- 如需历史区块数据,需具备归档节点或全节点
- 了解内存池可见性因网络和客户端而异
交易排序如何创造可提取价值
每个区块都是状态转换的有序列表。如果两笔交易触及同一个流动性池,第一笔针对池的当前储备执行,第二笔针对更新后的储备执行。这两种排序之间的执行价格差异就是所涉价值。能够选择顺序的区块生产者原则上可以捕获这一差异。
在实践中,价值通常由搜索者捕获:他们是独立参与者,对等待中的交易数据运行算法以寻找有利可图的排序。搜索者向构建者提交交易包,构建者组装区块并竞标提出区块的权利。随后验证者提出获胜区块。这种角色分离通常称为提议者-构建者分离,它改变了谁捕获 MEV 以及有多少流回验证者。
关键的心智模型是,MEV 是以下因素的函数:(1) 待处理交易集合,(2) 选择顺序方的自由裁量权,以及 (3) 受影响合约的经济敏感性。移除其中任何一个,机会就会缩小。
常见 MEV 策略及其机制
大多数 MEV 活动属于少数可识别的模式。理解它们有助于你识别自己的交易何时面临风险。
DEX 套利:当两个池对同一资产定价不同时,搜索者在同一区块内从较便宜的池买入,在较贵的池卖出。这通常被认为是良性的,甚至是有益的,因为它将价格推向平价。
清算:借贷协议允许任何人偿还资不抵债借款人的债务以换取清算奖励。当头寸越过阈值时,搜索者竞相抢先,这是一场排序竞赛。
三明治攻击:搜索者在一笔大额待处理交换之前买入,之后卖出,从受害者交易造成的价格影响中获利。受害者获得的执行价格比没有前后交易时更差。
抢跑和尾随:同一思路的泛化版本,即在目标交易之前或之后立即插入交易以获取优势。NFT 铸造狙击和先到先得领取是常见例子。
使用 JSON-RPC 衡量排序效应
你可以构建可复现的排序效应测量,而无需依赖任何第三方仪表板。以下流程重建一个区块,识别针对已知池的交换,并将每笔交换的执行价格与区块前池的中间价进行比较。按区块汇总的差异是该区块中存在的排序价值的下限。
首先,获取区块及其收据。以下 curl 调用按区块号检索包含完整交易体的区块:
- 将 0x1312D00 替换为你要检查的十六进制区块号
- 将 RPC_URL 设置为支持完整交易体的端点
- 对于历史区块,使用归档端点
curl -s -X POST "$RPC_URL" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_getBlockByNumber","params":["0x1312D00", true]}'可运行的 Python 交换排序诊断脚本
以下脚本将手动调用扩展为可重复的诊断。它获取一个区块,筛选指定池地址上的 Swap 事件,并打印每笔交换在区块中的位置及其发送者。在一系列区块上运行它,观察同一发送者在大额交换前后立即出现的频率,这是三明治活动的特征。
该脚本仅使用标准库和单个 RPC_URL 环境变量。它不需要任何特定提供商的 API 密钥。
- 将 POOL_ADDRESS 设置为你想要检查的池
- Swap 主题哈希因 DEX 而异;确认目标协议的主题
- 在连续区块上运行以区分噪声和重复模式
import json, os, urllib.request
RPC_URL = os.environ["RPC_URL"]
POOL = os.environ.get("POOL_ADDRESS", "0x0000000000000000000000000000000000000000")
SWAP_TOPIC = "0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822"
def rpc(method, params):
body = json.dumps({"jsonrpc":"2.0","id":1,"method":method,"params":params}).encode()
req = urllib.request.Request(RPC_URL, body, {"Content-Type":"application/json"})
return json.loads(urllib.request.urlopen(req).read())["result"]
def scan_block(block_hex):
block = rpc("eth_getBlockByNumber", [block_hex, True])
print(f"block {int(block_hex,16)} txs={len(block['transactions'])}")
for i, tx in enumerate(block["transactions"]):
if tx.get("to", "").lower() == POOL.lower():
print(f" pos={i} from={tx['from']} input={tx['input'][:10]}")
if __name__ == "__main__":
scan_block("0x1312D00")预期验证结果及其解读
成功运行会打印区块号、交易数量以及每笔针对该池的交易及其位置和发送者。如果你看到同一发送者在位置 i-1 和 i+1 围绕位置 i 的大额交换出现,这与三明治模式一致。如果同一发送者只出现一次,可能是合法的流动性操作。
将观察结果记录在结果表中,以便测量可复现。建议的结构如下所示;填入你自己运行的值,而不是复制任何数字。
| 区块范围 | 扫描区块数 | 池交换数 | 重复发送者模式 | 备注 |
|---|---|---|---|---|
| 0x1312D00–0x1312D0F | 16 | (你的计数) | (你的计数) | (端点、时间戳) |
该表是测量模板,不是基准。你发布的任何数字都应来自针对有文档记录的端点和区块范围的自身运行。
常见测量问题的故障排除
如果脚本对某个区块返回 null,端点可能已被修剪,不提供历史状态。切换到归档端点或明确支持归档查询的提供商。如果交易列表为空,确认你向 eth_getBlockByNumber 的第二个参数传递了 true。
如果遇到速率限制错误,批量请求或迁移到专用端点。公共端点通常限制每秒请求数,这使得逐块扫描不可靠。对于高流量测量,专用节点或付费 RPC 计划是实际选择。
如果缺少交换事件,验证特定 DEX 的主题哈希。Uniswap V2、V3 和其他协议使用不同的事件签名,主题不匹配会静默返回无匹配。
- 区块为 null:使用支持归档的端点
- 交易为空:传递 true 以获取完整交易体
- 速率限制:批量请求或使用专用端点
- 未找到交换:确认目标 DEX 的事件主题
缓解方案及其权衡
MEV 没有单一的解决方案,每种缓解措施只是转移成本而非消除成本。滑点限制减少三明治损失,但可能导致交易失败。私有交易中继向搜索者隐藏待处理交易,减少抢跑,但依赖中继的信任假设和覆盖范围。批量拍卖和公平排序旨在消除排序自由裁量权,但需要协议级更改,并可能引入延迟。
对于用户,实际杠杆是滑点容忍度、交易时机,以及选择通过私有内存池或批量结算路由的交易场所。对于开发者,杠杆是合约设计(例如提交-揭示方案)和提供一致待处理状态视图的基础设施选择。
对于节点运营商和 RPC 提供商,相关问题是端点是否暴露公共内存池以及待处理交易传播的速度。缓慢或不一致的内存池视图使测量不可靠,并可能导致你自己的交易被竞争掉。
MEV 相关工作负载的基础设施考量
如果你正在构建搜索者、分析或 MEV 感知的交易系统,端点行为与策略同样重要。你需要低延迟访问待处理交易、一致的区块数据以及用于回测的归档支持。公共端点很少能大规模提供这三者。
OnFinality 的 API 服务提供跨多个网络的托管 RPC 访问,专用节点为延迟敏感的工作负载提供隔离吞吐量。如需针对目标网络的具体端点推荐,RPC Assistant 可以为你匹配提供商;本文刻意停留在方法论层面。
比较端点时,在每个端点上测量相同的区块范围,并记录传播延迟、错误率和归档覆盖范围。将任何已发布的性能声明视为需要根据自身工作负载验证的假设。
- 在回测历史区块前确认归档支持
- 在每个候选端点上测量待处理交易传播延迟
- 根据预期请求量检查速率限制
- 对延迟敏感的策略优先选择隔离吞吐量
进一步学习的后续步骤
首先在你已使用的网络上跨小区块范围运行诊断。将结果与第二个端点比较,看看观察到的模式有多少取决于端点。然后扩展脚本以计算每笔交换的实际滑点并按区块汇总。
有关节点操作和端点选择的更广泛背景,请参阅区块链节点托管指南和多链 RPC 端点概述。如果你正在为特定网络评估提供商,RPC Assistant 可以缩小选择范围,而定价页面可帮助你根据预期请求量比较计划。