ERC-7758 Transfer With Authorization:不广播交易也能完成 ERC-20 转账的签名凭据
平时转一笔 ERC-20 代币,流程是固定的:钱包签名、广播交易、等出块、付一笔 Gas。如果持有人此刻手里根本没有 ETH,或者想把多步操作合成一次链上动作,这条路就走不通。ERC-7758 给出的解法是把”我要转走这笔币”的意图做成一份结构化的 EIP-712 类型化签名,签名本身不上链,任何拿到它的人都可以在有效期内把它送进合约执行,合约验签之后代替签名人完成转账。按照以太坊 ercs 仓库的记录,这份提案状态为 Review,创建于 2020 年 9 月 28 日,是元交易思路上比较早期的一份标准化尝试。
三个函数覆盖签发、执行和撤销
ERC-7758 的接口核心是三个函数。transferWithAuthorization 的接收方是执行者而不是资产持有人,参数打包了六个关键字段:from(授权转出的地址)、to(收款地址)、value(金额)、validAfter 与 validBefore(生效与失效时间窗)、以及 nonce(一次性随机数),末尾再附上签名本身。执行者替这份签名付 Gas 调用它,合约恢复出签名人身份,检查条件都满足后直接从 from 的余额划转。receiveWithAuthorization 是镜像版本:签名由收款人出示,用于”我先把币打给你、你自己上链领取”的场景,省掉了接收方先攒一笔原生币的门槛。cancelAuthorization 则让签名人在链下签名作废之前,主动上链宣告这个 nonce 不再有效。配套的状态查询函数 authorizationState(authorizer, nonce) 返回一个布尔值,用来判断某份授权是否已被消费或撤销;两类链上痕迹分别由 AuthorizationUsed 和 AuthorizationCanceled 事件记录。

时间窗和一次性 nonce 各自管什么
validAfter 与 validBefore 划出签名的有效区间,提案的解释是防止交易提交过早或过晚带来的意外后果:例如你希望某笔交割在对手方完成另一侧动作之后再发生,就把 validAfter 设在那之后。nonce 解决的是另一个问题——同一份签名如果被反复提交,就会重复划款。标准规定每个 nonce 只能被消费一次,执行成功的同时把 AuthorizationUsed 事件写进日志,之后任何再提交都会失败。两个字段合起来,等于给一份链下凭据套上了”什么时候能兑换、只能兑换一次”的约束,性质上接近一张注明有效期且一次性的支票。
和 ERC-2612 的 permit 差在哪
容易混淆的是 ERC-2612 的 permit 签名。permit 签名改变的是 allowance(授权额度)账本,签完之后仍然要有后续的 transferFrom 才能动币;ERC-7758 的签名直接指向一次转账本身,验签和划转在同一次调用里原子完成。前者的风险集中在”额度挂在网上被人转走”,后者的风险集中在”这份签名兑换后会立即划走资金”。对拆箱阅读数据的用户来说,看到 permit 意味着查额度账,看到 ERC-7758 的授权签名意味着查转账意图,两种签名字段长得像,含义完全不同。
一张签名能顺带解锁的场景
提案摘要还列举了这套机制顺手解锁的用法:用代币本身而不是原生币支付手续费、由收款方提交交易的反向交割、把若干笔操作编进同一笔交易批量执行,以及担心交易被抢先或重复提交时改用签名凭据排队生效。这些场景的共同点是”交易的发起权”与”资产的支配权”解耦——签名表达意志,执行者是谁变得无关紧要,这正是元交易一词的全部含义。
实现与使用各自要小心什么
对合约实现方,提案明确提醒重放保护:nonce 与签名人的映射必须逐份消费、不可复用,跨链部署时还要确认 EIP-712 的域分隔符包含了链信息,否则一条链上签好的凭据可能在另一条结构相同的链上同样有效。对使用者,最朴素的两条防线是:签名前确认合约里的域名与版本号字段指向的是官方部署,避免在仿冒页面签任何带 validBefore 很长的授权;签完之后保留 nonce 记录,万一中途情况变化,赶在有效期结束前调用 cancelAuthorization 主动止损。按 ercs 仓库口径,该标准停留在 Review 阶段,并未被所有 ERC-20 代币采用,调用前应当先用 EIP-165 或直接读合约函数列表确认目标合约真的实现了这三个函数。本文为机制说明,不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。