授权给路由之前先看清清单:ERC-6120 通用代币路由器的得与失 图 1
授权给路由之前先看清清单:ERC-6120 通用代币路由器的得与失 · 图 1

授权给路由之前先看清清单:ERC-6120 通用代币路由器的得与失

一次“卖 NFT 换 ETH 再买另一个”的操作,在传统流程里可能要签四笔交易:两个授权、两个执行,每一笔都在向陌生合约让渡权限。钓鱼网站最喜欢的正是这种混乱:页面把流程包装成一键完成,用户连着点了四个签名,事后才发现第三个签名的对象根本不是官方合约。ERC-6120(2022 年 12 月 12 日创建,提案状态 Review)提出的通用代币路由器(Universal Token Router, UTR)想把这类多步流程压成一次调用,顺便给钱包一个可以展示的收支清单。但它换安全的方式很特别,值得逐条拆开看。

exec 把意图先摊在桌面上

路由器的核心是一个 exec 函数,参数里带三样东西:一组要调用的动作(action)、一组输入代币及限额、一组期望输出及下限。执行结束时,路由器对 outputs 里列的每一项,在接收地址上前后各读一次余额,任何一项的增量低于声明的 amountOutMin,整笔交易以 INSUFFICIENT_OUTPUT_AMOUNT 回滚。这个设计的妙处不在省 Gas——真正关键的是它把“这笔交易应该让我得到什么”变成了链上可执行的断言,钱包前端在签名前就能把这张收支清单渲染给用户:你付出多少、至少换回什么,一目了然。标准文本在动机部分把话挑明了:在 UTR 之前,用户只能盲信应用前端会诚实构造交易,这种盲信正是钓鱼温床;把参数清单立成规范,恶意前端就难藏动作。

授权给路由之前先看清清单:ERC-6120 通用代币路由器的得与失 图 2
授权给路由之前先看清清单:ERC-6120 通用代币路由器的得与失 · 图 2

0x61206120 与一批必须记住的边界

路由器能替你动币,靠的是事先对它的授权。为了限制爆炸半径,标准留了一个非常罕见的狠招:保留 ERC-165 标识 0x61206120 给“非代币合约”使用,任何被 UTR 调用的动作合约都必须声明它;同时明令所有代币合约永远不得实现这个标识——因为一旦某个代币“长得像动作合约”,它被挂到路由上就可能被任何人无限制花掉。读到这里,用户侧的安全要点已经清楚了。第一,给路由合约授权等于给一个可编程的中间人发通行证,只应授权官方审计过的部署地址,而不是页面上弹出来的“最近一个请求”。第二,动作清单要求每个代币操作都显式写出接收人,对老旧的“把币转给 msg.sender”型合约,路由器需要额外适配层,所以历史项目兼容性有真实代价——标准自己也承认,唯一完全不兼容的是那些用 msg.sender 做受益人又不提供所有权转移函数的应用合约。第三,带 discard 功能的路由实例要加倍小心:标准安全考量明确说该函数无法像 pay 那样用余额前后对比验证,只应配合可信部署使用。

值不值得等它普及

现状要讲公道:UTR 停在 Review 阶段多年,链上主流路径仍是各 DEX 和市场的私有路由,NFT 场景里直接对 Seaport 类合约做单动作授权的惯例没有变。对普通持有人,眼下更可执行的做法是:能拆步骤就手动拆,每一步都核对合约地址;确需一键聚合时,选择公开可验证、有版本号和路由地址白名单的聚合器,并在每次操作后清理授权。这份标准提出的“收支清单先于签名”思想,已经在更主流的模拟式签名预览里部分落地——不必等 6120 普及,用户可以现在就要求自己的钱包展示这笔调用会让哪些资产进、哪些出。本文只讨论机制与安全实践,不构成任何交易或投资建议。

从用户视角复述一遍验证逻辑

路由器最容易被误解的一点是:它并不保证你换到了理想价格,它保证的是“低于下限就整笔作废”。执行开始时,路由器对声明的每一项输出记录接收地址的余额快照,结束时再读一次;增量少于 amountOutMin,交易以 INSUFFICIENT_OUTPUT_AMOUNT 回滚,你的授权与代币分毫未动。这意味着恶意前端能作恶的空间被压缩:它可以在动作清单里藏步骤,但不能在你眼皮底下让结果静默缩水。当然前提是路由地址本身可信——同样的脚本逻辑写在恶意路由里,它完全可以不调 _transferToken 而直接把批准的币转走。所以信任链条的正确读法是:官方路由合约加审计哈希负责逻辑诚实,exec 参数与回滚规则负责结果可验证,两层缺一不可。理解了这一点,就不会被“路由器让交易绝对安全”的宣传带偏,也不会低估它对多步操作的透明度改善。