本文深入探讨了Compound V3的多个关键主题,包括抵押品估值、清算机制、抵押品出售、储备金的作用及其对清算的影响。文章通过详细的代码示例和图表,解释了用户抵押品的存储结构、资产信息的管理,以及清算过程的具体实现。
在本章中,我们将探讨以下关于 Compound V3 的主题:
这些主题在一篇文章中覆盖的内容较多,但它们彼此密切相关,所以最好在一篇文章中讨论。
读者应对 Compound V3 如何定义本金和现值 以及 DeFi 清算和抵押品 已经有一定了解。
让我们回顾一下 CometStorage.sol 中的 UserBasic 结构。

如果 principal(蓝框)为负,则表示用户是借款人,负值将是他们债务的 加粗 本金值。
assetsIn(红框)是一个位图,用于指示他们是否存入了一定的抵押资产。在撰写时,该位图布局如下:

变量 baseTrackingIndex 和 baseTrackingAccrued 用于记录奖励的分配,将在另文中讨论。变量 _reserved 未使用。
请注意,此结构未告诉我们用户持有多少抵押品。抵押品的数量存储在 UserCollateral 结构 的 balance 变量中,该结构存储在 userCollateral 嵌套映射中。变量 _reserved 未使用。

要列出用户提供的抵押品,我们遍历 0…numAssets Compound 存储,并检查该用户的位是否设置为 1。如果是,我们获取与该位关联的代币地址,并检查 userCollateral[user][collateralAsset] 中用户持有的该抵押品数量。
通过将 balance 与预言机价格相乘,我们知道用户抵押品的美元价值。以下表格给出了计算用户抵押品总价值的一个示例。

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

观察上面的 AssetInfo 结构大小为 432 位 —— 它占用 2 个槽来存储。我们将在后面的部分回顾这一点。
让我们将上面显示的 AssetInfo 结构的内容与 Compound Finance 市场 UI 进行比较。这里我们可以看到大多数显示的信息。
文档和代码未说明变量 scale 的用途,但它持有数字 1e18,因此推测是为了让使用者知道如何缩放百分比。
这些变量的含义在 清算和抵押品 的文章中有解释。

当我们查询 UNI 代币的当前值(assetId 3)时,可以将其值与市场上显示的值进行比较。两者之间的关系应该很明确。特别需注意:清算罚金为 1 - liquidation factor。liquidateCollateralFactor 是清算贷款的贷款价值比(LTV)。liquidationFactor 编码了清算罚金。结构中的 liquidationFactor 与 UI 中的 liquidationFactor 名称不一是令人困惑的。
顶部图像是截图,下面的值是从 Etherscan 查询 getAssetInfo() 针对 UNI 代币获得的。
以下是 Compound UI 与查询 getAssetInfo() 针对 UNI 代币参数之间的关系。

显而易见的下一个问题是,“Compound 将 AssetInfo 结构存储在哪里?”
每个资产的信息被打包到不可变变量中 —— 它不存储在内存中以提高气体效率。由于 AssetInfo 结构需要两个 32 字节的字来存储,Comet 通过 assetXX_a, assetXX_b 为 uint256 字分配编号。这里的 XX 表示资产索引。因此 asset00_a 和 asset00_b 共同持有资产 0 的 AssetInfo 结构。请记住,存储 AssetInfo 需要两个 256 位的变量。

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

由于这些变量是不可变的,[治理](https://learnblockchain.cn/article/11258...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!