你每次在Uniswap上换币之前弹出的那个"授权"确认框,它本身就是一笔链上交易,要付Gas费。这笔授权交易本质上是一次对代币合约的调用,执行了修改你账户状态的操作。
操作目标
搞清楚一次代币授权操作到底包含了哪些步骤,以及为什么它是一笔独立的Gas消耗。
代币授权核心规则
代币授权(Token Approval)的核心,是ERC-20标准里定义的approve函数。你调用它,就是在告诉代币合约:"我允许某个合约地址(比如Uniswap的Router),可以从我的余额里转出最多X个代币"。这个"允许"的记录,会存储在代币合约的allowance映射表里。
这个操作之所以要付Gas费,是因为它修改了区块链上的状态(写入了你的授权额度)。一次完整的授权流程,包含以下被EVM打包执行的操作:
调用
approve(spender, amount):你的钱包发起一笔交易,目标地址是你持有的那个代币的合约地址,调用它的approve方法。设置授权额度:代币合约执行代码,将
spender(比如Uniswap合约)和amount(你授权的数量)的对应关系,写入合约内部存储。触发
Approval事件:合约在链上生成一条Approval事件日志,记录下"谁授权给了谁多少额度"。
高危风险:不要为了省事授权"无限额"(Maximum)。这相当于给那个合约一把你钱包的万能钥匙。如果那个合约被黑客攻击或存在漏洞,你的钱包可能被直接掏空。每次只授权本次操作所需的确切数量,是对自己资产安全的基本尊重。
做完授权这一步,你才能在后续的正式交易(如Swap)中,由Uniswap合约调用transferFrom函数,真正把你的代币转走。
两类授权模式对比
授权方式在演进,主要有两种模式,这直接影响你的操作步骤和Gas消耗。
| 模式 | 操作步骤 | Gas消耗 | 使用场景 |
|---|---|---|---|
| 传统ERC-20授权 | 两步走:1. 单独发起授权交易(付Gas)。2. 发起正式交易(再付Gas)。 | 需付两次Gas费 | 大多数标准ERC-20代币,如USDT(某些实现)等。 |
| 签名式授权(EIP-2612 Permit) | 一步到位:在钱包里离线签一个名(不消耗Gas),然后将签名与正式交易一起发送,由代付方(如dApp)或你自己在同一笔交易中完成授权+操作。 | 只需付一笔交易的Gas费(合并到正式交易中) | 支持EIP-2612标准的代币(如一些新的ERC-20,以及部分Layer 2上的代币)。 |
如果你交互的dApp和代币支持EIP-2612,你会明显感觉到流程更顺滑,因为没有那笔单独的授权交易弹窗了。
授权交易常见失败原因
授权数量不足:你之前授权了100 USDT,现在想换200 USDT。如果没有重新授权足够的额度,正式交易会因
Transfer amount exceeds allowance而回滚失败,但Gas费不退。钱包余额不足:发起授权交易时,钱包里ETH不足以支付Gas费,交易会提交失败。
授权结果验证方法
授权交易成功后,去区块浏览器(如Etherscan)查这笔交易的详情:
在"Logs"里,找到
Approval事件。确认owner(你的地址)、spender(被授权的合约地址)和value(授权额度)是否正确。你也可以用Etherscan的"Token Approval Checker"工具,直接查看你地址下所有代币的授权情况。
常见问题
Q:授权了一笔额度后,用完还要再授权吗? A:需要。授权额度是累积消耗的。比如你授权了100个代币,第一次转了60个,那么剩余的授权额度就是40个。再转50个时,因为40 < 50,就需要重新发起一笔授权交易,增加额度。
Q:怎么取消之前给某个合约的授权?
A:再发起一笔授权交易,把amount设为0即可。这会将授权额度归零,相当于撤销了权限。这笔操作同样需要付Gas费。



