受害者联系我们的时候,主钱包已经被盗了,钱包受到黑客控制,但是还有大约 5wu 的资产正在质押,并且正在等待分批解锁,一旦解锁就会被黑客抢走,受害者找到我们进行救援
虽然金额不多,但是我们绝不允许黑客行为在我们眼皮下发生,并且我和
@MegaKecc 博士决定,公开本次救援的技术细节
1. 构造调用数据
EXIT_SELECTOR = keccak(b"exit(uint256)")[:4]
EXIT_CALLDATA = EXIT_SELECTOR (TIMESTAMP).to_bytes(32, "big")
编码 exit(TIMESTAMP) 作为 calldata,函数签名与参数必须完全匹配,否则后续交易即使进入区块也会直接 revert,整个流程失效。
2. 构造交易
tx = {
"from": SENDER_ADDR,
"to": LOCKING_REWARD,
"data": EXIT_CALLDATA,
"value": 0,
}
将合约调用封装为交易体,并提前模拟获取交易所需的基本gas。
3. 设置 gas 参数
block = w3.eth.get_block("latest")
base_fee = block.baseFeePerGas
priority =
w3.to_wei(1, "gwei")
max_fee = base_fee * 2 priority
tx.update({
"type": 2,
"chainId": 1,
"nonce": w3.eth.get_transaction_count(SENDER_ADDR),
"maxFeePerGas": max_fee,
"maxPriorityFeePerGas": priority,
})
EIP-1559 定价机制中,priority fee 决定排序权,max fee 决定可接受区块范围,nonce 决定交易有效性。该步骤本质是为交易购买执行优先级,定价不足将直接失去排序位置。
4. 签名并发送
signed = w3.eth.account.sign_transaction(tx, SENDER_PK)
w3.eth.send_raw_transaction(signed.raw_transaction)
交易进入 public mempool 后即具备可见性,calldata 可被复制并通过提高 gas 进行覆盖式竞争,导致原交易失去排序权。该阶段的核心约束不在“发送成功”,而在“是否被观察与替换”,因此通常通过提高 priority、并发 RPC 发送或使用 private relay / 自有节点 方式提高成功率。
我们用这项技术累计救援超过 100万美金资产,第一次披露,希望可以对行业的安全有帮助,建议收藏,以备不时之需