理解 Compound V3 中的抵押品、清算和储备金

  • RareSkills
  • 发布于 2024-01-10 20:45
  • 阅读 223

本文深入探讨了Compound V3的多个关键主题,包括抵押品估值、清算机制、抵押品出售、储备金的作用及其对清算的影响。文章通过详细的代码示例和图表,解释了用户抵押品的存储结构、资产信息的管理,以及清算过程的具体实现。

在本章中,我们将探讨以下关于 Compound V3 的主题:

  • 抵押品估值
  • 吸收不足抵押贷款(清算)
  • 出售吸收的抵押品
  • 什么是准备金
  • 准备金如何影响清算。

这些主题在一篇文章中覆盖的内容较多,但它们彼此密切相关,所以最好在一篇文章中讨论。

先决条件

读者应对 Compound V3 如何定义本金和现值 以及 DeFi 清算和抵押品 已经有一定了解。

UserBasic 存储结构

让我们回顾一下 CometStorage.sol 中的 UserBasic 结构

UserBasic 结构

如果 principal(蓝框)为负,则表示用户是借款人,负值将是他们债务的 加粗 本金值。

assetsIn(红框)是一个位图,用于指示他们是否存入了一定的抵押资产。在撰写时,该位图布局如下:

compound 抵押资产位图

变量 baseTrackingIndexbaseTrackingAccrued 用于记录奖励的分配,将在另文中讨论。变量 _reserved 未使用。

请注意,此结构未告诉我们用户持有多少抵押品。抵押品的数量存储在 UserCollateral 结构balance 变量中,该结构存储在 userCollateral 嵌套映射中。变量 _reserved 未使用。

UserCollateral 结构

要列出用户提供的抵押品,我们遍历 0…numAssets Compound 存储,并检查该用户的位是否设置为 1。如果是,我们获取与该位关联的代币地址,并检查 userCollateral[user][collateralAsset] 中用户持有的该抵押品数量。

通过将 balance 与预言机价格相乘,我们知道用户抵押品的美元价值。以下表格给出了计算用户抵押品总价值的一个示例。

示例总抵押品价值

AssetInfo

Compound 从中获取抵押品价格的预言机地址存储在 AssetInfo 结构中(蓝框)。

AssetInfo 结构

观察上面的 AssetInfo 结构大小为 432 位 —— 它占用 2 个槽来存储。我们将在后面的部分回顾这一点。

在 Compound Finance 市场上显示 AssetInfo

让我们将上面显示的 AssetInfo 结构的内容与 Compound Finance 市场 UI 进行比较。这里我们可以看到大多数显示的信息。

文档和代码未说明变量 scale 的用途,但它持有数字 1e18,因此推测是为了让使用者知道如何缩放百分比。

这些变量的含义在 清算和抵押品 的文章中有解释。

AssetInfo 与 Compound V3 市场 UI 并排对比

当我们查询 UNI 代币的当前值(assetId 3)时,可以将其值与市场上显示的值进行比较。两者之间的关系应该很明确。特别需注意:清算罚金为 1 - liquidation factorliquidateCollateralFactor 是清算贷款的贷款价值比(LTV)。liquidationFactor 编码了清算罚金。结构中的 liquidationFactor 与 UI 中的 liquidationFactor 名称不一是令人困惑的。

顶部图像是截图,下面的值是从 Etherscan 查询 getAssetInfo() 针对 UNI 代币获得的。

以下是 Compound UI 与查询 getAssetInfo() 针对 UNI 代币参数之间的关系。

Compound V3 市场数据截图在 getAssetInfo() 函数返回的顶部

显而易见的下一个问题是,“Compound 将 AssetInfo 结构存储在哪里?”

AssetInfo "结构" 保存在不可变变量中

每个资产的信息被打包到不可变变量中 —— 它不存储在内存中以提高气体效率。由于 AssetInfo 结构需要两个 32 字节的字来存储,Comet 通过 assetXX_a, assetXX_b 为 uint256 字分配编号。这里的 XX 表示资产索引。因此 asset00_aasset00_b 共同持有资产 0 的 AssetInfo 结构。请记住,存储 AssetInfo 需要两个 256 位的变量。

AssetInfo 不可变变量布局

我们现在可以展示 getAssetInfo()Comet.sol:280-356 的实现。它只是将不可变变量解包到 AccountInfo 结构中并返回。所使用的位移和打包是直接的,我们在这里不进行解释。

getAssetInfo 函数

由于这些变量是不可变的,[治理](https://learnblockchain.cn/article/11258...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

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