什么是清扫器) x/ O6 L0 w. o' Y' q5 H
5 @- Y4 g$ y3 J* g1 b
清扫器是 sweeper 的直译,它主要工作在以太坊网络上(包括 EVM 兼容链,比如 BSC、Heco等),sweeper 持有一个私钥,这个私钥对应的钱包中有大量的 ERC20 通证,但是没有足够的 ETH 当 gas 费,所以无法直接从中转走 ERC20 通证。 为了从中取出价值连城的 ERC20 通证,你不得不往里面转 ETH,但有趣的是,一旦你往里面转 ETH,立刻会被 sweeper 卷走。( {, e4 v5 a. y7 _/ s: a1 f$ e+ @
这个泄漏私钥的账户看起来像是这样:
! y" U' f+ V5 `% x: G6 }- A
5 Y+ d- @1 G; r5 k5 L& p
5 T* L! [+ C7 @' k' E- e
: w, o! V W& T, ^ N8 J% W
这个私钥可能是一个黑客故意以看起来无意的方式暴露给你的,激发你的贪婪,让你试图从中取出资产。* R4 r0 b; A: w: Z% j5 t0 `
也可能是由于你在参与一些空投时进入了钓鱼网站,它要求最终输入你的私钥,一旦这么做了,账户中的所有 ETH 会被瞬间转走,并为你挂上一个 sweeper。8 P4 m0 F* a5 S. W% E; n
一个 demo) R9 Y) O# h( {) q% x8 z
# M, \/ B9 A' u/ m* o3 j% u在 Goerli 测试网络上(chainId 为 5,它是测试网络,因此你只需要到对应的 faucet 领取 token,即可测试),我设置了一个简单的 sweeper 去模拟你的困境,sweeper 会占用较多资源,我可能随时会关。如果你需要发起测试时,发现 sweeper 没工作,可以联系我开启。
3 }' M0 v! ~ N9 U被盗私钥的地址:0x166d78FE7a9e1De11aF1ef8aE5919fbBf3E81245
6 K- y M/ ]% B: F& @( e/ {0 G$ o对应私钥就暂时不公布了,我可不想到时候你们使用我的解决方案来干掉我的 sweeper。6 ?, \) s0 a9 I0 E
模拟的 USDT 地址:0x4734C809Cd59C87753Ebe95B494C0056513ceF85 ,这上面有 1000 USDT 你可以尽你最大的努力将它取出来。
6 F$ ]4 f, Z3 _$ }7 H$ T但你会发现,一旦你转 ETH 到该地址,所有的 ETH 都会被立刻转移到黑客的地址中,就像下图这样:* y+ b: ^/ a" O& q+ s! M- h/ e& ~
6 o/ y! @. d0 O
9 f) F0 r) e0 v; d
' _' D$ v2 g7 T3 d8 |) s
工作原理
$ x* B& D& l2 X5 B2 [ |1 e
2 s* z* X0 E5 t4 w7 W目前的 sweeper 主要基于以太坊的交易池(也称 txpool、mempool)发现你发起的交易与新块产生调用 eth.getBalance() 获取你的余额。% C1 j% R+ @' [8 N7 K9 r# z
交易池中包含了所有未被包含进区块的交易,当你试图直接将 ETH 通过转账发送到被盗账户时,你的交易就会被送入交易池,时刻监听交易池的 sweeper 就能够发现你的行为。$ i$ v& V; |2 u) p ~2 @- \
) ?/ K9 z, v& P: |' ], H
% B' ~8 ]$ ^# V5 A) s! W7 Y
; S7 m) C# g7 a* U" }+ i并等到你的交易被执行后,立刻发起新的交易,这个新的交易将你转入的 ETH 扣除掉 gas 费后的剩余数量转入到黑客的地址中。
" f5 R) f/ a% U, i* |) m7 c \: Z
( ~+ g4 I+ i3 f6 o4 y4 P
# k3 W8 Y4 b; e! _
+ b* N$ o% y; Q% o$ H然而根据公共交易池获取信息并不总是有效,很多方法可以规避交易进入交易池。( ]1 a( I1 O9 F* `- W1 P
$ i0 G9 Z( d" r. s
- 选择私有交易池。如果其中没有黑客,那么你的交易不会被黑客发现8 |3 |6 j7 p% G* O8 s7 `/ B! C/ p2 {
- 选择内部交易(internal transaction)。简单的理解就是合约内部的逻辑调用,就是内部交易。对于外部来说,他们只能发现你调用了合约,无法获知合约内部具体的执行情况。例如,为了避免进入交易池,你只要对一个合约发起交易,执行合约的代码,而合约去将 ETH 转入你的被盗钱包即可。# r4 k, l# E2 h! {
sweeper 可能没有足够的成本去成为一个私有交易池的参与方,但有的 sweeper 会对内部交易进行预防。因为不论一笔交易会不会进入公共交易池,交易最终出现在链上的时候,一定会有状态的改变。也就是说通过内部交易转入的 ETH,会在新块产生时,能够被 sweeper 通过调用 eth.getBalance() 发现。
) s( I0 a6 j8 I+ z0 T. {2 p这是简单的工作原理,实际的 sweeper 拥有很复杂的逻辑,会让黑客的收益最大化,让你的损失最大化。更深的细节就不过多讲解,避免出现更加棘手的 sweeper 不是吗?
: u* o6 u3 q4 U( D如何恢复你的资产' g2 W" o$ I7 |% u# ~
( K& `) B8 k1 g. m4 N' ]讲了原理,就容易理解如何应对它们了。, u. L f/ p7 F- ]3 }0 O% l+ d+ \
如果你的私钥已经泄漏,那么目前最有效的方案是通过私有交易池进行交易,而且是进行“批处理”交易,也就是说你可以将一批交易提交到私有交易池中,这个交易池中的矿工为你做以下担保:
' D8 i! o1 |; W: X
" W- \* V( j7 b- d- H. m# c- 如果决定在区块中包含你的交易,就一定将你的一批交易全部包含
+ W( D: u3 F5 @& h% U9 z - 你的一批交易全被包含进区块链后,才会广播到公共网络中
: K; x1 a. Q* ], V- H( _. e 而矿工是根据利益关系做决定的,你需要更多的 gas price 支付,才能让矿工愿意打包你的交易,否则它为什么不直接打包公共交易池中的交易呢?
" T" `4 R( @$ I# {flashbots 是能够做到以上几点,但它目前只在以太坊主网与 Goerli 测试网络上工作,所以如果你的资产不在以太坊主网,将无法通过这种方式找回。4 ^1 o9 i* i( d+ N6 T, a
如何预防
' ?" k& E4 z$ [9 h- x$ m( [! v2 G ~9 O! O, k
% @. d# b5 e+ O# E& R2 j* F
- 不要随意将你的私钥泄漏,在任何时间,任何地点! E8 x5 A. a" M' @5 g/ \
- 考虑使用硬件钱包
" m$ t1 j& |. Q" ^* Z: a - 有远见的批准一个“安全”的账户去能够转移你的 ERC20 通证,这样安全账户可以直接通过 transferFrom 转移你被盗账户中的 ERC20 通证
1 A9 V; ` c! p+ H' b - 参与空头、活动等行为的账户与拥有大量存款的账户独立开) N9 o: f% U d+ l# U9 C
|