DeFi:Uniswap v1协议原理分析

1,039 阅读7分钟

一.什么是uniswap?

关于什么是uniswap,可以看uniswap v1的白皮书中定义:

Uniswap is a protocol for automated token exchange on Ethereum. It is designed around ease-of-use, gas efficiency, censorship resistance, and zero rent extraction.It is useful for traders and functions particularily well as a component of other smart contracts which require guaranteed on-chain liquidity.

Uniswap 是一个基于以太坊的自动代币交易协议。它的设计目标是更易用,gas 高利用率,限制审查和无手续费抽成。

Uniswap 的一个重要特性是利用一个工厂-注册合约来为每个 ERC20 代币部署一个独立的交易合约。这些交易合约同时持有 ETH 和他们关联的 ERC20 代币构成的准备金。这可以实现两个基于相关供应的交易对之间的交易。交易合约被注册串联在一起,从而可以以 ETH 作为媒介实现 ERC20 代币之间的互相交易。

二.运作原理

1.AMM VS Order Book

自动化做市商(AMM)是一种用于在去中心化金融 (DeFi) 中提供流动性的工具。通过智能合约来实现做市商的功能,流动性提供者(liquidity provider)将持有的两种资产放入流动池,合约按预先设计的规则与买卖双方完成交易,并将交易手续费支付给流动性提供者。

在AMM没有兴起之前,大部分传统金融使用订单簿模式(order book),传统的交易平台使人们能够为买卖资产提供不同的价格。 一段时间后,其他用户选择他们同意的列出价格。该价格续成为资产的市场价格。

传统的做市过程需要专业的做市商来处理大量订单。 因此,他们会把可以交易的数量给出报价。 他们在报出最优惠价格的频率方面受到限制。这需要在交易时间内持续使用一组强大的参数,以便他们可以从自己的库存中快速销售。

大多数资产目前仍依赖于AMM。证券和房地产通常以这种方式进行交易。AMM 提供了一种适用于 DeFi 新颖的替代方案。

2.角色类型

VUG21J6[YUS4BMYX]4N50.png

在uniswap中,一般由两种类型角色组成,分别是流动性提供者,交易者。

  • 流动性提供者(liquidity provider)

Uniswap可以为任何两个ERC20代币提供交换服务,但是必须有人提供流动性。

任何用户都可以将两种等值代币(ETH和erc20代币)按照一个比例投入流动池中,并获得一个流动性证明,即LPLP可以获得trader的交易金额的0.3%的手续费,用于鼓励更多的LP加入,以增强池中的流动性。

  • 交易者(trader)

Uniswap有以下几类交易者:

1.DAPP用户在Uniswap上购买代币,用于以太坊上的其他应用程序。

2.投机者使用各种社区构建的工具和产品,使用Uniswap协议提取的流动性来交换代币。

3.套利机器人通过比较不同平台的价格来寻求利润,以找到优势。(虽然这看起来很滑稽,但这些机器人实际上有助于在更广泛的以太坊市场上平衡价格,并保持公平。)

不管在什么情况下,trader都需要给协议交易固定的费用。

3.流动性代币

在Uniswap中每一种代币对只能存在一个流动性池, 添加流动性时,合约为流动性提供者铸造流动性代币。LP持有多少流动性代币,就表示LP为流动性池贡献了多少份额,也表示LP享有流动性池多少权益。流动性代币是高度可分离,可以在任何时候销毁。

三.uniswap算法原理

每个交易所合约都会和一个ERC-20代币相关,并带有一个ETH和这个代币的流动池。该流动性池是由恒定乘积公式支持。什么是恒定乘积公式?

  • 恒定乘积公式:x * y = k

xeth_pool(ETH数量), ytoken_pool(代币数量), k是不变量(只有当池中的流动性变化时k才会发生变化)

CDD43B3D3B8EF3373731A66418C0C72B.jpg

假设流动性提供者向池中放10个ETH和100个WETH,则K = 10 * 100 = 1000。 若此时一位交易者发送一些 ETH到合约中,为了维护K值不变,池中的WETH将减少相应的比例,而WETH减少的数量就是交易者交易获得的数量。

由上图可以看出,要想保证K 不变,其中一个代币数量增加,另外一个代币数量将减少,且数量少的代币其价值将上升。

  • ETH ——> OMG

流动性提供者将10个ETH和500个OMG(ERC20)投入到智能合约中,不变量K=eth_pool * OMG_pool

ETH_pool(ETH 资金池) = 10

OMG_pool(OMG 资金池) = 500

K(不变量) = 10 * 500 = 5000

OMG购买者发送1ETH到合约中,假设其中0.25%的手续费会交给流动性提供者,剩下0.9975ETH会被放入ETH_pool中,用不变量K的结果除以新增后的ETH数量,得到新的OMG_pool的代币数量,将原来OMG_pool中的代币数量减去新的OMG_pool的差值会发送给购买者。

4AA7CE9421214C4F69AC7CAF107D64D8.jpg

由于手续费会在计算后被添加到资金池中,所以不变量K会随着每次交易稍微变大,为流动性提供者提供系统性盈利。故此,不变量表示的是上次交易结束后ETH_pool(ETH 资金池) * OMG_pool(OMG 资金池)的值。

ETH_pool(ETH 资金池) = 10.9975 + 0.0025 = 11

OMG_pool(OMG 资金池) = 454.65

K(新的不变量) = 11 * 454.65 = 5,001.15

在这个示例中,购买者接受的兑换比率是 45.35 OMG / 1 ETH。然而价格已经发生了变动。如果另一个购买者做了同样方向的交易,他将会得到一个稍微差一些的 OMG/ETH 兑换比率。可是如果一个购买者做了一个反向的交易,他则会得到一个稍微好一些的 ETH/OMG 兑换比率,即用更少的OMG代币数量换取相同的ETH。

W(TO2{LY~IP0N0%ZDG@0{FK.png

四.Uniswap v1 现状

1. Uniswap自动化做市商优势

为Uniswap的资金池提供100ETH以及100GT代币,且此时两者的价值比为1:1。当有交易者从这个池子中购买10枚OMG,此时池子里还剩100枚ETH和90枚OMG。由于恒定乘积10000是不变的,通过用乘积10000除以90OMG得出111.11ETH,而池子本身只有100枚ETH。说明当我再次购买10枚OMG,需要付出11.11枚ETH,即ETHOMG的价格比变成了1:1.11,OMG的价格由1ETH涨到了1.11ETH。

当越来越多的交易者参与做市后,资金池中的代币也会随之增加,而随着交易产生的价格变化幅度也会越来越小,交易的成本也会随之降低。通过自动做市商,加密货币的买卖成交效率更高,这种模式也逐渐成为了去中心化交易所的主流。

2.Uniswap v1存在的问题

  • 不支持币币交易(ERC20对ERC20),导致了当交易者需要将代币A换成代币B时,中间还需要买入卖出ETH并支付两笔交易费和gas费,成本高昂。

  • 不支持链式的兑换,例如:ETH-Goge-USDT-DAI 这种。作为一个DEX,v1也没有提供价格预言的机制。这些问题在v2版本都已经解决了。后面会逐步介绍。

由于uniswap v1的合约代码是用Vyper语言写的(语法结构类似于Python)这里就不做源码分析了,在后续的Uniswap v2介绍,会进行源码分析。

参考文章:什么是自动化做市商(AMM)

参考文章:Uniswap 白皮书

参考文章:Uniswap 官方文档