奖励发放不循环转账:ERC-1973 的 TPP、轮次掩码与拉取式领取 图 1
奖励发放不循环转账:ERC-1973 的 TPP、轮次掩码与拉取式领取 · 图 1

奖励发放不循环转账:ERC-1973 的 TPP、轮次掩码与拉取式领取

一个激励型应用有了几万活跃参与者,发奖励这件事会迅速变成工程事故:循环五千万次给五千个地址各转一个零头,单笔 gas 贵得离谱,还得有人替所有人垫付手续费。ERC-1973 把这类问题总结成推式分配的天花板,并提出一套拉取式的标准接口。文件头记录创建于 2019 年 4 月 1 日,仓库记录状态为 Stagnant。

人均额度的算法

规范的三个核心概念里,最基础的是 TPP,原文给出的定义式是一轮里铸造的代币总量除以该轮活跃参与者总数。它天然是个稀释量:网络冷清时参与者少,人均额度高;网络热闹起来,同样一轮铸造摊到更多人头上,人均值下降。标准允许每轮铸造量按区块配置,例子里出现过每轮十二个币对九十五个参与者这种组合。换句话说,这套模型不把“发多少给每个人”写死,只保证每个人领到的是当轮的人均数,通胀节奏由每轮铸造参数控制。

轮次掩码是各轮 TPP 的累计快照,作用类似“截止到我参与的这一轮,池子历史上每轮的人均额度序列”。参与者掩码则记录某个地址参与了哪些轮次。领取时把两者做交集运算,地址就拿到了自己参与过的每一轮的人均额度之和——这就是拉取式的实现方式:没人给你转账,你按账本自己算自己拿。

奖励发放不循环转账:ERC-1973 的 TPP、轮次掩码与拉取式领取 图 2
奖励发放不循环转账:ERC-1973 的 TPP、轮次掩码与拉取式领取 · 图 2

接口的权限设计

函数清单分成两半。参与者侧只有 withdraw,谁调用都能领自己算出来的那份;系统侧是 triggermintTokens,标准规定 mintTokens 可以由任何活跃参与者发起,铸造这个动作本身不需要特权,这是它保持去中心化的关键一刀。名单管理走 addMintersremoveMinters 维护有权铸造的管理者集合,readyToMint 判断当前是否处于可铸造窗口,updateRoundMaskupdateParticipantMask 负责更新两本掩码账,calculateRewardscalculateTPP 把算账逻辑开放成可查询函数,前端不必自己复刻公式。

适用边界与状态

掩码运算的数字直觉

原文给了一个算例,值得用文字复述一遍来体会这套记账的锋利处。设每轮触发铸造二十个币,网络里原本十个人,于是这轮 TPP 是二;第十一个人加入后分母变十一,他在场期间三轮各摊二十比十一;他离开后又恢复十人配置。他加入那一刻系统记下 participantMask 等于加入前的 roundMask 累计值,等于把他入场前已经流走的人均份额清零;离场后再算他应得,就是当前 roundMask 减去他的 participantMask,恰好等于他在场期间各轮 TPP 之和。整个过程中没有人给他转过一分钱,账本只更新了两个累计量。这就是掩码的实质:用两个单调递增的快照之差,把“你参与了哪些轮”翻译成可提取余额。它优雅的前提是所有轮次的 TPP 能压进同一条累计流,若参与者分类计价或不同资产分池,单个 roundMask 就不够用,得靠多套掩码并行,规范没有推进到那一步。

这套设计的隐含前提值得点破:它假设参与者集合能被合约可靠地界定,“活跃”的判断标准由实现方定义,掩码的更新时机由谁触发、漏更新算谁的,标准没有细到那个层面,只把轮次快照的语义钉死。人均稀释也有反面:如果你的目标恰恰是给早期参与者更高的确定性回报,TPP 公式会随后来者稀释,这一点和直觉相反,读项目文档时要先确认它用的到底是不是这种模型。仓库记录里该提案停留在 Stagnant,没有出现被广泛采用的参考实现,后来生态里更常见的做法是默克尔树空投加认领,那套思路解决的正是同一类推式困境,但用的是快照证明而非掩码累计。评估任何自称“拉取式分配”的系统时,先问三个问题:轮次边界怎么定、参与者名单怎么进、账本由谁推进,三个答案合起来才是这套机制的真实形态。本文为机制说明,不构成任何投资建议。