本文深入探讨了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...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!