# 深聊Uniswap（v2）

By [德根L](https://paragraph.com/@l-4) · 2022-11-30

---

金融是货币资金融通的总称，主要是指与货币流通和银行相关的各种活动（百度百科）

在链下的世界里，掌握金融命脉的是政府和政府管理下的中央银行。尽管有来自市场先生的调控，再加上每个有金融市场的国家都有一套相对成熟的金融市场监管体系，但当危机发生时，我们都会知道谁才是最有Power那个角色-----政府。

当货币被密码学带到区块链上，这意味着金融也被带到了区块链上。密码学和互联网技术给予大众在一定程度上探索代码取代法律法规（政府）的可能性，即Code is law的可能性。

为什么要研究Uniswap协议（代币UNI）?
-----------------------

如果把各条链比作不同的国家，以太坊必然是一个综合实力排名最靠前的国家，那么我认为Uniswap就是这个国家上最大的“证券”交易所，它承载着以太坊上大量token的流动性，满足了大量用户买卖ERC20代币的需求。

![](https://storage.googleapis.com/papyrus_images/b5c7b5afece75b6b5645288514f0f2ebc55a32d10a6583bbafa95e25092ea5d1.png)

这篇文章从哪几个角度去研究Uniswap？
---------------------

写Uniswap的文章已经有很多，本文主要从用户需求，Uniswap v2 AMM实现原理，以及激励机制去学习和讨论。

什么是Uniswap协议？
-------------

Uniswap是一个开源的，去中心化的，用于在以太坊上提交流动和交易ERC20代币，也即是我们常说的去中心化交易所（DEX）

Uniswap解决了什么问题？满足了用户什么需求？
-------------------------

### 中心化交易所的弊端：用户资产不安全

中心化交易所（CEX）相较于去中心化交易所，流动性好，而且更容易上手，交互更人性化，出入金更方便，再加上部分交易所经常搞活动比如IEO，理财，所以中心化交易所在这个圈子里拥有大量的用户和交易量。并且绝大部分用户习惯把自己的token存放在交易所里。

但中心化交易所存在一个经常为人诟病的问题，就是资产负债不透明。现在这个圈子缺乏监管，资产负债不透明就容易会催生徇私舞弊的行为，最典型的莫过于挪用用户资产，这次FTX爆雷的导火线是SBF在今年年中挪用41亿美元用户资产去救Almeda Research。

我们知道token的所有权是归属于钱包私钥的所有者(Not your key, Not your coin)当我们把token转移到中心化交易所那一刻开始，由于缺乏监管，你的token资产本质上已经是属于交易所，你的资产能拿回来的前提是这个交易所不作恶。对于交易所来说，token币价就只是一个数字，对于那些市值较小的山寨币更是如此，这就是为什么某些交易所在代币还没发行就可以开盘给用户参与买卖。

### Uniswap如何解决用户交易token和资产不安全的问题？

资产安全问题

首先Uniswap并不需要像中心化交易所那样需要用户先把token充值到平台再进行交易，Uniswap在执行用户交易行为之前，用户的token一直存放在自己的钱包中比如Metamask，Tokenpocket。除非用户泄露自己钱包的私钥或钱包被黑，否则token在钱包里都是安全的。

交易

一笔token的买与卖需要有买家和卖家，若这笔交易发生在中心化交易所里，交易所充当中介的形式撮合交易并收取手续费。交易所一般使用中央订单簿的形式撮合买家和卖家的交易，因此就有了做市商的存在（Wintermute/Almeda Research），具体见下图。

![图片来源，知乎用户JasonW](https://storage.googleapis.com/papyrus_images/7d75345b5ed6b1f7e4844b8b62c7df19c84c2b4fd9908a8c45b0160eacc0f2c4.png)

图片来源，知乎用户JasonW

在Uniswap里没有中央服务器，没有订单簿，它使用一个叫自动化做市商的东西（下称AMM）来撮合用户的交易。下文将会详细讨论Uniswap的AMM机制。

**因此Uniswap为区块链用户提供了一个去中心化的，安全的，用来交易ERC20 token的场所，满足人们交易token且钱包资产的安全得以保障的需求。**

Uniswap AMM实现原理
---------------

Uniswap的流动性池是通过一个公式来计算价格的，我们称这个公式为恒定乘积公式：

x \* y = k，k是常数（一个数值不变的常量）

### 在讨论这个公式之前，需要先理解以下几个概念：

*   **流动性**：由两种token组合而成，比如token1和token2组称一对（pair），注意这里组合成pair以后，pair是一种ERC20的token
    
*   **流动性池（Pool）**：流动性汇集的池子，即AMM的资产池
    
*   **流动性提供者**：向流动性池中提供流动性的人，称为Liquidity Provider/LP
    
*   **流动性代币（Pool Token也叫做Liquidity Token）**：UniswapV2里的Pair是一种ERC20的token，是LP提供/提取流动性的一种“凭证”，在LP提供流动性时自动生成代币给LP，在LP提取流动性时燃烧LP的代币
    
*   **流动性池份额（Liquidity Pool Share/LPS）**：通过计算得到的，用来记录每个LP的流动性贡献比例
    

### 建立流动性池子和Token兑换的流程

在部署好一个流动性池的合约以后，比如token1和token2这一pair，然后需要有流动性提供者LP向池子里放入一定量的代币去启动流动性池，这时候LP会获得流动性代币Pool Token。第一个LP能设定这个流动性池的初始金额，并且拥有100%的LPS。在完成上述流程后，流动性池就拥有了流动性，可以开始供trader兑换代币，流程示意图参考下图：

![图片来源，Uniswap官网](https://storage.googleapis.com/papyrus_images/bff4046264641695a20dfc944ebee137963ed9c00f885885a652dc59c0847c1e.png)

图片来源，Uniswap官网

### x \* y = k计算token兑换价格

Token兑换时的价格是通过公式x \* y = k（k是常数）计算得来的

x和y分别代表流动性池里两种token的数量，**两种代币的总价值需要相同，假设现在一个ETH的价格是1000 USDT，那么建立流动性池的时候需要比如5ETH - 5000USDT（其他稳定币也可以）或者 10ETH - 10000USDT**

从公式可以看出兑换token的价格是由x和y两种token的数量来决定的

x代表token1的数量，即reserve1

y代表token2的数量，即reserve2

由于k是常数，

如果增加reserve1，那必须要减少reserve2

如果增加reserve2，那必须要减少reserve1

举一个具体的例子：

假设ETH的价格为1ETH=1000USDT，由于两种代币的总价值需要相同

x=流动性池ETH数量=5ETH

y=流动性池USDT数量=5000USDT

k=x \* y

k=5\*5000

k=25000

现在有人要从该流动性池子中买入（抽走）1个ETH

x=流动性池ETH数量

x=5-1

x=4ETH

由于k保持不变

y=k/x

y=25000/4

y=6250

那么这个人需要支付的USDT为

6250-5000=1250USDT

抛开交易手续费不谈，1ETH=1000USDT，但在这个流动性池里购买1ETH需要支付1250USDT，这就是我们常说的交易滑点（slippage）。但一般来说流动性池越大，兑换token的数量相对流动性池越小，交易滑点就越小。

还是用上面的例子，但现在流动性池变成：x=500ETH，y=500000USDT

k=x \* y

k=500\*500000

k=250,000,000

现在也有人要从该流动性池子中买入（抽走）1个ETH

x=流动性池ETH数量

x=500-1

x=499ETH

由于k保持不变

y=k/x

y=250,000,000/499

y=501,002

那么这个人需要支付的USDT为

501002-500000=1002USDT

抛开手续费，在这个相对更大的流动性里交易1ETH，交易滑点为2USDT，比上一笔交易里的250USDT的滑点明显要小得多。

但一个流动性池里通常有不止一个人在进行token的兑换，也就是说交易滑点一直处于一个动态的变化，而流动性池越小，交易滑点变化的波动越大。如下图，在一个token兑换者（Trader）的视角下，一笔交易进行完毕，流动性池里的token的价格是变化的。

![图片来源，Uniswap官网](https://storage.googleapis.com/papyrus_images/0728655220b10841a876e536aa19950ceedd03745898e01b7462db769c3e4846.png)

图片来源，Uniswap官网

激励机制
----

用查理芒格的话来说，一个人的决策是由这个人的激励机制决定的，也就是他在《穷查理宝典》提到的**奖励和惩罚超级反应倾向。**

站在token兑换者Trader的角度，因为Uniswap满足了用户对资产安全的追求和交换ERC20 token的需求，所以会有人来使用它。如果情况允许，没有人会愿意冒着资产会被挪用的风险去使用一个平台来交易代币。

站在Uniswap中流动性提供者的角度，那是什么吸引着他们去建立流动性池或在流动性池里添加代币？

**在Uniswap v2，token兑换者在交易的过程中，协议会提取交易token数量的0.3%作为交易费用，并把这些交易费用放回到流动性池子中，用来奖励那些流动性提供者。提供越多流动性的流动性提供者，所拥有的流动性代币就越多（Pool token），即代表所拥有的流动性池份额越大（LPS），所以最后能获得的交易费用奖励就越多。**

流动性提供者LP一般有三个主要群体：被动性流动性提供者，项目方，专业做市商

被动性流动性提供者：为了赚取被动收入的token持有者

项目方：他们添加流动性是为了方便Trader进行买卖，也就是俗称的项目方加池子

专业做市商：完成他们做市任务的一种策略

Uniswap（v2）的缺点
--------------

Uniswap v2的一个优点是通过激励机制集中了许多流动性，**但缺点是流动性的使用效率比较低**。在v2中，x \* y = k这条公式，并没有特别限定x和y的范围，那么x和y的数量可以趋向于0或者无穷大，即说明x和y代表的两种token的价格也可以趋向0或者无穷大，但实际情况是：在一定的时间里，某个代币的价格会在一个区间里波动，因此导致了LP提供的流动性中有一部分是处于休眠状态的（如下图），无法为LP赚取交易费用。

![图片来源，Uniswap官网](https://storage.googleapis.com/papyrus_images/0d549a7658aaded72d24ce3e6514210a650d4c3deedb860b04c4210f790bbafa.png)

图片来源，Uniswap官网

在Uniswap v3中，项目方增加了一个集中流动性（流动性区间）的概念来解决这个问题。这个以后咱们再另外写一篇来介绍。

以上

> 推特:@degenll
> 
> 微博:我是德根L

本文章参考文献:

文章基本都是自己码的，内容如有侵权请联系我删除。

---

*Originally published on [德根L](https://paragraph.com/@l-4/uniswap-v2)*
