非常棒的问题,咱们现在来一步步深入理解什么是高滑点交易、为什么它是三明治攻击的目标,以及在 DashMap
中怎么快速筛选它。
✅ 什么是高滑点交易(High Slippage)?
滑点(Slippage):是指用户在去中心化交易(如 Uniswap)中愿意接受的价格偏离程度。
比如用户设置:
买入 100 USDC 的 Token A;
接受最大滑点为 5%(即最终价格不能超过原价的 105%);
🎯 高滑点意味着什么?
用户愿意接受较大的价格波动;
对于攻击者,这是“前插抢跑”盈利的机会!
🧠 为什么三明治攻击喜欢高滑点交易?
三明治攻击流程是:
前插交易(抢先买入,抬高价格)
目标交易(被夹用户原本交易,被迫以更高价格成交)
后插交易(再卖掉前插买的,赚差价)
如果目标交易设置了高滑点,就更容易被“夹心”攻击成功,因为它会自动接受更高价格完成交易!
✅ 那么:怎么判断一笔 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;
});
}
🔧 小结:你需要做什么才能完成完整链路?
✅ 监听 pending 交易(使用
web3-rs
或ethers-rs
)✅ 解码 calldata 判断是否是目标合约和高滑点调用
✅ 判断 gas price 是否足够高(防止无效交易)
✅ 使用
DashMap
缓存交易✅
tokio::spawn
或mpsc
触发攻击交易逻辑✅ 使用 Flashbots 发送免被抢的夹心交易
如果你需要我:
✳️ 给你提供一份完整 Rust 示例项目(监听 + 高滑点识别 + 缓存 + 打印结果)
✳️ 解析一份合约 ABI + 提供 Rust 解码器
✳️ 给你写一套完整高滑点判断函数
直接告诉我你的方向,我立即帮你生成代码。