白帽闪电战:如何用 1 秒抢跑黑客,拯救被盗的千万资产?
作者|pcaversaccio
🔗 原文链接:https://github.com/pcaversaccio/white-hat-frontrunning
🥷🏽 白帽抢跑脚本
用于赶超黑客并保护被盗钱包资金的白帽抢跑脚本。该(Bash)脚本设计为零依赖,仅需 Linux 原生工具和 Foundry 的 cast 命令。
使用说明
确保已安装 cast 工具。有关安装说明,请参阅本安装指南。
首先,修改脚本中的主循环。脚本主循环需根据每次救援场景定制(当前默认逻辑为向受害者钱包发送 Gas 并转移特定代币)。
快速开始
1. 修改脚本权限(若未自动生效):
chmod +x go.sh💡 脚本在仓库中已预设可执行权限,克隆后可直接运行。
2. 配置 .env 文件(示例模板):
# ⚠️ 以下私钥为占位符,禁止在生产环境使用!
PROVIDER_URL="https://rpc.flashbots.net"
RELAY_URL="https://relay.flashbots.net"
VICTIM_PK="0x1234567890" # 受害者钱包私钥
GAS_PK="0x9876543210" # 提供 Gas 的 EOA 私钥
FLASHBOTS_SIGNATURE_PK="0x31337" # Flashbots 身份签名密钥
TOKEN_CONTRACT="0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" # 目标代币合约当您向 Flashbots 提交 bundles 时,它们会使用您的 FLASHBOTS_SIGNATURE_PK 密钥进行签名,从而使 Flashbots 能够验证您的身份并持续跟踪您的声誉 。此声誉系统旨在保护基础设施免受 DDoS 攻击等威胁。需要注意的是,此密钥不处理任何资金, 也不需要作为交易身份验证的主要以太坊密钥。它的唯一目的是在 Flashbots 中确认您的身份。您可以使用任何 ECDSA secp256k1 密钥来执行此操作,如果需要创建新密钥,可以使用 cast wallet new 。
3. 执行脚本:
./go.sh调试模式(打印每条执行命令),请在运行脚本之前将 DEBUG 环境变量设置为 true
DEBUG=true ./go.sh基于 EIP-7702 的救援方案
使用 EIP-7702(https://eips.ethereum.org/EIPS/eip-7702),您可以通过付款人和友好的委托人从受损钱包中恢复所有资金。完全无需向受损钱包发送以太币。脚本 go_eip7702.sh (https://github.com/pcaversaccio/white-hat-frontrunning/blob/main/go_eip7702.sh)处理完整的救援逻辑。它部署了一个名为 recoverooor.vy (https://github.com/pcaversaccio/white-hat-frontrunning/blob/main/recoverooor.vy)的 Vyper 合约,该合约充当(友好的)委托人来协助资产转移。您只需设置环境变量 RPC_URL 、 VICTIM_PK 和 PAYMASTER_PK ,以及包含委托人合约要执行的调用数据的 PAYLOAD 参数。
操作流程
1. 配置环境变量 .env 文件:
RPC_URL="https://rpc.flashbots.net"VICTIM_PK="0x1234567890" # 受害者私钥PAYMASTER_PK="0xba5Ed" # Paymaster合约控制者私钥2. 生成委托合约字节码(需安装依赖):
pip install vyper==0.4.2 snekmate==0.1.2rc1 # 要为 recoverooor.vy 生成与脚本 go_eip7702.sh 相同的字节码vyper recoverooor.vy # 编译合约3. 执行救援:
go_eip7702.sh 脚本中的 PAYLOAD 参数必须是使用适当逻辑调用 recoverooor.vy 合约的调用数据(有关如何为 recover_multicall 函数编码调用数据的详细信息,请参阅 encode_recover_multicall.sh 脚本)。recoverooor.vy 合约将以 recoverooor.vy 钱包作为 OWNER 进行部署。该 script 还会在最后重置 EIP-7702 授权,以防 OWNER 将来不再受信任。
./go_eip7702.sh4. 调试模式
要启用调试模式 ,请在运行脚本之前将 DEBUG 环境变量设置为 true :
DEBUG=true ./go_eip7702.sh这将在执行每个命令之前打印它,这在排除故障时很有帮助。
要使授权在所有链上可重放,只需将链 ID 设置为 0 ,参见此处 。
虽然 cast 目前不支持此功能,但您可以使用我基于 ethers 的脚本生成可重放的授权。然后,此授权可以传递到主脚本中。
社区案例集
⚠️ 警告:以下案例已通过PR审核,但未经完整测试,使用前请充分验证!
community-examples/ 目录包含主要 go.sh 脚本的定制版本,适用于各种救援场景。



