前言:The best way to learn something is to teach others,Second best way to learn something is to do it yourself
中心化交易所和去中心化交易所的认识
本质区别(代币的管理方式)
- 钱(代币):在中心化交易所中是存储于交易所钱包中的,也就是说,中心化交易所类似现实世界中的银行为你保管钱财并未你提供金融相关的服务(欧易的中心化式的服务);
- 而去中心化交易所不保管钱(代币),钱(代币)由用户钱包自行保管,参与去中心化的金融服务需要有用户钱包接入(uniswap).
核心认识(交易的执行方式)
- 中心化交易所:用户进行交易时,会向交易所提交交易指令,由交易所进行交易撮合,并将成交后结果告知用户.除了充提币以外,整个交易过程全部是在交易所的服务器中完成,与区块链没有交互;
- 去中心化交易所:采用智能合约,而不必将其资金的控制权交给任何中介或托管人;
- 这是一种进步,人和机器的互动在交易方面的进步,我认为DEX的发展前景很大,不仅仅因为智能合约;任何只要能够改进金融的本质——交易的方式,我认为都有待思考之处
uinswapV1
简介(uniswap是什么?)
- 个人理解它是DEX的一种应用、一种目的是成为去中心化交易所的替代品的应用、一种不需要管理员、经营者或者其他有权限的人能够监视或者监听某些行为的应用;
自动做市商(AMM)
定义(何为AMM?)
- 抽象的来说,自动化做市商 AMM(Automated market maker) 是一个通用术语,包含不同的去中心化做市商算法;
- 也就是说类似恒定函数做市商(CFMM)、恒定乘积做市商(CPMM)或者恒定和做市商(CSMM)都是它的子集
对比理解AMM存在的意义
- 基于订单铺:用户可以在他们选择的限价或者市场价格上设置买卖订单;这和现实生活中很像,CEX平台订单铺的局限性在于中心化的方式可以能够知道某人花费了多少以及平台流通了多少,并不是纯粹的交易,想象如果我想保护自己的隐私,CEX最终能确保吗?
- 采用这种方式的DEX受到高Gas的限制(以太坊采用高吞吐量的Solana链缓解这种压力),但是订单铺的方式仍然受到半中心化之类的质疑
- 采用这种方式的DEX受到高Gas的限制(以太坊采用高吞吐量的Solana链缓解这种压力),但是订单铺的方式仍然受到半中心化之类的质疑
- 基于流动性池:采用与链上流动性资产池(想象一个水池中有两种不同的鱼,两种鱼的数量的乘积或者相加为一定值k,将两种鱼换成两种不同的Token)进行交互;通常,以钱包Provider的身份接入区块链,你的资产依旧掌握在自己手中,并且交易过程中保护了隐私.
流动性提供者(LP)
定义
- 所谓流动性性提供者,我们也可以叫做做市商(MM),以单个个体的角度来看,这是一个为交易提供流动性的实体对象(当新的Token上交易所的时候,流动性会成为发行方不得不考虑的方面;
- 往往发行方会鼓励LP将自己的代币放入池子,这样LP可以从提供的代币中获取流动性收益,相应的,池子变得流通起来)
增加流动性和移除流动性都是保持交易池中两个代币比例不变的操作
模型(恒定乘积公式做市商)
- 我们让x,y代表两个不同的token(在v1中有一个肯定是eth)的资产数量,两者的乘积保持一个恒定的值=>k,延伸=>用 Delta x 数量的token x 交换出 Delta y 数量的 token y:
- 所以得到Delta y的数量计算对应:
分析学习
需要明白的是,V1版本的Uniswap协议是采用Vyper语言进行开发的(而非Solidity,而Vyper和Python相似,但后续被Solidity取代.
基于Vyper实现的UniswapV1源码的解析:DeFi发展史:Uniswap V1 源码阅读和分析
Exchange合约(核心)(五个主要功能之一:流动性)
1 | addLiquidity(min_liquidity: uint256, max_tokens: uint256, deadline: timestamp) -> uint256; |
需要注意的点是,整个交易池是并发的,也就是说,在用户调用addLiquidty()
函数的时候池中由于池子中还是在流动,这会出现兑换比例的波动,所以脱离了单纯的按比例互换代币的说法,增加了min_liquidty(用户希望铸造的LP代币数量)、max_tokens(用户想要提供的最大代币数量)、deadline(交易大于该时间,执行回滚)字段进行“用户止损”
1 | removeLiquidity(amount: uint256, min_eth: uint256(wei), min_tokens: uint256, deadline: timestamp) -> (uint256(wei), uint256) |
Factory合约:采用工厂合约的设计模式,每个Exchange都可以被追踪
仿写一个UniswapV1(Solidity+Hardhat)
Jeiwan/zuniswap: UniswapV1 clone made in educational purposes
uniswapV2
简介
V2 was launched in March 2020 and it was a huge improvement of V1 that allowed direct swaps between any ERC20 tokens, as well as chained swaps between any pairs.
白皮书学习
-
交易对
- 理解:相比于V1版本只支持ERC20/ETH(注意创建交易池是使用的ETH,实际上交易池中的交易对是ERC20/WETH,这样说明是为了强调一种绑定关系),而V2版本允许流动性提供商为任意的两个ERC20代币创建交易对
那为什么V1只支持ERC20/ETh pair呢?1
2
3
4
5
6
7
81.V1中有一个方便快捷的交易路由查询功能,我们只需要在pairs中查询是否存在两个ERC20代币的地址是否存在就可以知道该交易对是否存在.
2.在V1中如果要使ERC20/ERC20存在,那么需要承受两次gas、即两次手续费(或者说两次滑点损失(109条消息)[ 深入分析AMM恒定乘积模型的滑点与无常损失_恒定乘积](https://blog.csdn.net/SierraW/article/details/118543720),因为我们使用A代币换ETH需要花费一次gas,而使用ETH换B代币又需要花费一次gas=>V2就是为了解决此问题!
- V2的解决了两次gas吗?如何解决?
```答案是肯定的,在V2版本中,需要创建交易对的A代币和B代币会在pairs中生成一个固定的地址,那么就可以很方便的查询到该交易对是否存在
比如在pairs中,A代币和B代币存在一个流动性交易池,B代币和C代币存在一个流动性交易池,我们如果知道这两个交易池的地址信息,我们既可以很容易的创建A代币和C代币的流动性交易池
- 理解:相比于V1版本只支持ERC20/ETH(注意创建交易池是使用的ETH,实际上交易池中的交易对是ERC20/WETH,这样说明是为了强调一种绑定关系),而V2版本允许流动性提供商为任意的两个ERC20代币创建交易对
Price Oracle(抗风险的价格预言机)
- 什么是区块链预言机 (zhihu.com)=>本质是一种中间件 功能同闪电贷异曲同工,无需抵押品,就可以借出uniswap中的流动性代币,只要在规定时间内完成后,将代币归还就可以完成一笔闪电兑换,同样的如果规定时间内没有归还,那么就会执行原子操作(回滚),使得借贷失效,借出的代币归还到流动池当中
1
2
3
4
5
6
7有一种比较极端的说法:任何能影响价格的因素,都存在套利和风险=>任何与价格有关的地方,都需要Oracle;在V1版本中,在一段时间内抬高ETH价格从而可以存在套利风险或者说使套利成功的安全案例是存在的,所以这种说法是有理可循的.[抵押品不足的贷款攻击](https://www.cnblogs.com/ACaiGarden/p/16073115.html)
V2的Price Oracle避免操纵攻击采取了一种Oracle延迟更新机制TWAP
原理:简单来说,就是用均价替代预言机的实时报价,通过市场的均衡价格的机制来使得攻击失效或者说削弱攻击;这里题外话,我觉得市场是一种抽象的真实的概念,是一种集体意识的表现,操纵市场的波动也终究取决于人,而如果有少部分人妄想摧毁这种集体意识那么市场本身也应该采取相应的保护措施(股市的熔断机制).
<br>
- Flash Swap(闪电交换)
类似在回调函数中拿到钱,然后执行回调函数中执行自己的事务,最后加上把钱还回去的逻辑?一个技术的细枝末梢的繁杂可能真的会超乎自己的想象,尤其是我在面临搜索出来的资源的时候,排除能力其实是占很大一部分,但是我又逐渐觉得这是一种必备的核心能力,如果想继续深入互联网世界的话.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- 合约代码(主要)(solidity)
- 我看的解析
[剖析DeFi交易产品之Uniswap:V2上篇 | 登链社区 | 区块链技术社区](https://learnblockchain.cn/article/2824)
[剖析DeFi交易产品之Uniswap:V2中篇 | 登链社区 | 区块链技术社区](https://learnblockchain.cn/article/3047)
[剖析DeFi交易产品之Uniswap:V2下篇 | 登链社区 | 区块链技术社区](https://learnblockchain.cn/article/3100)
<br>
- 拉代码自己解析Uniswap Labs https://github.com/uniswap
<br>
- 依旧是仿写Programming DeFi: Programming DeFi: Uniswap V2. Part 1 - Going the distance (jeiwan.net)
<br>
- 前端代码(不是特别会)
https://www.bilibili.com/video/BV1Uv411N7Ry?spm_id_from=333.999.0.0
- 题外
```
- 什么是区块链预言机 (zhihu.com)=>本质是一种中间件