到期自动收回:ERC-5334 给 NFT 的使用者角色装上过期钟 图 1
到期自动收回:ERC-5334 给 NFT 的使用者角色装上过期钟 · 图 1

到期自动收回:ERC-5334 给 NFT 的使用者角色装上过期钟

租赁类 NFT 产品有个尴尬的工程细节:租约到期那一刻,链上必须再发生点什么,否则“租客”的名字会一直挂在合约里。传统做法是房东到期再发一笔交易把使用者改回去——两笔交易、两倍 Gas,还有忘发、迟发、抢发的边界麻烦。ERC-5334(2022 年 7 月 25 日创建,提案文档现状为 Stagnant)给出的答案是换一个记账角度:不用删除记录,只需要让每次查询都先看一眼表。

user、expires、level:一次写入,三个维度

标准给 ERC-721 加了一个 user 角色——可以“使用”这枚 NFT(把虚拟土地拿去搭场景、把游戏资产拿去上场),但不能转让它、也不能再指定别的使用者。核心函数 setUser(tokenId, user, expires, level) 一次写入三样东西:谁来用、用到哪个 Unix 时间戳为止、以及一个可选的用户等级。之后一切交给语义规则:userOf(tokenId) 在查询时如果发现当前时间已越过 expires,直接返回零地址,效果等同于“没有使用者”;userExpiresuserLevel 分别给出到期时间与等级;角色变化时广播 UpdateUser 事件。到期收回从“一笔必须有人记得去发的交易”变成“一条永远成立的时间判断”,这就是它省事的根本原因。标准文档还举了组合玩法:同一枚头像 NFT 可以同时接入一个三十天租赁平台和一个分期买房式的抵押贷款应用,两边都读写同一套 user 字段,原项目方不需要为任何一方单独开发接口。

到期自动收回:ERC-5334 给 NFT 的使用者角色装上过期钟 图 2
到期自动收回:ERC-5334 给 NFT 的使用者角色装上过期钟 · 图 2

与 4907、5380 站在同一条光谱上

三条相近路线可以这样摆放。ERC-4907 是最简形态:只有 user 与到期时间,一步到位的整枚出租。ERC-5334 在它上面加了两样东西——level 等级维度,以及把“查询时判时”的语义写进正文,让到期归零成为规范要求而非实现默契。ERC-5380 则走了另一条轴:不按整枚出租,而按功能合约拆分名额、可一对多。三者都建立在“所有权与使用权分离”这同一直觉上,选择哪条,取决于场景需要“一个人用整枚”还是“多人用零件”。需要坦白的现实是:5334 的提案状态是 Stagnant,字段设计里连 ERC-165 的接口号在正文注释中都尚未定稿,采用面远小于 4907 生态的尝试者们。看到某个租凭平台自称“支持到期自动收回”时,值得先问一句它实现的是哪个标准、还是自研的私有字段。

租客下单前的三次点击

机制落到用户手里,是三次可执行的核验。第一次,调用 userOf 确认标的当前使用者为空(或就是你自己担心的那个地址)——这是防止一物多租最直接的证据。第二次,调用 userExpires 并自己换算时间戳,别只看页面换算好的中文日期;到期时间与租约文本不符,就是红旗。第三次,翻这枚代币的 UpdateUser 事件历史,看这个租约结构过去是否正常运转过、user 字段被改写的频率是否符合常理。最后一句边界话:到期自动失效保护的是“名字不再挂在租客账上”,不保护押金与纠纷——租金退还、违约处理都不在标准射程内,一切以项目条款为准。本文只做机制解释,不构成任何租赁或投资建议。

时间字段的两个技术细节

细节一是类型:接口里 expires 声明为 uint64,语义是 Unix 秒级时间戳。秒级加区块时间戳的组合意味着到期时刻的判定跟随矿工打包时间,边界分钟内存在正常波动,租约敏感场景(比如到期即生效的下一轮出租)应把它当作“大约几点”,而不是分秒不差的闹钟。细节二是判定时机:标准的到期语义发生在 userOf 查询时,链上存储不会在到期瞬间自动改写——没有定时任务、没有 gas 消耗、也没有到期广播事件,UpdateUser 只在有人主动调用 setUser 时出现。这带来一个连锁推论:仅监听事件的系统可能感知不到“到期”这件事本身,它们必须按标准语义在每次读取时自行比较时间;反过来,若某个租凭平台的后台只靠事件驱动,到期的使用者名义上还在记录里躺一段时间,页面显示的回收延迟未必是作弊,也可能只是实现选择了事件口径。读懂这两个字段,就能看懂很多“到期了还能用”究竟是设计、延迟还是欺诈。