setApprovalForAll 与 approve 区别|从 NFT 全权到 ERC20 限额
approve(spender, amount) 是 ERC20 限额授权(指定数量);setApprovalForAll(operator, true) 是 ERC721 / ERC1155 全权授权(整个 collection 全部 NFT)。本文按 6 个维度对比两者。
setApprovalForAll 与 approve 有什么区别?直接答:approve(spender, amount) 是 ERC20 标准里的「限额授权」——指定 spender 与具体数量;setApprovalForAll(operator, true) 是 ERC721 / ERC1155 的「全权授权」——一次签名让 operator 能转走整个 collection 里的全部 NFT,没有数量限制。前者风险线性,后者风险指数级。setApprovalForAll 是 NFT 钓鱼最常见手法。
如果你识别完授权风险后想把 NFT 资产转去交易所或冷钱包,可顺路准备 币安官网 的实名账号——Binance 也支持部分热门 NFT 交易。手机端可用 币安官方App 一键完成。下载入口在 下载页。
6 个维度对比
| 维度 | approve | setApprovalForAll |
|---|---|---|
| 标准 | ERC20 | ERC721 / ERC1155 |
| 授权范围 | 单个 Token 限额 | 整个 collection 全权 |
| 参数 | spender, amount | operator, bool |
| 一次签名能授权什么 | spender 转 X 个币 | operator 转 collection 里所有 NFT |
| 撤销 | approve(spender, 0) | setApprovalForAll(operator, false) |
| 钓鱼风险 | 中(限额可控) | 极高(一次失守全没) |
第 1 步:approve 的执行模型
function approve(address spender, uint256 amount) returns (bool);
调用后 spender 的 allowance 变为 amount——spender 后续调 transferFrom 累计转走 ≤ amount。用完后 allowance = 0,要再 approve。
| 用例 | 例 |
|---|---|
| 在 Uniswap 兑换 USDT | approve(Router, 100) |
| 给 Aave 抵押 USDC | approve(Pool, 1000) |
| Unlimited approve | approve(Router, uint256.max) |
第 2 步:setApprovalForAll 的执行模型
function setApprovalForAll(address operator, bool approved);
调用后 operator 对你 collection 全部 NFT 拥有「转移权」——任何时间能转走任意 tokenId。没有数量参数,没有 tokenId 参数。
| 用例 | 例 |
|---|---|
| 在 OpenSea 卖 NFT | setApprovalForAll(OpenSea Conduit, true) |
| 在 Blur 挂单 | setApprovalForAll(Blur, true) |
| 在 LooksRare 卖 | setApprovalForAll(LooksRare, true) |
第 3 步:风险等级对比
| 攻击场景 | approve 风险 | setApprovalForAll 风险 |
|---|---|---|
| spender 合约升级有漏洞 | 限于 allowance | 整个 collection 失守 |
| spender 被钓鱼 | 限于 allowance | 整个 collection 失守 |
| Permit 离线签 | 限额 | 整个 collection(NFT permit) |
| 反复利用 | spender 用完 allowance | operator 永久有权限 |
A:setApprovalForAll 一旦签错,损失是「整个 collection 价值」——可能几万到几百万美元。approve 限额损失只到 allowance。
第 4 步:识别 setApprovalForAll 的钓鱼信号
| 信号 | 说明 |
|---|---|
| 不熟悉网站要求 setApprovalForAll | 高风险 |
| operator 是 EOA(钱包地址) | 100% 钓鱼 |
| operator 是 Unverified 合约 | 高风险 |
| 弹窗显示 Approve 但 calldata 是 0xa22cb465 | 钓鱼骗你以为是 ERC20 approve |
| approved 参数 = false 没事 | 那是撤销不是授权 |
第 5 步:MetaMask 弹窗辨识
approve 的 calldata:0x095ea7b3 + spender + amount
setApprovalForAll 的 calldata:0xa22cb465 + operator + bool(true=授权,false=撤销)
A:MetaMask 钱包弹窗中应该明显显示「ERC721 Approval」与「Set Approval For All」字样——新版 MetaMask 警告「这会让 operator 转走你 collection 里的全部 NFT」。
第 6 步:撤销 setApprovalForAll
方法 1:在 Etherscan Approval Checker / Revoke.cash 找到 ERC-721 / ERC-1155 类型的授权,点 Revoke。
方法 2:手动在该 NFT 合约页 Write Contract 调 setApprovalForAll(operator, false)。
| 链 | 撤销 Gas |
|---|---|
| ETH 主网 | 0.0005-0.005 ETH |
| Polygon | 0.001-0.01 MATIC |
| BSC | 0.00005-0.0001 BNB |
详见 Token approval 分类的 Revoke.cash 教程篇。
实战:清理 5 个 NFT collection 的 setApprovalForAll
| 步骤 | 操作 | 时间 |
|---|---|---|
| 1 | 打开 revoke.cash 连钱包 | 30 秒 |
| 2 | 切到 ERC-721 / ERC-1155 类型 filter | 5 秒 |
| 3 | 看到 5 个 setApprovalForAll | 1 分钟 |
| 4 | 优先撤给 EOA / 陌生合约的 | 5 分钟(含签名) |
| 5 | 给 OpenSea / Blur 的可保留(除非不再卖) | 视情况 |
| 6 | 复查 | 2 分钟 |
A:给 OpenSea Conduit 与 Blur 的 setApprovalForAll 不必撤——撤了下次卖 NFT 还要再签。这两个是公认安全的 operator。
主流 NFT 市场 operator 地址
| 市场 | operator 合约 |
|---|---|
| OpenSea Conduit | 0x1E0049783F008A0085193E00003D00cd54003c71 |
| OpenSea Seaport | 0x00000000006c3852cbEf3e08E8dF289169EdE581 |
| Blur | 0x39da41747a83aeE658334415666f3EF92DD0D541 |
| LooksRare | 0x0000000000E655fAe4d56241588680F86E3b2377 |
| X2Y2 | 0x74312363e45DCaBA76c59ec49a7Aa8A65a67EeD3 |
风险提示
setApprovalForAll 是 NFT 钓鱼最高发场景——任何不熟悉网站要求 setApprovalForAll,关闭浏览器。MetaMask 弹窗里看到「Set Approval For All」字样就要警觉。
如果资产想出金,可借助 币安官网 走 C2C。
实操核对清单
- [ ] 已了解 approve vs setApprovalForAll 区别
- [ ] 已记 4byte selector(0x095ea7b3 vs 0xa22cb465)
- [ ] 已识别 MetaMask 弹窗里两种类型
- [ ] setApprovalForAll 只给主流 operator
- [ ] 不再用某市场后撤销其 setApprovalForAll
- [ ] 月度审计 setApprovalForAll 状态
一站式回顾
A:approve = ERC20 限额授权;setApprovalForAll = NFT 全权授权。核心 4 个识别:标准、范围、参数、风险等级。核心 1 个安全心法:setApprovalForAll 是「指数级风险」——只给公认主流 operator,任何陌生地址要求 setApprovalForAll = 立即关闭。
如果想了解钓鱼授权的具体识别方法,下一步建议看钓鱼授权识别篇。
常见问题
approve 也能授权 NFT 吗?
A:能,ERC721 / ERC1155 也有 approve(spender, tokenId) 单个 NFT 授权。但 setApprovalForAll 更常用因为 NFT 市场需要预先授权整个 collection。
setApprovalForAll 能用 amount 限制吗?
A:不能。这就是其根本风险——没有数量参数,要么全权 (true),要么收回 (false)。
给 OpenSea setApprovalForAll 永久授权安全吗?
A:相对安全。OpenSea Conduit 是知名公开合约,多年运营无大事故。但「永久」意味着 OpenSea 合约出大问题时你的 NFT 也会受影响——所以「不再用 OpenSea 后撤销」是更稳的做法。
Permit 也有 NFT 版本吗?
A:有。ERC-4494(NFT Permit)允许 NFT 离线签名授权——但目前应用很少,主要 ERC-2612(ERC20 Permit)更常见。
MetaMask 不显示 setApprovalForAll 警告怎么办?
A:升级到最新版本——新版 MetaMask 内置了警告。老版本只显示原始 calldata,需要用户自行解码 0xa22cb465。
我撤销了 OpenSea 的 setApprovalForAll 还能登录 OpenSea 吗?
A:能登录但不能卖 NFT——下次挂单时 OpenSea 会再弹一次 setApprovalForAll 让你签。对买家来说撤销不影响。
approve 与 setApprovalForAll 的 Gas 消耗一样吗?
A:差不多——两者都是简单 storage write,Gas 50,000-80,000。实际成本看 Gas Price。
文档发布于 2026-05-08,下次复测计划 2026-08-08(约每 90 天回访一次,确认 ERC721/ERC1155 setApprovalForAll 标准与主流 NFT 市场 operator 地址未变)。