作为Defi领域现象级产品,Uniswap在DEX领域稳居第一的宝座。那么Uniswap是什么,从何而来,有哪些技术特点,给Defi领域带来了什么,笔者带着这些问题收集了一些资料,开始一点点学习和理解Uniswap协议。
一切为了交易
在理解Uniswap之前,还是需要来谈一谈传统的交易。当某个人已经持有某种资产,他想要出让一部分自己的资产从而换取另一种资产时,交易的需求就产生了。无论是传统的中心化交易平台,还是随着数字加密技术火爆起来的去中心化交易平台,其本质都是服务于人们的交易需求,只是其实现方式和所用的技术有所不同。
传统交易平台
首先来看在中心化交易平台上,人们是如何进行交易的。
Alice想要买入一种资产,出价100,在中心化交易平台上挂出价格为100的买单,此时交易平台会查询是否已经有人在平台上挂出过此资产的卖单,如果有的话,价格是否匹配。若有匹配的卖单,则会促成Alice的买入交易,若没有匹配的卖单,就会先记录下Alice的买单信息,直到有匹配的卖单出现。
如果这个交易平台上的买卖活动并不活跃,买卖双方将无法快速完成交易,整个平台的交易效率就变得非常低,此时就出现了做市商。 做市商的定义如下:
做市商是指在证券市场上,由具备一定实力和信誉的独立证券经营法人作为特许交易商,不断向公众投资者报出某些特定证券的买卖价格(即双向报价),并在该价位上接受公众投资者的买卖要求,以其自由资金和证券与投资者进行证券交易。买卖双方不需等待交易对手出现,只要有做市商出面承担交易对手方即可达成交易。
做市商通过做市制度来维持市场的流动性,满足公众投资者的投资需求。做市商通过买卖报价的适当差额来补偿所提供服务的成本费用,并实现一定的利润。
总结来说,一个有效的、基本的中心化交易平台,需要有如上图所示的参与者。如果想把这种模式改为去中心化的模式,那就需要依赖区块链技术,靠智能合约完成自动的交易撮合。如何实现这个过程呢?我们来看一下Uniswap的做法。
Uniswap
The Uniswap Protocol: A suite of persistent, non-upgradable smart contracts that together create an automated market maker, a protocol that facilitates peer-to-peer market making and swapping of ERC-20 tokens on the Ethereum blockchain.
这是Uniswap协议的官方定义,它一个用来在以太坊区块链上交易加密货币(ERC-20代币)的点对合约系统。通过持久化、不可更改的智能合约集合来实现自动做市商(AMM)。对应到传统中心化交易平台上,可以理解为Uniswap直接把交易平台的“订单簿”和做市商的撮合交易功能都实现了。
但Uniswap协议的设计结构体系与传统数字资产交易所中的交易模型不同。大多数传统交易所都是通过维护一个“订单簿”,来匹配一种数字资产的买卖双方。Uniswap则是通过智能合约来实现做市商的功能,它需要流动性提供者(liquidity provider)将持有的资产存入智能合约,Uniswap利用这个储备金的流动性来实现协议上的数字资产交易兑换。
如何通过Uniswap完成数字货币的自动交易
1. 任何人使用Uniswap的工厂合约在链上部署某种Token的交易合约。
exchangeTemplate: public(address)
token_to_exchange: address[address]
exchange_to_token: address[address]
@public
def __init__(template: address):
self.exchangeTemplate = template
@public
def createExchange(token: address) -> address:
assert self.token_to_exchange[token] == ZERO_ADDRESS
new_exchange: address = create_with_code_of(self.exchangeTemplate)
self.token_to_exchange[token] = new_exchange
self.exchange_to_token[new_exchange] = token
return new_exchange
2. 注入流动性
仅有exchange合约还是不够的,因为uniswap的设计模式是利用储备金流动性来实现协议上的数字资产交易兑换。所有的资金兑换交易都要满足一个大前提:
x * y = k
创建完某代币的交易合约后,任何用户都可以为其注入流动性,注入流动性的人可以被称作LP,即流动性提供者。提供流动性的过程,简单来说就是把两种币按一定的比例投入到智能合约中。
在Uniswap v1版本中,只支持ETH和一种ERC20代币的兑换。在这个恒定乘积公式中,用x代表流动池中ETH的量,y代表流动池中ERC20代币量。无论用户是想要进行ETH到ERC20代币的兑换,还是要进行ERC20到ETH的兑换,汇率的波动、兑换金额的多少,都将服从于此恒定乘积公式。
3. Swap过程
举一个具体的例子来说明代币的兑换过程:
假设已经存在TokenA和ETH的交易合约,LP已经根据TokenA在市场上的流通价值,为其在此合约注入了流动性,向资金池中质押了10000个TokenA和100个ETH。
此时,Tom想获得大约100个TokenA,他拿1个ETH发起了Swap操作。
我们可以看到质押资金池中TokenA和ETH的比例是100:1,那么LP对TokenA的价格就锚定在1个TokenA等于0.01个ETH的价格上,Tom想用1个ETH换取100个TokenA是合理的。
根据恒定乘积公式:
k=x * y=100* 10000=1000000
按照Uniswap的协议规定,每笔swap操作都要交0.3%的手续费,Tom此时想获得大约100个TokenA,他拿1个ETH发起了Swap操作。
首先,每笔交易要先交手续费:
fee: 1ETH * 0.3% = 0.003
扣除手续费后,实际加入到流动性资金池的资金是:
1-0.003=0.997 ETH
为了维持恒定乘积,加入的ETH的数量x’和将要提走的TokenA数量y’需要满足:
(x+x')*(y-y')=k
(100+0.997)*(10000-y')=1000000
可以计算出:y’=98.72
即Tom此次Swap可以得到98.72个TokenA,比他原本想获得的100个要少,因此,如果Tom想要获得精准的TokenA数量,需要提前进行估算。然而在Uniswap v1版本中,普通参与者先进行估算再进行swap操作可能也无法获得准确的代币数量。这是因为流动资金池有波动性,当然也和Uniswap v1版本自身的问题有关。
Uniswap v1的局限性
Uniswap V1是2018年Uniswap Lab推出的第一版协议,主要贡献是证明了通过智能合约质押代币的方式实现AMM的可行性。但是,在应用方面此版本存在着一些问题,比如受制于以太坊的交易速度、流动性受限、存在价格被操控的问题等,这些问题在之后的版本中有针对性解决方案,后面将继续进行Uniswap系列的学习,看看这些问题是如何被解决的。