ERC-4494 是什么?NFT 免 Gas 授权怎么用才安全 图 1
ERC-4494 是什么?NFT 免 Gas 授权怎么用才安全 · 图 1

一句话理解

标准 ERC-721 授权要走两步:你先花 Gas 调用 approve,被授权人再发起转账。ERC-4494 把这一步搬到链下:你对一份结构化数据签名(内容包含授权给谁、第几号 NFT、截止时间),拿到签名的人可以把它带进合约,合约验签后视同你已经授权。对用户体验的提升很直观——首次操作不再需要先准备 Gas、先等一笔授权交易。

签名里有什么

按提案,签名对应的域分隔数据(EIP-712 结构化签名)包含:合约地址、Token ID、被授权地址、过期时间戳,以及一个随授权版本递增的 nonce。几个设计意图值得记住:

  • 过期时间:授权不是一劳永逸,到期自动失效,这是它比传统永久 Approve 更安全的原因之一;
  • nonce:同一份签名不能反复重放,撤销时递增 nonce 即可让旧签名作废;
  • 带 Token ID:授权天然精确到单只 NFT,比 setApprovalForAll 的“全系列放行”粒度细得多。

和传统授权相比,风险换了位置

有人会把 permit 理解为“更安全”,这只对了一半。它把风险从链上永久授权搬到了链下签名:

  • 传统 Approve 是公开的、可查询的,你可以随时在授权管理工具里看到并撤销;permit 签名在过期或被 nonce 作废之前,只存在于拿到它的那个人手里——你无法在链上“看见”一个还没被使用的签名,也就难以主动撤销。
  • 反过来,正因为有截止时间与单只粒度,一份设计良好的 permit 授权暴露窗口比 setApprovalForAll 小。

结论:粒度与时效是它的优势,不可见是它的代价。两者都真实存在。

安全红线

  • 签任何 permit 类消息前,在钱包弹窗里核对三样: spender(被授权人)是不是你正在使用的市场官方地址、token id 是不是你要处理的那只、过期时间是不是短到够用。这三项任何一个异常,直接拒签。判别方法参见盲签名是什么
  • 别把 permit 签名当成“只是签个名”:只要对方拿到它并上链,你的 NFT 就可能被转走,它等价于一次授权。
  • 合约支持 permit 不代表必须用它:如果你的操作频率低,老老实实走 approve 反而让授权历史可见、可撤销。免 Gas 便利换来的账本不可见性,值得按自己的习惯权衡。

延伸阅读

授权撤销的通用操作参见代币授权撤销是什么;订单与签名机制在 NFT 市场里的系统讲解,可以看Seaport 订单机制

常见问答

问:permit 签名会不会被别处重放?

域分隔里包含合约地址与链 ID,跨合约跨链不会直接通用;同一合约内靠 nonce 防重放。真正要防的不是跨链重放,而是你亲手把有效签名交给钓鱼前端。

问:我签了 permit 之后反悔,怎么办?

三种办法:等它过期;在合约支持时调用 nonce 递增函数作废;或在过期前抢先完成你自己的操作。如果签名从未交出(没有上链、没给对方),它只是你链下持有的一段字符串,不构成链上风险。

常见问答

问:市场提示“免 Gas 授权”,我需要做任何链上操作吗?

只需要签一个消息。你不出 Gas、也不动资产,但记住:这段签名的价值等于一次单只 NFT 的限时授权,对方可以择机上链。签之前完成三核对:spender 地址、Token ID、过期时间(过期时间字段在授权语境下是安全特性,在别的语境可能是风险,看它授权给谁)。

问:怎么查看我签过哪些 permit?

看不到——这正是机制特点:未被消费的 permit 签名不存在链上记录。你能审计的只有消费后的链上授权状态。所以 permit 的安全感来自期限设置而非事后撤销,签的时候把过期时间选短,是给未来的自己留后路。

风险提示

本文为机制科普,不构成投资建议。签名即授权,误签可能导致资产被转移;操作前请逐项核对签名内容并控制授权期限。