钱包常见问题:助记词泄露、授权陷阱和那些没人告诉你的坑
上周有个朋友在群里发截图,说他钱包里 0.3 个 ETH 被转走了,助记词从来没给过任何人。我让他把钱包地址发过来,在 Revoke.cash 上一查——半年前他在某个 NFT 铸造网站签过一个 setApprovalForAll,授权对象是一个看起来人畜无害的合约。那个合约三天前被部署者调用了 transferFrom,把他钱包里所有值钱的东西扫了一遍。
这种事每周都在发生。钱包出问题,九成不是“黑客太厉害”,是用户根本不知道自己在签什么。
助记词到底该放哪
先说个反直觉的事实:助记词泄露最常见的方式不是被黑客偷,是用户自己拍照存手机、存微信收藏、存 Notion 笔记、存百度网盘。
我见过最离谱的一个案例,有人把 12 个助记词单词写在手机备忘录里,备忘录标题叫“钱包密码”,然后手机备份同步到了 iCloud。他的 Apple ID 密码是 名字+生日。
正确做法很朴素:手写在纸上,纸放家里安全的地方。如果你想再稳一点,买块金属助记词板(市面上 30 到 80 美元),把单词刻上去。火、水、纸腐烂,金属板扛得住。
有人问我能不能分两半存——一半在手机备忘录,一半在邮箱草稿箱。讲真,这比全放在一个地方更危险,因为攻击面从一个变成了两个,而你自己拼回去的时候还容易搞混顺序。
还有个细节:助记词的顺序错了就是错的,不存在“意思差不多”。BIP39 词表里 2048 个单词,12 个词乱序,对应的私钥完全不同。我见过有人抄的时候把第 7 和第 8 个词写反了,恢复出来是个空钱包,以为钱没了,折腾了两天才想起来翻原始纸条。
授权比私钥泄露更隐蔽
私钥泄露是“门被撬了”,授权是“你自己把钥匙给了别人,还忘了要回来”。
ERC-20 的 approve 和 ERC-721 的 setApprovalForAll 是两个高频雷区。前者常见于 DEX 交易——你授权某个合约花你的 USDC,额度可能是“无限”。后者常见于 NFT 平台——你授权某个合约转走你某一整个系列的 NFT。
操作步骤很简单,但没人做:打开 Revoke.cash 或 Etherscan 的 Token Approvals 页面,连接钱包,看列表。每个授权后面有个 Revoke 按钮。点它,付一笔 gas(主网大概 2 到 5 美元,取决于当时的 gas 价格)。
我自己的习惯是每季度查一次,尤其在大额交互之后。上个月查的时候发现有个 2022 年的旧授权还挂着,对象是一个已经跑路的项目合约——那个合约虽然没人维护了,但 transferFrom 函数还在,只要有人调用就能动我的代币。
有个常见误区:以为“不常用的钱包就安全”。实际情况是,你越不常用的钱包,越容易积攒陈年授权,越容易忘记里面还有没有东西。我建议把钱包分三类:冷钱包(只收不发)、交互钱包(常用,定期清授权)、测试钱包(随便造,别放钱)。
Gas 费卡住了怎么办
交易卡在 pending 状态,是新手最容易慌的场景。
先搞清楚一件事:卡住不是钱丢了,是交易在 mempool 里排队。以太坊主网 mempool 里常年有 10 万到 30 万笔待处理交易,你的交易 gas price 设低了,矿工就不打包。
解决办法取决于你的钱包类型。MetaMask 里有个“Speed Up”按钮,点它,用更高的 gas price 重新发一笔相同 nonce 的交易。如果你想把交易取消掉,发一笔 0 ETH 转账给自己,nonce 和卡住的那笔一样,gas price 设高一点。矿工只会打包其中一笔,另一笔自动作废。
注意:这个操作有坑。如果你卡住的是一笔 DeFi 交互(比如 swap),Speed Up 之后可能因为滑点变化导致交易失败,gas 照扣。我有次在 Uniswap 上 Speed Up 一笔 swap,等了 40 秒价格动了 0.8%,交易 revert,白付了 12 美元 gas。
更稳妥的做法是发交易前看一眼 gas 追踪器(Etherscan Gas Tracker 或 ultrasound.money),别在 gas 飙到 80 gwei 的时候硬上。周末凌晨的 gas 通常比工作日白天低 60% 以上。
多签不是万能药
Safe(原 Gnosis Safe)多签钱包这两年被吹得很猛,但很多人没搞明白它的边界。
多签解决的是“单点私钥泄露”问题——3/5 多签意味着攻击者要拿到 3 个私钥才能动钱。但它不解决“签名者被钓鱼”的问题。如果 5 个签名者里有 3 个在同一个恶意网站上签了交易,多签照样被掏空。
今年 5 月有个 DAO 的案例:他们的 4/7 多签钱包被清空,原因不是私钥泄露,是 4 个签名者的硬件钱包在连接一个伪造的 Safe 界面时,签了一笔 execTransaction,把所有权转给了攻击者。硬件钱包屏幕上显示的是一串哈希,签名者没细看就按了确认。
说白了,多签把“一个人犯错”的门槛提高到了“多个人同时犯错”,但如果你的签名者群体没有独立的操作习惯(比如有人用 Ledger、有人用 Trezor、有人用纸钱包),攻击者钓鱼一次就能拿到多个签名。
钱包连接网站时,看域名最后三位
钓鱼网站最常见的套路是域名相似。uniswap.org 和 uniswap.com、unlswap.org(小写 L 换成大写 I)、app-uniswap.org——这些域名长得像,点进去界面一模一样。
我的习惯是:连接钱包前,把浏览器地址栏的域名从右往左读。先看 .org 还是 .com,再看主域名拼写,最后看有没有奇怪的子域名前缀。app.uniswap.org 是正常的,uniswap.app.xyz.com 就有问题。
还有个细节:真正的 Uniswap 不会在连接钱包后立刻弹出一个“请签名以验证所有权”的请求。任何在你刚连上钱包就要求签 eth_sign 或 personal_sign 的网站,先关掉再说。eth_sign 尤其危险,它签的是任意哈希,攻击者可以用它签一笔转账交易的哈希,你签完就等于授权了那笔转账。
硬件钱包在这时候能救命。Ledger 上签 personal_sign 会显示“Sign message”,签交易会显示金额和地址。如果你在硬件钱包屏幕上看到的是“Sign message”但网站说“这只是登录验证”,停下来,别按确认。
钱包这东西,说到底是个责任自负的工具。没有客服电话,没有冻结按钮,没有“找回密码”。你签的每一笔交易、存的每一份助记词、授出去的每一个权限,都是不可逆的。花 10 分钟查一次授权,比事后写 100 条求助帖有用得多。