DEX 也就是去中心化交易所,典型代表就是 Uniswap、Curve。对应的中心化交易所有币安、OKX 等。去中心化和中心化最核心的差别大家应该也都知道,中心化的交易所的交易是通过交易所的服务器来实现交易的,而去中心化的交易所则是通过运行在区块链上的智能合约交易的。

然而除了是否是去中心化以外,大部分 DEX 相比中心化交易所对比,还有一个巨大的差异,那就是他们撮合交易的方式也不同。中心化交易所撮合交易的方式和传统的股票交易类似,他们都是订单簿交易所。有人要卖,有人要卖,交易所在中间撮合。

但是这样的模式在 DEX 上就行不通了,为啥?因为这样消耗的 GAS 贵啊,效率也不高。想想看如果合约中要记录每个人的订单,然后去做撮合,中间得来来回回执行好多运算,另外有的代币可能流动性不高,能上中心化交易所的代币可能就没这个问题了,但是很多流动性较小的代币,可能还没法完成交易。

于是就发明了 AMM(自动化做市商,Automated Market Maker),可以做到不用匹配订单也可以实现交易。大家可能会好奇,这怎么做到的,交易通常就是有人卖才有人能买啊?没错 AMM 就是做到了没人卖你也可以买。接下来就具体展开讲讲 AMM 是如何做到这一点的。

AMM 是如何做的呢?没有订单如何交易呢?那就要引入一个概念 Liquidity Provider(LP),也就是流动性提供商。

简单一句话说:交易不再是通过订单匹配买卖双方交易,而是直接在 LP 提供的流动性池子中交易。

就比如说我作为 LP 在池子中放了 1 个 ETH 和 3000 个 USDT(当前市场价正好是 1 ETH = 3000 USDT),那你作为交易方就可以把 0.01 嗯 ETH 放进池子,然后拿出来 30 个 USDT。

这样池子里面就变成 0.99 个 ETH 和 3030 USDT 了,所以作为交易者你不需要等待,直接就能换。

但是价格怎么定呢?不能由 LP 来实时调整价格吧,这样行不通,价格应该是市场驱动的。那如何让市场的交易行为体现在架构上呢?这里就很巧妙了,其实核心就下面一个公式:

X * Y = K

其中 X 和 Y 是一个交易对(上面例子中就是 ETH 和 USDT)中两种代币的数量,K 是这两者相乘得到的值,我们要求交易者每次取出 X 存入 Y 或者存入 X 取出 Y(也就是发生了代币交换),但是 K 必须保持不变。

这样就能做到市场自动调节价格了吗?没错,我们继续看上面的例子。

1 * 3000 = 3000

0.99 * 3030 = 2999.7

K 从 3000 变成 2999.7 了,但是基本认为还是 3000。但是下一次再交换 ETH 的价格就不再是 3000 了,而是 3000 / 0.99 = 3030.3... 了,ETH 涨价了。这样是不是很合理,有人要换 ETH,ETH 变得稀缺,所以涨价了,下次要换 ETH 就需要更多的 USDT,只要保证池子中的 ETH * USDT 等于一个常量,这样自然就会此消彼长,当 ETH 变少时,你要通过 USDT 换取 ETH 时候就需要消耗更多 USDT,反之亦然。

Web3 新手系列:DEX 为啥不做订单匹配也能撮合交易

如上图,x * y = K 的曲线如上,当 x 越少,y 就越多,x 的价格就是 y/x 其实就是斜率,斜率越高,x 越贵。

当然上面的例子只是为了方便理解,实际上的价格并不是交易后才重新计算,而是当前交易造成的 x 和 y 的变化就会影响价格。这里会引出一个比较重要的概念,就是滑点。在上面的例子中,真实情况是,为了保证 K 不变,你买入 ETH 就会导致 ETH 价格上涨,而这个上涨在当前交易中就会体现,你会发现最终成交的价格和交易前看到的价格不一致,这就是滑点。当一个交易对流动性越大的时候滑点就越小,反正滑点越大。另外交易量越大,滑点也会越大。

除了滑点外,在真正的实现中还有很多细节要考虑,比如取整问题,手续费,跨池子交易问题等等。在这里就不展开了,如果感兴趣的同学可以阅读来自 ZAN 团队同学在开源社区贡献的https://github.com/WTFAcademy/WTF-Dapp/blob/main/P002_WhatIsUniswap/readme.md这篇解析 Uniswap 代码的文章具体了解。

相比 ERC20 或者 ERC721 这样的合约,涉及到金融的合约往往更为复杂,往往包含大量的复杂逻辑代码,这里推荐大家可以试用体验我们的ZANAI Scanhttps://zan.top/home/ai-scan?chInfo=ch_WZ)的合约审计服务。只需要输入合约地址就能快速对合约进行安全分析,查看与其相似的链上代码以及审计历史,还可以体验先进的形式化验证和 GPT 安全分析功能。

总的来说,基于智能合约可以做到不依赖中心化的服务进行交易,但是智能合约交易成本的考虑(主要是 gas)和交易效率的要求,使得订单薄不适用于它。于是有了 AMM,AMM 核心就是基于 X * Y = K 这个逻辑,于是需要 LP 来提供流动性。流动性提供方收取手续费,交易方基于流动性池子来交易。

本文由 ZAN Team(X 账号@zan_team) 的愚指导(X 账号@yudao1024)撰写。