Skip to content

[Discussion] 矿工证能量公式、惩罚机制与等级模型的改进建议 #23

@lurenpluto

Description

@lurenpluto

背景

当前矿工证系统的核心能量逻辑已经基本实现,相关代码主要位于:

  • src/btc/usdb-indexer/src/index/energy_formula.rs
  • src/btc/usdb-indexer/src/index/energy.rs
  • src/btc/usdb-indexer/src/index/pass.rs

相关协议与设计文档位于:

  • doc/矿工证铭文设计.md
  • doc/矿工证铭文协议.md

本 issue 不是最终方案确认,而是在现有实现基础上的一轮改进建议讨论,目标包括:

  • 降低能量模型在长期运行中的数值风险
  • 改善增长与惩罚之间的经济平衡
  • 为后续等级系统设计提供稳定的数值基础
  • 为协作矿工证的合并与结算预留合理空间

1. 目前能量增长公式的问题

当前增长模型的核心问题在于:能量增长公式整体仍然偏线性,且曾经采用较大的 ENERGY_GROWTH_MULTIPLIER

主要问题

  • ENERGY_GROWTH_MULTIPLIER = 10000 时,增长速度过快,极易在较高余额、较长持有周期下快速逼近 u64 上限。
  • 即使将 ENERGY_GROWTH_MULTIPLIER 降到 1,如果年龄 age 仍然采用“无上限线性增长”,从理论上讲依然存在能量最终打满 u64 的风险。
  • 当前实现虽然通过饱和计算避免了 Rust 层面的整数溢出 panic,但一旦能量打满,后续数值会失真,影响:
    • 能量排行
    • 能量继承
    • 等级映射
    • 后续经济模型的可解释性

初步建议

建议将 ENERGY_GROWTH_MULTIPLIER 收敛到 1,同时同步调整惩罚算法的量纲和强度,避免出现“增长变慢,但惩罚仍然沿用旧体系”的失衡问题。

也就是说,multiplier 的调整不能单独看,必须和惩罚公式一起重构。


2. 考虑引入 balance_units 的方案

为降低线性增长公式的数值规模,建议引入余额缩放单位:

balance_units = floor(balance_sats / 100_000)

即以 0.001 BTC 为一个最小能量计量单位。

方案意义

这样做的核心目的是:

  • 降低原始 satoshi 数值过大带来的增长过快问题
  • 将增长公式从“按 sat 直接累计”改为“按缩放后的余额单位累计”
  • 为后续 multiplier = 1 的简化方案提供更稳定的数值基础

在线性增长公式下的可行性

若配合:

  • multiplier = 1
  • 增长仍为线性
  • growth ~ balance_units * age

则对于绝大多数现实账户规模,数值风险会大幅下降。

极端情况的风险

需要明确的是:

  • 如果 age 仍然无上限线性增长,则该方案只能显著降低风险,不能从数学上彻底消除风险。
  • 也就是说,只要增长对 age 仍保持无限线性,理论上经过足够长时间,仍然可能触及 u64 上限。
  • 但从协议寿命和实际运行周期角度看,风险会比“直接使用 sat 原值增长”低很多。

当前讨论结论

balance_units 是一个值得引入的基础改动,优点是:

  • 逻辑简单
  • 易于实现和审计
  • 可显著缓解数值膨胀问题

但它更适合作为“第一层缩放”,而不是唯一防线。后续仍应结合 age 侧的改进一起使用。


3. age 的可能改进方案

背景

当前讨论中,一个核心结论是:

年龄越大,新增能量的边际增长越慢

也就是说,age 更适合从“线性增长变量”改为“衰减后的成熟度函数 R(H)”。

这里的衰减不是指已有能量下降,而是指:

  • 持有时间越长
  • 每新增一个区块带来的额外收益越小

方案 A:分段衰减

示意为:

  • 前一段全速增长
  • 中段降速增长
  • 后段进一步降速
  • 最后可以选择进入平台期

示例思路:

0 ~ T1:      100% 增速
T1 ~ T2:      25% 增速
T2 ~ T3:      10% 增速
T3+:           0% 或极低增速

分段衰减的优点

  • 容易解释,适合协议和产品文案表达
  • 容易实现,适合索引器历史重放
  • 容易审计和测试
  • 可以自然形成 hard cap

分段衰减的缺点

  • 在断点附近会有不连续感
  • 用户可能围绕断点做行为博弈
  • 若分段过多,参数会变得比较人工

方案 B:log 衰减

示意为:

R(H) = A * log(1 + H / B)

或等价形式的离散/查表版本。

log 衰减的优点

  • 曲线更平滑,没有明显断点
  • 更符合“长期仍有增长,但越来越慢”的直觉
  • 不容易围绕某个固定高度进行边界博弈

log 衰减的缺点

  • 不如分段方案直观
  • 若直接使用浮点实现,历史一致性和跨语言复现要更谨慎
  • log 仅能降低增速,不会天然形成严格 hard cap
  • 参数调优不如分段方案直观

推荐方向

从当前项目阶段看,更推荐:

  • 底层能量结算层:优先考虑分段衰减
  • 上层等级映射层:再考虑 log / 几何阈值等平滑模型

原因是:

  • 底层能量状态需要稳定、可审计、易重放
  • 分段方案更适合作为协议级基础规则
  • log 更适合作为展示层或等级层的非线性映射

也可以考虑折中方案:

  • 用离线表或查表方式实现“近似 log 的年龄函数”
  • 既保留平滑性,也兼顾实现确定性

4. 惩罚机制的改进

背景问题

如果增长机制引入 age 衰减,但惩罚仍然沿用旧体系,容易出现以下问题:

  • 增长越来越慢,但惩罚依旧过重
  • 负向余额变化的成本远大于长期积累收益
  • 用户只要正常整理 UTXO 或进行少量转账,就可能遭遇过重损失
  • 系统更像“强锁仓 + slash 模型”,而不是“长期质押积累模型”

当前推荐方向

更推荐采用“弱对称方案”:

penalty = lost_units * R(H_now) * lambda

其中:

  • lost_units:按缩放后的损失余额单位计算
  • R(H_now):当前成熟度函数
  • lambda:惩罚放大系数

该方案的意义

该方案保留了以下特性:

  • 惩罚与当前成熟度挂钩
  • 已成熟的仓位减仓会付出更高代价
  • 惩罚强度可以通过 lambda 调整
  • 比“固定最大惩罚”更平衡
  • 比“完全对称无惩罚”更能抑制短期停车资金

lambda 的设计可能性

方案 1:固定系数

例如:

  • lambda = 1.2
  • lambda = 1.5
  • lambda = 2.0

适合:

  • 参数简单
  • 易实现
  • 易解释

方案 2:随成熟度变化

例如:

  • 年轻仓位 lambda 更大
  • 成熟仓位 lambda 更小

这样可以满足不同目标:

  • 打击短期流入流出
  • 对长期稳定账户更友好
  • 减少“成熟账户一次小幅减仓也被过度惩罚”的问题

方案 3:随减仓比例变化

例如:

  • 小比例减仓:较小 lambda
  • 大比例减仓:较大 lambda

适合防止:

  • 大额快速撤出
  • 短周期套利行为

当前建议结论

相比“最大惩罚”或“完全对称惩罚”,更推荐:

  • R(H_now) 为基准
  • 再乘一个温和的 lambda
  • 构成“弱对称惩罚”体系

这更符合长期矿工体系的直觉,也更容易与后续等级系统协调。


5. 能量等级模型

设计目标

等级模型需要满足:

  • 前期升级较快,增强参与感
  • 后期升级变难,体现长期积累价值
  • 不应与原始能量完全线性对应
  • 能承接未来协作矿工证的合并逻辑

推荐模型:几何级数阈值模型

推荐使用几何级数型阈值定义等级门槛:

E(L) = E0 * (q^L - 1) / (q - 1)

其中:

  • E(L):达到等级 L 所需能量阈值
  • E0:初始门槛
  • q:增长系数,q > 1

反向求等级时可理解为对数型增长,因此具有:

  • 前期升级快
  • 后期升级越来越难
  • 参数可控
  • 结构成熟,类似许多游戏/成长系统的经验阈值设计

推荐取值方向

建议优先讨论以下区间:

  • q = 1.15 ~ 1.18
  • E0 根据最终能量量纲确定,例如:
    • 100_000
    • 1_000_000
    • 或其他更适合新能量尺度的值

后续可根据以下样本场景做等级对照表,再反推参数:

  • 1 BTC / 10 BTC / 100 BTC
  • 1 个月 / 6 个月 / 1 年 / 4 年

协作矿工证合并能量的注意事项

在该等级模型下,需要特别注意协作矿工证的合并方式。

当前不建议直接采用:

总等级 = 主矿工证等级 + 所有协作矿工证等级之和

原因是:

  • 如果等级函数本身是凹函数(如 log / 几何阈值反函数)
  • 直接相加多个等级,可能鼓励把能量拆分到多张证上
  • 从而带来拆分套利或 sybil 风险

更推荐的方向

先做能量聚合,再映射等级:

effective_energy = E_main + alpha * sum(E_collab)
total_level = level(effective_energy)

其中:

  • alpha 用于控制协作矿工证的贡献比例
  • alpha 可以小于 1,避免协作路径过强
  • 等级映射只对聚合后的有效能量做一次

这样更有利于:

  • 控制拆分激励
  • 保持主矿工证为核心
  • 让协作矿工证成为辅助加成,而不是主导套利手段

待进一步讨论的问题

  • balance_units 的单位应选 100_000 sats,还是更粗/更细的粒度?
  • age 更适合 hard cap 的分段模型,还是平滑的 log 模型?
  • penaltylambda 应该固定,还是跟随成熟度/减仓比例变化?
  • 等级模型中的 E0q 应如何通过样本场景反推?
  • 协作矿工证的 alpha 应如何设定,才能既有意义又避免拆分套利?
  • 当前“负向变动后基线重置”的机制,是否需要与新的 age 模型联动调整?

当前建议小结

本轮讨论阶段的建议方向可以概括为:

  1. 将增长体系收敛到更小量纲,避免长期数值膨胀。
  2. 引入 balance_units,降低 sat 原值直接累计的风险。
  3. age 从简单线性变量改为带衰减的成熟度函数 R(H)
  4. 惩罚机制从“旧线性体系下的重惩罚”调整为“基于成熟度的弱对称惩罚”。
  5. 等级系统采用几何级数阈值模型,并优先采用“先聚合能量,再映射等级”的协作合并方式。

Metadata

Metadata

Labels

enhancementNew feature or request

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions