如何在Token持有者间分配手续费新Token?求低Gas成本方案
解决大规模Token持仓奖励分配的Gas优化方案
核心优化思路:改用用户主动申领模式
彻底规避批量遍历的高额Gas成本,这是当前Web3项目处理此类场景的主流方案:
- 仅记录全局基准数据:每日结算时,合约只需更新两个全局变量,无需遍历任何持有者:
totalSupplySnapshot:当日结算时刻的Token总供应量rewardPerToken:当日每单位Token可分配的奖励额度,计算公式为当日赚取Y数量 / totalSupplySnapshot
- 用户触发奖励计算:当用户执行转账、查询余额或主动调用申领函数时,合约自动完成以下操作:
- 计算用户自上次申领(或首次持仓)以来的累计奖励:
(当前rewardPerToken - 用户lastRewardRecord) * 用户持仓量 - 将奖励直接追加到用户余额,同时更新用户的
lastRewardRecord为当前rewardPerToken值
- 计算用户自上次申领(或首次持仓)以来的累计奖励:
对应案例的流程演示
- 初始状态:总供应量100枚(用户1持10枚、用户2持90枚),
rewardPerToken=0,两位用户的lastRewardRecord均为0 - 当日赚取10枚Token,结算时更新:
rewardPerToken = 10 / 100 = 0.1
- 用户1发起转账或主动申领:
- 应得奖励 = (0.1 - 0) * 10 = 1枚
- 用户1余额变为11枚,
lastRewardRecord更新为0.1
- 用户2查询余额或主动申领:
- 应得奖励 = (0.1 - 0) * 90 = 9枚
- 用户2余额变为99枚,
lastRewardRecord更新为0.1
额外优化细节
- 嵌入核心操作:将奖励计算逻辑整合到
transfer、transferFrom等高频函数中,用户无需额外调用申领接口,体验更顺畅 - 可选批量申领:针对长期未操作的用户,可提供管理员批量申领功能,但仅针对特定分组(如持仓Top N用户),而非全量遍历
- 奖励池暂存:合约赚取的Y枚Token先存入奖励池,用户申领时直接从池内划转,避免提前增发导致的总供应量混乱
方案优势对比
- Gas成本完全分散:由用户各自承担自身申领的Gas费用,合约无需支付批量操作的高额成本
- 无时间约束:无需固定窗口完成批量分配,用户可随时触发奖励到账
- 逻辑简洁易维护:避免维护持有者列表索引、批次状态等复杂逻辑,降低合约出错风险
内容的提问来源于stack exchange,提问作者Anton Nikolayevich
相关产品推荐
相关产品推荐

