第一课:DEX概述与AMM原理

各位同学,欢迎来到《去中心化交易所DEX智能合约开发实战》的第一课。

我是你们这门课的老师。在DeFi领域摸爬滚打了好几年,踩过不少坑,也攒了一些经验。今天咱们就从最基础的东西聊起——DEX到底是什么?它背后的AMM原理又是怎么一回事?

1.1 去中心化交易所(DEX)简介

先说说什么是DEX。说白了,DEX就是跑在区块链上的交易所。没有老板,没有员工,也没有一个中央服务器来管你的钱。

你打开Uniswap或者PancakeSwap,直接连上你的钱包就能交易。你的资产全程在你自己的钱包里,直到交易那一刻才被智能合约调用。这就是DEX的核心——非托管

核心要点: DEX是一组智能合约,它自动执行订单匹配和资产结算。没有中间人,你说了算。

我记得2018年刚接触这个领域时,DEX的体验还很糟糕。交易速度慢,滑点高,流动性也差。但现在不一样了,很多DEX的日交易量已经能跟一些中小型CEX掰手腕了。

1.2 中心化交易所(CEX)与DEX对比

你可能会问:既然有币安、Coinbase这些大交易所,为什么还要用DEX?

咱们来做个对比,你就明白了。

对比维度 CEX(中心化交易所) DEX(去中心化交易所)
资产控制权 交易所托管你的资产 你完全控制自己的资产
交易对手 与交易所内部订单簿匹配 与流动性池交互
上币门槛 需要审核,费用高 任何人都可以创建流动性池
安全性 单点故障风险(黑客攻击、跑路) 依赖智能合约安全,无单点故障
隐私性 需要KYC(实名认证) 无需KYC,匿名交易
交易速度 毫秒级,体验好 受区块链确认时间影响(几秒到几分钟)
交易费用 较低,通常固定比例 包含Gas费,高峰期可能很贵

看到没?CEX快、便宜,但你要信任它。DEX慢一点、贵一点,但你的资产永远在你手里。我个人习惯是:大额资产放冷钱包,日常交易用DEX。小额频繁交易才用CEX。

避坑指南: 我曾经见过一个项目方,把全部资金放在CEX里做市,结果交易所被盗,血本无归。如果你真正理解「Not your keys, not your coins」这句话,你就会明白DEX的价值。

1.3 自动做市商(AMM)核心原理

好了,重点来了。DEX是怎么工作的?它靠的就是AMM——自动做市商。

传统交易所用的是「订单簿」模式。你想买,得有人愿意卖。买卖双方挂单,交易所撮合。但DEX不一样,它没有订单簿。它用的是一个数学公式来定价。

你想想看,如果没有人挂单,你怎么交易?AMM的答案是:流动性池

流动性池是什么?就是一个智能合约,里面存着两种代币。比如ETH和USDC。用户(我们叫他们「流动性提供者」)把ETH和USDC按一定比例存入池子。然后,交易者就可以用USDC从池子里买ETH,或者用ETH买USDC。

价格怎么定?不是谁说了算,是公式说了算。

1.4 恒定乘积公式(x*y=k)推导

最经典的AMM公式,就是Uniswap用的那个:x * y = k

咱们来拆解一下:

  • x = 池子里代币A的数量(比如ETH)
  • y = 池子里代币B的数量(比如USDC)
  • k = 一个常数,交易前后保持不变

什么意思呢?就是无论你怎么交易,池子里两种代币的乘积永远不变。

举个例子:

  • 假设池子里有10个ETH和20,000个USDC
  • 那么 k = 10 * 20,000 = 200,000
  • 你想用USDC买1个ETH
  • 买完之后,池子里ETH变成9个(因为被你买走了1个)
  • 为了保持k不变,USDC的数量必须变成:200,000 / 9 ≈ 22,222.22
  • 也就是说,你需要支付:22,222.22 - 20,000 = 2,222.22 USDC

你看,你花了2,222.22 USDC买了1个ETH。而池子里的ETH价格,从交易前的2,000 USDC/ETH,变成了交易后的2,222.22 USDC/ETH。价格涨了!

为什么会这样?因为池子里的ETH变少了,物以稀为贵嘛。这就是AMM的定价逻辑——流动性越深,滑点越小;交易量越大,价格冲击越明显

小提示: 我在项目中遇到过一个问题:如果池子里某个代币被大量买走,价格会变得极其离谱。比如有人把池子里的ETH几乎买光,那剩下的ETH价格会高到天上。这就是「无常损失」的根源之一。后面我们会专门讲这个。

咱们用代码来验证一下这个公式:

// 假设初始状态
uint256 x = 10;      // ETH数量
uint256 y = 20000;   // USDC数量
uint256 k = x * y;   // k = 200000

// 用户想买 dx = 1 个ETH
uint256 dx = 1;
uint256 new_x = x - dx;  // 新的ETH数量 = 9

// 根据恒定乘积公式,计算新的USDC数量
uint256 new_y = k / new_x;  // new_y = 200000 / 9 = 22222

// 用户需要支付的USDC数量
uint256 dy = new_y - y;  // dy = 22222 - 20000 = 2222

// 所以用户支付2222 USDC,获得1个ETH

嗯,这里要注意:实际合约里用的是定点数运算,不是整数除法。因为整数除法会丢失精度。Uniswap V2用的是 uint112uint112 来存储,配合一个精度修正机制。这个我们后面写合约时会详细讲。

总结一下今天的核心:

  • DEX是跑在链上的交易所,资产由你控制
  • AMM用数学公式代替订单簿,核心是流动性池
  • 恒定乘积公式 x*y=k 保证了交易前后池子乘积不变
  • 交易量越大,价格滑点越高

下一课,咱们会深入AMM的数学细节,推导出通用的定价公式,并开始写第一行Solidity代码。到时候你会看到,这个看似简单的公式,背后藏着多少精妙的设计。

今天就到这儿。有问题随时在群里问我。