ERC-6909两种授权有何区别? 图 1
ERC-6909两种授权有何区别? · 图 1

ERC-6909用一份合约余额表管理多个token id,授权也分成两层:allowance只允许spender动用某个id的一定数量,operator则允许地址操作owner名下所有id。保留两者不是重复设计,而是让一次性额度和长期全局委托拥有不同的风险与交互。

先看余额和授权的坐标

余额通常以balanceOf[owner][id]理解;allowance增加spender维度,形成allowance[owner][spender][id];operator则只有isOperator[owner][spender],不区分id和数量。三张表的键不同,决定了授权粒度。

权限作用范围数量上限典型用途
owner本人自己全部id余额直接转账
allowance指定spender与id指定额度一次购买、有限委托
operator指定spender的全部id通常无单独额度路由、托管或市场合约

前端若把operator也显示成“授权某代币”,会严重低估权限。

transferFrom应如何判断

当调用者就是from,合约可直接检查余额;当调用者是已授权operator,也可跳过逐id allowance;否则必须读取该id的allowance并确认足够,再按实现规则扣减。最后才更新from和to余额并发出Transfer事件。

无限allowance是否使用最大整数、扣减顺序以及自转账处理属于具体实现细节。集成方不能只根据接口名推断,应阅读源码并测试余额不足、allowance不足、operator撤销和重复调用分支。

两个看似相同但风险不同的场景

场景A:用户允许游戏合约消费id 7的100个道具。即使游戏合约被攻击,其他id原则上不在这项allowance范围。场景B:用户把同一合约设为operator,攻击者可能转走该owner名下所有ERC-6909 id,数量上限只受余额约束。

因此需要频繁操作多个id的协议才有理由请求operator。普通支付或单品交易优先用精确allowance,并在完成后允许用户清零。所谓“节省一次授权交易”必须与扩大的长期攻击面一起展示。

撤销界面要展示完整上下文

allowance撤销页应显示合约、owner、spender、token id、当前额度和最后修改交易;operator撤销页必须明确“全部id”,并列出该合约中已发现的余额范围。只展示代币符号会在一个合约承载多个资产时造成误判。

授权交易提交后要等待回执并重新读取链上状态。前端本地把开关变灰不等于撤销成功;链重组、RPC缓存或交易失败都可能让权限仍然有效。高风险operator变更应在签名摘要中突出spender地址和全局范围。

实现与集成的测试清单

合约测试至少覆盖:owner直接转移、operator转移多个id、逐id allowance扣减、额度不足、余额不足、撤销后立即调用、零地址规则、事件参数与重入边界。模糊测试可以随机生成owner、spender、id和amount,检查总余额守恒与未授权转移永不成功。

钱包和索引器还要接受“ERC-6909是最小标准”这一事实:元数据、枚举、批量转账和扩展事件不一定存在。识别资产时以合约地址加id作为主键,不把id 1跨合约合并。遇到扩展接口时,应标明它不是ERC-6909核心保证。

选择授权模型的简单原则

能预先确定单一id和最大数量时,用allowance;必须持续管理多个id且用户理解全局范围时,才考虑operator;权限只用于一次事务时,在事务完成后撤销或采用原子化调用。协议若必须请求operator,应解释原因、提供最小权限替代路径和一键链上撤销。

审计结论也要区分标准与实现。标准定义可观察接口和权限语义,不能证明某个具体合约没有升级后门、签名授权漏洞或错误的检查顺序。用户最终信任的是部署代码、管理员权限和签名内容的组合。

ERC-6909 Allowance与Operator的资料版本与边界

  1. Ethereum EIPs:候选主题、当前接口或站内待复核页面。
  2. ERC-6909 Source Proposal:机制、字段、操作路径与风险边界交叉验证。

资料访问日期为2026年7月23日。本文按当前规范解释机制和核验方法,不构成投资、法律或资金安全承诺。节点版本、链配置与接口字段可能变化,实际操作前应重新打开一级来源,并以目标环境返回为准。

延伸阅读:钱包会话权限权限模型