最强Defi协议Uniswap原理分析

Uniswap是DeFi中最著名的协议之一,Uniswap本质是一个自动化做市商(AMM),它舍弃了传统订单薄的撮合方式,采用流动池加恒定乘积公式算法($x times y=k$)为不同加密资产提供即时报价和兑换服务。
什么是Uniswap
关于什么是Uniswap,先看一下Uniswap白皮书中的定义:
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.
Uniswap是一个基于以太坊的自动代币交换协议,它的设计目标是:易用性、gas高利用率、抗审查性和零抽租。
· ease-of-use(易用性):Token A换Token B,在Uniswap也只要发出一笔交易就能完成兑换,在其它交易所中可能需要发两笔交易:第一笔将Token A换成某种媒介货币,如ETH, DAI 等,然后再发第二笔交易换成Token B。

· gas efficiency(gas高利用率):在Uniswap上消耗的gas量是以太坊上的几家主流去中化交易所中最低的,也就代表在Uniswap交易要付的矿工费最少。 

· censorship resistance(抗审查性):抗审查性体现在Uniswap上架新Token没有门槛,任何人都能在Uniswap上架任何Token。这在去中心交易所中很少见,虽然大多数的去中心化交易所不会像中心化交易所那样向你收取上币费,但还是需要提交上币申请,通过审查后运营团队才会让你的Token可以在他们的交易所上交易。下面是各去中心化交易所上币规则的详情:
     · KyberSwap上币规则:https://developer.kyber.network/docs/Reserves-ListingProcess/
     · EtherDelta上币规则:https://steemit.com/cryptocurrency/@mindseye69/new-etherdelta-coin-listing-rules
     · IDEX上币规则:https://medium.com/@forrestwhaling/idex-token-listing-guidelines-eae00785fdd2
     · Uniswap上币规则:https://uniswap.org/docs/v1/frontend-integration/token-listing/
· zero rent extraction(零抽租):在Uniswap协议设计中,开发团队不会从交易中抽取费用,交易中的所有费用都归还给流动性提供者。
自动化做市商(AMM)
传统的交易所有一个订单薄(Order Book),订单薄上记录着买卖方向,数量和出价,交易所负责对买卖双方进行配对,一旦订单薄中最高价格低于或等于最低价格,就会促成交易,同时会产生一个新的成交价,传统交易所有以下特点:
· 市场上必须要有用户进行挂单,要有一定量的订单(市场流动)。
· 订单必须重叠才能成交,即买价高于或等于卖价。
· 需要将资产存储在交易所。

在订单薄模型市场中,买家期望用最低的价格买到想要的资产,而卖家则是期望用最高价格卖出同一项资产,如果交易要成立,买卖双方必须要在价格上达成共识,一是买家提高出价,而是卖家降低出价,如果双方都不要改变出价,这时候就要依靠做市商的参与,简单来说,做市商是一个促进交易的实体,它会在买卖两个方向上挂单,让想要交易的参与方只要跟做市商的订单撮合就能完成交易,而不需要等待对手方出现才能交易,极大的提高了市场的流动性。
为什么Uniswap不采用订单薄模型?
Uniswap部署在以太坊上,而以太坊每秒可以出来15笔左右的交易,这对于订单薄交易所来不可行,主要原因是:“订单薄模型依赖一个或多个外部做市商对某项资产一直不断的做市,而以太坊的TPS过低不支持做市商高频的交易,如果缺少了做市商,那么交易所的流动性立刻会降低,对于用户来说这样的交易所体验很差。”
Uniswap采用流动池加恒定乘法公式这种自动化做市商(AMM)模式实现了资产的交换,自动化做市商模式方式不需要买卖双方进行挂单,也不要买卖双方的订单重叠,可以进行自由买卖。
· 流动池:使用流动池来提供买卖双方交易,做市商只要把资金放入流动池即可
· 恒定乘法公式:按照流动池中Token的数量,自动计算买卖价格
流动池
流动池就是锁定在智能合约中所有的代币以及资金的总称,流动是资金转为代币,或代币转为资金的意思。
一个完整的流动池分为2个部份,分别表示不同的货币,成为一个交易对,在Uniswap V1中就是ETH及ERC20代币,在Uniswap V2中是支持不同ERC20代币直接交换,所以在Uniswap V2中的流动池可以允许两边是不相同的ERC20代币,其中ETH会自动转换成以WETH代币。为了简化,直接以ETH-ERC20交易对作为例子。
如下图所示,Uniswap将所有做市商的ETH集合在一起放在流动池左边, 将所有ERC20集合在一起放在流动池的右边。如果有用户要买ERC20代币,就从流动池的右边将ERC20代币转给用户,同时将用户支付的ETH添加的流动池的左边,然后重新计算流动池中的价格,等待下次交易。

Uniswap是无法自己变出钱来,因此需要依赖外部资金向合约中提供流动性,向Uniswap流动池中提供流动性的用户被称为流动性提供者,当流动性提供者向Uniswap中注入流动性的时候,Uniswap会铸造出一个流动性代币(LP),铸出LP代币数量是与用户注入的资金所占流动池中的资金比例相关,动性提供者可以选择在任何时间销毁自己持有的流动性代币。为了鼓励用于向Uniswap的流动池中提供更多的流动性,Uniswap会从每笔交易总额中抽取0.3%当成交易手续费,并将手续费全额交给那些将注资金到Uniswap资金池提供流动性的流动性提供者。
恒定乘积公式
假设在Uniswap中存在一个ETH-DAI交易对的流动池,用户在使用DAI与ETH兑换时需要一个方法来决定交易价格。
Uniswap定价模型非常简洁,它的核心思想是一个恒定乘积公式$x times y = k$ 。其中x和 y分别代表流动池中两种资产的数量,k是两种资产数量的乘积。
$x times y = k$的函数图像如下:

假设乘积k是一个固定不变的常量,当用户使用x资产从流动池中兑换y资产时,流动池中x资产的数量会增加,y资产的数量会减少。由于k是恒定的,所以当x增长$Delta X$ 时,需要将y减少$Delta Y$才能保持等式的恒定。
[(x+Delta X ) times (y – Delta Y) =k]
这里没有考虑到手续费的问题,如果要计算手续费的话,公式如下:
[(x+Delta X gamma) times (y – Delta Y) =k‘] [k’ gt k]
其中:$rho = 0.3% $,$gamma = 1- rho$
$Delta X gamma$表示扣除手续费后加入到流动池中的资产。由于在流动池中增加了手续费所以计算出来的k’会大于k,详细过程会在后面推导。
接下来会有一些数学公式的推导,为了方便理解,我们先对不含手续费的情况进行推导,包含手续费的推导过程放在最后。
不含手续费
交易价格计算
交易价格的计算分成两种:
· InputPrice:向流动池中放入$Delta X$个Token可以兑换出多少个$Delta Y$Token
· OutputPrice:从流动池中取出$Delta Y$个Token,需要向流动池中放入多少个$Delta X$Token
[x^{‘}=x+ Delta x =(1+ alpha)x= frac {1} {1 – beta} x] [y^{‘}=y- Delta y = frac {1} {1+alpha} y = (1 – beta)y] [xy=x’y’=k]
其中:$alpha = frac {Delta x} {x}$,$beta = frac {Delta y} {y}$
[Delta x= alpha x] [begin{aligned} {x’}&=(1+alpha)x=frac {1} {1-beta} x \ & implies 1+alpha=frac {1} {1-beta} \ & implies alpha=frac {beta} {1-beta} \ end{aligned}] [Delta x = frac {beta} {1 – beta} x tag{Output price}] [Delta y = frac {alpha} {1 + alpha} y tag{Input price}]
下面是Input price的函数图像:

从上图可以看出向流动池中注入的$Delta X$越多,可以从流动池中取出的$Delta Y$也会越多,但是$Delta Y$只会不断地逼近流动池中现有的$y$代币数量,并不会超过,也就是说你永远无法一次性买断流动池中所有的$y$。可以看出,恒等乘积公式可以提供无限的流动性,只要你想买就一定可以买到。
交易滑点
交易滑点是指:“在买卖$Token$时,实际支付的价格和期望的交易价格之间的差别,称为交易滑点”。
从流动池中购买$Delta Y$Token需要支付$Delta X$,所以本次购买的价格为:$P=frac {Delta X} {Delta Y}$
[P=frac {Delta X} {Delta Y} = frac {alpha x} {frac {alpha} {1 + alpha} y}= ({1 + alpha}){frac x y}] [{P’}=frac x y] [滑点=P-P’=(1+alpha){P’} -{P’}=alpha {P’}]
其中:${P’}=frac x y$表示当前流动池中的价格
从公式可以看出交易的滑点是与$alpha = frac {Delta X} x$成线性关系。
下图是滑点的函数图像:

滑点(偏离幅度)取决于$frac {Delta X} {x}$, 当资金池中$x$足够大时,滑点越小,资金池固定时,一个区块时间内净交易量越小,滑点越小,一个区块时间内的净交易量又与两个因素相关,一个是区块确认速度,一个是市场价格波动率,因此Uniswap恒定乘积做市的滑点与下面三个因素高度相关:
· 资金池的大小
· 区块确认速度
· 市场波动率
流动池币价
当从流动池中购买$Delta Y$代币后一定会引起当前流动池中的价格波动:
[P=frac {x’} {y’} = frac {(1+alpha)x} {frac {1} {1+alpha} y}= {(1+alpha)(1+alpha)} frac x y]
其中:$P$是购买$Delta$代币后流动池中的币价
从公式可以看出流动池中的币价与$alpha$成二次函数关系
下图是价格的函数图像:

当流动池中的价格与外部市场价格不一致时就会有套利者出现,套利者监控全球各家交易所的价格,一旦发现两家交易所存在价差,就会同时在两边低买高卖赚取中间差价。由于套利者的存在,才使得Uniswap币价不会与全球市场脱节。
· Uniswap中的价格高于外部市场时,套利者从外部市场低价买入Y ,然后高价卖给Uniswap
· Uniswap中的价格低于外部市场时,套利者从Uniswap低价买入Y,然后高价卖给外部市场
表格
对于不理解上面公式的同学,可以参考以下表格中的数据自己在excel中手动演算一遍,可以更直观的理解Uniswap的工作原理。

加入手续费的恒定乘积公式
以下过程是在计算手续费的情况下,将上面的公式重新推导了一遍。
计算交易价格

k除了在有交易手续费的情况会变大,还有一个情况也会使k值产生变化,当向流动池中增加流动性的时候k会变大,当从流动池中取回流动资金时k会变小。具体变化比例可以参考Uniswap白皮书,这里就不做推导了。

流动池收益与风险
在Uniswap中流动性提供者的收益主要来自于交易抽成,Uniswap会从每笔交易中抽取0.3%的手续费,并将手续费按流动性提供者所占流动池的比例分配给流动性提供者。
impermanent loss
向Uniswap中提供流动性的人会发现一个现象:“目前在流动池中资金的价值比放入流动池之前的资金价值少了,也就是资金缩水了”,这种现象被称为“impermanent loss”,impermanent loss中文翻译成“无常损失”,简单来说impermanent loss是指你将加密货币放入uniswap中赚取的收益与你将加密货币放入钱包中的收益之间的差,公式为:$L={profit}{lp}- {profit}{hodl}$
hodl指不看币价涨跌长期持有某种加密货币(hold on for dear life)
impermanent loss通常是由于流动池中的价格发生波动引起的,下面看一个例子:

可以看出价格从100变成120后我们的资金只有之前的99.59%,损失了4%左右。只要这时候我们不将资金从流动池中取出,一旦流动池中的币价回到100时,我们是没有损失的,这是为什么叫impermanent loss无常损失的原因。
下图演示impermanant loss的比率与当前价格变化的关系,O列表示资金刚放入流动池的情况,O->H表示价格上涨时impermanent loss的变化,A<-O表示价格下跌时impermanent loss的变化。

下图是根据上面数据画出的函数图像,蓝色的曲线是不包含手续费的,黄色的图像包含手续费,红色的线条是我手动添加上去的为了方便说明。
先看蓝色曲线,当不计算手续费收益的情况下,无论币价上涨或下跌,流动性提供者100%会有损失。
再看黄色的曲线,由于黄色曲线是计算手续费收益的,所以只要币价在一个范围内波动,流动性提供者可以稳赚手续费收益。

由此可以得出一个结论要介绍impermanent loss对流动性提供者的影响,可以为两个币价之间波动小的流动池提供流动性。

· mean-reverting pairs:均值回归的交易对,比如稳定币交易对两者波动是最小的,可以最大程度减少impermanent loss
· correlated pairs:有正相关性的交易对,例如ETH/ZRX,这两个币的波动方向基本上是一致的,同涨同跌,两者之间的相对波动小
· Uncorrelated pairs:非相关性的交易对,如ETH/DAI,为这种交易对提供流动性,赚取的交易费有可能会覆盖impermanent loss
· Inverse correlated pairs:负相关的交易对,是最危险的,他们之间波动方向相反,两者之间的相对波动范围最大。
下面是计算impermanent loss的公式

总结
优点
完全去中心化,不依赖第三方,任何人都可以基于uniswap构建自己的应用
可以自由地创建任何ERC20交易对
与其他去中心化交易所相比gas费用更低
任何人都可以向uniswap流动池中提供流动性,人人都可以是做市商
缺点
需要依赖套利者去平衡uniswap与外部交易所之间的汇率
对大户不友好,进行大额的交易会造成很大的滑点


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260