Uniswap 设计结构
(1)Uniswap 两大核心智能合约
交易合约
一个交易合约支持一种 ERC20 代币,每一个交易合约都储备持有一定量的 ETH 以及支持的这种 ERC20 代币。
工厂合约
工厂合约可用于部署新的交易合约,因此,任何还没有在 Uniswap 上面有交易合约的 ERC20 代币,都可以使用工厂合约来部署一个交易合约。任何以太坊的用户都可以通过‘createExchange()’函数实现这一点。工厂合约扮演了 Uniswap 中交易合约“注册中心”的角色,工厂合约可以用来查找所有已经被添加进 Uniswap 系统里面 ERC20 代币和交易地址。
(2)Uniswap 交易类型
ETH ⇄ ERC20 交易
ERC20 ⇄ ERC20 交易
交易汇率是由 Uniswap 的恒定乘积公式来决定的:ETH 池 * token 池 = 恒定乘积值
在 Uniswap 上执行任何交易,此恒定乘积值都保持不变。只有当此交易合约中的流动性池发生变化的时候,此恒定乘积值才会发生变化。
(3)Uniswap 交易流程
1. 恒定乘积公式
Uniswap 遵循的是 AMM(Automated Market Maker,自动化做市机制),AMM 机制由算法构成,Uniswap 的机制是恒定乘积:
图示公式:
x * y = k
k 表示一个不变的常数
x 和 y 表示特定交易对中 ETH 和 ERC20 代币的可用数量。
使用此公式,如果以 Uniswap 中的交易合约举例,则代表该交易合约储备有 x 数量的 A 代币和 y 数量的 B 代币。这个合约将始终保持乘积恒定,也就是说 x * y 得到的 k 值不变。任何人都可以通过有效改变做市商在 x* y 曲线上的位置来进行买入或者卖出代币。横轴代表卖出的 A 代币的数量,纵轴代表买入的 B 代币的数量。
2. 流程举例
流动性提供者一共存了 10ETH 和 500BAT 到交易合约中,因此,基础的恒定乘积值为: 500 * 10 = 5000
⬇
路人甲想要发起交易来用自己的 1 个 ETH 兑换成代币 BAT,此时,交易金额的 0.3%也就是 0.003ETH 将被扣除作为给流动性提供者的报酬。剩余的 0.997ETH 则被添加到了 ETH 池里面。
⬇
根据公式,恒定乘积值不变,还是 5000,除以 ETH 池中新的 ETH 数量,来得到 BAT 池中应该有的数量,那么多出来的 BAT 就是路人甲兑换的数量
计算过程:
ETH 池 = 10 (1–0.003) = 10.997
BAT 池 = 5000/10.997 = 454.67
Bob 将兑换得到 : 500–454.67 = 45.33 BAT
兑换交易结束后,路人甲发起交易的手续费 0.003 ETH 将会加回到 ETH 流动池里面,因此在交易合约上每执行一次交易,恒定乘积值就会增加一点。
计算过程:
ETH 池 = 10.997 0.003 = 11
BAT 池 = 454.67
新的恒定乘积值 = 5,001.37
在这次交易中,路人甲兑换的汇率为 45.33 BAT/ETH
计算过程:
1 ETH 入
45.33 BAT 出
汇率 = 45.33 BAT/ETH
本次交易,流动性提供者获得报酬 0.003 ETH,使得流动性提供者为交易合约提供流动性这件事儿,成为一种有利可图的行为,会吸引更多其他人加入。
三、Uniswap V2 新特性
(1)多智能合约组成
包括 Factory 、Router V2、Pair 和 Pari ERC20,还有一个负责功能的 Library 。
(2)闪电互换
从 Uniswap 流动性池中 “借出” 代币、用于与任意的外部服务交互、然后 还清 的初始贷款,所有操作都要放在一笔交易内,并且这样的交易是原子化的,意思是说,交易中的任何一个操作失败,都是导致整笔交易失败、被改动的状态完全回复。
(3)去除 ETH 作为中介代币
Pari ERC20,还有一个负责功能的 Library 。
(2)闪电互换
从 Uniswap 流动性池中 “借出” 代币、用于与任意的外部服务交互、然后 还清 的初始贷款,所有操作都要放在一笔交易内,并且这样的交易是原子化的,意思是说,交易中的任何一个操作失败,都是导致整笔交易失败、被改动的状态完全回复。
(3)去除 ETH 作为中介代币
移除这个硬性要求可以减少一半的交易数量,也能节约交易的 Gas 费。