ERC-6982 默认锁定:给灵魂绑定代币省 Gas 的小设计 图 1
ERC-6982 默认锁定:给灵魂绑定代币省 Gas 的小设计 · 图 1

ERC-6982 默认锁定:给灵魂绑定代币省 Gas 的小设计

如果一个合集从一开始就决定“所有代币永远不可转让”,按早期做法,合约要在铸造每一枚代币时都发一条“已锁定”事件,一万枚就是一万条冗余记录。ERC-6982(Efficient Default Lockable Tokens)针对这种“全员默认锁”场景做了个很 Unix 哲学的优化:默认状态用一个事件声明一次,只有偏离默认的个体才单独发事件。该提案目前为 Final(最终)状态,创建于 2023 年 5 月 2 日,接口面向 ERC-721。

默认状态只声明一次

按规范,合规合约必须在部署时发出一次 DefaultLocked(bool locked) 事件,为整个合约的所有代币设定初始锁定状态;如果将来默认状态本身变了,再补发一次同名字段更新后的 DefaultLocked。单个代币的锁定状态变化则用 Locked(uint256 indexed tokenId, bool locked) 事件逐个记录,这类事件是对默认值的“个体覆写”。

这样索引器和钱包在解析一个一万枚成员、从未偏离默认值的合集时,只需要读一条部署事件,而不是扫描一万条单币事件——提案的动机部分把节省 Gas 的场景直接点名为“从铸造到销毁都永久锁定的灵魂绑定代币与不可转让徽章”。

两个查询函数

接口提供两个只读函数:

  • defaultLocked():返回当前默认锁定状态,返回值必须与最近一次 DefaultLocked 事件一致。
  • locked(uint256 tokenId):返回指定代币的当前锁定状态;若该代币从未有过单独的 Locked 事件,返回默认值;代币不存在时必须回滚(revert)。

ERC-165 接口标识为 0x6b61a747,钱包和市场可以先探测再决定要不要按“可锁定代币”渲染。

“锁定”在合约里到底是什么

需要澄清一个常见误读:ERC-6982 本身只标准化了“锁状态的声明与查询”,它不强制规定锁定必须在哪一层执行。典型实现会在转账路径上加检查——locked(tokenId) 为真则拒绝转账。也有的实现用锁定表示禁止市场类操作而允许直转。所以判断一枚“锁定代币”的真实能力,最终要看转账函数代码或官方文档对锁定语义的描述,接口标识只回答“状态怎么读”。

和相邻概念的边界

  • 与 ERC-6454 的关系:ERC-6454 回答“这枚代币当前可转让吗”,是面向前端的探测接口;ERC-6982 回答“锁定状态如何高效地声明与存储”。一个偏查询呈现,一个偏状态管理,二者可以共存。
  • 与销毁的关系:锁定改变的是转出资格,代币的所有权记录还在;销毁(转入零地址或 burn 函数)才让代币退出流通。锁定可被实现设为永久,但语义上不是消失。
  • 与灵魂绑定的关系:SBT 是一种产品概念(不可转让的凭证),ERC-6982 是实现这种概念的低成本状态层之一。

用户核验清单

  1. 用 ERC-165 探测 0x6b61a747,确认合约支持。
  2. defaultLocked() 看合集默认状态,再对具体编号调用 locked(tokenId),两者不一致时以单币状态为准。
  3. 到事件日志核对:这枚代币历史上是否发过 Locked 事件、默认声明是否改动过——这决定“默认锁”是不是曾被管理员调转。
  4. 别把接口支持误读为“任何人永远转不走”:状态查询可信,强制执行取决于转账实现,必要时查合约源码。

一个合集生命周期的事件量对比

把三种写法的账算在一起看。写法一(旧式逐币声明):铸造一万枚,每枚发一条锁定事件,部署与铸造合计一万零一条相关事件。写法二(ERC-6982):部署时一条 DefaultLocked,之后除非有人改动个体状态就不再发事件,事件量是一条。写法三(不声明默认、只在转账时检查内部标志):不发事件,但索引器和市场也无法从链上得知锁定语义,只能靠猜。方案二在“可审计”与“省 Gas”之间取了一个明确的平衡点:默认值可查、个体可查,冗余被压到最小。对于打算铸造大规模凭证合集的团队,这是把“全员锁”做成正经链上语义的成本最低路径;对于只有几十枚藏品的合集,节省有限,采用与否更多是规范一致性考虑。

索引与展示层怎么用

对数据服务商来说,这套接口改变了查询策略:先读部署交易的 DefaultLocked 确定基调,再针对关心的代币回查是否存在 Locked 覆写,两步就能给出准确状态,不必全量扫描事件历史。钱包在展示“该合集不可转让”徽标时也应走这条链路,而不是硬编码项目方的市场文案。当 defaultLocked 返回真、而 locked(tokenId) 对个别编号返回假时,说明存在显式解禁记录——这类个体的历史本身就值得多看了一眼。

对普通持有人来说,这类标准的意义在于:不可转让属性可以用更便宜、更可审计的方式写在链上,而不是散落在前端说明里。本文不构成投资建议,涉及流转受限的资产请自行评估退出风险。