Rust——什么是高滑点交易,以及在DashMap` 中怎么快速筛选它

发布于:2025-06-27 ⋅ 阅读:(23) ⋅ 点赞:(0)

非常棒的问题,咱们现在来一步步深入理解什么是高滑点交易、为什么它是三明治攻击的目标,以及在 DashMap 中怎么快速筛选它。


✅ 什么是高滑点交易(High Slippage)

滑点(Slippage):是指用户在去中心化交易(如 Uniswap)中愿意接受的价格偏离程度

比如用户设置:

  • 买入 100 USDC 的 Token A;

  • 接受最大滑点为 5%(即最终价格不能超过原价的 105%);

🎯 高滑点意味着什么?

  • 用户愿意接受较大的价格波动;

  • 对于攻击者,这是“前插抢跑”盈利的机会!


🧠 为什么三明治攻击喜欢高滑点交易?

三明治攻击流程是:

  1. 前插交易(抢先买入,抬高价格)

  2. 目标交易(被夹用户原本交易,被迫以更高价格成交)

  3. 后插交易(再卖掉前插买的,赚差价)

如果目标交易设置了高滑点,就更容易被“夹心”攻击成功,因为它会自动接受更高价格完成交易!


✅ 那么:怎么判断一笔 pending 交易是不是“高滑点”?

这取决于交易调用的 DEX 合约函数(UniswapV2/V3 等)。

📌 以 Uniswap V2 为例:

function swapExactETHForTokens(
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
)

🚨 关键参数:

  • msg.value:用户付出的 ETH 数量

  • amountOutMin:用户最少想获得的 Token 数量

那么:

滑点 = 实际期望兑换价格 / 用户最少接受价格
     = (msg.value / 市场价格) / amountOutMin

若这个比例差距很大(比如设置 amountOutMin = 80,但市场上应该能换到 100),说明用户设置了高滑点(20%)。


✅ 在 Rust 中做滑点判断(示意):

监听 swapExactETHForTokens 的 pending 交易时,解析 calldata 参数 → 判断滑点:

fn is_high_slippage(tx: &Transaction) -> bool {
    if tx.to == UNISWAP_ROUTER_ADDRESS {
        if let Some(calldata) = &tx.input {
            let decoded = decode_swap_exact_eth_for_tokens(calldata)?;
            let expected_price = get_market_price(&decoded.path)?;
            let actual_rate = tx.value / decoded.amount_out_min;

            let slippage = (actual_rate - expected_price) / expected_price;
            return slippage > 0.1; // 超过 10%
        }
    }
    false
}

✅ DashMap 怎么用来辅助这件事?

你在监听 pending 交易时,用 DashMap 存储“地址 → 最近交易数据”:

use dashmap::DashMap;
let trade_map = DashMap::new(); // Map<地址, Vec<TxMetadata>>

if is_high_slippage(&tx) && tx.gas_price > U256::from(100_000_000_000u64) {
    trade_map.entry(tx.from).or_default().push(TxMetadata::from(tx));
}

然后你可以定期扫这个 Map,看是否有人频繁高滑点交易(可能是机器人 or 人类)


✅ 三明治攻击真实触发流程结合起来如下:

// 每当捕获一笔 pending 交易时:
if is_target_token(tx) && is_high_slippage(&tx) && is_high_gas(&tx) {
    // 满足目标标准,加入 DashMap 临时缓存
    dashmap_cache.insert(tx.hash, tx.clone());

    // spawn 攻击处理逻辑
    tokio::spawn(async move {
        try_sandwich_attack(tx).await;
    });
}

🔧 小结:你需要做什么才能完成完整链路?

  1. ✅ 监听 pending 交易(使用 web3-rsethers-rs

  2. ✅ 解码 calldata 判断是否是目标合约和高滑点调用

  3. ✅ 判断 gas price 是否足够高(防止无效交易)

  4. ✅ 使用 DashMap 缓存交易

  5. tokio::spawnmpsc 触发攻击交易逻辑

  6. ✅ 使用 Flashbots 发送免被抢的夹心交易


如果你需要我:

  • ✳️ 给你提供一份完整 Rust 示例项目(监听 + 高滑点识别 + 缓存 + 打印结果)

  • ✳️ 解析一份合约 ABI + 提供 Rust 解码器

  • ✳️ 给你写一套完整高滑点判断函数

直接告诉我你的方向,我立即帮你生成代码。


网站公告

今日签到

点亮在社区的每一天
去签到