文章详细介绍了Compound V3中的baseSupplyIndex
和baseBorrowIndex
机制,解释了它们如何跟踪借贷者的存款和借款,以及如何通过principal value
和present value
计算用户的余额。同时,文章还包含代码示例和图表,帮助读者更好地理解这些概念。
跟踪贷方存款的直观方法是记录他们存入的 USDC 数量和存入的时间。Compound V3 并没有这样做。
相反,类似于 SushiSwap Masterchef Staking Algorithm,Compound V3 追踪自“始至今”借出的一美元的假想收益。(尚未熟悉该算法的读者应阅读链接资源)。
自“始至今”借出的一美元的假想收益记录在 baseSupplyIndex
(在 CometStorage.sol 中)。它的行为非常类似于 Sushiswap 的“rewardPerTokenAccumulator”。它从 1.0 开始,每当发生改变状态的操作(存入、取出、借入等)时,它会根据经过的时间和该时间段的利率成比例地增加。例如,如果经过了 100 秒,利率为 0.001 每秒(尽管不现实,但易于理解),那么 baseSupplyIndex
将更新为 1.1。具体使用以下公式:
baseSupplyIndex += supplyInterestRatePerSecond(utilization) × secondsElapsed
baseSupplyIndex
唯一发生变化的地方是在 Comet.sol 第 403 行,在 accrueIndexIndices
内部。
由于利率是利用率的直接函数,因此在高利用率时,baseSupplyIndex 增加得更快,而在低利用率时则增加得更慢。
以下假想图示显示了 baseSupplyIndex
和 baseBorrowIndex
根据利用率以不同速率增长。通常,借款人的利率高于贷方所得到的利率,因此 baseBorrowIndex
增加得更快。
以下示例说明该变量是如何使用的。
Alice在 baseSupplyIndex 为 2.5 时存入 \$1,000。她没有被记账为存入 \$1,000,而是被记为存入 \$400,即她的存款除以当前的 baseSupplyIndex(\$1,000 ÷ 2.5)。Alice在她的账户中有 \$400 的“本金价值”(黄色框)。这是 Compound 为用户存储的值 (CometStorage.sol)。
如果她马上取款,Compound 会将她的余额计算为 \$400 乘以当前的 baseSupplyIndex,即 2.5,因此她将提取 \$1,000。Compound 将本金价值乘以 baseSupplyIndex 称为“现值”。
Compound V3 不会“记住”她原来的真实存款是 \$1,000。这是 隐含的,因为 baseSupplyIndex
当前为 2.5,而她的存款被记录为 \$400。
Compound V3 存储的“缩小”的或“向后缩放”的美元价值称为“本金价值”。当我们将本金价值乘以当前的 baseSupplyIndex,或“向前缩放”,我们得到“现值”。
来自传统金融背景的读者可能会发现 Compound 使用的“本金价值”和“现值”这两个术语有些令人困惑——我们建议不要试图将这些术语与它们的传统含义联系起来,只需接受 Compound 的用法即可。
如果她一直等待到 baseSupplyIndex 增加到 3.0,本金价值仍然是 \$400,但现值将增加到 \$1,200(\$400 x 3.0 = 1,200)。
在 [CometCore.sol](https://github.com/compound-finance/comet/blob/ma...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!