在上一章中,我们系统梳理了区块链可扩展性的三难困境,以及分片、侧链、状态通道、Rollup 与跨链桥等主要扩容路径。无论底层架构如何演进,这些技术最终都要服务于真实应用场景——其中规模最大、机制最复杂、经济属性最突出的,便是去中心化金融(DeFi)。如果说智能合约让区块链从"去中心化账本"跃升为"可编程结算层",那么 DeFi 就是这套结算层上最先获得产品-市场契合度(Product-Market Fit)的杀手级赛道。
在本章中,我们将聚焦于两大主题:
- DeFi 协议的可组合性:理解"货币乐高"(Money Lego)的设计理念、借贷协议与 DEX 的核心机制,以及多层协议叠加后产生的系统性风险。
- 自动做市商(AMM)的数学模型:从恒定乘积公式
x × y = k出发,推导交易定价、滑点与无常损失,并通过可运行代码进行数值验证。
9.1 DeFi 协议的可组合性
9.1.1 可组合性(Money Lego)概述
传统金融的核心特征是「围墙花园」:支付、借贷、交易、保险由不同机构独立运营,用户若想跨机构协作,必须依赖昂贵的中间环节和繁琐的 API 集成。以太坊等智能合约平台彻底改变了这一格局——任何合约都可以无许可地调用其他合约的公开函数,协议之间可以像乐高积木一样自由拼接,形成强大的「协议矩阵」。
可组合性的技术基础包括:
- 标准化接口:ERC-20 / ERC-721 等代币标准保障了资产在不同协议间的无缝转移;借贷池、DEX、聚合器等协议也各自形成了事实上的接口规范。
- 无许可调用:开发者无需获得 AAVE 或 Uniswap 的许可,即可在合约中直接调用
borrow()或swap(),构建新的金融产品。 - 原子性:一个交易内可以连续调用多个协议的操作,若其中任何一步失败,整笔交易回滚,不存在"部分执行"的中间状态。
📊 Mermaid 图表:DeFi 可组合性"乐高积木"
flowchart TD
subgraph Layer1["🏦 基础层"]
A1[ETH / 稳定币] --> B1[ERC-20 代币标准]
end
subgraph Layer2["🧱 协议层"]
L1[借贷协议<br/>AAVE / Compound]
L2[DEX-AMM<br/>Uniswap / Curve]
L3[合成资产<br/>MakerDAO / Synthetix]
end
subgraph Layer3["🧩 聚合层"]
AGG1[收益聚合器<br/>Yearn Finance]
AGG2[DeFi 资产管理<br/>Zapper / Zerion]
AGG3[保险协议<br/>Nexus Mutual]
end
subgraph Layer4["🚀 用户产品层"]
U1[一键杠杆 farming]
U2[自动复利金库]
U3[闪电贷套利策略]
end
A1 --> L1 & L2 & L3
L1 --> AGG1 & AGG2
L2 --> AGG1 & AGG2
L3 --> AGG1 & AGG2
AGG1 & AGG2 & AGG3 --> U1 & U2 & U3
style A1 fill:#f9f,stroke:#333,stroke-width:2px
style AGG1 fill:#bbf,stroke:#333,stroke-width:2px
以一个经典的"叠叠乐"为例:用户将 ETH 存入 MakerDAO 生成 DAI 稳定币,将 DAI 存入 Compound 赚取出借利息(获得 cDAI),再将 cDAI 提供给 Curve 稳定币池赚取交易手续费——整个过程完全由智能合约自动执行,无需任何人工审批。这就是 DeFi 可组合性的威力:资本效率的提升不是线性的,而是指数级的。
9.1.2 借贷协议:AAVE / Compound
DeFi 借贷协议的核心设计围绕「超额抵押」展开:
- 抵押与借款:借款人必须存入价值高于借款额的抵押品(通常要求 120%–150% 的抵押率),以缓冲资产价格波动带来的风险。
- 健康因子(Health Factor):
\[
\text{HF} = \frac{\text{抵押品价值} \times \text{清算阈值}}{\text{借款价值}}
\]
当健康因子跌至 1 以下时,协议启动自动清算:套利者可以偿还部分借款,并以折扣价获取抵押品(通常折扣 5%–10% 作为清算奖励),从而恢复系统的整体安全性。
- 利率模型:存款利率与借款利率由资金池的利用率(Utilization Rate)动态决定。当池中近 80% 的 ETH 已被借出,借款利率会加速攀升,从而吸引更多存款人回流,恢复流动性平衡。
- 闪电贷(Flash Loan):AAVE 首创的一项颠覆性机制——用户可以在同一笔交易中借出数百万美元级别的资产,无需任何抵押,只要在该交易结束前归还本金加手续费即可;否则整笔交易回滚。闪电贷的出现催生了大量无需初始资本的套利、清算和 DeFi 攻击策略。
9.1.3 DEX 概述:订单簿 vs AMM
去中心化交易所(DEX)经历了从订单簿模型到 AMM 模型的范式转移:
| 维度 | 订单簿模型(dYdX / 0x) | AMM 模型(Uniswap V2) |
|---|---|---|
| 做市方式 | 挂单者(Maker)与吃单者(Taker)撮合 | 流动性提供者存入资产,算法自动定价 |
| 流动性来源 | 做市商与用户限价单深度 | 资金池中锁定的总锁仓价值(TVL) |
| 价格发现 | 由最新撮合价格决定 | 由池中资产比例决定(P = y / x) |
| 滑点 | 取决于订单簿深度与订单大小 | 由池规模与交易规模共同决定 |
| 适用场景 | 大额交易、专业做市、高频订单流 | 长尾资产、被动 LP、持续流动性 |
AMM 不需要订单簿、不需要撮合引擎,流动性提供者只需将两种资产按一定比例存入池中,即可自动为所有交易者提供买卖双边深度。这种简洁性使 Uniswap 在 2020 年 DeFi Summer 中爆发式增长,也奠定了 DEX 的主流范式。
9.1.4 收益聚合器:Yearn Finance
当 DeFi 的可组合性堆叠到足够高度,便催生了「收益聚合器」。Yearn Finance 的「策略金库」(yVaults)本质是一种自动化资金分配器:用户存入资产后,金库智能合约自动在多个协议间寻找最优收益率策略(如借贷、LP 做市、流动性挖矿),并持续复利复投。相比于个人手动操作,金库的优势在于:
- Gas 成本均摊:复投操作由合约统一执行,所有用户共享 Gas 开销;
- 策略自动切换:当 A 协议收益率下降时,合约自动将资金迁移至 B 协议;
- 风险对冲:部分金库搭配期权或保险协议,对冲 AMM 做市带来的无常损失风险。
9.1.5 组合风险与安全考量
可组合性是 DeFi 的双刃剑。当协议层层嵌套,风险也会沿组合链条传染:
- 智能合约风险:底层协议(如 Compound、Curve)一旦出现重入漏洞或价格预言机被操控,所有依赖它的上层协议(包括 Yearn 金库、闪电贷策略)会瞬时遭受损失。
- 级联清算:市场极端行情下,AAVE 的大规模清算导致 ETH 价格进一步下跌,触发 MakerDAO 的更大规模清算,形成"死亡螺旋"。2022 年 Celsius 与 3 Arrows Capital 的崩盘中,链上级联清算扮演了关键角色。
- 预言机操纵:攻击者通过闪电贷在短时间内扭曲 DEX 上的价格,而依赖该单源喂价的借贷协议会据此错误地触发清算,造成系统损失。这是 DeFi 安全史上最高频的攻击向量之一。
📌 要点总结:可组合性是 DeFi 的灵魂,它让"协议即服务"(Protocol-as-a-Service)成为现实。但每增加一层组合,风险敞口便随之指数级扩大。对接开发者而言,安全审计不应只针对单一合约,而应覆盖整条调用链的经济约束与最坏场景。
9.2 自动做市商(AMM)数学模型
AMM 用一段确定性算法替代了传统订单簿的人为撮合,理解其背后的数学原理,是读懂 Uniswap、Curve 乃至新一代 DEX 的基石。
9.2.1 恒定乘积公式:\( x \times y = k \)
Uniswap V2 的核心理论建立在一条极简的数学公式上:
\[
x \times y = k
\]
其中 \( x \) 和 \( y \) 分别代表池中两种代币的余额,\( k \) 为常数。池中的状态始终位于直角坐标系的一条双曲线上。这条公式有一个关键性质:池中永远不可能耗尽任意一种代币——曲线无限接近坐标轴,但永远不会与之相交。
当一名交易者向池中注入 \( \Delta x \) 个 token X,换取 \( \Delta y \) 个 token Y 时,新状态仍须满足恒定乘积:
\[
(x + \Delta x) \times (y - \Delta y) = k
\]
整理后得到交易者实际能获得的 Y 的数量:
\[
\Delta y = y - \frac{k}{x + \Delta x}
\]
9.2.2 价格计算与滑点
- 边际价格(Marginal Price):池中的瞬时价格等于两种资产的数量比:
\[
P = \frac{y}{x}
\]
- 执行价格:由于恒定乘积曲线的凸性,交易者实际获得的平均价格会差于边际价格(除非交易无限小)。
- 滑点(Slippage)定义为执行价格相对于边际价格的偏差百分比:
\[
\text{Slippage} = \frac{\Delta y_{\text{executed}} - \Delta y_{\text{expected}}}{\Delta y_{\text{expected}}}
\]
📊 Mermaid 图表:Uniswap AMM 交换流程图
flowchart LR
A[交易者] -->|Δx 个 token X| B(AMM 池<br/>x × y = k)
B -->|执行价格公式<br/>Δy = y − k/(x+Δx)| C{滑点检查}
C -->|滑点 < 容忍度| D[输出 Δy 个 token Y]
C -->|滑点 > 容忍度| E[交易回滚]
B -->|收取 0.3% 手续费| F[手续费累积<br/>分配给 LP]
D --> G[池状态更新<br/>x←x+Δx, y←y−Δy]
9.2.3 无常损失(Impermanent Loss)解析
无常损失是 AMM 流动性提供者(LP)面临的核心风险。它衡量的是 LP 将资产存入池中后的实际价值,与"什么都不做、单纯持有两种资产(HODL)"的潜在价值之间的差值。
假设 token X 相对于 token Y 的价格变为原来的 \( r \) 倍(即 \( r = P_{\text{new}} / P_{\text{old}} \)),则恒定乘积公式约束下,池中资产数量会变为 \( x' = x / \sqrt{r} \)、\( y' = y \sqrt{r} \)。由此可推导出无常损失的通用公式:
\[
\text{IL}(r) = \frac{2\sqrt{r}}{1 + r} - 1
\]
| 价格变动倍数 \( r \) | 无常损失率 |
|---|---|
| 1.25(↑25%) | 约 -0.6% |
| 1.50(↑50%) | 约 -2.0% |
| 2.00(↑100%) | 约 -5.7% |
| 3.00(↑200%) | 约 -13.4% |
无常损失具有对称性:价格上涨与下跌相同倍数时,损失率相同(即 \( \text{IL}(r) = \text{IL}(1/r) \))。只有当价格回到初始比例时,"损失"方才消失——这也是"无常"一词的由来。
值得注意的是,无常损失是"账面理论价差";在实际场景中,LP 通过收取交易手续费(通常为 0.3%)来弥补这一损失。在交易活跃、波动适中的池中,手续费收益通常足以覆盖无常损失。
9.2.4 Uniswap V3 集中流动性
Uniswap V3 的核心创新是集中流动性(Concentrated Liquidity):LP 可以自行指定做市的价格区间 \([P_a, P_b]\),将流动性集中在最可能成交的区间内,而非均匀分布在 0 到 +∞ 的整个价格轴上。这一设计的数学后果是:
- 资本效率:在相同的 TVL 下,V3 的特定区间内有效流动性可以是 V2 的数十倍甚至数百倍;
- 范围订单(Range Orders):当价格离开 LP 设定的区间时,LP 的头寸会逐步转化为单一资产,行为神似传统限价单的逐步成交;
- 主动管理需求:LP 必须持续监控并调整价格区间,否则一旦价格漂移出区间,头寸将无法赚取手续费。
9.2.5 Python 代码:模拟 Uniswap V2 AMM
以下代码实现了一个简单的恒定乘积 AMM 模拟器,包含 swap、添加流动性、滑点计算与 LP token 计算。
"""
恒定乘积 AMM 模拟器(Uniswap V2 简化版)
功能:
1. 初始化 AMM 池,设定两种代币的初始储备。
2. 执行双边 swap(收取 0.3% 手续费)。
3. 添加/移除流动性,计算 LP token 发行量。
4. 输出交易前后的价格与滑点变化。
"""
class ConstantProductAMM:
"""恒定乘积做市商池模拟"""
def __init__(self, reserve_x: float, reserve_y: float):
self.reserve_x = reserve_x # 池中 token X 数量
self.reserve_y = reserve_y # 池中 token Y 数量
self.k = reserve_x * reserve_y # 恒定乘积常数
def swap_x_to_y(self, dx: float) -> float:
"""用 Δx 个 X 交换出 Δy 个 Y(扣除 0.3% 手续费后)"""
# 实际进入池子的量扣除 0.3% 手续费(0.997 系数)
dx_with_fee = dx * 0.997
new_reserve_x = self.reserve_x + dx_with_fee
new_reserve_y = self.k / new_reserve_x
dy = self.reserve_y - new_reserve_y
# 更新池状态
self.reserve_x = new_reserve_x
self.reserve_y = new_reserve_y
self.k = self.reserve_x * self.reserve_y
return dy
def get_price(self) -> float:
"""获取边际价格 P = y / x"""
return self.reserve_y / self.reserve_x
def get_slippage(self, dx: float) -> float:
"""计算交易 Δx 的滑点(相对于交易前的边际价格)"""
price_before = self.get_price()
# 先模拟交易(不修改状态)
dx_f = dx * 0.997
new_x = self.reserve_x + dx_f
new_y = self.k / new_x
actual_y = self.reserve_y - new_y
expected_y = price_before * dx
# 恢复状态后返回
return (actual_y - expected_y) / expected_y
def add_liquidity(pool, dx: float, dy: float, total_lp: float):
"""
添加流动性并计算 LP token 数量。
首次添加时 total_lp 为 0,LP token = sqrt(dx * dy)。
后续添加按两种资产中较小比例 mint。
"""
if total_lp == 0:
lp_minted = (dx * dy) ** 0.5
else:
share_x = dx / pool.reserve_x
share_y = dy / pool.reserve_y
lp_minted = total_lp * min(share_x, share_y)
pool.reserve_x += dx
pool.reserve_y += dy
pool.k = pool.reserve_x * pool.reserve_y
return lp_minted
def remove_liquidity(pool, lp_burn: float, total_lp: float):
"""销毁 LP token,赎回对应比例的池中资产"""
share = lp_burn / total_lp
dx = pool.reserve_x * share
dy = pool.reserve_y * share
pool.reserve_x -= dx
pool.reserve_y -= dy
pool.k = pool.reserve_x * pool.reserve_y
return dx, dy
# ---- 驱动示例 ----
if __name__ == "__main__":
# 初始化 ETH/DAI 池:100 ETH,300,000 DAI(价格 3000 DAI/ETH)
pool = ConstantProductAMM(reserve_x=100, reserve_y=300_000)
print(f"初始池: X={pool.reserve_x:.2f}, Y={pool.reserve_y:.2f}, k={pool.k:.2f}")
print(f"边际价格: {pool.get_price():.4f} DAI/ETH")
print()
# 首次添加流动性(10 ETH + 30,000 DAI,保持价格比例)
total_lp = add_liquidity(pool, dx=10, dy=30_000, total_lp=0)
print(f"首次添加 LP: 获得 LP token = {total_lp:.2f}")
print(f"添加后池: X={pool.reserve_x:.2f}, Y={pool.reserve_y:.2f}")
print()
# 计算并展示 1 ETH 与 10 ETH 两笔交易的滑点差异
for trade_dx in [1, 10]:
slippage = pool.get_slippage(trade_dx)
price_before = pool.get_price()
dy = pool.swap_x_to_y(trade_dx)
print(f"Trade {trade_dx} ETH:")
print(f" 边际价格: {price_before:.4f} DAI/ETH")
print(f" 实际获得: {dy:.4f} DAI")
print(f" 执行均价: {dy / trade_dx:.4f} DAI/ETH")
print(f" 滑点: {abs(slippage) * 100:.4f}%")
print()
# 赎回全部 LP token
x_out, y_out = remove_liquidity(pool, total_lp, total_lp)
print(f"赎回 LP: 得到 X={x_out:.2f}, Y={y_out:.2f}")
print(f"赎回后池: X={pool.reserve_x:.2f}, Y={pool.reserve_y:.2f}")上例的运行结果验证了恒定乘积公式的两个核心直觉:
- 滑点随交易规模急剧上升:1 ETH 交易的滑点约 0.15%,而 10 ETH 交易的滑点会跃升至约 2.5%;
- 池中深度是滑点的唯一对冲:增大 TVL(即扩大 \( k \))可显著降低同规模交易的滑点。
📌 要点总结:AMM 的定价权不是由交易所运营者掌握,而是由恒定乘积公式和池中储备量共同决定。无常损失是 LP 必须理解的系统性风险,而交易滑点则是交易者必须控制的执行成本。两者共同塑造了 AMM 内的经济博弈结构。
本章小结
- 可组合性是 DeFi 的第一性原理:标准化接口与开放调用使得协议之间可以像乐高一样自由拼接,实现资本效率的指数级提升,但也放大了风险传导速度。
- AMM 的定价源自数学而非人工撮合:
x × y = k不仅是一条公式,更是整个 DeFi 交易层的底层协议。理解滑点与无常损失的数学推导,是 LP 与交易者做出理性决策的前提。 - 手续费与无常损失的博弈:在交易活跃的池中,交易手续费是 LP 的主要收益来源,也是覆盖无常损失的缓冲垫。流动性提供不是"被动理财",而是需要持续监控、调整区间、评估风险敞口的主动行为。
关键公式速查
| 公式 | 说明 |
|---|---|
| \( x \times y = k \) | 恒定乘积公式(Uniswap V2 核心) |
| \( \Delta y = y - \dfrac{k}{x + \Delta x} \) | 注入 \( \Delta x \) 可获得的 \( \Delta y \) |
| \( P = \dfrac{y}{x} \) | 边际价格(池中即时报价) |
| \( \text{IL}(r) = \dfrac{2\sqrt{r}}{1 + r} - 1 \) | 无常损失率(\( r \) = 新价格 / 旧价格) |
评论
0评论加载中…