NFT 被谁拿了多久:ERC-6806 持有时长查询的能与不能 图 1
NFT 被谁拿了多久:ERC-6806 持有时长查询的能与不能 · 图 1

NFT 被谁拿了多久:ERC-6806 持有时长查询的能与不能

一枚 NFT 在某个人手里待了多久,听起来是个简单问题,但在 ERC-721 的标准接口里其实没有现成答案。ownerOf 只告诉你现在归谁,不告诉你从哪天开始归他。想还原历史,只能去区块浏览器把每一次 Transfer 事件翻出来重放。ERC-6806 想把这件事简化成一次调用:加一个函数,直接读出持有人和持有时长。按照 ercs 仓库的记录,这份提案状态是 Draft(草稿),创建于 2023 年 3 月 30 日,建立在 ERC-721 之上。

一个函数解决一个查询

ERC-6806 的核心接口叫 IERC6806,只有一个函数:getHoldingInfo(tokenId),返回两个值——当前持有人的地址,以及这枚代币在当前持有人手里已经停留的秒数。计时单位用秒,和智能合约里其他基于 block.timestamp 的逻辑天然对齐。提案的动机写得很直接:有些应用需要奖励长期持有者、控制独家内容的访问资格,或者按持有时长设计业务规则,而标准 ERC-721 没有内建机制提供这个信息。

对开发者来说,这个扩展不改动 ERC-721 本身的任何函数,老钱包和市场不认识它也不会出错;认识的合约才能把“拿够九十天解锁某内容”这类规则写进合约逻辑,而不必自己维护一套转账日志索引。

NFT 被谁拿了多久:ERC-6806 持有时长查询的能与不能 图 2
NFT 被谁拿了多久:ERC-6806 持有时长查询的能与不能 · 图 2

计时从哪一刻开始

规范把持有时长定义为“代币进入当前持有人名下的那一刻”到现在的间隔。也就是说,每发生一次转让,计时器归零重走。这符合“奖励忠诚持有人”的直觉:倒手一次,时长就清零。但要注意口径细节——它统计的是当前这一段持有期,不是这枚 NFT 自铸造以来的历史总时长,也不是某个地址跨多枚代币的累计持仓。想区分“拿得久”和“倒手多”,恰恰要的就是这种清零语义,但读数据的人必须知道自己在读哪一段。

三类测不准的情形

第一类是链外转移。如果市场通过托管、订单撮合之外的方式改变实际控制关系,或者合约把转让实现成先收回合约再重新发放,计时起点取决于合约怎么写,外部读取者未必看得懂。第二类是跨合约搬运。同一个系列的资产如果桥接到另一条链或另一个合约,那条链上的一切计时都从零开始,链下的“我拿了三年”在链上没有任何凭证可言。第三类是合约自身升级。可升级合约改写了存储结构,历史计时可能整段丢失。

还有一层容易被忽略:getHoldingInfo 只是查询函数,它给不出证明力。合约可以如实实现,也可以在返回前做手脚——所以拿它做 gating 条件的项目,本质上信任的是这份合约的实现,而不是“链上客观事实”。

和相近概念怎么分工

ERC-6806 管“这一枚资产在当前主人手里多久”,与它容易混淆的有三类东西:ERC-20 世界里的账龄、流动性池里的份额时长,以及各市场自己统计的持仓榜单,它们都不查询也不覆盖 NFT 的枚级持有时长。另外,持有时长不等于持有成本,也不构成任何价值信号——它只是一个时间读数,被谁引用、用来触发什么规则,才决定它的意义。

草稿状态意味着什么

怎样给持有时长做一次交叉验证

普通持有者不需要写解析器也能自检。先读一次合约的 getHoldingInfo,记下返回的秒数与持有人地址;再到区块浏览器里找到这笔 NFT 最近一次进入当前地址的 Transfer 事件,用当前区块时间戳减去事件所在区块的时间戳,得到一个参照值。两个数字大致相符,说明合约按公开转让起点如实计时;合约读数明显偏大,多半把代持或桥接的某段历史并进了时间线;读数明显偏小,则要警惕合约把一次转手拆成多步的内部记账。一次对照不能证明合约可信,但能把“计时从哪一刻开始”从悬念变成数据——依赖持有时长的 gating 系统如果只信合约读数、不查事件历史,对转手刚满一天的地址同样会放行,这个差值值得每个参与者亲手量一遍。

按 ercs 仓库口径,ERC-6806 停留在 Draft,没有进入最终阶段,实现它的合约需要自行约定接口细节。对普通持有者的实际建议是:如果某个项目声称“按持有时长发奖励”,先确认它读的是哪份合约的 getHoldingInfo,再确认你之前有没有把 NFT 转过、桥过或放进过托管合约——这三种情况都可能让你的计时被重置,而重置往往在签名那一刻就发生了。本文为机制说明,不构成任何投资建议。