奖励不用等清算:ERC-2917 把质押利息的计算搬上合约 图 1
奖励不用等清算:ERC-2917 把质押利息的计算搬上合约 · 图 1

奖励不用等清算:ERC-2917 把质押利息的计算搬上合约

很多质押或借贷产品的收益,用户是拿不到中间数字的:要么等所有参与者退出时一起结算,要么项目方在链下算好再一次性发放。ERC-2917 想消灭这种不透明,创建于 2020 年 8 月 28 日,仓库状态是 Stagnant。它的思路是把“某个地址现在应得多少奖励”写成合约里一个随时可查的函数,让钱包可以把各家产品的收益口径统一显示出来。

八个函数,先分四组

原文给出的接口按功能可以分四组。第一组是总闸:interestsPerBlock 返回每个区块的全局利率,changeInterestRatePerBlock 由管理方调整它。第二组是个人账本:getProductivity 返回两个无符号整数,increaseProductivitydecreaseProductivity 按地址增减其中一个值。第三组是取钱:take 返回一个数值,takeWithBlock 同时返回数值与区块号。第四组是铸造入口 mint。原文说合约会在两个事件上被触发计算:某个地址的生产力发生变化,或者有用户提取。

这里的关键词是 productivity(生产力)。它不是余额本身,而是原文所谓“有效抵押乘以时间”的量:你抵押了多少、抵押了多久,两者相乘累计进一个只增或只减的值。公式里区分了个体生产力、全局生产力与总产出三个量,某一时段的奖励按个体在全局中的占比分配。这样写的好处,原文明说:早进入不会多得,晚进入不会少得,退出也不必等到清算日。

奖励不用等清算:ERC-2917 把质押利息的计算搬上合约 图 2
奖励不用等清算:ERC-2917 把质押利息的计算搬上合约 · 图 2

为什么“早进晚进中性”值得单独强调

把奖励写成累计量而不是快照比例,解决的是一个非常具体的套利问题。如果按区块快照记比例,晚进的人可以掐着发币前的最后一个区块进来分走一笔;反之早进的人为了不被稀释,必须在每个结算点前不动。累计生产力记账把时间因素算进权重之后,两类抢跑都失去意义。读任何质押合约时,先分辨它用的是哪一种:是按某个区块的余额切片发钱,还是把每笔抵押在链上活了几个区块都算进权重。这两种口径在同一份界面文案下会给出差别很大的收益。

停在 Stagnant 的现实原因

这份标准没有跑通,原因不在算法。第一,changeInterestRatePerBlock 意味着收益曲线由管理方随时可改,用户查到的瞬时数字背后是一条别人可以拧的旋钮,这对一个声称透明的标准是硬伤。第二,逐区块累计要求每次抵押、提取都触发写入,Gas 成本与“随时可查”的好处互相抵消,项目方更愿意用按秒推算的懒计算。第三,同期涌现的 ERC-4626 金库标准选了一条更简单的路:把收益折算进份额价格,只留一个兑换率函数,用户不再需要理解生产力这个中间量。今天看,ERC-2917 关心的透明性问题由后者用另一种方式回答了一半。

钱包界面里那句“预计收益”是谁算的

把 ERC-2917 和今天的实际体验对照,最有价值的收获是养成一个追问习惯:当界面显示一个可领取数字时,它是合约 take 类函数返回的,还是前端拿过去七天的数据反推的。前者可以被任何人在浏览器里复算,后者是一次预测,改一个参数就会变。有些产品会显示“已产生奖励”,这个数字来自合约;另一些只显示“当前年化”,这个比率来自某个价格模型。这两种显示在合规和体验上的含义完全不同,而界面排版往往让你察觉不到差别。分辨办法只有一条:查合约里有没有一个不需要参数或只需要地址的奖励查询函数。有,就去调用一次,拿返回值跟界面对账;没有,就说明这个数字根本不是链上事实。 留给用户的核对清单很短,但每一条都能用:在合约页确认有没有查询奖励的函数、它是否只读;确认利率参数由谁调用修改、有没有时间锁;确认所谓“预估收益”是合约返回的还是前端按历史年化算的。第三条尤其常见,界面写着当日年化,实际来源是一行前端公式,与合约里发生的事没有直接关系。

本文为机制说明,不构成任何投资建议。