整批授权太吓人:ERC-5216 给 ERC-1155 装上按数量放行的闸门
在 1155 合约里挂一次卖,很多钱包会弹出同一类提示:你要授权一个操作员管理某类代币。点下去的瞬间,一批币的命运就交出去了。这不是操作习惯问题,而是 ERC-1155 原生规范的先天局限——它的授权函数只有一个 setApprovalForAll(operator, bool),开关一拨,同一编号(id)下你手里的全部数量都进了对方的可操作范围,想只放行二十张门票而不动剩下八百张?原生接口做不到。ERC-5216(2022 年 7 月 11 日创建,进入过 Last Call 最终征询、截止日为 2022 年 11 月 12 日)想把 ERC-20 那套“按额度授权”的老智慧搬进 1155 世界。
一个函数、一个查询、一个事件
5216 的接口借用了 ERC-20 和 ERC-721 的命名习惯,学起来几乎没有门槛。授权函数签名是 approve(operator, id, amount):给某个操作员放行、指定哪一类代币、最多能动多少,三件事一次说清,并同时广播带四个字段(account、operator、id、amount)的 Approval 事件。查询函数是 allowance(account, operator, id),三个坐标问出一个数字:你、对方、哪类币之间还剩多少额度。转账侧的改动藏在 1155 原有的 safeTransferFrom 与 safeBatchTransferFrom 里:如果操作员没有被 setApprovalForAll 整体放行,合约必须核对额度是否足够,成交后从授权额度里扣掉实际转走的数量;批量转账则要求列表里每一个 id 的额度都单独核验。接口识别走 ERC-165,标识符为 0x1be07d74。这套设计的要害是把信任从“全部或没有”改成了“用多少、给多少”。

额度不会自己消失
标准文本的安全考量只有一句话,但分量最重:使用者要仔细掂量给出的数量,未用完的授权应当撤销。链上额度是持久状态,不会因为你在市场上完成了一笔成交、或者关掉了那个标签页而自动归零。撤销的方式就是再调一次 approve(operator, id, 0),把额度清零并留下事件记录。于是就有了一个值得固化的习惯:每次在 1155 类项目(游戏道具、会员门票、批量头像最常见的载体)操作完,去区块浏览器对着合约手动跑一遍 allowance(你的地址, 操作员地址, 代币编号),返回值大于零而你又没打算继续挂单,立刻清零。这个动作不需要任何第三方工具授权,也不花额外 Gas 之外的成本——真正贵的从来是那笔“整类全部放行”之后被盗走的币。
理想与现实的距离
必须诚实地交代现状:5216 停留在 Last Call 阶段,主流市场与钱包对它的适配参差不齐。也就是说,多数时候你面对的现实仍是“要么整类放行、要么没法挂单”。这时防御手段退回通用三件套:用专门的低余额钱包做交易热钱包,把主力库存留在不授权的位置;挂单前先查合约是否支持 165 探测里的 0x1be07d74,支持才谈按量授权;每次成交或撤单后复查并清理授权。另外提一句容易混淆的邻居:ERC-7604 让 1155 支持免 Gas 的 permit 签名授权,底层同样依赖按数量记账的额度模型,两者一个是链上直调、一个是签名代付,别当成同一件事。本文只讨论接口机制与安全习惯,不构成任何投资建议。
把查授权做成肌肉记忆
对 1155 类资产,浏览器读函数比任何第三方扫描器都直接,操作只有四步。第一步,进区块浏览器的 Read Contract 面板,选目标 1155 合约;第二步,若合约实现了 5216,直接查 allowance(你的地址, 操作员地址, 代币编号),返回的额度就是对方当前能动用的数量;第三步,若没有该函数,退回查 isApprovedForAll(你的地址, 操作员地址),返回真即整类放行状态成立;第四步,需要撤销时,前者用 approve(operator, id, 0) 清零,后者用 setApprovalForAll(operator, false) 关闭,两种撤销都会留下可核对的事件。值得把这个动作设为固定节律的人包括:在游戏里存取过道具的、用过 1155 通票类集市的、以及任何一次操作中签过“管理某类代币”授权的。清单式的安全建议很多,但 1155 场景里真正兜底的只有这一条:授权是持久的链上状态,看不见不等于不存在。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。