Uniswap

Web3相关知识总结


Uniswap V2

Uniswap V2是什么

  • Uniswap V2 是一个在以太坊上交换 ERC-20 代币的协议。它消除了信任的中介和不必要的租金提取方式,从而实现了快速、高效的交易。以下是关于 Uniswap V2 的一些要点:交换代币:Uniswap V2 允许用户在以太坊上交换任何 ERC-20 代币与其他 ERC-20 代币。去中心化:它是一个去中心化的交易所,不需要中央机构进行撮合。新功能:Uniswap V2 引入了新功能,如价格预言机、闪电交易和核心/辅助架构,旨在更加去中心化、可持续和抗操纵。
  • 是一个运行在以太坊区块链上的基于"恒定乘积"算法的"自动化流动性"协议,我们可以将其看做是一个建立在以太坊上的去中心化数字货币交易所(DEX),在该交易所上的所有交易(代币互换)都由智能合约来执行且免信任。 code点击详情

交换原理

ERC-20 Pairs:Uniswap v1使用ETH作为过渡货币,每对都将ETH作为其资产之一,例如使用TokenA换TokenB时,需要先使用TokenA来换取ETH,之后再通过ETH来换取TokenB,这虽然减少了流动性的分散,但是该规则对流动性提供者施加了巨大的成本,所有流动性提供者都需要具备和ETH进行互换的接口同时流动性提供者所持有的资产相对于ETH的价格变化而变化有可能带来巨大损失。当两个资产ABC和XYZ相关时(例如,如果它们都是美元稳定币),Uniswap对上的流动性提供者ABC/XYZ所承受的永久损失通常会比ABC/ETH或XYZ/ETH对更少,同时使用ETH作为强制性过渡货币也会给交易者带来成本,交易者必须支付的费用是直接购买ABC/XYZ对的费用的两倍,并且遭受两次滑点,而Uniswap v2允许流动性提供者为任意两个ERC-20创建交易对合约,任意ERC-20之间的线路数量激增可能会更难找到交易特定资产线路的最佳路径,但是路由可以在更高的层上处理(通过链外或链上路由器或聚合器))。

自动做市商 AMM (Automated Market Making)

常见的 AMM 可以分为四种:恒定乘积做市商(CPMM)、恒定和做市商(CSMM)、恒定平均值做市商(CMMM)和混合恒定函数做市商(CFMM)。不同的函数做市商的定价逻辑不同,也都有各自的优缺点。

CPMM

CPMM(Constant Product Market Maker)恒定乘积做市商,典型的交易所有 Uniswap 和 Bancor。CPMM 的原理是通过函数 X*Y=K 来为数字资产定价的,X 和 Y 分别代表资金池内两种不同数字资产 A 和 B 的数量,K 代表常数,该函数根据每个代币的可用数量(流动性)确定两种代币的价格范围。X 和 Y 为一个交易对,当代币 A 的供给增加时,B 的代币供给必须减少,反之亦然,以保持恒定的乘积 K。在绘制这个函数时,结果呈现出来的是一个双曲线,流动性总是可用的,但价格会越来越高,两端接近无穷大。当代币 A 的供给量非常大时,很少量的代币 B 就可以兑换大量的代币 A,这种平衡虽然在 CPMM 模型中是成立的,但是脱离这个系统后,代币 A 和代币 B 的市场价格未必如 CPMM 系统中所示,所以会产生套利的机会,套利者会用大量的代币B换取大量的代币 A,从而使得两种代币的供求关系恢复平衡。

CSMM

CSMM(Constant Sum Market Maker)恒定和做市商,是零滑动的理想选择,但是不能提供无限的流动性。恒定和做市商的定价模型是 X+Y=K,K 为常数,在这个模型中,X 和 Y 的兑换关系永远是1:1,所以会存在其中一种资产被另外一种资产全部兑换完的情况,从而丧失流动性。这种情况将摧毁流动性池的一方,迫使流动性提供者承受损失,并使得交易者不再有流动性。因此,恒定和做市商(CSMM)并不是一个常见的 AMM 模型。

CMMM

CMMM(Constant Mean Market Maker)恒定平均值做市商,它允许创建可拥有两个以上代币,并在标准 50/50 分布之外加权的 AMM。在这种模型中,每个储备资产的加权几何平均数保持不变。对于有三种资产的流动性池,它的公式如下:(XYZ)^(⅓)=K。

CFMM

对于两个代币的交易对,不管是 CPMM 还是 CSMM,都存在固有的弊端,CPMM 虽然可以提供永久的流动性,但是交易滑点会比较明显,CSMM 虽然是零滑点的理想选择,但是不能提供无限的流动性,所以将两者优点相结合的混合 CFMM 模型出现了。CFMM(Constant Function Market Maker)混合恒定函数做市商,结合了多种函数和参数,以实现特定的行为,如调整流动性提供者的风险敞口或减少交易者的价格滑点。

Uniswap v2 使用的恒定乘积做市模型(CPMM)

Uniswap-v2 使用了恒定乘积做市模型来实现自动化做市商。其计算步骤如下:
甲在 Uniswap-v2 上提供了 1000 个 TokenA 和 100 个 TokenB 作为流动池,计乘数 Kab = 1000 * 100 = 100000
乙想要在 Uniswap-v2 上使用 100 个 TokenA 兑换 TokenB,那么 Uniswap-v2 会首先计算交易后流动池会有 1000 + 100 = 1100 个 TokenA;为了维持 Kab 的不变,就需要 TokenB 的数量减少为 100000/1100 = 90.909… 。因此,Uniswap-v2 会给乙兑换出100 - 90.909 = 9.091 个 TokenB 。
乙成功地使用 100 个 TokenA 在 Uniswap-v2 上兑换了 9.091 个 TokenB。可以预见的是,根据这套算法,乙需要兑换的 TokenA 越多,平均每个 TokenA 能兑换的 TokenB 就会越少。这就产生了滑点的概念。
简化公式:(TokenA余额 + 你出售的TokenA)*(TokenB余额 - 你获得的TokenB) = 常数K

什么是无常损失(Impermanent Loss) ?

在学习AMM 时,我们必须了解什么是无常损失。无常损失是当您存入池中的代币在存入后价格比率发生变化时,就会发生这种情况。变化越大,无常损失越大。 AMM 最适合具有相似价值的代币对,例如稳定币。如果货币对之间的价格比率保持在相对较小的范围内,无常损失也很低。

比例的变化可能会导致流动性提供者更好地持有代币而不是把代币存入资金池里。

即便如此,像ETH/DAI 这样的矿池,由于它们获得的交易费用,已经盈利。

如果资产恢复到原来的存款价格,它不会减轻永久性损失。

但是,如果您以与存入资金不同的价格比率提取资金,损失仍然很大。虽然交易费用在某些情况下可能会减轻损失,但它们仍然是重要的考虑因素。

将资金存入AMM 时保持警惕很重要,因此请确保您了解永久损失的后果。


V1 V2 V3区别

Uniswap V3

  • Uniswap V3 允许流动性提供者将流动性集中在特定的价格范围内,这可以为交易者带来更高的资本效率和更低的滑点。
  • Uniswap V3 共有三个费用等级(0.05%、0.3% 和 1%),流动性提供者可以根据自己的风险承受能力和预期收益进行选择。
  • Uniswap V3 有一个更复杂的 AMM 模型,它使用一系列价格而不是固定价格。使 Uniswap V3 能够提供更细粒度的价格风险并减少无常损失的影响。
  • Uniswap V3 具有可定制的费用结构,这意味着流动性提供者可以选择最适合其需求的费用等级。
  • Uniswap V3 对可以为池提供资金的流动性提供者的数量有限制,这可能会导致较大交易的滑点较低。

与 V1 差别:

– Uniswap v2 合约是用 Solidty 而不是 Vyper
– V1 中实际上没办法直接让 ERC-20 和 ERC-20 进行互换,而是通过 ETH 作为中间者进行交易,V2 则可以直接与 ERC-20 代币之间的 Pair 进行互换。在 V1 中交易者要支付更多的手续费(两倍),也需要承担滑价的风险。
– 在V2中ETH被改以WETH取代。
– Flash Swap:如果用户可以负担起所有的手续费和 Gas,那么可以直接提领所有 ERC-20 再在同笔交易中把他们退回去,中间可以做一些特别的事情。

与 V3 差别

.Uniswap V2Uniswap V3
Native TokenUNIUNI
Liquidity FormulaConstant Product (x*y=k)Concentrated Liquidity
Fees0.30%0.01%, 0.05%, 0.30%, and 1%.
Liquidity FungibilityFungibleNon-Fungible
Capital EfficiencyNoYes

Uniswap V2 和 V3 是不同版本的 Uniswap 去中心化交换平台。

Uniswap V2 在交易所的撮合引擎中使用了 Constant Product Market Maker (CPMM) 模型,而 V3 则使用了更先进的模型,即Balancer Liquidity Pool (BLP)。

Uniswap V3 具有更高的交易效率,更低的交易费用,以及更灵活的抵押和池配置选项。此外,V3 还具有更好的安全性,因为它使用了更复杂的智能合约代码和更先进的抵押机制。

总体来说,Uniswap V3 是一个更先进,更高效,更安全的版本,而 Uniswap V2 则是一个更简单,更稳定的版本。

Core 代码

我们先介绍几个主要合约的功能:

uniswap-v2-core

Uniswap v2代码走读

  • UniswapV2Factory:工厂合约,用于创建Pair合约(以及设置协议手续费接收地址)
  • UniswapV2Pair:Pair(交易对)合约,定义和交易有关的几个最基础方法,如mint(添加流动性)、burn(移除流动性)、swap(兑换),价格预言机等功能,其本身是一个ERC20合约,继承UniswapV2ERC20
  • UniswapV2ERC20:实现ERC20标准方法

mint

// this low-level function should be called from a contract which performs important safety checks
function mint(address to) external lock returns (uint liquidity) {
    (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
    uint balance0 = IERC20(token0).balanceOf(address(this));
    uint balance1 = IERC20(token1).balanceOf(address(this));
    uint amount0 = balance0.sub(_reserve0);
    uint amount1 = balance1.sub(_reserve1);

    bool feeOn = _mintFee(_reserve0, _reserve1);
    uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
    if (_totalSupply == 0) {
        liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);
        _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
    } else {
        liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);
    }
    require(liquidity > 0, 'UniswapV2: INSUFFICIENT_LIQUIDITY_MINTED');
    _mint(to, liquidity);

    _update(balance0, balance1, _reserve0, _reserve1);
    if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
    emit Mint(msg.sender, amount0, amount1);

uniswap-v2-periphery

  • UniswapV2Router02:最新版的路由合约,相比UniswapV2Router01增加了对FeeOnTransfer代币的支持;实现Uniswap v2最常用的接口,比如添加/移除流动性,使用代币A交换代币B,使用ETH交换代币等

  • UniswapV1Router01:旧版本Router实现,与Router02类似,但不支持FeeOnTransferTokens,目前已不使用


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值