DeFi 利率指数:Compound V3 中的本金现值与现值

文章详细介绍了Compound V3中的baseSupplyIndexbaseBorrowIndex机制,解释了它们如何跟踪借贷者的存款和借款,以及如何通过principal valuepresent 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 内部。

accrueInterestIndices 函数

由于利率是利用率的直接函数,因此在高利用率时,baseSupplyIndex 增加得更快,而在低利用率时则增加得更慢。

以下假想图示显示了 baseSupplyIndexbaseBorrowIndex 根据利用率以不同速率增长。通常,借款人的利率高于贷方所得到的利率,因此 baseBorrowIndex 增加得更快。

利率指数与利用率的关系

以下示例说明该变量是如何使用的。

示例和术语

Alice在 baseSupplyIndex 为 2.5 时存入 \$1,000。她没有被记账为存入 \$1,000,而是被记为存入 \$400,即她的存款除以当前的 baseSupplyIndex(\$1,000 ÷ 2.5)。Alice在她的账户中有 \$400 的“本金价值”(黄色框)。这是 Compound 为用户存储的值 (CometStorage.sol)

userBasic 结构

如果她马上取款,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 中,我们看到:

  1. “本金价值”是通过 将“现值”除以 baseSupplyIndex 计算出来的

  2. “现值”是通过 将本金价值乘以 baseSupplyIndex 计算出来的

本金和现值函数

因此,总结重要术语:

本金价值

本金价值是存入的 USDC 除以存入时的 baseSupplyIndex 值。这被保存在与用户账户相关的存储变量中,除非用户存入或取出,否则不会变化。本金价值通常小于实际存款,因为 baseSupplyIndex 总是大于或等于 1。

现值

现值是本金价值乘以 当前值 的 baseSupplyIndex。该值并未存储在任何地方,而是动态计算得出。

本金价值和现值是理解 Compound V3 的两个最关键的概念。

本金是贷方唯一追踪的变量

让我们重新审视上述截图的结构:

再次展示用户基本结构

变量 baseTrackingAccrued 被 CometRewards 用于确定为参与协议奖励账户多少 COMP。变量 baseTrackingIndex 与此相关但当前未使用。变量 assetsIn 仅用于借款人,作为某些抵押资产是否使用的指标。变量 _reserved 未使用。

因此,principal 是贷款人会计中唯一必要的变量。请注意,这是一个签名变量——对于借款人来说,它是负的。对于借款人,我们还需要跟踪他们存入了多少 抵押品,但那是另一个主题。

balanceOf() — 检查贷方的正余额

为了说明 Compound V3 存储本金价值,但以现值评估账户,考虑以下在 Comet.sol 中的 balanceOf() 函数

首先,它将在不更新的情况下读取更新后的 baseSupplyIndex,因为这是一个视图函数。然后,它读取贷方的本金余额,并将其乘以 baseSupplyIndex。

由于利息的累积是时间和利用率的函数,只要利用率不为零,每次查询 balanceOf 时,它返回的值将更高。

balanceOf 函数

以下屏幕截图显示了 Compound V3 dapp 上贷方余额与该地址从 Etherscan 返回的 balanceOf 值之间的关系。两个值都以橙色框高亮显示。

贷方的 balanceOf

baseSupplyIndex 的可视示例

当贷方存款时,他们的存款的 USDC 余额被除以 baseSupplyIndex 以产生本金价值,这就是被存储的内容。存入时间越晚,baseSupplyIndex 的值越大,他们将获得较低的本金价值。

本金价值是静态的(除非他们存入或取出),但现值是本金价值 * baseSupplyIndex,并且该现值是不断增长的。

在下图中,Alice在 baseSupplyIndex 等于 1.01 时存入了 \$1,所以她的本金价值是 0.99(1 ÷ 1.01)。Bob也存入了 \$1,但在 baseSupplyIndex 的值为 1.03 时存入(1 ÷ 0.97)。因此,他的本金价值是 0.97。

Bob和Alice都存入了相同的金额:\$1。但因为Bob的存入时间较晚,他的本金价值较低。

现值和本金价值曲线

supplyBase() 和 withdrawBase()

当用户供应(或取出)基础资产时,本金价值会被重置。例如,如果Alice在 baseSupplyIndex 为 10 时存入 \$10,那么她的本金价值将是 \$1。现在假设此时 baseSupplyIndex 增加到 20,她账户的现值将是 \$20。她再增加 \$10。她的新 现值 应为 \$30。

她的本金价值应该是多少?(想一想!)

当前 baseSupplyIndex 为 20,现值目前为 \$30,因此她的本金价值应为 \$1.5(\$30 ÷ 20)。

考虑到这个例子,我们展示 supplyBase() 函数(Comet.sol 第 829 行),该函数在贷方存入时被调用。

supplyBase 函数

当Alice存入时,我们读取她的本金价值(橙色框),将其转换为现值(绿色框),然后将刚存入的金额加到它上面(蓝色框)。这是从现值转换为存储在 dstPrincipalNew 中的本金价值(黄色框),我们将其存储为该用户的新本金价值(红色框)。

函数 updateBasePrincipal() (红色框)上面简单地更新了与用户关联的 UserBasic 结构,使用 dstNewPrincipal 覆盖旧本金。

相反的函数 withdrawBase()(Comet.sol 第 1051 行) 以相反的逻辑应用。

baseBorrowIndex 怎么样?

类似于 baseSupplyIndex 跟踪自“始至今”借出的每一美元的收益,baseBorrowIndex 则跟踪自“始至今”借入的一美元的债务累积。贷方和借款人有不同的利率曲线,因此需要两个独立的变量来进行跟踪。

指数何时会溢出?

baseSupplyIndexbaseBorrowIndex 均被视为具有 15 位小数的 定点数,因此 1e15 被视为 1.0。一个有符号的 104 位数能容纳的最大数字是 1.014e31。因此,累加器能够容纳的最大数字为 1.014e16(具有 15 位小数)。

假设借贷协议的年利率永远不会超过 100%。指数溢出将需要 53 年。如果使用更现实的 10% 的年利率,那么使一美元复利增至 10 万亿美元将花费 386 年。

很合理的假设是,在那一天到来之前,Compound 将升级到版本 4。

通过 RareSkills 学习更多

请查看我们的 Solidity Bootcamp 以了解更多高级 Solidity 概念。

最初发布于 2024 年 1 月 5 日

  • 原文链接: rareskills.io/post/defi-...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
RareSkills
RareSkills
https://www.rareskills.io/