什么是清扫器
" L; }" J: I ~
9 x) h8 x5 P, I5 w. I% _% [* c$ e: Z5 R清扫器是 sweeper 的直译,它主要工作在以太坊网络上(包括 EVM 兼容链,比如 BSC、Heco等),sweeper 持有一个私钥,这个私钥对应的钱包中有大量的 ERC20 通证,但是没有足够的 ETH 当 gas 费,所以无法直接从中转走 ERC20 通证。 为了从中取出价值连城的 ERC20 通证,你不得不往里面转 ETH,但有趣的是,一旦你往里面转 ETH,立刻会被 sweeper 卷走。7 c; `+ U K7 @" K
这个泄漏私钥的账户看起来像是这样:
2 K5 u) S% Q0 R% N* _" E: {
5 r4 m$ y3 K% u ]3 T% }. g8 q
3 z! m6 s; a0 r+ p& m C$ o4 N- t$ u2 v; z
这个私钥可能是一个黑客故意以看起来无意的方式暴露给你的,激发你的贪婪,让你试图从中取出资产。
9 v" ~% y6 c4 H$ A/ ~也可能是由于你在参与一些空投时进入了钓鱼网站,它要求最终输入你的私钥,一旦这么做了,账户中的所有 ETH 会被瞬间转走,并为你挂上一个 sweeper。( ~. } Z1 e% Q( A( m
一个 demo8 L9 c! l, h+ J/ i7 X
5 N1 [" | k: t
在 Goerli 测试网络上(chainId 为 5,它是测试网络,因此你只需要到对应的 faucet 领取 token,即可测试),我设置了一个简单的 sweeper 去模拟你的困境,sweeper 会占用较多资源,我可能随时会关。如果你需要发起测试时,发现 sweeper 没工作,可以联系我开启。2 s( z5 ]' Q( {2 q
被盗私钥的地址:0x166d78FE7a9e1De11aF1ef8aE5919fbBf3E81245
/ h: E' k/ @: `+ ^# o: `2 j- |. _' L3 k对应私钥就暂时不公布了,我可不想到时候你们使用我的解决方案来干掉我的 sweeper。* L. s9 o3 D: B! ]. @+ _
模拟的 USDT 地址:0x4734C809Cd59C87753Ebe95B494C0056513ceF85 ,这上面有 1000 USDT 你可以尽你最大的努力将它取出来。& h7 ?8 v. f' T9 b8 r, {7 k! d4 a
但你会发现,一旦你转 ETH 到该地址,所有的 ETH 都会被立刻转移到黑客的地址中,就像下图这样:) U2 N) p! Y/ O- g
% A3 V6 n% W% V: b4 d# m* a- t T
0 A" s! N& l$ P* w, E7 P0 s
8 ` n, t& B% h; I f( e" A& j5 ^
工作原理( h) n0 E0 m+ }) b ^- j
2 j+ S- ~1 H1 u目前的 sweeper 主要基于以太坊的交易池(也称 txpool、mempool)发现你发起的交易与新块产生调用 eth.getBalance() 获取你的余额。8 P: D( y1 a& i! G6 d
交易池中包含了所有未被包含进区块的交易,当你试图直接将 ETH 通过转账发送到被盗账户时,你的交易就会被送入交易池,时刻监听交易池的 sweeper 就能够发现你的行为。
9 j1 |; p+ B) w0 R! w
' d7 \$ O2 x& ]4 }# i. ]
2 s6 E3 g" a3 z' x3 K3 c3 [# ^1 ?
3 M! C& u4 K V0 y5 |并等到你的交易被执行后,立刻发起新的交易,这个新的交易将你转入的 ETH 扣除掉 gas 费后的剩余数量转入到黑客的地址中。
) r, ?3 v" R% g& g2 Q2 h4 U; B* t# \( u2 ~
_0 X3 A7 ~& w1 g; `
! k; Z5 k4 ^* a$ X9 p然而根据公共交易池获取信息并不总是有效,很多方法可以规避交易进入交易池。- s# \8 Y: O6 d3 P: B! m
9 q6 [; C' b; Q2 X$ o/ x
- 选择私有交易池。如果其中没有黑客,那么你的交易不会被黑客发现0 \! t5 d$ S. W& E& ^$ |
- 选择内部交易(internal transaction)。简单的理解就是合约内部的逻辑调用,就是内部交易。对于外部来说,他们只能发现你调用了合约,无法获知合约内部具体的执行情况。例如,为了避免进入交易池,你只要对一个合约发起交易,执行合约的代码,而合约去将 ETH 转入你的被盗钱包即可。
, w' _2 h% ] R3 ~4 v- N sweeper 可能没有足够的成本去成为一个私有交易池的参与方,但有的 sweeper 会对内部交易进行预防。因为不论一笔交易会不会进入公共交易池,交易最终出现在链上的时候,一定会有状态的改变。也就是说通过内部交易转入的 ETH,会在新块产生时,能够被 sweeper 通过调用 eth.getBalance() 发现。
/ S8 M; w% W- P/ `: r; N这是简单的工作原理,实际的 sweeper 拥有很复杂的逻辑,会让黑客的收益最大化,让你的损失最大化。更深的细节就不过多讲解,避免出现更加棘手的 sweeper 不是吗?
) q& U* V9 I& y- A如何恢复你的资产8 z$ x3 z" N& @5 E4 }1 V( E2 a
; N3 G$ Q& L8 P5 [# B
讲了原理,就容易理解如何应对它们了。- q/ l }8 O* ~! a8 q+ R! \+ p
如果你的私钥已经泄漏,那么目前最有效的方案是通过私有交易池进行交易,而且是进行“批处理”交易,也就是说你可以将一批交易提交到私有交易池中,这个交易池中的矿工为你做以下担保:; N4 V% K! h. j0 A7 i) r
: R- p9 R0 I# E: k- 如果决定在区块中包含你的交易,就一定将你的一批交易全部包含
% t* ]9 U* G6 ]* ]; T% {& Z - 你的一批交易全被包含进区块链后,才会广播到公共网络中
! y- o. h+ U# v$ s" C 而矿工是根据利益关系做决定的,你需要更多的 gas price 支付,才能让矿工愿意打包你的交易,否则它为什么不直接打包公共交易池中的交易呢?
3 r1 P7 z5 _& g* mflashbots 是能够做到以上几点,但它目前只在以太坊主网与 Goerli 测试网络上工作,所以如果你的资产不在以太坊主网,将无法通过这种方式找回。: c, S4 s) w! U" y0 S
如何预防9 V6 K5 d2 g! B; e6 u
( R3 c `6 Y7 W3 J: k7 o
% P# u" X2 {3 r/ b- 不要随意将你的私钥泄漏,在任何时间,任何地点
$ B" n' r$ O5 | - 考虑使用硬件钱包6 U/ K% N0 _8 H, R) a! [+ J
- 有远见的批准一个“安全”的账户去能够转移你的 ERC20 通证,这样安全账户可以直接通过 transferFrom 转移你被盗账户中的 ERC20 通证" V c$ J- A. g
- 参与空头、活动等行为的账户与拥有大量存款的账户独立开7 ]# I# Z( q( J7 d7 u
|