# #13 借贷协议数据分析

## 背景知识

去中心化金融（DeFi）是区块链的金融创新。通过各协议之间的可组合性、互操作性，DeFi乐高就此诞生。2020年6月，DeFi借贷协议Compound开启流动性挖矿，不仅拉开了DeFi Summer的序幕，也给DeFi借贷赛道注入新活力、新思路、新用户，借贷业务成为DeFi的三大核心之一。

### 借贷协议的意义

借贷协议是DeFi的银行。传统银行中，用户可以向银行存款收取利息，也可以向银行借款，最后连本带利一起归还。类似的，在DeFi的借贷协议中用户可以向协议存钱、借钱，不同的是没有了中心化的托管机构，而是用户和借贷协议的智能合约直接交互，靠代码的运行确保一切有条不紊地进行。CeFi中的借贷，贷款担保方式分为信用、担保以及抵押贷款。银行的风险偏好较低，抵押贷款在各类贷款中是占比最高的。得益于大数据信用体系建设，信用借贷越来越普遍，不过需要大量的审查、资质证明等。

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-e59da3184febd3d3d9735d820c933d05d2cc8c0c%2Fbank.jpeg?alt=media)

而DeFi中的借贷是匿名的，无需信任的。从模式上讲基本都处于抵押贷款方式，普遍采用的方式是超额抵押。也就是说，我抵押200块的资产，可以从借贷协议这借走不足200块的资金，这样就无需担心我借钱不还跑路，可以放心地借钱给我了。这种以币借币，借入金额小于抵押金额的行为看似非常愚蠢，但是实际上它解决的是市场切实存在的需求：

1. 交易活动的需求：包括套利、杠杆、做市等交易活动。例如做市商需要借资金来满足大量的交易；在DEX上买币只能做多，但是通过借币可以做空；通过抵押资产加杠杆，甚至可以通过循环贷不断增加杠杆（抵押ETH借USDC买ETH再抵押再借再买…）
2. 获得被动收入：闲置资金/屯币党在屯币的过程中可以通过借出资产获得额外收益
3. 代币激励：除了流动性挖矿，头部 DeFi 协议推出基于其原生代币的质押服务，代币持有者可质押获得更多原生代币。代币激励是面对借贷协议所有参与者的，借方可以通过交互获得代币奖励，通过交易获得的代币，偿还一部分债务

相比传统房车类型抵押贷款，需要人力验证资产所有人，还款违约还需要人力及时间进行资产拍卖。DeFi中的当铺模式只需要在抵押率过低停止抵押，对资产清算即可结束贷款合同。

### 借贷协议的运作模式

在区块链上抵押借贷，能借多少代币、什么时候清算，都是由智能合约中的一系列参数设定好的。

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-f4dc4c85e63b4b224ba911da8b13bf6acddc0348%2Floan.png?alt=media)

Max LTV（Loan to Value）：最大贷款价值比，决定借款发生时债务/ 抵押品价值的最大比例。

Liquidation threshold：清算门槛，是一个清算判定条件，债务/ 抵押品价值升至这个比例时发生清算。

Liquidation penalty：强平罚款，当清算发生时，以该资产为抵押品需要扣除的罚金比例。

比如，Aave V2中USDC 的Max LTV为87%，Liquidation threshold 为89%，Liquidation penalty 为4.5%，就代表每有1 USDC 的抵押品，最高可以借入0.87 美元其它代币，当借入的代币升值至0.89 美元时发生清算，顺利清算的情况下将被扣除4.5% 的罚金。

加密资产的价格浮动往往会比较剧烈，借贷协议采用的超额抵押方式有助于避免资不抵债的情况发生，如下图所示：不同的抵押率对应不同的费率和质押要求。

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-82f0ca4ff8b96c78f60fed66ffa29fa0c58e532b%2F2.png?alt=media)

当抵押资产或者借出资产发生大幅波动时到达一定程度时，借贷协议为了避免坏账要执行清算。 我们以AAVE为例，看借贷协议是如何进行清算的。 首先介绍一个概念叫健康因子（Health Factor），健康因子和账户的抵押物、借款金额有关，表达资不抵债的可能性。如何计算健康因子？

1、查看抵押物的清算线（LiquidationThreshold），比如此时USDC是0.89；

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-023f49819620c227b22bd84d80e14beac21505bf%2Fhf1.png?alt=media)

2、健康因子 = 抵押金额 \* 清算线/ 借出资产金额，以此刻为例，5794 \* 0.89/ 4929 = 1.046；

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-6a640fac08b44b325060a9bfd084b50eaf459bb9%2Fhf2.png?alt=media)

3、如果抵押物价格下跌，或者借出资产价格上涨，导致健康因子<1，则会执行清算（Liquidation），具体清算过程如下：

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-92251b703fb1373375a372a666476cab62c42564%2Fhf3.png?alt=media)

那么实际的不等式是：借出资产金额 <= 抵押金额 \* LTV < 抵押金额 \* 清算线。 清算时，超出清算线的部分会拿去拍卖，清算者（liquidators）购买抵押物，拍卖获得的资金用于归还负债，多出部分就作为清算者的奖赏。 清算过程依赖于预言机的喂价，目前AAVE取的是Chainlink。

有意思的是，虽然超额抵押的思路看起来非常靠谱，借贷协议应该没有坏账风险，但是实际上是这样吗？最近Eisenberg从AAVE V2借币做空CRV的事件中，就产生了约170 万美元的坏账。最主要的原因可能是该巨鲸的头寸过大，市场上并没有足够多的流动性让清算人买入。从下图可以看到，该巨鲸在Aave 中存入了5794 万USDC，借入了8342 万CRV。

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-031cff7b95101a90f83bbb050cd940ed6a4d2d09%2Fcrv1.jpg?alt=media)

而从CoinGecko 和区块链浏览器中可以看出，CRV 代币的流通量只有6.37 亿，巨鲸借出的CRV 数量高于所有外部帐户持有者。例如，截至11 月25 日，Aave 的合约中只有4212 万CRV，持币量第8 的Binance 14 地址中也只有2021 万CRV。

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-3a1560b676a3187a80958fe19c22f201f95c008d%2Fcrv2.png?alt=media)

在DEX 中，Uniswap V3 的相关交易对中流动性最高的ETH/CRV 交易对中，流动性共176 万美元，只有148 万CRV。因此，市场上并没有足够的流动性供清算人买入，完成清算。每一次清算后，剩余的资金会补充到抵押品中，使剩余债务的清算价格上升。但是在清算过程中，CRV 的价格继续上涨，最终导致Aave 产生坏账。

简单总结，大部分的借贷协议目前采用的方式是超额抵押，当价格波动时由健康因子监控是否需要清算，以及清算多少。这里我们只讲了最简单最基本的借贷业务，实际上各个协议之间也各有特色，如Compound是去中心化的点对点模式，资金池运用模式使池内资金达到了极高的利用值；AAVE首先提出了闪电贷，借款+操作+还款在一个区块内完成，原子性决定了这笔交易要么全部成功，要么全部失败；AAVE V3更提出了资产跨链流动的功能；而Euler，Kashi和Rari等借贷平台通过无许可的借贷池更好地满足长尾资产的需求。

## 重点关注指标

搞明白链上借贷协议的业务逻辑之后，就可以着手分析了，接下来我将列出一些常用于评估借贷协议的一些指标。需要注意的是，在智能合约中资金的流动虽然只有入、出两个方向，但是所代表的意义有所不同，需要结合智能合约、区块链浏览器来辅助判断。

### 1.总锁仓量 TVL（Total Value Locked）

即有多少金额锁定在借贷协议的智能合约中，TVL代表了协议的流动性。从[defillama](https://defillama.com/protocols/lending)数据来看，整体借贷市场TVL超过$10 B，前五的TVL总和约为$9.5 B，其中AAVE独占$3.9 B。

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-51e59f0f907190379c7aeb43a9281a4e94f9598b%2Ftvl.png?alt=media)

以Arbitrum上的AAVE V3为例，做[TVL](https://dune.com/queries/1042816/1798270)的查询。

基本思路是：将AAVE智能合约中，定义为'Supply'的存入资金，减去定义为'Withdraw'的提取资金，就是锁定在合约中的总价值。打开[Arbscan](https://arbiscan.io/address/0x794a61358d6845594f94dc1db02a252b5b4814ad)找到一笔[AAVE的交易](https://arbiscan.io/tx/0x6b8069b62dc762e81b41651538d211f9a1a33009bcb41798e673d715867b2f29#eventlog)，点开log可以看到 topic0 = '0x2b627736bca15cd5381dcf80b0bf11fd197d01a037c52b927a881a10fb73ba61' 对应智能合约中'Supply'的行为。

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-c8be25a9c9f271274224ea72b707261d3ec9cee0%2Farbscan1.png?alt=media)

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-ff3ddc1982ded005207d9eddef4e42094b559b0d%2Ftvl2.png?alt=media)

类似的，topic0 = '0x3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f7' 时对应'Withdraw'的行为（注，在Dune中topic1指的是etherscan中的topic0）。在Dune里，从Arbitrum的log表中选择发往AAVE V3合约的交易，根据topic定义“存入“和”提取“这两个动作（action\_type）。存入为正提款为负，相加之后就是在合约内锁定的代币。用`bytearray_ltrim(topic1)`函数得到转账token的地址，用`bytearray_to_uint256(bytearray_substring(data, 1 + 32, 32))`函数得到转账token对应的数量（非usd计价金额）。

```sql
with aave_v3_transactions as (
    select 'Supply' as action_type,
        block_time,
        bytearray_ltrim(topic1) as token_address,
        bytearray_ltrim(topic2) as user_address,
        cast(bytearray_to_uint256(bytearray_substring(data, 1 + 32, 32)) as decimal(38, 0)) as raw_amount,
        tx_hash
    from arbitrum.logs
    where contract_address = 0x794a61358d6845594f94dc1db02a252b5b4814ad   -- Aave: Pool V3
        and topic0 = 0x2b627736bca15cd5381dcf80b0bf11fd197d01a037c52b927a881a10fb73ba61 -- Supply
        and block_time > date('2022-03-16') -- First transaction date
    
    union all
    
    select 'Withdraw' as action_type,
        block_time,
        bytearray_ltrim(topic1) as token_address,
        bytearray_ltrim(topic2) as user_address,
        -1 * cast(bytearray_to_uint256(bytearray_substring(data, 1 + 32, 32)) as decimal(38, 0)) as raw_amount,
        tx_hash
    from arbitrum.logs
    where contract_address = 0x794a61358d6845594f94dc1db02a252b5b4814ad   -- Aave: Pool V3
        and topic0 = 0x3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f7 -- Withdraw
        and block_time > date('2022-03-16') -- First transaction date
),

aave_v3_transactions_daily as (
    select date_trunc('day', block_time) as block_date,
        token_address,
        sum(raw_amount) as raw_amount_summary
    from aave_v3_transactions
    group by 1, 2
    order by 1, 2
)

select * from aave_v3_transactions_daily
```

到此我们得到了锁定在智能合约中的token数量，要得到美元计价的TVL，我们还需要将token和其价格匹配，这里我们手动选取了一些主流的币种：

```sql
token_mapping_to_ethereum(aave_token_address, ethereum_token_address, token_symbol) as (
    values
    (0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9, 0xdac17f958d2ee523a2206206994597c13d831ec7, 'USDT'),
    (0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f, 0x2260fac5e5542a773aa44fbcfedf7c193bc2c599, 'WBTC'),
    (0xd22a58f79e9481d1a88e00c343885a588b34b68b, 0xdb25f211ab05b1c97d595516f45794528a807ad8, 'EURS'),
    (0xff970a61a04b1ca14834a43f5de4533ebddb5cc8, 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48, 'USDC'),
    (0xf97f4df75117a78c1a5a0dbb814af92458539fb4, 0x514910771af9ca656af840dff83e8264ecf986ca, 'LINK'),
    (0x82af49447d8a07e3bd95bd0d56f35241523fbab1, 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2, 'WETH'),
    (0xda10009cbd5d07dd0cecc66161fc93d7c9000da1, 0x6b175474e89094c44da98b954eedeac495271d0f, 'DAI'),
    (0xba5ddd1f9d7f570dc94a51479a000e3bce967196, 0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9, 'AAVE')
),

latest_token_price as (
    select date_trunc('hour', minute) as price_date,
        contract_address,
        symbol,
        decimals,
        avg(price) as price
    from prices.usd
    where contract_address in (
        select ethereum_token_address
        from token_mapping_to_ethereum
    )
    and minute > now() - interval '1' day
    group by 1, 2, 3, 4
),

latest_token_price_row_num as (
    select  price_date,
        contract_address,
        symbol,
        decimals,
        price,
        row_number() over (partition by contract_address order by price_date desc) as row_num
    from latest_token_price
),

current_token_price as (
    select contract_address,
        symbol,
        decimals,
        price
    from latest_token_price_row_num
    where row_num = 1
),
```

用raw amount除以对应token的小数位（decimal）（例如ETH的decimal是18，USDT的是6），得到实际token有多少枚，再和对应价格相乘得到以usd为计价单位的金额，求和后得到总的TVL。

```sql
daily_liquidity_change as (
    select d.block_date,
        p.symbol,
        d.token_address,
        d.raw_amount_summary / power(10, coalesce(p.decimals, 0)) as original_amount,
        d.raw_amount_summary / power(10, coalesce(p.decimals, 0)) * coalesce(p.price, 1) as usd_amount
    from aave_v3_transactions_daily d
    inner join token_mapping_to_ethereum m on d.token_address = m.aave_token_address
    left join current_token_price p on m.ethereum_token_address = p.contract_address
    order by 1, 2
)

select sum(usd_amount) / 1e6 as total_value_locked_usd
from daily_liquidity_change
```

参考：<https://dune.com/queries/1037796/1798021。>

### 2.未偿贷款（Outstanding Loan）

即外借出去尚未归还的金额。与计算TVL时类似，参考区块链浏览器的数据，找出topic0（1）所对应的合约功能，用借出的（‘Borrow’）减去已偿还（‘Repay’）的。

参考：<https://dune.com/queries/1037796/1798021>

```sql
 select 'Borrow' as action_type,
    block_time,
    bytearray_ltrim(topic1) as token_address,
    bytearray_ltrim(topic2) as user_address,
    cast(bytearray_to_uint256(bytearray_substring(data, 1 + 32, 32)) as decimal(38, 0)) as raw_amount,
    tx_hash
from arbitrum.logs
where contract_address = 0x794a61358d6845594f94dc1db02a252b5b4814ad   -- Aave: Pool V3
    and topic0 = 0xb3d084820fb1a9decffb176436bd02558d15fac9b0ddfed8c465bc7359d7dce0 -- Borrow
    and block_time > date('2022-03-16') -- First transaction date

union all

select 'Repay' as action_type,
    block_time,
    bytearray_ltrim(topic1) as token_address,
    bytearray_ltrim(topic2) as user_address,
    -1 * cast(bytearray_to_uint256(bytearray_substring(data, 1 + 32, 32)) as decimal(38, 0)) as raw_amount,
    tx_hash
from arbitrum.logs
where contract_address = 0x794a61358d6845594f94dc1db02a252b5b4814ad   -- Aave: Pool V3
    and topic0 = 0xa534c8dbe71f871f9f3530e97a74601fea17b426cae02e1c5aee42c96c784051 -- Repay
    and block_time > date('2022-03-16') -- First transaction date

limit 100
```

### 3.资本效率（Utilization Ratio）

简单理解就是存入协议中的资金有多少被真正利用起来（借走）了，当前Arbitrum上AAVE V3的资本效率大约在30%，处于一个低杠杆水平，对比21年牛市时，资金利用率在40%-80%之间。有了前两段的基础，计算这部分并不困难，参考<https://dune.com/queries/1037796/1798141。>

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-b88ce286ac6abaca415a65ac3f08e22f16d2285a%2Fur.png?alt=media)

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-dc2836e35101db17acc8d6fb2c9d460bdd346786%2Fur.jpg?alt=media)

### 4.详细分类

包括合约锁定资产构成和用户行为分布，参考：<https://dune.com/queries/1026402/1771390。>

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-d7ec6cb1455b78a7aad2319c6b22c19a0ccb9499%2F4.1.png?alt=media)

AAVE在Arbitrum上资金池中占比前三的是WETH（37.6%）、USDC（29.5%）和WBTC（22.6%）。目前还处于熊市，用户对杠杆需求不强烈，整体以存款吃息为主。

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-79a4df55346b7b0852fafa637b3e94ebe01205b9%2F4.2.png?alt=media)

### 5.基础指标

一些基础的协议分析指标，如用户数，交易数，日均变化量情况，参考：<https://dune.com/queries/1026141/1771147。>

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-71ec7c6b772553ce3b302b8448b0e65c35ee1437%2Fdunedata.png?alt=media)

## 借贷的综合看板

1. Arbitrum上AAVE V3的综合dashboard。

<https://dune.com/sixdegree/aave-on-arbitrum-overview>

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-e519f4b9ec664cb8578637b75cc076842304456b%2Fdashboard.png?alt=media)

2. 将以太坊上三大经典借贷协议Maker，AAVE和Compound进行对比的dashboard。不过这个dashboard比较老，用的是Dune V1引擎，Dune即将下架V1，今后只使用V2，所以大家学习时借鉴思路即可。

<https://dune.com/datanut/Compound-Maker-and-Aave-Deposits-Loans-LTV>

![](https://1629163311-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbGxRE01f8LgrjVzD7rnT%2Fuploads%2Fgit-blob-1d594269d4227254f5ba56a32ce4fcda4478a45b%2Fdashboard2.png?alt=media)

## 参考

1. <https://foresightnews.pro/article/detail/17638>
2. <https://learnblockchain.cn/article/5036>
3. <https://twitter.com/0xhiger/status/1595076528697905157>
4. <https://www.blocktempo.com/why-do-defi-lending-protocols-generate-bad-debts/>
5. <https://www.panewslab.com/zh/articledetails/k1ep9df5.html>
6. <https://new.qq.com/rain/a/20201121A096UF00>

## SixdegreeLab介绍

SixdegreeLab（[@SixdegreeLab](https://twitter.com/sixdegreelab)）是专业的链上数据团队，我们的使命是为用户提供准确的链上数据图表、分析以及洞见，并致力于普及链上数据分析。通过建立社区、编写教程等方式，培养链上数据分析师，输出有价值的分析内容，推动社区构建区块链的数据层，为未来广阔的区块链数据应用培养人才。

欢迎访问[SixdegreeLab的Dune主页](https://dune.com/sixdegree)。

因水平所限，不足之处在所难免。如有发现任何错误，敬请指正。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://tutorial.sixdegree.xyz/zh/zhong-ji-jiao-cheng/ch13-lending-analysis.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
