Aave V4 协议系统梳理
Aave V4 是 Aave 协议的下一代版本,采用 Hub-Spoke 模块化架构, 实现了统一的流动性层与用户操作层的分离。核心创新包括: 按用户抵押品质量的风险溢价定价、 动态风险配置(多版本共存)、 荷兰拍式清算引擎、 以及 可选的再投资模块。
代码仓库: github.com/aave/aave-v4 | 最新版本:v0.5.11 (2026-03-20)
审计机构: Blackthorn, Trail of Bits, ChainSecurity (2026.02)
1. 协议概述
核心改进(相对 V3)
| 维度 | V3 | V4 |
|---|---|---|
| 架构 | 单体 Pool 合约,含全部业务逻辑 | Hub-Spoke 分离:Hub 管流动性,Spoke 管用户操作 |
| 升级性 | Pool 不可升级,新功能靠 Governance 提案 | Spoke 可升级,Hub 不可变(最小化核心风险) |
| 利率模型 | 所有借款人同一利率(由利用率决定) | 基础利率 + 用户风险溢价(按抵押品质量差异化定价) |
| 风险参数 | 全局风险参数,修改即时影响所有仓位 | 动态配置:新参数仅影响新仓位,旧仓位沿用旧配置 |
| 清算机制 | 固定 Close Factor(50%/100%)+ 固定清算奖励 | 目标健康因子 + 荷兰拍式可变清算奖励 |
| 坏账处理 | V3.3 引入坏账清理和 deficit 追踪 | 内置 deficit 报告机制 + Spoke 间互助消除 deficit |
| 闲置资金 | 全部锁在流动性池中 | 可选再投资模块:闲置资金部署到外部策略 |
| 跨链/多资产 | Portal 跨链桥 | 多 Spoke 可接入同一 Hub(包括 RWA、DEX LP 等任意资产类型) |
2. 用例图
Aave V4 的五类参与者和核心用例:
参与者说明
| 角色 | 说明 |
|---|---|
| Supplier(存款人) | 存入资产到流动性池,赚取被动利息收益 |
| Borrower(借款人) | 以超额抵押方式借出资产,支付利息(含风险溢价) |
| Liquidator(清算人) | 监控不健康仓位并触发清算,获取清算奖励 |
| Governance(治理) | 管理 Spoke 注册、风险参数、利率策略、紧急控制等 |
| Reinvestor(再投资者) | 将闲置流动性 sweep 到外部策略或 reclaim 回 Hub |
3. 供应流程 (Supply)
用户存入资产到 Spoke 的完整调用链:
关键步骤
- 用户通过 Position Manager 调用
supply() - Spoke 从用户地址 transferFrom ERC20 资产
- Spoke 调用
Hub.deposit(spokeId, assetId, amount) - Hub 更新虚拟余额(virtual balance accounting)、累积利息、检查 add cap
- Hub mint supply shares 返回给 Spoke
- Spoke 记录用户 supply shares、更新抵押品记账
4. 借款流程 (Borrow)
用户以抵押品借出资产的完整调用链:
关键步骤
- 用户通过 Position Manager 调用
borrow() - Spoke 验证 reserve 状态(active && borrowable)
- Spoke 验证抵押品充足(HF > 1)
- Spoke 计算用户风险溢价 (RP_u),基于该用户的抵押品组合
- Spoke 调用
Hub.refreshPremium(user, newRP)重校准 premium shares - Spoke 调用
Hub.borrow(spokeId, assetId, amount) - Hub 更新 drawn shares、累积利息、检查 draw cap
- Spoke 记录用户 drawn debt + premium debt
5. 清算流程 (Liquidation)
清算流程步骤
- 检查资格:当借款人 HF 低于清算阈值,任何人可触发清算(不能自己清算自己)
- 确定偿还金额:基于 TargetHealthFactor 计算需要偿还的债务(不能造成粉尘残留)
- 处理粉尘:若剩余债务低于 DUST_LIQUIDATION_THRESHOLD,且清算人选择全额偿还,则允许覆盖全部债务
- 计算抵押品:转换债务金额为抵押品价值,应用荷兰拍奖励
- 执行转账和清算奖励:转移抵押品(含 bonus)给清算人,费用部分发给协议
- 可选 shares 接收:若 receiveSharesEnabled 且 reserve 未冻结,清算人可接收 Hub shares 而非底层资产
- 报告 deficit:若用户无剩余抵押品但仍有债务,报告 protocol deficit
6. 风险溢价计算流程
触发时机
RP_u 在以下操作时刷新(即用户可能增加风险时):borrow、withdraw(减少抵押品)、setUsingAsCollateral(禁用抵押品)、liquidationCall。
降低风险的操作(repay、supply)不会刷新 RP_u。用户也可主动调用 updateUserRiskPremium() 刷新。Governance 有权强制刷新。
计算公式
RP_u = Sigma(CR_i x C_{u,i} x P_i) / Sigma(C_{u,i} x P_i)
其中 CR_i 为资产 i 的 Collateral Risk,C_{u,i} 为用户 u 的资产 i 抵押品数量,P_i 为资产 i 的价格。
Premium Offset 机制
风险溢价在实现上通过额外的虚拟债务份额(premium shares)来实现:
- 借款时,offset 被设定为精确等于 premium shares 的资产价值
- 随时间推移,premium shares 累积利息,其资产价值超过 offset
- 超出部分即为 premium debt
- 用户已累积的 premium debt 在 refresh 时保持不变,仅未来的 premium accrual 反映新的 RP_u
7. Spoke / 资产状态机
每个 Spoke 有全局状态,每个 Reserve 有独立状态。两种状态机正交运行:
Spoke 全局状态
| 状态 | 说明 |
|---|---|
active | 正常模式,所有用户操作(supply/withdraw/borrow/repay/liquidate)均可执行 |
halted | 紧急模式,用户操作全部停止,仅 Governance 可执行管理操作 |
Reserve(资产)状态
| 参数 | 说明 |
|---|---|
active | 资产是否活跃 |
frozen | 资产是否冻结(即使冻结也可被清算) |
paused | 资产是否暂停 |
borrowable | 是否允许借款 |
receiveSharesEnabled | 清算人是否可接收 shares 而非底层资产 |
collateralRisk | 抵押品风险系数(0-100000 BPS),决定风险溢价 |
8. Hub-Spoke 架构
Aave V4 引入 Hub-and-Spoke 模型作为流动性管理的核心架构范式。 Hub 是不可变的核心合约,协调流动性; Spoke 是可升级的模块,处理特定资产的供应和借款。 一个 Hub 可以拥有不限数量的 Spoke,每个 Spoke 都可以贡献总债务和利息。
Hub 职责
- 维护每个资产已授权的 Spoke 注册表
- 管理 Spoke 级别的配置(流动性上限 Add/Draw Caps、风险溢价阈值)
- 提供紧急控制(active / halted 两种状态)
- 管理 per-asset 的 deficit 会计,保持协议偿付能力
- 管理 per-asset 的再投资控制器(授权 sweep 和 reclaim 闲置流动性)
- 管理 per-asset 的利率策略(最优利用率、基准利率、斜率等)
- 设置流动性费用(liquidity fee,决定协议留存利息比例)
- 强制执行会计不变量(总借款份额 = 各 Spoke 债务份额之和等)
Spoke 职责
- 触发向 Hub 转入资金(用户 supply)
- 处理供应和借款功能
- 管理用户数据结构和配置(最多
MAX_USER_RESERVES_LIMIT个抵押品/借款资产) - 提供紧急控制(paused / frozen 状态,以及 borrowable / receiveSharesEnabled 配置)
- 维护 spoke 级别的
reserveId追踪(独立于 Hub 中的assetId) - 管理预言机交互(每个 Spoke 独立配置预言机)
- 配置和执行 per-reserve 清算参数
Spoke 类型
- TokenizationSpoke(通用加密资产):标准 crypto 资产借贷
- TreasurySpoke(金库):协议费用铸造/收取
- 可扩展:支持 RWA、DEX LP 等任意类型的 Spoke
9. 系统组件架构图
10. Hub 模块详解
Hub 是 Aave V4 的不可变核心合约,负责所有流动性会计和利率计算。核心合约:
| 合约 | 路径 | 说明 |
|---|---|---|
Hub.sol |
src/hub/Hub.sol |
主合约,33KB。暴露 deposit/withdraw/borrow/repay 等核心接口 |
HubConfigurator.sol |
src/hub/HubConfigurator.sol |
配置管理合约,负责 Spoke 注册、限额设置、紧急控制等 |
HubStorage.sol |
src/hub/HubStorage.sol |
存储布局定义 |
AssetInterestRateStrategy.sol |
src/hub/AssetInterestRateStrategy.sol |
利率策略合约,基于利用率计算资产利率 |
Hub 核心方法
| 方法 | 调用方 | 说明 |
|---|---|---|
deposit(spokeId, assetId, amount) |
Spoke | 存入资产到 Hub,mint supply shares |
withdraw(spokeId, assetId, amount) |
Spoke | 从 Hub 提取资产 |
borrow(spokeId, assetId, amount) |
Spoke | 从 Hub 借出资产,记录 drawn shares |
repay(spokeId, assetId, amount) |
Spoke | 偿还借款 |
refreshPremium(user, riskPremium) |
Spoke | 刷新用户风险溢价,重校准 premium shares 和 offset |
eliminateDeficit(spokeId, assetId) |
Spoke | 使用 Spoke 的 supply shares 填补其他 Spoke 的 deficit |
mintFeeShares(spokeId, assetId) |
授权实体 | 铸造协议费用份额 |
Spoke 配置项
| 参数 | 说明 |
|---|---|
addCap | Spoke 向 Hub 存入资产的流动性上限 |
drawCap | Spoke 从 Hub 借出资产的上限 |
riskPremiumThreshold | 限制 Spoke 上报的 premium shares 与 drawn shares 的最大比例 |
active / halted | Spoke 状态:active(正常)/ halted(紧急停止用户操作) |
协议费用生命周期
协议从借款人利息中抽取 liquidity fee(流动性费用),但费用不直接打到某个固定账户,而是经过以下生命周期:
- 累积: 借款人支付的利息中,按 liquidity fee 比例扣除的部分,在 Hub 内以 supply shares 形式累积记账
- 铸造: 授权实体(通常是 TreasurySpoke)调用
Hub.mintFeeShares(spokeId, assetId),将累积费用铸造为对应的 supply shares,转入 TreasurySpoke - 留存: 这些 shares 留在协议内,持续累积利息收益
- 提取: 只有经 Aave Governance(DAO 投票)批准后,才能从 TreasurySpoke 提取到授权的国库地址
会计不变量
- 总 borrowed shares == 各 Spoke debt shares 之和
- Hub added assets amount >= 各 Spoke added assets amount 之和
- Hub added shares == 各 Spoke added shares 之和
- supply share price 和 drawn index 只能单调不减
11. Spoke 模块详解
Spoke 是面向用户的可升级合约,处理供应、借款、清算等用户操作。核心合约:
| 合约 | 路径 | 大小 | 说明 |
|---|---|---|---|
Spoke.sol |
src/spoke/Spoke.sol |
36KB | Spoke 基类,所有核心逻辑 |
SpokeConfigurator.sol |
src/spoke/SpokeConfigurator.sol |
11KB | Spoke 端配置管理(初始化储备、动态风险配置等) |
SpokeStorage.sol |
src/spoke/SpokeStorage.sol |
1.6KB | Spoke 存储布局定义 |
TokenizationSpoke.sol |
src/spoke/TokenizationSpoke.sol |
14KB | 代币化 Spoke(标准加密资产) |
TreasurySpoke.sol |
src/spoke/TreasurySpoke.sol |
3.5KB | 金库 Spoke(费用管理) |
AaveOracle.sol |
src/spoke/AaveOracle.sol |
3KB | 预言机合约(per-Spoke 独立配置) |
12. Position Manager(仓位管理器)
Position Manager 是用户与 Spoke 之间的网关合约层,提供增强的用户体验:
| 合约 | 说明 |
|---|---|
NativeTokenGateway |
原生代币(ETH)网关:封装/解封装原生代币以与 Spoke 交互 |
SignatureGateway |
EIP-712 元交易网关:支持 gasless 操作(supplyWithPermit 等) |
ConfigPositionManager |
仓位配置管理:setUsingAsCollateral、setUserEMode 等 |
TakerPositionManager |
标准仓位管理:supply/withdraw/borrow/repay/liquidationCall |
GiverPositionManager |
捐赠/赠送仓位:donate、give 操作 |
13. 合约类图
14. 风险溢价系统 (Risk Premium)
Aave V4 的核心创新之一是按用户抵押品质量差异化定价。 每个用户的借款利率 = 基准利率 (base drawn rate) + 风险溢价 (risk premium), 其中风险溢价由该用户抵押品的质量决定。
抵押品风险 (Collateral Risk, CR)
每个资产被赋予一个 Collateral Risk 值(BPS,范围 0 - 100000):
- CR = 0:最高质量,无风险(如 ETH)
- CR = 100000:最低质量,最大风险
CR 属于 Spoke 级别的风险参数,同一个资产在不同 Spoke 中可以有不同的 CR 值。
用户风险溢价 (User Risk Premium, RP_u)
RP_u 由用户的抵押品组合动态决定:
- 抵押品资产数量 (C_{u,i}) — 随借款利息单调递增
- 资产价格 (P_i) — 持续波动
- 抵押品风险系数 (CR_i) — 由 Governance 定期调整
(计算公式见 6. 风险溢价计算流程。)
15. 利息累积模型
每个借款仓位的利息被拆分为两个并行的累积流,均按 Hub 的 drawn rate 累积:
Drawn Debt (基准债务)
- 用户实际从 Hub 借出的本金部分
- 按 Hub 利率策略的基准利率 (R_{sbase,i}) 累积
- D_{u,ibase}(t) = D_{u,ibase}(t-1) + R_{sbase,i} x D_{u,ibase}(t-1)
Premium Debt (溢价债务)
- 因用户抵押品质量产生的额外利息
- 不来自实际资产提取,仅为记账条目
- D_{u,premium}(t) = D_{u,premium}(t-1) + R_{sbase,i} x RP_u x D_{u,ibase}(t-1)
总债务
D_{u,i} = D_{u,ibase} + D_{u,ipremium}
从用户视角看,仅看到一个综合利率:
R_{u,i} = R_{sbase,i} x (1 + RP_u)
16. 动态风险配置 (Dynamic Risk Configuration)
V3 的最大风险痛点之一是:所有仓位共享同一个全局风险参数配置。 一旦 Governance 调整(如降低 Liquidation Threshold),所有现存仓位立即受影响,可能导致意外清算。
Aave V4 的解决方案:允许多个风险配置版本同时存在。
工作原理
- Governance 每次调整抵押参数(CF, Max LB, LF)时,协议新增一个配置版本,而非覆盖旧配置
- 旧配置继续治理在其下开启的仓位
- 新仓位绑定到最新配置
- 配置存储在一个上限为 ~43 亿条目的字典中,由
dynamicConfigKey(uint32)标识
快照更新时机
用户仓位的 dynamicConfigKey 快照在以下操作时刷新(对所有抵押品资产):
setUsingAsCollateral(禁用时刷新全部,启用时仅刷新该资产)borrowwithdraw
以下操作不刷新快照:supply、repay、liquidationCall、updateUserRiskPremium。
自动重绑定与硬性安全防护
- 用户尝试降低健康因子的操作时,协议检查最新配置下仓位是否可持续
- 如果可持续 -> 自动重绑定到最新 key,允许操作
- 如果不可持续 -> revert 阻止操作
17. 清算引擎
Aave V4 重新设计了清算机制,用目标健康因子替代了 V3 的固定 Close Factor, 并引入了荷兰拍式可变清算奖励。
V3 vs V4 清算机制对比
| 维度 | V3 | V4 |
|---|---|---|
| 清算额度 | 固定的 50%(或 HF < 0.95 时为 100%) | 按需偿还到 TargetHealthFactor |
| 清算奖励 | 固定值(如 5%) | 荷兰拍式:HF 越低奖励越高,线性变化 |
| 粉尘处理 | 低于阈值时 revert | 动态允许全额偿还以避免粉尘,除非该 reserve 完全耗尽 |
可配置参数
| 参数 | 级别 | 说明 |
|---|---|---|
TargetHealthFactor | Spoke 全局 | 清算后应恢复到的目标 HF(>= 清算阈值常量) |
DUST_LIQUIDATION_THRESHOLD | 硬编码常量 | 粉尘阈值,固定为 $1000 等值 |
maxLiquidationBonus | per reserve dynamic config | 最大清算奖励(BPS),如 10500 = 5% bonus |
healthFactorForMaxBonus | Spoke 全局 | 低于此 HF 时获得最大奖励 |
liquidationBonusFactor | Spoke 全局 | HF=LIQ_THRESHOLD 时可获得的最大奖励比例 |
receiveSharesEnabled | per reserve | 清算人是否可接收 shares(产生收益,更高效) |
荷兰拍清算奖励公式
lb = maxLB (if HF <= hfForMaxBonus) lb = minLB + (maxLB - minLB) x (LIQ_THRESHOLD - HF) / (LIQ_THRESHOLD - hfForMaxBonus) (if HF > hfForMaxBonus)
其中:
- maxLB:per-collateral 的最大清算奖励
- liquidationBonusFactor:per-Spoke,决定清算阈值处可获得的奖励比例
- minLB = (maxLB - 100%) x lbFactor + 100%
- hfForMaxBonus:per-Spoke,获得最大奖励的 HF 阈值
Deficit 消除
清算后若用户无剩余抵押品但仍有债务,系统报告 deficit。任何授权且 active 的 Spoke 可调用 Hub.eliminateDeficit() 使用自身 supply shares 来覆盖其他 Spoke 的 deficit。这在紧急情况下也可执行(Spoke halted 但 active 时)。
18. 再投资模块 (Reinvestment Module)
Aave V4 内置了可选的再投资基础设施,允许将 Hub 中的闲置流动性部署到外部投资策略中,且不影响资产利率。
关键特性
| 特性 | 说明 |
|---|---|
| Governance 控制 | 所有资金分配由 Governance 独家管理 |
| 利率中性 | Swept 流动性仍然计入利用率分母,不影响 drawn rate |
| 用户可选加入 | 在 per-asset 级别启用,用户选择是否供应到启用 reinvestment 的 Hub 资产 |
| 增强收益 | 闲置流动性投入外部策略,opt-in 用户获得增量收益 |
| 风险隔离 | 再投资策略的亏损由 Governance 吸收(定义覆盖方式),LP 不直接暴露于策略风险 |
19. V3 vs V4 架构对比
总结
| 维度 | V3 | V4 |
|---|---|---|
| 架构模式 | 单体 Pool | Hub-Spoke 模块化 |
| 核心合约 | 1 个 Pool + 多个 Library(delegatecall) | 1 Hub(不可变)+ N Spoke(可升级) |
| 利率定价 | 统一利率 | 基准利率 + 用户风险溢价 |
| 风险参数 | 全局即时生效 | 多版本共存,渐进过渡 |
| 清算 | 固定 Close Factor + 固定奖励 | 目标 HF + 荷兰拍可变奖励 |
| 可扩展性 | 新功能需 Governance 提案升级 | 新 Spoke 可独立部署,接入已有 Hub |
| 资金效率 | 闲置资金锁在池中 | 可选再投资模块部署闲置资金 |
- Aave V4 代码仓库:github.com/aave/aave-v4
- Aave V4 官方文档:aave.com/docs/aave-v4
- Aave V3 系统梳理(同一目录):aave-system.html