DeFi 借贷协议深度解析

前言

借贷协议是以太坊上 TVL 最高的 DeFi 赛道。截至 2026 年 5 月,Aave 一家就锁着约 180 亿美元资产。但这不是这篇文章的重点 —— 重点是理解链上银行是怎么运作的

和 DEX 不同,借贷协议的复杂度不在定价公式,而在状态管理、风险控制和清算逻辑。它的核心问题是:如何在一个极不稳定的市场中,确保存款人永远能取回自己的钱?

这篇文章以 Aave v3 为主轴展开,穿插 Compound 的对比。读完你应该能回答面试中最常见的那道题:「Aave 和 Compound 有什么区别?」


一、借贷协议解决什么问题?

1.1 两方需求,一个池子

Aave 存借流程

传统银行的存贷模式是:你把钱存银行,银行拿你的钱放贷给张三李四,赚利差。你只知道”年化 2%”,但不知道银行把你的钱借给了谁。

Aave 把这个过程透明化了。你存 USDC 进去,任何人(包括你自己)都可以超额抵押借款。利息是算法动态计算的,不是行长拍脑袋定的。

1.2 超额抵押:DeFi 借贷的基石

DeFi 借贷全是超额抵押——想借 100 块钱,你得先压 130-200 块的东西进去。这和传统金融的信用贷款完全不同。

为什么?因为 DeFi 是无身份的。协议不知道你是谁、收入多少、会不会还钱。它唯一能信任的,就是你锁在合约里的抵押品。你不还?抵押品归协议。


二、Aave 核心机制

logo

官网: aave.com | GitHub: aave/aave-v3-core

2.1 aToken:存款凭证即利息

Aave 最巧妙的设计是 aToken。你把 100 USDC 存进 Aave,返还你 100 aUSDC。然后 aUSDC 的余额会自动增长——利率直接体现在余额里,不需要手动领取利息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// aToken 的核心逻辑(极度简化)
contract AToken is ERC20 {
IERC20 public underlyingAsset; // 基础资产(如USDC)
uint256 public liquidityIndex; // 利率累积指数,随时间单调递增

// 存款:存入 USDC,获得 aUSDC
function mint(address user, uint256 amount, uint256 index) external {
// amountScaled = amount / liquidityIndex
uint256 amountScaled = amount.rayDiv(index);
_mint(user, amountScaled);
}

// 用户的实时余额 = scaledBalance * liquidityIndex
function balanceOf(address user) public view override returns (uint256) {
return super.balanceOf(user).rayMul(liquidityIndex);
}
}

关键理解:合约里存储的不是你的实际余额,而是一个经过利率指数缩放后的折算值(scaled balance)。任何时候查询余额,都是 scaledBalance × 当前利率指数

这种设计的优势:没有”利息领取”这一步,利息一直在自动复利。每次链上任何操作更新利率指数后,所有人的余额同步增长。

2.2 核心流程:从存款到清算

清算流程

2.3 利率模型:不完全靠市场,不完全靠算法

Aave 的利率是动态的,核心变量叫资金利用率(Utilization Rate, U)

$$
U = \frac{\text{总借款额}}{\text{总存款额}}
$$

利率曲线分两段:

利率曲线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Aave v3 DefaultReserveInterestRateStrategy 简化版
function calculateInterestRates(
uint256 unbacked, // 无抵押铸造量
uint256 totalLiquidity, // 总存款
uint256 totalStableDebt, // 总固定利率债务
uint256 totalVariableDebt, // 总浮动利率债务
uint256 reserveFactor // 储备因子(协议抽成比例)
) external view returns (uint256, uint256) {
// 1. 计算利用率
uint256 totalDebt = totalStableDebt + totalVariableDebt;
uint256 utilizationRate = (totalLiquidity == 0) ? 0 :
totalDebt.rayDiv(totalLiquidity + unbacked);

// 2. 分段计算借款利率
uint256 optimalUsageRatio = 0.8e27; // 80% 为最优利用率
uint256 baseVariableBorrowRate = 0; // 基础利率

if (utilizationRate < optimalUsageRatio) {
// U < 80%: 线性增长
// rate = baseRate + (U / U_optimal) * slope1
return baseVariableBorrowRate +
utilizationRate.rayMul(slope1).rayDiv(optimalUsageRatio);
} else {
// U > 80%: 加速增长
// rate = baseRate + slope1 + (U - U_optimal) / (1 - U_optimal) * slope2
uint256 excessRatio = utilizationRate - optimalUsageRatio;
return baseVariableBorrowRate + slope1 +
excessRatio.rayMul(slope2).rayDiv(1e27 - optimalUsageRatio);
}
}

为什么这样设计?

  • 利用率低时,利息低 → 鼓励人来借钱 → 利用率上升
  • 利用率超过最优值(如 80%)后,利率陡峭上升 → 吓退部分借款人,吸引更多人存款
  • 结果:利率像一个弹簧,自动让利用率稳定在 80% 附近

这个算法的精妙之处在于:不需要预言机,不需要治理投票,利率自己找平衡点。 这是 DeFi 最接近”市场自动调节”的设计之一。


三、清算机制:DeFi 借贷的安全阀

3.1 健康因子

清算的核心判据是健康因子(Health Factor, HF)

$$
\text{HF} = \frac{\sum(\text{抵押品价值}_i \times \text{清算阈值}_i)}{\text{借款总额}}
$$

  • HF > 1:安全
  • HF = 1:临界点
  • HF < 1:可以被清算

清算阈值(Liquidation Threshold)是一个资产参数——ETH 可能设为 82.5%,意味着你抵押 1 个 ETH(价值 $2000),最多能借出 $1650。一旦 ETH 跌到让你的 HF 跌破 1,清算人就登场了。

3.2 清算流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 清算的核心逻辑(简化)
function liquidationCall(
address collateralAsset, // 抵押品(如 ETH)
address debtAsset, // 债务(如 USDC)
address user, // 被清算的用户
uint256 debtToCover, // 清算人偿还的债务量
bool receiveAToken // 是否直接收 aToken
) external {
// 1. 检查用户是否可被清算
(uint256 healthFactor, ) = getUserAccountData(user);
require(healthFactor < 1e18, "Health factor not below 1");

// 2. 清算人偿还用户的债务(最多 50%)
// 转账 USDC 给协议

// 3. 按清算奖励比例多给清算人抵押品
// collateralAmount = debtToCover * liquidationBonus / collateralPrice
// liquidationBonus = 10500 (5% 奖励)

// 4. 更新用户的债务和抵押品余额
}

几个关键点:

  1. 每次最多清算 50% 的债务:防止一次性清光、造成不必要的损失
  2. 清算人有奖励:清算人能拿到折扣价的抵押品(5%-10% 的奖励,取决于资产),这激励了外部清算人像秃鹫一样盯着市场上的坏账
  3. 任何人都能当清算人:你不需要注册、不需要授权。写个脚本监控链上 HF,发现有人的 HF < 1 就去清算赚差价

3.3 清算的博弈逻辑

清算本质上是一个抢单竞赛。当 ETH 价格在一个区块内暴跌了 15%,链上会同时出现几十个可清算头寸。清算人之间比拼的是:

  • Gas 出价谁更高(让交易被优先打包)
  • 脚本响应谁更快(监控节点延迟)
  • MEV 策略谁更聪明(是否会被人三明治)

Aave 和 Compound 都经历过大规模清算事件(如 2020 年 3·12 和 2022 年 UST 脱锚),但两者的清算机制在面对极端行情时表现有差异。Compound 的清算机制偏保守(清算激励较低),在极端行情下可能清算人激励不足、坏账堆积。Aave 的清算机制更激进一些,每次清算的量上限更高。


四、闪电贷:没有抵押也能借钱

4.1 原理

闪电贷(Flash Loan)是 DeFi 最迷人的金融创新之一:在同一笔交易内借出和归还,不需要任何抵押。

逻辑很简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function executeFlashLoan(
address asset,
uint256 amount,
bytes calldata params
) external {
uint256 balanceBefore = IERC20(asset).balanceOf(address(this));

// 1. 转出贷款
IERC20(asset).transfer(msg.sender, amount);

// 2. 用户做任何事(必须在同一笔交易内)
IFlashLoanReceiver(msg.sender).executeOperation(asset, amount, premium, params);

// 3. 检查归还是否足够
uint256 balanceAfter = IERC20(asset).balanceOf(address(this));
require(balanceAfter >= balanceBefore + premium, "Not enough returned");
}

为什么安全?因为在同一笔交易里,如果你没还回来,整个交易回滚(revert),钱从来没有真正离开过合约。

4.2 闪电贷的合法用途

闪电贷不是 bug,是 feature。典型用途:

  1. 套利:Uniswap 上的 ETH 比 SushiSwap 便宜 1%,闪电贷借钱买→卖出→还钱→赚差价
  2. 清算:别人 HF < 1,你闪电贷借钱去清算他,拿到折扣抵押品,卖了还贷
  3. 债务再融资:你在 Aave 借的利率太高,闪电贷借一笔钱把 Aave 的债还了,用同样的抵押品在 Compound 以更低利率再借一笔

4.3 闪电贷攻击

闪电贷也是攻击者的利器。经典攻击模式:

闪电贷 → 操纵预言机价格 → 触发错误清算 → 套走抵押品

防范措施:

  • 不要用瞬时价格做清算判断
  • 使用 TWAP + Chainlink 双数据源
  • 协议内部的时间锁机制

五、Aave v3 的改进

Aave v3(2022年上线)相比 v2 有几个重要升级:

特性 v2 v3
跨链支持 Portal 跨链桥支持
隔离模式 高风险资产只能做抵押、不能触发其他资产的借款
效率模式 (eMode) 同类资产(如稳定币)抵押率更高(可达 98%)
Gas 优化 约 20-25% 的 Gas 节省

eMode 是 v3 最有用的功能:当你抵押 USDC 借 DAI 时,协议允许你进入 eMode,把抵押率推到 98%(意思是借出价值 $98 的 DAI 只需要 $100 的 USDC 抵押)。因为稳定币之间的价格几乎不波动,所以可以更放心地让你加杠杆。


六、Compound 对比分析

logo

官网: compound.finance

Compound 是另一个借贷协议的标杆项目,在学习时值得拿它和 Aave 对比:

维度 Aave v3 Compound v3
利率模型 双斜率模型 利用率跳跃模型
固定利率借款 支持(stable rate) 不支持
清算激励 5%-10% 固定 7%
闪电贷 内置(手续费 0.09%) 不支持(需第三方)
多链部署 13+ 条链 以太坊主网 + L2
代币用途 治理 + 质押折扣 治理

利率模型的差异是两者最核心的区别:

Compound 的利率是阶段函数(kink model):利用率低于 80% 时利率很低,超过 80% 后利率瞬间跳到高位。Aave 则是连续平滑上升的曲线。这意味着在 Compound 上,借款人对利用率的变化更敏感——一旦摸到 kink 点,利率会突然跳涨。

孰优孰劣没有定论。Compound 的模型更简单透明,Aave 的模型更平滑。实际使用中,Aave 因为更多的资产支持和更好的多链体验赢得了更大的市场份额。


七、安全与风险

7.1 预言机风险

借贷协议最致命的攻击面是价格预言机。如果协议相信了一个被操纵的价格,就会:

  • 允许攻击者以虚高的抵押品价值借款
  • 触发不该发生的清算

Aave v3 使用 Chainlink 价格预言机,但即使 Chainlink 也会在极端行情下有延迟。

7.2 智能合约风险

2023 年 Euler Finance 被攻击损失 1.97 亿美元,原因是一个捐赠函数的逻辑漏洞。即使 Aave 经过了多轮审计,每条升级仍然意味着新的风险面。

7.3 流动性风险

如果你存了一个非主流资产,当所有人都想取款时,池子里的钱可能不够——这种情况在 Aave 上还没发生过大规模事件,但在较小的借贷协议上出现过。


📚 参考资料

  1. Aave 协议白皮书
  2. Aave V3 技术论文
  3. Aave 官方文档
  4. Compound 白皮书
  5. DeFi 可贷资金协议 - 利率与流动性研究
  6. DeFi 清算机制实证研究
  7. 理解闪电贷
  8. SoK: 去中心化金融综述
  9. Euler Finance 事故复盘
  10. Chainlink 价格预言机文档
  11. 借贷协议仪表板
  12. 以太坊 DeFi 页面

本文撰写于 2026 年 5 月。Aave 和 Compound 都在持续迭代中,协议参数可能随治理提案调整。