两个钱包,一个被清空一个安然无恙:我复盘了那晚的每一个操作

· 币种支持

去年11月,我亲眼看着两个朋友的钱包在同一个晚上遭遇了完全不同的事。

老周的钱包被转走了12.3个ETH,按当时价格差不多2.8万美元。小陈的钱包那天晚上也收到了钓鱼链接,但他什么都没丢。

差别不在运气。我把两个人的操作从头到尾捋了一遍,发现老周踩了三个坑,而小陈恰好躲过了所有。这篇就把那晚的复盘写出来,都是我亲眼看到的东西。

老周是怎么丢钱的

老周用的是某知名浏览器插件钱包,助记词抄在一张A4纸上,压在键盘底下。这个细节我后来才知道,当时听完头皮发麻。

那晚他在一个Discord群里看到有人发“早期空投查询”链接。点进去,页面做得跟项目官网几乎一模一样。他连接钱包,点了“查询”,弹出一个签名请求。他没仔细看内容,直接确认了。

问题就出在这个签名上。那是一个 setApprovalForAll 授权,等于把钱包里所有NFT的操作权交给了对方地址。签名一确认,他钱包里4个Azuki和2个Doodle被人用极低价格挂单买走,加上后续被转走的ETH,总共损失约12.3 ETH。

事后我问他:你签名的时候看到那串十六进制数据了吗?他说看到了,但看不懂,以为只是普通的登录验证。

这就是第一个坑:把签名当登录。钱包签名和登录完全是两回事。一次 approve 或 setApprovalForAll 签名,就是一次不可撤销的授权。

小陈做对了什么

小陈那天也收到了同一个链接。他做了三件事。

他先把链接域名复制出来,去 Etherscan 上查了合约地址,发现那个地址是3天前刚创建的,没有任何交易历史。然后他打开了一个备用钱包,里面只放了0.05 ETH,连进去试了一下,果然弹出了 setApprovalForAll 请求。他直接关掉页面,把那个域名拉黑了。

他跟我说了一句话我印象很深:“我所有钱包都分了层,主钱包从来不连任何DApp。”

具体分层是这样的:

  • 冷钱包(Ledger):存了80%的资产,从不联网交互
  • 主热钱包:只用来收转账和偶尔交互,里面不超过总资产的10%
  • 测试钱包:专门用来点不明链接,里面永远不超过0.1 ETH

这个结构听起来麻烦,但实际操作就是多建几个钱包的事。MetaMask 建一个钱包只要30秒。

授权管理是你最该学的操作

老周出事之后,我帮身边至少15个人查过授权。有9个人的钱包里躺着至少一个高风险授权,其中3个是 setApprovalForAll,对象地址已经标记为钓鱼。

查授权的方法很简单:

  1. 打开 revoke.cash,连接钱包
  2. 看列表里所有授权,重点关注 Approval 和 setApprovalForAll 两类
  3. 对不认识的合约地址,点进去看它在 Etherscan 上的创建时间和交易记录
  4. 不确定的一律 revoke,撤销授权gas费大概0.5到2美元

我自己的习惯是每月1号查一次。听起来像体检,但确实有用。上个月就查出来一个半年前交互过的DEX还留着无限授权,虽然那个项目没出事,但留着就是个隐患。

助记词存储的实战细节

说回老周那张压在键盘底下的A4纸。这是最典型的错误,但比这更离谱的我都见过:有人截图存手机相册,有人存在微信收藏,有人写在Notion里。

讲真,助记词只应该以物理形式存在。我自己的做法是:

  • 用金属助记词板(市面上20到50美元)刻录,防火防水
  • 分两处存放,比如家里保险柜和银行保管箱各一份
  • 绝对不拍照、不打字、不存任何联网设备

有人问过分片存储行不行,比如12个词分三个地方放。可以,但你得确保自己不会忘掉组合方式。我见过有人分了片,半年后自己都拼不回来了。

两个容易被忽略的设置

第一,关闭钱包的“自动检测代币”功能。 很多钱包默认开启这个,骗子会给你空投一个假代币,你一点交互就可能触发恶意合约。在 MetaMask 里进设置 → 安全与隐私 → 关掉“自动检测代币”。

第二,给钱包设一个独立密码,跟你的常用密码完全不同。 插件钱包的密码保护的是本地文件,不保护链上资产,但至少能防止别人用你电脑时直接打开钱包。我见过有人在网吧登钱包,走的时候没锁屏。

那晚之后我改了什么

老周的事之后,我把自己所有钱包的授权全查了一遍,撤了7个不必要的授权,gas花了不到10美元。然后把主钱包的资产挪了70%到冷钱包。建了一个新的测试钱包,里面放了0.08 ETH,专门用来点任何我不确定的链接。

这些操作加起来花了不到一个小时。

小陈后来跟我说,他每次点陌生链接之前都会问自己一句:这个操作如果最坏的结果发生,我能不能承受?测试钱包里只有0.1 ETH,最坏就是丢0.1 ETH。主钱包不连任何DApp,最坏的结果根本不会发生。

说白了,钱包安全不是什么高深技术,就是几个习惯的事。老周丢的那12.3个ETH,换成任何人,只要签名前多看一眼请求类型,或者用一个空钱包去试,都不至于发生。