钱包弹窗不是都叫“签名”:先分清它要你做什么

连接钱包、签一段登录消息、批准代币额度和发送资产,在技术上是四件不同的事。页面按钮可能都只写“Continue”,真正有约束力的是钱包弹窗里的方法、合约、金额、网络和接收方。看懂这些字段,比记住某个项目是否“热门”更可靠。
怎样快速判断钱包请求属于哪一类?
先看钱包是否显示 gas、资产变化、spender 或消息正文。只有公开地址连接通常不需要链上 gas;消息签名不会立即进入区块;approve 和普通转账是链上交易;permit 虽然常不立即花 gas,却可能把代币使用权交给指定地址。
| 请求 | 常见显示 | 是否上链 | 主要风险 |
|---|---|---|---|
| 连接钱包 | Connect / 查看账户地址 | 否 | 暴露公开地址与站点关联 |
| 普通消息签名 | personal_sign / Sign message | 签名本身不上链 | 被当作登录或链下授权凭证 |
| 结构化签名 | Sign typed data / EIP-712 | 签名本身不上链 | 订单、授权或委托被第三方提交 |
| 代币授权 | Approve / Permit / Allow spending | approve 上链,permit 可后交 | spender 可在额度内使用代币 |
| 交易 | Send / Confirm / Contract interaction | 是 | 转账、调用合约或改变链上状态 |
钱包品牌不同,字段位置会变,但风险判断不应依赖按钮颜色。看不到完整数据时,展开“Details”“Data”“Permission”或类似区域。仍看不懂就拒绝,拒绝请求不会让合法资产消失。
钱包弹出一个请求,这个到底能不能签?
按弹窗里真正出现的字眼对号入座,不按网页按钮上的说法。下表里“可以签”都有两个前提:浏览器地址栏的域名是你从官网或官方文档点进来的那一个;这一步确实是你正在做的操作需要的。任何一个前提不成立,就按“拒绝”处理。
| 弹窗里看到的 | 能不能签 | 要核对什么 |
|---|---|---|
| Connect / 连接此网站,只列出账户,没有金额和 gas | 域名对就可以 | 只勾选这次要用的账户,不勾装着主要资产的账户。 |
| Sign message,正文是一段能读懂的话,例如“Sign in to 某域名”,带 Nonce、Issued At | 可以签 | 正文里的域名必须和地址栏完全一致;正文出现 transfer、approve、withdraw 这类资产字眼就拒绝。 |
| Sign message,正文是一长串 0x 开头的十六进制,或钱包提示无法显示内容 | 拒绝 | 看不懂就等于不知道自己同意了什么。MetaMask 已按 2024 年通过的 MIP-3 提案停用能盲签任意数据的 eth_sign,还在要这类签名的页面本身就可疑。 |
| Signature request 里出现 Permit、PermitSingle、PermitBatch,或 spender、value、deadline 字段 | 当作代币授权,多数时候拒绝 | 只在你正在官方页面做兑换或质押时才考虑;spender 要和官方文档公布的合约一致,value 不能是 115792… 开头的一长串最大值,deadline 不能是几十年以后。 |
| Spending cap request、Approve、Allow … to spend your token | 只在正在做的那一步需要时签 | 核对代币和 spender;把额度改成这次要用的数量,不接受默认的无限额度。 |
| setApprovalForAll,或写着可以访问、转移你在某个合集里的全部 NFT | 除了在官方 NFT 市场挂单,一律拒绝 | “验证持有资格”“领取徽章”都不需要把整个合集的操作权交出去。 |
| Confirm 交易,资产变化里有你的币或 NFT 流出 | 流出的不是你打算支付的,就拒绝 | 页面写 Claim、Mint、Verify,钱包却显示你的资产转出,说明页面说法和实际调用对不上。 |
点 Reject 或 Cancel 不会损失资产,正规项目也不会因此取消你的资格,之后从官方入口重新打开页面即可。拿不准时,把弹窗截图(遮住余额)发到项目官方文档写明的公开支持频道问一句;私信你说能帮忙看的人一律不理。
只点 Connect Wallet,网站能做什么?
连接通常只让网站读取你选择的公开地址、当前网络和钱包能力。这一步一般不产生链上交易,也不会自动给合约花币权限。不过公开地址的交易历史是可查询的,网站可以把该地址与浏览器、账号或社交任务联系起来,所以仍有隐私成本。
连接后要留意连续弹窗。有些仿冒页把“连接”和“授权”做成连贯动作,用户看到第一个低风险请求后,习惯性确认第二个高风险请求。正确做法是每个弹窗重新读一遍:请求来自哪个域名、当前是哪条链、有没有资产和合约字段。不要因为刚刚安全确认过一次,就把下一次当成同一件事。
断开网站连接只会结束前端会话,不会撤销已经写入链上的 approve。钱包的“Connected sites”适合清理隐私关联;链上授权则要通过钱包授权管理页或可信的撤销工具单独处理。把两者混为一谈,是测试网用户最常见的安全误区之一。
personal_sign 登录签名安全吗?
可读、限定域名和用途、带 nonce 的登录消息通常风险较低,但不是“随便签”。EIP-191 为以太坊签名消息定义了前缀,目的是避免普通消息直接冒充一笔交易;它不替你判断消息内容是否恶意,也不限制网站拿签名去哪里验证。
一段合格登录消息应告诉你什么
正常的登录签名通常包含服务域名、钱包地址、登录意图、随机 nonce、签发时间和可选到期时间。你应能用人话读懂它,例如“登录某域名”,而不是一长串无法解释的十六进制。域名与浏览器地址不一致、消息要求接受未知条款,或者签名可以长期重复使用时,都值得拒绝并回到官方文档确认。
为什么“签名不上链”仍有风险
不上链只表示签名动作不立即产生公开交易,不表示签名没有效力。应用可以用它证明“这个地址的控制者同意了某件事”。如果消息实际是订单、登录挑战或资产操作凭证,拿到签名的人可能在另一个时间或系统中使用。不要把 gas 为零等同于风险为零。
遇到不可读的十六进制消息,先拒绝并寻找项目对签名格式的公开说明。硬件钱包屏幕显示信息较少时,可在电脑钱包界面核对完整内容,但不能只看网页自己写的“这是安全登录”,因为网页正是请求发起方。
EIP-712 结构化签名为什么更容易读,却不一定更低风险?
EIP-712 把签名数据拆成域、类型和字段,让钱包能显示人类可读的内容;字段本身仍可能授予真实权限。它常用于订单、投票、permit、链下报价和账户操作。你需要核对 verifyingContract、chainId、spender、value、deadline 与 nonce,而不是看到排版整齐就确认。
Domain:确认应用名称、版本、chainId 和 verifyingContract。主网页面却要求签另一条链,或合约地址与官方文档不一致,都是停止信号。名字只是文字,可被仿冒;合约地址和链更难伪装。
Message:确认 owner 是否是你的地址,spender 或 operator 是谁,value 是否是你打算授权的额度,deadline 是否合理。某些钱包把大整数显示成科学记数法,必须展开详情,结合代币 decimals 理解真实数量。
Nonce:nonce 通常用来防止同一签名重复使用,但具体实现由合约决定。你不需要凭肉眼验证合约代码,却应确认项目有公开合约地址和说明。对来源不明的结构化签名,最安全的判断仍是拒绝。
approve、permit 和 setApprovalForAll 有什么区别?
三者都可能把资产控制范围交给第三方,但对象和提交方式不同。approve 通常给某个 spender 使用一定数量的同质化代币;permit 用签名表达类似授权,第三方可代为上链;setApprovalForAll 常用于 NFT 集合,把该集合内所有资产的操作权交给 operator。
approve:看代币、spender 和额度
ERC-20 approve 是链上交易。确认正在授权哪种代币、spender 合约是否来自官方资料、额度是否只覆盖当前操作。无限授权减少以后重复授权的 gas,但也扩大合约被攻击、升级或私钥泄露后的损失范围。对测试任务,若页面只需少量测试代币,却请求主网稳定币无限额度,应立即停止。
permit:没有 gas 弹窗也能产生权限
EIP-2612 permit 允许代币持有人通过签名设置 allowance,之后由其他账户提交。用户常误以为“没有链上交易就没有授权”,这正是 permit 钓鱼利用的认知差。核对 owner、spender、value、deadline、nonce 和 verifyingContract;签过可疑 permit 后,仅断开网站连接不够,应查看代币合约支持的撤销方式,并考虑转移高价值资产。
setApprovalForAll:一个开关可能覆盖整个 NFT 集合
这个权限不是批准单个 NFT,而是允许 operator 管理某地址在一个集合中的全部 NFT。钱包通常会给出明显警告,但仿冒页面会把它描述成“验证持有资格”。如果任务只是签名登录或领取测试徽章,没有合理理由要求主网 NFT 全集授权。
授权交易成功后,权限会留在链上,直到额度用完、你主动改为零、合约规则使其失效,或资产移走。网站关闭、浏览器缓存清除、钱包断连都不会自动清理。
普通转账和合约交互要看哪些字段?
至少核对网络、接收地址、资产、数量、调用方法和预计余额变化。交易会写入链上,签名只是最后确认;网页上的按钮文案没有约束力。页面说“Claim”时,钱包 data 可能调用 transferFrom、multicall 或不认识的方法,不能只根据按钮判断。
- 确认当前 chain ID,避免把测试操作放到主网。
- 核对 To 是个人地址还是合约;与官方公布地址逐字比较。
- 查看 Value 是否发送原生币,Token changes 是否包含不期望的资产。
- 展开调用数据,确认方法名称和参数与当前任务相关。
- 查看 gas 只是费用检查,低 gas 不能证明交易安全。
- 钱包提供模拟时,阅读预计转入转出,但保留对模拟局限的认识。
交易模拟依赖当时的链状态、节点和解析器。可升级合约的实现可能变化,复杂调用也可能无法完整解码。模拟结果与页面描述冲突时应拒绝;模拟显示“无资产变化”也不代表长期授权没有风险。
签名前如何做一套不费力的检查?
把检查固定成“域名—网络—类型—对象—范围—退出方式”六步。这套顺序比凭项目名、粉丝数或页面视觉做判断稳定。
- 域名:从官网或文档进入,确认浏览器完整域名,没有同形字或多余子域。
- 网络:核对 chain ID 和钱包当前账户,主钱包与测试钱包分开。
- 类型:这是连接、消息签名、结构化签名、授权,还是链上交易?
- 对象:核对合约、spender、operator、接收地址和代币。
- 范围:核对金额、额度、NFT 集合、deadline 与可重复使用性。
- 退出:知道如何撤销授权、取消会话、换钱包或停止任务。
如果钱包界面省略重要字段,不要转回网页寻找“安全”承诺。换用能显示详情的钱包、查阅官方合约说明,或放弃该任务。测试网奖励不确定,无法解释的权限却可能影响真实资产,这个风险收益关系不值得赌。
签错了 approve、permit 或 setApprovalForAll,接下来怎么做?
先分清你签的是哪一种,再走对应的步骤。只连接了可疑网站、没签任何东西的,在钱包的已连接网站里断开即可,资产不受影响。不确定签过什么,就在区块浏览器搜自己的地址,看最近的记录里有没有 Approve、Set Approval For All 或陌生的 Transfer。下面每一步都用不到助记词,任何要你输入助记词的“修复工具”都是骗局。
签了 approve 或 setApprovalForAll:去撤销页面把权限清零
- 自己在地址栏输入网址,打开撤销工具,例如 revoke.cash,或 Etherscan 的 Token Approval Checker(etherscan.io/tokenapprovalchecker;BNB Chain 用 BscScan 的同名页面)。不要点私信或群里发来的“撤销链接”。
- 连接钱包,或先只粘贴地址查看;把网络切到你当时签授权的那条链,授权是按链分开记录的。
- 按时间排序,找到那个陌生的 spender 或 operator,点 Revoke。
- 钱包会弹出一笔交易,确认它做的是撤销(把 approve 额度改为 0,或把 setApprovalForAll 设为 false),并支付少量原生币作 gas。钱包里没有 gas 就先转入一点。
- 交易成功后刷新列表,确认那一行已经消失。更细的操作见撤销授权教程。
撤销只能阻止以后的转移,已经被转走的资产拿不回来。如果余额正在减少,先把剩下的币和 NFT 转到新钱包,再回来撤销。
签了 permit 或 Permit2 签名:先看它有没有被提交上链
permit 本身只是一段签名,对方要把它提交上链才会生效。在区块浏览器打开你的地址,看该代币的授权记录或最近事件里有没有出现对方的 spender:
- 已经出现:按上一节撤销,同时查看该代币余额是否已被转走。
- 还没出现:最稳的办法是马上把这个代币转到另一个钱包,签名里的额度就没有东西可动。Revoke.cash 的 Signatures 页面可以尝试作废可疑签名,但它自己也说明,诈骗者通常拿到签名就会尽快提交,往往来不及。
只签了 personal_sign 登录消息:一般不会丢币,但要做三件事
带 EIP-191 前缀的普通消息签名不能被当成一笔转账交易,也不是 permit 需要的 EIP-712 结构化数据,单凭它通常转不走你的代币。你需要做的是:
- 回想或翻截图确认签过的原文。如果原文不只是登录,而是写着 authorize、order、key、trading 之类的内容,就到对应平台的官方网站检查已登录设备、会话和 API key,逐个撤销。
- 在钱包里断开这个网站的连接,它之后再弹出的 approve、permit 一律拒绝。
- 如果是在仿冒站上签的,这个地址已被对方记下,接下来可能收到假空投代币和“领取链接”,都不要点。只签过登录消息的话,不需要为此换钱包。
币一转进去就被转走:问题不在授权,而是私钥或助记词已泄露
往钱包里转原生币,几秒钟后就被转到陌生地址,说明对方已经掌握你的私钥。撤销授权没有用,转进去的 gas 也会被一起转走。停止向这个地址转入任何资产,用新生成的助记词建一个新钱包,能转的资产尽快转过去,旧地址彻底弃用。
资产已经被转走:保全证据,只找官方渠道
链上转账无法撤回。把交易哈希(TxID)、你的地址、对方地址、钓鱼网站域名和弹窗截图整理好。资产流向某个交易所的充值地址时,带着这些材料联系该交易所官方客服,尚未提走的部分有机会被冻结;同时向钱包官方支持报告钓鱼域名,并向你所在地的警方报案。声称付费就能“追回”“解冻”的人和服务都是第二次诈骗,正规机构不会先向你收费。
常见问题
只连接钱包会转走资产吗?
单纯连接通常只是把公开地址和当前网络提供给网站,不会直接转账。但连接后的页面可能继续请求消息签名、代币授权或交易,所以每一个后续弹窗仍要单独判断。
personal_sign 一定安全吗?
不一定。普通可读登录消息通常不直接移动资产,但签名仍可被应用当作授权凭证。域名、消息内容、nonce、有效期或用途不清楚时应拒绝。
approve 和 permit 有什么共同风险?
两者都可能允许指定 spender 使用你的代币。approve 是链上交易;permit 往往先签名、之后由他人提交。都要检查代币、spender、额度、网络和有效期。
钱包模拟显示安全就能直接签吗?
不能只依赖模拟。模拟能帮助解释交易结果,却可能漏掉可升级合约、后续调用、签名被延迟提交或数据源未知等风险。它是辅助信息,不替代域名和权限核对。
approve 之后还能撤回吗?
能撤销,但只对以后生效。自己输入网址打开 revoke.cash 或区块浏览器的 Token Approval Checker,切到签授权的那条链,找到对应 spender 点 Revoke,再在钱包里确认一笔需要少量 gas 的交易。撤销前已经被转走的资产拿不回来。
只签了 personal_sign 登录消息,钱包还安全吗?
通常安全。普通消息签名不能被当成转账或 permit 授权来用。确认原文只是登录后,断开该网站连接、拒绝它之后弹出的授权请求即可;如果原文提到授权交易、API key 之类的内容,就到对应平台撤销相关会话和密钥。