[TOC]
Ethereum 原始货币:ETH,任何人可构建 Token。AMM(Automated Market Maker)是最常见的交易方法。
大多数"真实世界"的交易所是如何运作的?
- 基于订单簿 Order Book:用户提交卖单(asks)和买单(bids),这些都被收集在一个 Order Book 中
- 匹配兼容的 ask/bid
- 市场价格位于最低卖价和最高买价之间
传统中心化交易所(CEX)的运作机制,以此来引出为什么需要自动做市商(AMM)。
在传统交易所中:
- 交易是通过订单簿系统进行的,买家和卖家分别提交他们愿意的交易价格
- 当买价和卖价有交集时,订单就能够被撮合
- 实际的成交价格会在最高买价(bid)和最低卖价(ask)之间形成,这个差价也被称为价差(spread)
而AMM(自动做市商)则是去中心化交易所(DEX)采用的另一种机制,它不需要传统的订单簿,而是使用算法和流动性池来实现自动的价格发现和交易执行。这种机制更适合区块链上的去中心化交易,因为它不需要集中撮合订单,能够提供持续的流动性。
中心化加密货币交易(CEX)所遵循这种模式,例如 Coinbase、Binance 等
问题1:订单簿在链上运行时消耗太多 gas(成本高),因为需要维护和排序大量列表 问题2:信任和治理问题
结论:我们需要一个不同的链上交易所解决方案!
我们不能使用 Order Book来确定市场价格。
Idea of an Invariant:
-
当用户存入代币时,基于存入的数量计算一个值
$k$ -
这个值
$k$ 是 Invarient,意味着在代币交换过程中这个值不会改变 -
当用户用代币
$A$ 换取代币$B$ 时,计算应该给出多少代币$B$ 以保持 Invariant Constant这张图片在介绍AMM(自动做市商)中的核心概念——不变量定价机制。与传统订单簿不同,AMM使用数学公式来确定价格和交易量。
最简单的 Invariant为 constant sum
$$
k = B_\alpha + B_\beta
$$
其中
这是不实际的,除非两个 token 价值一样。
假设有一个 2-asset pool,DAI 和 USDC
Alice 存入 100 DAI 和 100 USDC,其
$k = B_\text{DAI} + B_\text{USDC} = 100 + 100 = 200$ Bob swap 100USDC 为 DAI,$k$ 必须保持$200$ ,因此Bob收到 100 DAI
一个更通用的 Invariant
$$
k = B_\alpha \times B_\beta
$$
其中
以 β 表示的 α 价格在曲线梯度上为 1
假设有一个 2-asset pool,ETH 和 USDC
Alice 存入 10 ETH 和 10,000 USDC,其
$k = B_\text{ETH} \times B_\text{USDC} = 10^5$ Bob swap 2000USDC 为 ETH,$k$ 必须保持$10^5$ ,可以计算 $$ B_\text{ETH}' = k / B_\text{USDC} = 10^5 / 12,000 - 8.33 $$ 即$\Delta B_\text{ETH} = 10 - 8.33 = 1.67 \text{ ETH}$ 最终拿到 1.67 ETH.
传统交易所的流动性:在传统交易所中,流动性由市场参与者(交易者)提供 交易者通过主动挂单提供流动性
AMM中的流动性:在AMM中,流动性提供者(LPs)无需主动参与交易就能提供流动性 引入专门的流动性提供者(LP),他们只需存入资产即可
LP如何赚取收益:
-
直接收益:从交易费用中获得分成
-
额外奖励:获得平台的治理代币(参与平台治理的权利)
当用户进行 swap 时,余额会沿着流动性曲线(Liquidity Curve)移动
AMM池中的大部分流动性只在定价曲线的极端区域可用,这是低效的 流动性分布不均:大量流动性集中在曲线的两端 资本效率低:中间价格区域的流动性较少 Slippage问题:大额交易会导致显著的价格影响(如图中所示的Δβ变化导致的价格变动)
对于较大的交易,价格影响会变得显著(参见示例)——slippage 滑点
我们要避免这种情况!
AMM Curve结合了constant product 和 constant sum invariant,创造了他们称之为stableswap的机制
当流动性池大致平衡时,由于曲线更平坦,这减少了 slippage
注意这个曲线是为那些在正常情况下应该具有相同价格的资产对设计的(例如:稳定币)
L2s 的transaction free 更便宜。是否可以构建一个 order book 和 AMM curve的混合(hybrid)?
将可能的价格空间离散化(Discretise)为价格刻度(ticks) 允许流动性提供者(LPs)选择他们想要提供流动性的价格范围 使用 constant product curve 计算两个刻度之间的价格 当用户进行 swap 时,可能会跨越多个价格刻度 流动性集中在"合理"的价格范围内 如果价格超出他们设定的范围,LP将只持有其中一种资产
Uniswap V3允许流动性提供者(LPs)选择流动性范围(离散化的) 这些范围类似于一个粗粒度的订单簿,并集中流动性 当进行交易时,用户可能会将价格推至下一个价格区间,并使用该区间内的流动性
AMM 的价格由其资产的相对平衡决定。如果交易活动不同,就会导致不同 AMM 的价格出现偏差。在实践中,为什么不同 AMM 的价格不会相差太多? 如果不同市场的价格不同,就会出现 Arbitrage 机会 Arbitrage Bot 不断监控并利用(Exploit)这一点
Example
AMM1: 1 ETH = 1500 USDC AMM2: 1 ETH = 1400 USDC
- Buy ETH on AMM2
- Sell on AMM1
- 降低 AMM 1 的价格,拉升 AMM 2 的价格
- Profit Approx 100 USD
- 重复/Scale 直到价格一致
-
流动性提供者(LPs)在 AMMs 上提供一个波动性资产组合(portfolio of volatile assets)作为流动性池的资金。
-
当价格在不同的AMM之间出现差异时,资产在个别AMM上会暂时出现定价过高或过低的情况。
-
套利者总是会买入定价偏低的资产,卖出定价偏高的资产。
-
LPs 总是会留下价值较低的资产 == 非永久性损失
当用户作为流动性提供者向AMM提供资金时可能会遇到这个问题:
- 当市场上出现价格差异时,套利者会利用这种差异进行套利交易
- 套利者的行为会导致流动性池中留下价值较低的资产
- 这种损失被称为"非永久性"是因为如果价格最终回归到原来的水平,这种损失理论上可以被抵消
- 但在实践中,这种损失往往会变成实际的损失,因为价格可能不会回到原始水平
这个问题是AMM设计中的一个固有挑战,流动性提供者需要考虑这种风险。
假设一个具体例子:
- 初始存入:1 ETH ($2000) + 2000 USDT
- 如果ETH价格上涨到$3000:
- 套利者会从池子买走ETH(因为池子里的ETH相对市场价偏低)
- 注入更多USDT
- 最终池子里可能变成:0.82 ETH + 2450 USDT
- 虽然总价值上涨了,但比单纯持有原始资产获得的收益要少
为什么叫"非永久性"损失:
- "非永久性"是因为如果价格回到原始水平,损失会消失
- 但在实践中,价格很可能不会完全回到原始点
- 即使价格回归,期间也会错过了单纯持有资产可能带来的收益
影响因素:
- 价格波动幅度:波动越大,损失越大
- 流动性池中资产的相关性:负相关资产的损失风险更大
- 交易量:高交易量产生的手续费可能部分抵消损失
- 时间:持有时间越长,遭遇大波动的概率越高
减少非永久性损失的策略:
- 选择稳定币对(如USDC/USDT)做市
- 使用单边流动性提供机制
- 参与有激励的流动性池(额外代币奖励)
- 使用集中流动性(比如Uniswap V3)
- 设置止损策略
尽管存在套利,AMM只能反映基于其资产余额的 "local" price 如果这些资金池暂时 imbalanced(例如 manipulated 被操纵),local price 就不能反映池中资产的"真实" global price
AMM 不是可靠的价格数据来源!
依赖AMM价格的智能合约可能受到价格操纵的影响 典型案例:闪电贷攻击、价格预言机攻击
与AMM交互的智能合约(例如存款/取款)可能容易受到失衡攻击 时间差攻击(三明治攻击) 闪电贷结合的复杂攻击
一些AMM允许单资产提供流动性,这加剧了这个问题
允许LP只提供一种资产 不需要按比例配对其他资产 协议会自动处理资产转换和平衡
破坏了传统AMM的资产平衡机制 增加了价格操纵的可能性 可能导致更严重的非永久性损失
防护措施:
- 使用去中心化预言机(如Chainlink)
- 实施价格延迟机制
- 设置交易限额
- 多重价格验证
- 增加流动性要求
Block Proposers 可以自行选择交易的顺序或决定是否包含某些交易。
Proposers 可以在用户的交易之前插入自己的交易,从而影响资金池(pool)的平衡。
Proposers 还可以在用户的交易之后立即进行反向交易,从用户交易导致的价格上涨中获利。
- 这种攻击方式被称为"三明治攻击"(sandwich attack),为用户的交易被提议者的两个交易"夹"在中间。
Block Proposers 有多种获利机会,他们通过这种方式可提取的最大利润被称为Maximal Extractable Value (MEV, 最大可提取价值)。
Flash Loan 是一种无需抵押且无借款限额的贷款,其特点是必须在借入的同一笔交易中完成还款。
- 用户在同一笔交易中完成借款 borrow 和还款 repay
- 收取借款金额的手续费
- 如果未能在同一交易中还款,整个交易会被回滚(Atomicity)
优势:提供信贷(Credit)的同时无需承担借款人违约的风险!
- "原子性"意味着交易要么完全成功,要么完全失败,不存在中间状态
- 这种贷款通常用于区块链上的套利或其他复杂的金融操作
- 因为借贷都发生在同一个区块的同一笔交易中,所以贷方不会面临传统借贷中的违约风险
- 如果借款人无法按时还款,整个交易会自动回滚,就像从未发生过一样
这是区块链技术带来的创新金融工具之一,它让无抵押的大额借贷成为可能,但要求借款人能在极短时间内(同一笔交易中)完成套利或其他获利操作以偿还贷款。
如果交易结束时没有偿还 Flash Loan 怎么办?
- Transaction Reverts
- 因为交易是原子性的,没有发生任何状态变化
- Transaction Signer 要承担失败事务的 gas cost
主要设计要点:
-
Flash Loan 只能通过智能合约进行(EOA不能直接申请闪电贷款!)
-
调用 Flash Loan 功能的合约(i.e., the borrower)需要实现特定的接口/函数
-
Flash Loan Issuer(i.e., the lender)执行以下步骤:
- 在发放贷款前进行条件检查(例如,balance of the lender贷款人)
- 将 loan 转给 calling contract(borrower)
- 调用 borrowing contract 中的方法,该方法包含了贷款资金的使用逻辑
- 进行条件检查(即确认 loan 是否已还清/检查贷款人余额)
技术解释:
- 整个过程是通过智能合约自动执行的,这确保了交易的原子性
- "接口/函数"的要求意味着借款合约必须遵循标准化的结构
- 贷款发放和偿还的验证都在同一交易中完成
- 合约的设计保证了如果最终检查失败(即贷款未还清),整个交易会回滚
On-chain EX A: 1 ETH = 1,300 USDC On-chain EX B: 1 ETH = 1,290 USDC
一个 profitable flash loan transaction:
- Alice 从 PLF 获取 100 000 000 USDC 的闪电贷
- Alice 在 EX B 用 100 000 000 USDC 购买 77 519 ETH
- Alice 在 EX A 用 77 519 ETH 换取 100 774 700 USDC
- Alice 偿还 flash loan 100 000 000 USDC 和 0.1% 的费用 (100 000 USDC)
Alice最终获利 674 700 USDC
Alice在Aave(一个借贷平台)上存入1个ETH作为抵押,借出了1000 USDC。假设1个ETH的价格是1500 USDC。Alice对用ETH作为抵押感到不安,但她目前没有1000 USDC来偿还贷款。她该怎么办?
解决方案:执行抵押品互换(无需偿还贷款):
- Alice申请1500 DAI的闪电贷款
- Alice将1500 DAI存入Aave
- Alice从Aave提取她的1个ETH
- Alice在链上交易所将1个ETH兑换成1500 DAI
- Alice偿还1500 DAI的闪电贷款(外加一些手续费)
最初状态:
- Alice在Aave存入了1 ETH作为抵押
- 借出了1000 USDC
- 她想更换抵押品类型,从ETH换成DAI
交易步骤解析:
- 从闪电贷款借1500 DAI
- 将这1500 DAI存入Aave作为新的抵押品
- 提取原来的1 ETH抵押品
- 将ETH换成DAI以偿还闪电贷款
- 最后还给闪电贷款提供方1500 DAI(加手续费)
最终状态:
- 原来的1000 USDC贷款依然存在
- 抵押品从1 ETH变成了1500 DAI
- 闪电贷款已结清
https://rekt.news/cream-rekt-2/
Pros: Flash loan 可提供大量资金,从而提高市场效率 Cons: 高额资 capital 攻击提供了渠道
通过在某个 AMM 上的流动性池持有的储备之间制造暂时的不平衡,让攻击者从与智能合约的交互中获利的攻击。
- 使用 Flash Loan 借 DAI
- 在 AMM swap DAI 和 USDC
- AMM 的 DAI 价格跌
- borrowMaxDAI 获取 an excessive amount of DAI
- Swap USDC 回 DAI
- Repay load
闪电贷款可能有用,但往往会带来攻击载体(Attack Vector)
- 链上流动性池(AMMs)作为即时价格标志是不可靠的,因为它们可以被操纵
- 更好的方法是依赖链外交易规则(这些可以是去中心化的!),或一些混合解决方案
SoK: Decentralized Finance (https://arxiv.org/abs/2101.08778)