这篇文章深入探讨了Rebasing代币在DeFi智能合约集成中引入的复杂性,特别是余额波动和舍入误差等问题。作者详细分析了AaveV3和Lido stETH代币的四种特殊行为(“怪癖”),并强调了在智能合约中应以“份额”而非代币数量进行内部记账,以确保安全性和准确性。

Rebasing tokens 提供无缝的 UX,但给智能合约集成带来了额外的复杂性。由于余额根据全局指数而非简单的整数波动,舍入误差是不可避免的。我们将剖析导致 AaveV3 和 Lido 集成中逻辑回滚的四个基本“怪癖”,并解释为什么内部以“份额”(shares)进行会计处理是安全的黄金法则。
在 DeFi 收益型资产领域,开发者通常会遇到两类代币:一类是通过增加价格来增加价值的代币(如 RocketPool 的 rETH),另一类是通过增加钱包中代币数量来增加价值的代币。后者被称为 rebasing tokens(伸缩性代币)。
尽管 AaveV3 aTokens 和 Lido stETH 等 rebasing tokens 为终端用户提供了无缝体验,但它们给智能合约集成带来了一些开销。由于这些代币代表了对一个波动资产池的 1:1 所有权,它们的余额不是以简单的整数存储的。相反,它们是使用底层、每个用户持有的“份额”计数和全局十进制“指数”动态计算的。
这种动态计算引入了舍入误差,虽然这些误差在价值上可以忽略不计,但它们可能导致与它们交互的合约出现意外状态和逻辑回滚。因此,许多协议决定完全不支持 rebasing tokens。
希望与 Lido 集成而又不想面对 stETH 舍入算术相关代码复杂性的开发者,可以使用官方的 wstETH 代币,它是其非 rebasing 的对应物,与池份额而不是底层 ETH 进行 1:1 映射。另一种直接与份额交互的方式是使用自定义的 transferShares() / transferSharesFrom() 函数。这两种方法都在 Lido 的官方代币集成指南中有详细说明。
Aave 也存在类似的替代方案,由 stataTokens 代表:它们是符合 EIP-4626 的、围绕 aTokens 的非 rebasing 封装器。然而,它们在生态系统中的知名度和普及度较低,因此即使在链上集成中,aTokens 仍然占据主导地位。
虽然这些非 rebasing 变体通常是最佳选择,但有时 DeFi 协议就是_必须_支持 rebasing tokens:如果这是你的情况,或者你只是好奇想了解更多,那么请继续阅读。我们将剖析份额和余额之间的对应关系如何影响集成,并学习需要注意什么才能构建安全、生产就绪的保险库和策略。
份额-余额转换中涉及的舍入打破了一些对于标准 ERC20 代币而言本应显而易见的属性,而开发者可能依赖这些属性来确保其逻辑的正确性。我们已经发现了四个这样的“怪癖”:
我们已经调查了这些属性,并精确限定了由此产生的与非 rebasing 行为的“偏差”。下表总结了结果。请注意,Aave aTokens 和 Lido stETH 采用不同的舍入约定:

当用户调用 transfer(amount) 时,协议必须确定要移动多少份额 (σ)。由于金额和指数很少能完全整除,协议必须选择一个舍入方向。如果 a 是转移的金额,i 是(十进制)指数:
对于这两个协议,最大偏差最终为 ⌈i⌉ weis:更大的指数会放大舍入误差。例如,Lido stETH 的指数在撰写本文时约为 1.23,这意味着最大偏差为 2 weis:这是一种已知行为,并在相关的 GitHub 问题中正式描述。
如果我们将余额视为具有完整精度的十进制数字,我们会发现发送方和接收方初始余额的小数部分可能不同。然后,当对两者应用相同的增量(计算为 σ⋅i,也是一个十进制数)时,其中一个余额可能会由于 σ⋅i 的小数部分而跨过整数阈值,而另一个则不会。因此,当最终向下舍入时,我们可能会看到两个(舍入后的整数)余额的变化量不相同:一个增量可能比另一个大一个 wei。
我们的概率分析(经模糊测试证实)表明,在两个协议中,余额总和大约 66% 的时间保持不变,而 33% 的时间会变化 ±1 wei。
Lido 的向下舍入会产生“灰尘”问题。当合约尝试转移其全部 stETH 余额 b 时,舍入逻辑 σ=⌊b/i⌋ 通常只会导致 s−1 份额被移动,其中 s 是用户的总份额计数。
这可能是开发者面临的最危险的陷阱。想象一个合约计算其总 aToken 余额,并尝试将 5% 发送给金库,95% 发送给用户。
由于 Aave 对每个单独转移所需的份额都进行向上舍入,这可能会累积正的舍入误差,并最终导致最后一次转移回滚:
.png)
在大约 66% 的情况下,这些向上舍入的份额总和将超过合约的总份额余额。第二次转移将因“余额不足”而回滚,即使你的余额追踪逻辑显示你有足够的余额。
值得注意的是,Aave 目前的行为是相对较新的。在 Aave v3.5 升级(2025 年 8 月)之前,aToken 转移使用“半向上”(银行家)舍入。
3.5 升级是通过 Aave 的治理系统执行的,有效地“在现有集成的开发者脚下”改变了数千个现有集成的底层数学。
Rebasing tokens 是改善用户体验的强大工具,但它们打破了标准 ERC20 代币的“整数精确”思维模型。在构建集成时,请牢记这四个基本偏差:
黄金法则: 最安全的方法是以份额而不是代币金额进行内部会计处理。份额是合约存储中唯一的真相来源;代币余额只是该真相的一个移动的、舍入后的投影。
- 原文链接: chainsecurity.com/blog/t...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!