本文讲述了作者在以太坊ERC-4337上进行抢跑交易的冒险经历,通过监听Polygon链上的UserOperations,利用BlockNative的API漏洞,构建机器人抢在原Bundler之前获得Gas费退款。文章详细介绍了如何利用多个Polygon RPC节点加速交易,以及后续通过自建Reth节点提高抢跑成功率,并与竞争对手进行博弈的经历。
想象一下,你发现以太坊新交易模型中的一个细微差别,使你能够持续地几乎翻倍收回支付的 gas 费用。这就是 ERC4337 抢跑交易的狂野西部。
在大学二年级时,我阅读了 ERC-4337 的规范,以了解更多关于账户抽象的信息。ERC-4337 引入了 UserOperations (UserOps),它们是由智能钱包签名的特殊交易。这些交易由被称为 bundler 的参与者在链上转发。由于 UserOps 是经过签名的,ERC-4337 在其上下文中执行它们之前,会通过智能钱包验证授权。
有趣的是,智能钱包并不直接承担链上转发的 gas 成本。相反,bundler 垫付 gas 费用,而智能钱包在 UserOp 执行期间偿还他们。
以下是 UserOp 的结构(截至 0.6 版本):
struct UserOperation {
address sender;
uint256 nonce;
bytes initCode;
bytes callData;
uint256 callGasLimit;
uint256 verificationGasLimit;
uint256 preVerificationGas;
uint256 maxFeePerGas;
uint256 maxPriorityFeePerGas;
bytes paymasterAndData;
bytes signature;}
值得注意的是,UserOp 包含关于通过 maxFeePerGas 和 maxPriorityFeePerGas 字段,将支付给 bundler 多少转发费用的数据。
但看看这笔 AA 交易:bundler 支付了 0.0048 POL,并获得了 0.0091 POL 的退款,几乎是其支付金额的两倍!
AA 包通常会过度支付 gas 费用,以避免在链上拥堵期间卡住。但他们经常显著地过度支付,这留下了机会:
我们将获取以低价转发的 UserOps,低于其退款价值,稍微提高 gas 价格,然后收到他们的退款 —— 这将多于在链上转发它们的成本。
为此,我们必须在原始 bundler 的 userop 取走退款之前执行。无论谁在另一个人之后执行都会 revert,最终造成损失。
要执行此策略,需要有 4337 个 bundle 被发送到链上,并且我们必须能够看到待处理的交易。幸运的是,Polygon 具有不错的 AA 使用率,并且具有开放的 mempool。
这与常规的抢跑交易有何不同?
我当时身无分文,需要找到一种方法来监听 Polygon mempool,而无需运行自己的节点,这将是昂贵的。
BlockNative 有一个针对 AA 交易的“浏览器”,显示了 Polygon 上待处理的交易。我在浏览器控制台中四处摸索,发现他们正在使用他们的 mempool API(我不想为此付费)来提供此服务,并且他们的 API 密钥泄露在请求中。该浏览器现在已关闭,但这是来自 Wayback Machine 的快照:https://web.archive.org/web/20231201172934/https://4337.blocknative.com/
我挖掘了网络请求,找到了一个 websocket 消息序列,可以对我进行端点身份验证,并使用 ethers. js 编写了一个简单的脚本来运行该策略。
本周,Polygon 上 50% 的 ERC-4337 bundle 交易由于抢跑交易而失败。
这是该链上 ERC-4337 抢跑交易的新历史最高水平。显示更多
我大约只有 50% 的时间能与目标 tx 落在同一个区块中。我想尽可能快速和广泛地发送我的抢跑交易,以确保我能够始终如一地落在同一个区块中。我收集了公共 Polygon RPC 的列表,并确保将我的 tx 异步发送给尽可能多的 RPC。
Merkle 是传奇——他们有一个用于 Polygon 的 tx 注入端点,这在一段时间内是我的秘密武器。他们将此 tx 添加到其节点网络的内存池中,并将其广播给他们的对等方。
交易的 nonce 必须是连续且单调递增的。例如,如果我发送两个 nonce 分别为 3 和 5 的交易,则节点无法包含我的 nonce-5-tx,因为他们尚未看到我发送的 nonce 为 4 的 tx。
我每 3 秒发送一次 tx,发现节点有时不会足够快地传播我的交易,以至于整个网络在我发送下一个 tx 之前就看到它。我本质上是以如此快的速度发送交易,并且在同一个区块中发送多个交易,以至于我无法指望网络可靠地按照我发送的顺序分发它们。
我保留了 8 个地址,我在这些地址之间轮换以发送我的 tx,这样每个地址的交易平均时间从大约 3 秒增加到大约 24 秒,这已经足够了。
有时,如果链上出现 gas 峰值,地址仍然会被卡住。例如,我发送了一个 30 gwei 的 tx,但 gas 有时会突然飙升到 40 gwei。为了解决这个问题,我只是在计时器上有一个函数,可以检查是否有任何地址被卡住,并检查网络期望的下一个 nonce 是否与我的内部计数器对齐。如果一个地址被卡住,我只是使其失效并等待其解除卡住。我想我可以发送一个具有更高 gas 的替换交易(0 ETH 转账)来“解锁”它(稍后实现了这一点!)。
额外内容
我使用了 websocket mempool API,这意味着我不必运行自己的节点。公平地说,我确实尝试使用我拥有的一些免费 Azure 积分来运行我自己的 Polygon 节点 (bor),但同步时间太疯狂了。
BlockNative 停止了他们的服务。我尝试使用 Bitquery 和 Alchemy 来获得 mempool 的 websocket 流,但两者都具有非常高的延迟,并且无法获取某些交易。等到我收到并发送我的竞争性抢跑交易时,就已经太晚了。
唉,我需要运行自己的节点。为此,我将 reth(一个用 Rust 编写的高度模块化的以太坊节点)的一些部分拼凑在一起,并添加了一个 websocket 端点,该端点将提供来自 mempool 的新 tx。
非常感谢 Chainbound 和 Merkle——它们都在生产中使用 reth,并且有很棒的博客介绍如何入门。特别是:
[Merkle] 修改 reth 以在 BSC 和 Polygon 上构建最快的交易网络 —— 令人难以置信的资源,介绍了启动并运行仅网络的节点的步骤
[Chainbound] 深入研究 Reth p2p 堆栈 —— 介绍了我们如何获得待处理交易流、来自对等方的请求和网络事件。
出现了一些复杂情况:
如果对等方从我们这里请求数据,即像 GetBlockHeaders 或 GetBlockBodies,我们需要能够返回该数据。否则我们将断开连接。
解决方案
Polygon 节点在连接时很顽固。非常感谢 Merkle,他们在他们的 Discord 服务器中为我提供了一些支持,并使我走上了正确的道路:原来 Polygon 仍然像工作量证明一样通过网络广播新区块。当我们将 reth 中的网络堆栈设置为使用 PoS 时,它会将其视为协议冲突并断开与这些对等方的连接。设置回 PoW 似乎有效。
一旦这些问题得到解决,我们就启动并运行了。
reth 节点非常好,以至于我赢得了超过 80% 的抢跑交易。
我从 AWS 免费套餐迁移到 Hetzner,并进行了重构,以便我可以运行多个 reth 网络节点,并且它们会将流量转发到用 Typescript 编写的同一执行引擎。
在 BlockNative 删除了他们的 mempool 流媒体 API 之后,一些人正在寻找替代方案。我联系了他们,并收集了对托管替代服务的兴趣。
我注意到我进行抢跑交易的许多 tx 都涉及 Piggybox NFT 的转移。
我联系了 Piggybox 背后的团队 EARN'M,让他们知道他们使用的任何 bundler 服务都过度支付了 gas 费用,并且我会为他们编写一个更好的 bundler,但是在将我的消息转发给他们的团队后,他们的“支持”没有回复我。
我开始将我的执行引擎从 Typescript 移植到 Rust,因为这似乎是自然的下一步(alloy-rs 很棒!),但是我发现我正在权衡原型设计/实验速度和系统可靠性。
Rust 会很棒——在我的实验中,它将我的关键路径缩短到 <3 毫秒。但是对我来说,它更难快速测试一些新逻辑或重构。
抢跑交易并非没有竞争!在 2024 年夏天,我面临来自另一个搜索者的竞争,该搜索者具有以下地址:
"0xCd22C256E222529A29438406163Be3743d952cCD","0xA3e411169d3e009C304820eD9ed9A2BBe47dC390","0xbDAfc006073765c968FBEDc4F637EbE6e9df80fe","0xe787dC2C6497A696C7B22f18b152ccB744Da5BFA","0xbcaCb47747a7b241aE6319a2D8e10bDF20Ce6Ff8","0x1742Bb58C2Eb72e9f0CAbd63283755c3a8fE8C66","0x66D2445905586b6c06f86B41C0606aC850EdF324","0xB495e75d17A55Fe05D5746ebD5Dd162fBE12E9d9","0x239E68175459B80DbDF70E5876B83668d8A79110","0x3d739955243086032bB532A29C4F9e7fb1a86793"
这些地址也没有列在 BundleBear 的运营者注册表上。
在我编写我的 reth 网络节点后,他们在很大程度上停止了运营。
另一个搜索者(我们称他们为搜索者 B)大约在一个月前(2025 年 4 月/5 月)开始运营。他们的执行非常好。特别是,他们能够很好地获取 Polygon 上的所有交易,并且可以立即胜过任何竞争性抢跑交易。
例如,假设 Alchemy 发布了一个 30 gwei 的 handleOps 交易。我将发送一个 +1 wei 的抢跑交易,然后搜索者 B 将发送一个 +2 wei 的抢跑交易。或者,如果我等到搜索者 B 的抢跑交易传来(+1 wei),我将出价 +2 wei,然后搜索者 B 将立即执行以下任一操作:
我会与这个搜索者陷入竞标战,但他们几乎总是会因为他们卓越的网络覆盖率而获胜:
{
from: '0xF62298f2a58e07e914eCB711b0042762CA676565',
gas\_limit: '1072531',
gas\_price: 'null',
hash: '0x21a62de3ca45fdea7f465fcf75586b7323904c6dce04f515f5e20988389ef1cb',
input: '0x1fad948c0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000f62298f2a58e07e914ecb711b0042762ca67656500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b4fd6eed1f2584318719d8f38994da6150f8254b000000000000000000000000000000000000000000000000000000000000224b0000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000b7476000000000000000000000000000000000000000000000000000000000000fd8b00000000000000000000000000000000000000000000000000000000000117480000000000000000000000000000000000000000000000000000000873a60cab0000000000000000000000000000000000000000000000000000000873a60b000000000000000000000000000000000000000000000000000000000000000de00000000000000000000000000000000000000000000000000000000000000e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2447e1da2a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000853f2c11774bb08031e7dea93803569bbe2058f800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000ac4e9b5170f00000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000068210891e9a84426d16ce1663689a96b89a93558d1ba2c5a6a6f2b20d42b8d0ac666836f000000000000000000000000000000000000000000000000000000000000001c06233b2cbd9028884a62c3dc11f8724cfc088fbcf248b23f4a4d5f582ca2097c43a597b99ffaced5b3e8f6152170aaf20b360f9bb07c3eb153c3277c915a2c450000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000068210891e9a84426d16ce1663689a96b89a93558d1ba2c5a6a6f2b20d42b8d0ac666836f000000000000000000000000000000000000000000000000000000000000001b99e2d284d5523b1608957536f9ad3c016ea462ec216e225b9266357331802f3b0be38aab54571fd69cf511276808ac46436c32b2f6bec95600fef5168e710b110000000000000000000000006cbd9b41ba653d1909eb47fca266f1c160552eac0000000000000000000000000000000000000000000000000000000000000180000000000000000000000000a34b19863e7b1b58e707c3a6bfbaa62f0fcca97f000000000000000000000000853f2c11774bb08031e7dea93803569bbe2058f80000000000000000000000000000000000000000000000000000000002faf08000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000068210891e9a84426d16ce1663689a96b89a93558d1ba2c5a6a6f2b20d42b8d0ac666836f000000000000000000000000000000000000000000000000000000000000001bbf01394aedb56ece4a4e2dcf21625fc094cec98609afe7ca517c3f254de4ae0e711906bc559368cb49c063d448c27e2e3ba03d85beee7841726385b0e4a7587f00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000009636f75727479617264000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000003be9fd0ac95830558a994402d3d061dbd221575c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c99596d604be8ac20f56bff80660f72827697f600000000000000000000000031d058b5e02c8b01c749e6844d86cdd3f2962cd700000000000000000000000000000000000000000000000000000000000002000000000000000000000000006cbd9b41ba653d1909eb47fca266f1c160552eac00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000002faf080000000000000000000000000000000000000000000000000000000000000000e9a84426d16ce1663689a96b89a93558d1ba2c5a6a6f2b20d42b8d0ac666836f0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000009636f757274796172640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000544b02fcb9800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000068210891e9a84426d16ce1663689a96b89a93558d1ba2c5a6a6f2b20d42b8d0ac666836f000000000000000000000000000000000000000000000000000000000000001c781c97a3374fb1ef72e23d25870880ab60a3ed62fc3b69dfa3623924d9818e35432b32360085f3499e22077d84f867bf1cd8b4b9d18590947dca89c326d581cb000000000000000000000000776023a4573bd972c4c3e2a76f611d3c2bef516e00000000000000000000000000000000000000000000000000000000000001800000000000000000000000003be9fd0ac95830558a994402d3d061dbd221575c00000000000000000000000031d058b5e02c8b01c749e6844d86cdd3f2962cd70000000000000000000000000000000000000000000000000000000002faf08000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000068210891e9a84426d16ce1663689a96b89a93558d1ba2c5a6a6f2b20d42b8d0ac666836f000000000000000000000000000000000000000000000000000000000000001c92a3863e20512e3675fb613543a5b6af64fc47d531303eb627e8bb79140f26ea509206b45ad7bc354c55de4608f354f59d24c15e5e289fe1470f59dfb16d59ce0000000000000000000000000a01dcab35dfea3ef072d154c2403d64addc3fee00000000000000000000000000000000000000000000000000000000000002c4cd39bed70000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000776023a4573bd972c4c3e2a76f611d3c2bef516e000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000681fb96600000000000000000000000066dbff2ce099d19b4e8c5dc8b254ec7aeaf5e6420000000000000000000000003c499c542cef5e3811e1192ce70d8cc03d5c33590000000000000000000000000000000000000000000000000000000002faf0800000000000000000000000000a01dcab35dfea3ef072d154c2403d64addc3fee000000000000000000000000251be3a17af4892035c37ebf5890f4a4d889dcad0000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002466613563363530302d666130362d346263312d616430662d3138386636376237653662640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a4ce724973b58c37f3bd6ba695437b84fd98b89d10d341f8847455f4771295870000000000000000000000000000000000000000000000000000000000000041d55755cfb6256d8a7a95872afad8ae1152da94b09acde9a4d4c19c1780ba4867231537d6d751d380db93a115cd7931214205dcc5d3d53f49af04f2c8de5818ed1c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000754fd9098af9ddcb41da48a1d78f91f1398965addc0000000000000000681fb96c0000000000000000000000000000000000000000490871ee818c49fb42e45e41beab3def93dd84efe84571a23e7e32fb3df028f047035f15c351612173a48dab1dc8c59d9ab820f64eea289eec93626578da062f1b0000000000000000000000000000000000000000000000000000000000000000000000000000000000004177d45b941a0b57619771e5dbc33714e116095b845072a5bf58a4b6dac362a59871923bdfd504b07b62e2c3fdf59f237bf2e1953816680f2a022fa748e8e486d61b
max\_fee\_per\_gas: '90326017109',
max\_priority\_fee\_per\_gas: '82122025008',
nonce: '80499',
to: '0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789',
type: '2',
value: '0'
}
发现了签名 0x77d45b941a0b57619771e5dbc33714e116095b845072a5bf58a4b6dac362a59871923bdfd504b07b62e2c3fdf59f237bf2e1953816680f2a022fa748e8e486d61b 的竞争抢跑交易 竞争对手出价超过了我们,重新出价更高 通过地址 0x8CDA72Cd622825DBAd9234186F15A3A1a4e7743C 查找钱包 总时间 17
签名 0x77d45b941a0b57619771e5dbc33714e116095b845072a5bf58a4b6dac362a59871923bdfd504b07b62e2c3fdf5
- 原文链接: notion.so/ananthvivekana...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!