引言
银行把存款人的钱借给借款人赚利差;DeFi 借贷把这件事搬上链,却换了一套更激进的机制:没有信用审核,只有抵押。Compound 与 Aave 用「资金池 + 算法利率 + 超额抵押 + 强制清算」构建了一个不需要双边信任的借贷市场。这套机制如何定价?如何保证不坏账?闪电贷又是怎样「借出还要还回」?本文从协议源码视角逐一拆解。
前置:https://plumephp.com/blockchain-ethereum-evm-state/(EVM 与账户模型)、https://plumephp.com/blockchain-stablecoin-dex-amm/(DeFi 基础设施与流动性)、https://plumephp.com/blockchain-transaction-lifecycle-gas-market/(交易与费用)。
目录
- 1. 池化借贷范式
- 2. cToken 与 aToken 设计
- 3. 供应、借款与利用率
- 4. 利率模型
- 5. 抵押品与健康因子
- 6. 清算机制
- 7. 闪电贷
- 8. 系统性风险与漏洞面
- 9. 组合与跨协议
- 10. 速查表与一句话记忆
- 延伸阅读
1. 池化借贷范式
Compound 和 Aave 采用 池化借贷(pool-based):所有供应商把资产打入一个共享池,所有借款人从这个池子借出。与点对点(P2P)借贷相比:
| 维度 | 池化借贷 | P2P 借贷 |
|---|---|---|
| 匹配 | 自动,池内撮合 | 需逐单匹配 |
| 利率 | 算法定价(见第 4 节) | 协商或拍卖 |
| 流动性 | 随时进出 | 依赖对手方 |
| 清算 | 协议内自动 | 需人工/担保 |
┌──────────────┐
供应商 ──► 存款 ──► │ │ ──► 借款 ──► 借款人
│ DAI/USDC 池 │
└──────────────┘
核心不变式:池内资产 = 供应商余额 + 借款人余额 + 池储备金。任何操作都不能让池子「资不抵债」——这正是清算机制存在的原因。
2. cToken 与 aToken 设计
池化借贷的记账核心是「生息代币」:Compound 用 cToken(如 cDAI),Aave 用 aToken(如 aDAI)。它们取代了「余额账本」:
存款 100 DAI ──► 铸币获得 100 cDAI(按汇率)
│
利息累积 → cDAI 对 DAI 的汇率上升
│
赎回 cDAI ──► 兑换回 >100 DAI(含利息)
- 汇率即利息:
exchangeRate = 池中资产 / cToken 总供应量。利息累积 = 池中资产增长 = 汇率上升,与持有 cToken 的时间无关; - 利息结算是「账面上的」:每次供应/借款/赎回/清算时,把「应计利息」计入池中资产与借款余额,俗称「复利记账」;
- aToken 同样:aToken 余额恒定,但价值随 aToken 对基础资产的汇率增长;
- 工程要点:生息代币的 价值在兑换时实现,所以「查看余额」要用
underlyingBalanceOf/balanceOfUnderlying,而非原始 balanceOf。
3. 供应、借款与利用率
池子的健康程度由 利用率(utilization) 刻画:U = 总借款 / 总供应。
利用率 U = TotalBorrows / TotalSupply
U 低 → 钱多无人借 → 存款利率低、借款利率低
U 高 → 池子快被借空 → 存款利率高、借款利率高
操作语义:
- 供应(supply):打入资产 → 按当前汇率铸 cToken;
- 借款(borrow):必须已有抵押品且健康因子 ≥1 → 按当前汇率减记池中可借余额,加记自己借款;
- 偿还(repay):还本金 + 应计利息;
- 提取(withdraw/redeem):烧毁 cToken 换回基础资产(受可提余额限制)。
关键限制:借款不能超过「池中可用流动性」——高利用率的池子(如 U=95%)实际很难借出,这是「挤兑」的缓冲,也是参数治理要盯的指标。
4. 利率模型
利率不是拍脑袋定的,而是由利率模型合约根据 U 自动输出。两种主流:
静态模型(Compound 风格,分段):
U < 拐点(如 80%):borrowRate = 5% + U × 45% // 平缓段
U ≥ 拐点: borrowRate = 50% + (U-0.8) × 大斜率 // 陡峭段
动态模型(Aave 风格,kink/jump rate):同样分「最优利用率」前后两段,前缓后陡。
借款利率
│ ╱ 陡峭段(惩罚高利用)
│ ╱
│ ╱ 平缓段
│ ╱
│ ╱
└───────────────────► 利用率
U*(最优点,如 80%)
设计意图:让「利用率」自己稳定在最优附近——U 高了借贷利率抬升、需求下降,U 低了利率下降、需求回升,形成负反馈。存款利率 = 借款利率 × U(利息在供借之间分配)。
5. 抵押品与健康因子
借款人必须以「可抵押资产」担保,且抵押品价值必须超额覆盖借款。核心指标:
LTV(抵押率)= 可借的最大借款 / 抵押品价值 (如 80% 的 ETH LTV)
健康因子 HF = (抵押品价值 × 清算阈值) / 借款额
HF < 1 → 可被清算
| 参数 | 含义 | 典型值 |
|---|---|---|
| LTV | 最多可借的比例 | 0~90%(按资产风险) |
| 清算阈值 | 触发清算的抵押/借款比 | 55%~85% |
| 清算折扣 | 清算者拿到的折价 | 5%~15% |
| 借款上限 | 单池/单账户上限 | 防单点风险 |
工程要点:用户的操作(借更多、抵押品价格下跌、提取抵押品)会实时重算 HF,任何让 HF < 1 的操作直接 revert——健康因子是协议的「生命线检查点」。
6. 清算机制
当 HF < 1(抵押品价值不足),任何人(清算者)都可以触发清算:
- 清算者代替借款人偿还部分借款;
- 协议按「清算折扣价」把借款人的抵押品扣给清算者;
- 借款人的借款余额减少、抵押品减少,HF 回升。
清算前:HF = 0.9(可清算)
清算者 repay 100 USDC ──► 获得 115 美元等值 ETH(15% 折扣)
清算后:HF 回升到 >1
清算者是 DeFi 的「守门人」:他们把「濒临坏账」的仓位拉回健康,自己赚取折扣收益——清算折扣 < 价格闪崩幅度时,坏账仍会发生(Liquidation Cascade)。
关键反直觉点:清算不等于「没收全部」——只清算「足以回到 HF=1 的最小额度」。清算折扣越大,清算者越积极,但用户的损失也越大——参数需要平衡。
7. 闪电贷
闪电贷(Flash Loan)是 Aave 首创的「无抵押、同笔交易内还回」的机制:
一次闪电贷:
1. 借出 1000 万 USDC
2. 在同一交易内:套利 / 换仓 / 清算 / 救仓...
3. 交易结束前连本带息归还(+0.09% 手续费)
4. 还不上 → 整笔交易 revert(借贷不存在)
为什么安全:EVM 交易是原子的——闪电贷还款在交易提交时已保证,任何环节失败整笔回滚,池子不会损失。
用途:
- 套利:跨 DEX 价差(无本金套利);
- 清算:清算者用闪电贷放大仓位;
- 救仓:用自己的仓位借出、立即偿还,修复 HF;
- 抵押品置换:在同一笔交易里换掉风险更高的抵押品。
安全边界:闪电贷是操纵价格的放大器——大量借入+砸盘可在同一交易内压低预言机价格触发清算,这是「预言机操纵攻击」的典型配方(见下节)。
8. 系统性风险与漏洞面
借贷协议的风险不是「代码 bug」,而是机制风险 + 实现 bug 的组合:
| 风险 | 机制 | 对策 |
|---|---|---|
| 预言机操纵 | 闪电贷砸盘 → 价格失真 → 清算/坏账 | 时间加权(TWAP)预言机、喂价多源 |
| 流动性挤兑 | U 逼近 100%,无法提款 | 利用率参数、借款上限、储备金 |
| 清算瀑布 | 价格闪崩 → 连环清算 → 坏账 | 清算折扣温和、抵押资产风控 |
| 实现 bug | cToken/aToken 记账漏洞 | 形式化验证、bug 赏金、审计 |
| 衍生品风险 | 杠杆循环放大 | 协议级健康检查、账户级风控 |
典型案例:攻击者先用闪电贷借出大量代币、在同一交易内压低 DEX 价格,使基于「瞬时价格」的预言机失真,再触发清算拿走抵押品。防御核心是喂价要「慢」且「多源」(TWAP + Chainlink 多源),让瞬时操纵无法影响关键决策。
9. 组合与跨协议
DeFi 借贷的魅力在于可组合:借贷 = 收益引擎,可与其他协议叠加:
循环杠杆:存 ETH → 借 USDC → 买 ETH → 再存 → 再借...
(放大收益,也放大清算风险)
收益聚合:把闲置 cToken/aToken 再存入收益聚合器(如交协议金库)
流动性即服务:借贷池的资产被 Curve/Balancer 用作做市流动性
风险分层:组合的每一层都引入对手方风险——「抵押品价格下跌」与「聚合协议被攻击」都可能传导为借款人的坏账。给用户的设计建议:杠杆倍数 = 你能承受的清算距离;组合层数 = 你能承受的协议风险敞口。
10. 速查表与一句话记忆
| 概念 | 一句话解释 |
|---|---|
| cToken/aToken | 生息代币,汇率随利息上升 |
| 利用率 U | 借款/供应,U 高则利率高 |
| 利率模型 | 分段函数,U 越高借款利率越陡 |
| 健康因子 HF | 抵押×清算阈值/借款,<1 可被清算 |
| 清算 | 他人替你还款,打折拿走抵押品 |
| 闪电贷 | 同交易借还,还不上整笔回滚 |
| 头号风险 | 预言机操纵 + 清算瀑布 → 坏账 |
一句话记忆:借贷 = 池子记账(cToken/aToken)+ 算法定价(利用率→利率)+ 超额抵押(HF)+ 清算守门 + 闪电贷套利,而一切安全的前提是「喂价慢且多源」。
延伸阅读
- https://plumephp.com/blockchain-stablecoin-dex-amm/ — 稳定币、AMM 与 DeFi 基础设施
- https://plumephp.com/blockchain-ethereum-evm-state/ — EVM 状态与交易原子性(闪电贷基础)
- https://plumephp.com/blockchain-cryptography-foundations/ — 签名与预言机可信基础
- https://plumephp.com/blockchain-mev-block-building/ — 清算与套利在 MEV 中的角色
- https://plumephp.com/smart-contract-security-audit/ — 借贷协议漏洞审计清单
- 数据工程专题 — 链上借贷数据的监控与分析
- 安全专题 — 预言机安全与风控设计
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。