Uniswap V2 — 从代码解释 DeFi 协议

Posted YanAemons

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Uniswap V2 — 从代码解释 DeFi 协议相关的知识,希望对你有一定的参考价值。

Uniswap V2 — 从代码解释 DeFi 协议

为了理解我们在分析代码时将要经历的不同组件,首先了解哪些是主要概念以及它们的作用是很重要的。所以,和我一起裸露吧,因为这是值得的。

我在 5 个段落中总结了您需要了解的主要重要概念,您将在本文结束时理解这些概念。

Uniswap 是一种去中心化交易协议。该协议是一套持久的、不可升级的智能合约,它们共同创建了一个自动化的做市商。

Uniswap 生态系统贡献流动性的流动性提供者、交换代币的交易员和与智能合约交互以开发代币新交互的开发人员组成。

每个 Uniswap智能合约或对管理一个由两个 ERC-20 代币储备组成的流动资金池。

每个流动性池重新平衡以保持 50/50 比例的加密货币资产,这反过来又决定了资产的价格。

流动性提供者可以是任何能够向 Uniswap 交易合约提供等值的 ETH 和 ERC-20 代币的人。作为回报,他们从交易合约中获得流动性提供者代币(LP 代币代表流动性提供者拥有的池的份额),可用于随时提取其在流动性池中的比例。

他们存储库中的主要智能合约是:

  • UniswapV2ERC20— 用于 LP 令牌的扩展 ERC20 实现。它还实施了 EIP-2612 以支持链下传输批准。
  • UniswapV2Factory— 与 V1 类似,这是一个工厂合约,它创建配对合约并充当它们的注册表。注册表使用 create2 来生成对地址——我们将详细了解它是如何工作的。
  • UniswapV2Pair— 负责核心逻辑的主合约。值得注意的是,工厂只允许创建独特的货币对,以免稀释流动性。
  • UniswapV2Router— Uniswap UI 和其他在 Uniswap 之上工作的网络和去中心化应用程序的主要入口点。
  • UniswapV2Library — 一组实现重要计算的辅助函数。

在这篇文章中,我们将提及所有这些,但我们将主要关注浏览UniswapV2RouterUniswapV2Factory编码,尽管UniswapV2Pair并且UniswapV2Library会涉及很多。

UniswapV2Router02.sol

该合约使创建货币对、添加和删除流动性、计算所有可能的掉期变化的价格以及执行实际掉期变得更加容易。路由器适用于通过工厂合约部署的所有对

您需要在合约中创建一个实例才能调用 addLiquidity、removeLiquidity 和 swapExactTokensForTokens 函数

address private constant ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

IUniswapV2Router02 public uniswapV2Router;
uniswapV2Router = IUniswapV2Router02(ROUTER);

现在让我们看看流动性管理:

函数 addLiquidity():

function addLiquidity(
    address tokenA,
    address tokenB,
    uint amountADesired,
    uint amountBDesired,
    uint amountAMin,
    uint amountBMin,
    address to,
    uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
  • tokenAtokenB:是我们需要获取或创建我们想要增加流动性的货币对的代币。
  • amountADesiredamountBDesired是我们要存入流动资金池的金额。
  • amountAMinamountBMin是我们要存入的最小金额。
  • to address 是接收 LP 代币的地址。
  • 截止日期,最常见的是block.timestamp

在内部 _addLiquidity() 中,它将检查这两个令牌中的一对是否已经存在,如果不存在,它将创建一个新令牌

if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) 
    IUniswapV2Factory(factory).createPair(tokenA, tokenB);

然后它需要获取现有的代币数量或也称为reserveAand reserveB,我们可以通过 UniswapV2Pair 合约访问它

IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves()

现在,外部函数 addLiquidity, 返回(uint amountA, uint amountB, uint liquidity),那么它是如何计算的呢?

通过UniswapV2Library拿到上面提到的reserves之后,还有一系列的检查

如果该对不存在,并且新创建 amountAamountB返回一个新的,则将amountADesired作为amountBDesired参数传递(见上文)。

否则,它会做这个操作

amountBOptimal = amountADesired.mul(reserveB) / reserveA;

如果amountB小于或等于amountBDesired那么它将返回:

(uint amountA, uint amountB) = (amountADesired, amountBOptimal)

否则,它将返回

(uint amountA, uint amountB) = (amountAOptimal, amountBDesired)

其中amountAOptimal的计算方式与amountBOptimal

然后,要计算liquidity返回值将经过以下过程:

首先,它将使用现有/新创建的对的地址部署 UniswapV2Pair 合约。

它是如何做到的?它计算一对的 CREATE2 地址而无需进行任何外部调用:(阅读有关 CREATE2 Opcode 的更多信息

pair = address(uint(keccak256(abi.encodePacked(address(uint(keccak256(abi.encodePacked(
    hex\'ff\',
    factory,
    keccak256(abi.encodePacked(token0, token1)),
    hex\'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f\' // init code hash
))));

然后,它获取新部署合约的地址,我们需要用它来从这对代币中铸造代币。

当您向货币对添加流动性时,合约会生成 LP 代币;当你移除流动性时,LP 代币就会被销毁。

pairFor因此,首先我们使用UniswapV2Library获取地址:

address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);UniswapV2Library.pairFor(factory, tokenA, tokenB);

因此,稍后可以铸造 ERC20 代币并计算返回的流动性:

liquidity = IUniswapV2Pair(pair).mint(to);

如果您想知道为什么它最终成为 ERC20,在 mint 函数中它是这样存储的https://github.com/Uniswap/v2-core/blob/ee547b17853e71ed4e0101ccfd52e70d5acded58/contracts/UniswapV2Pair.sol#L112)

uint balance0 = IERC20(token0).balanceOf(address(this));
uint balance1 = IERC20(token1).balanceOf(address(this));

****函数removeLiquidity():

function removeLiquidity(
    address tokenA,
    address tokenB,
    uint liquidity,
    uint amountAMin,
    uint amountBMin,
    address to,
    uint deadline
) external returns (uint amountA, uint amountB);

从池中移除流动性意味着燃烧 LP 代币以换取一定数量的基础代币。

IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity);

然后,外部函数返回两个值(uint amountA, uint amountB),这些值是使用传递给函数的参数计算的。

随提供的流动性返回的代币数量计算如下

amount0 = liquidity.mul(balance0) / _totalSupply; 
amount1 = liquidity.mul(balance1) / _totalSupply;

然后它将这些数量的代币转移到指定的地址

_safeTransfer(_token0, to, amount0);
_safeTransfer(_token1, to, amount1);

您的 LP 代币份额越大,销毁后获得的储备份额就越大。

上面的这些计算发生在 burn 函数内部

IUniswapV2Pair(对).burn(对)

https://github.com/Uniswap/v2-periphery/blob/0335e8f7e1bd1e8d8329fd300aea2ef2f36dd19f/contracts/UniswapV2Router02.sol#L114)

IUniswapV2Pair(pair).burn(to)

****函数swapExactTokensForTokens()

function swapExactTokensForTokens(
    uint amountIn,
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
) external returns (uint[] memory amounts);

Uniswap 的核心功能是交换代币,所以让我们弄清楚代码中发生了什么,以便更好地理解它

您很可能听说过流动资金池中使用的神奇公式

X * Y = K

所以,这将首先发生在 swap 函数内部getAmountOut()

里面用到的关键函数有:

TransferHelper.safeTransferFrom().safeTransferFrom()

代币金额发送到配对代币的地方

在 UniswapV2Pair 合约的较低级别交换功能中,它将是

_safeTransfer(_token, to, amountOut);

这将实际转移回预期地址。

我知道信息量很大,但您将有足够的时间阅读所有内容,直到完全理解为止。所以……

UniswapV2Factory.sol

工厂合约是所有已部署对合约的注册表。这个合约是必要的,因为我们不希望有成对的相同代币,这样流动性就不会分成多个相同的对。

该合约还简化了配对合约的部署:无需通过任何外部调用手动部署配对合约,只需调用工厂合约中的方法即可。

好吧,让我们倒回去,因为在上面的这些行中已经说了非常重要的事情。我们把它们拆分开来分别分析:

该合约是所有已部署对合约的注册表

只部署了一个工厂合约,该合约用作 Uniswap 交易对的官方注册处。

现在,我们在代码中的什么地方看到了它以及发生了什么:

address[] public allPairs;

它有 的数组allPairs,如上所述,存储在这个合约中。这些对被添加到一个方法中,该方法createPair()通过将新初始化的对推送到数组来调用。

allPairs.push(pair);push(pair);

这个合约是必要的,因为我们不想拥有成对的相同代币

mapping(address => mapping(address => address)) public getPair;

它具有该对的地址与构成该对的两个令牌的映射。这用于检查一对是否已经存在。

require(getPair[token0][token1] == address(0), \'UniswapV2: PAIR_EXISTS\');

该合约还简化了配对合约的部署

这是一个更深层次的话题,但我将尝试总结一下这里发生的事情的重要性。

在以太坊中,合约可以部署合约。可以调用已部署合约的函数,该函数将部署另一个合约。

您不需要从您的计算机上编译和部署合约,您可以通过现有合约来执行此操作。

那么,Uniswap 是如何部署智能合约的呢?

通过使用操作码CREATE2

bytes memory bytecode = type(UniswapV2Pair).creationCode;type(UniswapV2Pair).creationCode;
bytes32 salt = keccak256(abi.encodePacked(token0, token1));
assembly 
    pair := create2(0, add(bytecode, 32), mload(bytecode), salt)

在第一行,我们得到创建字节码UniswapV2Pair

下一行创建了salt一个字节序列,用于确定性地生成新合约的地址。

最后一行是我们调用以使用+create2确定性地创建新地址的地方。部署。bytecode``salt``UniswapV2Pair

并得到对地址,我们可以看到这是createPair()函数的返回值

function createPair(
  address tokenA, address tokenA, 
  address tokenB
) external returns (address pair)

当提供的标记不是现有的对_addLiquidity()时,它在内部函数中使用。

所以,这就是关于 Uniswap 代码的全部内容。

现在,为了看到我们测试的所有内容,我可以推荐您查看 Smart Contract Programmer 在他的defi-by-example 内容中实现的代码,他已经在视频中进行了解释

在这里你可以看到我们可以增加流动性的方式

function addLiquidity(
  address _tokenA,
  address _tokenB,
  uint _amountA,
  uint _amountB
) external 
  IERC20(_tokenA).transferFrom(msg.sender, address(this), _amountA);
  IERC20(_tokenB).transferFrom(msg.sender, address(this), _amountB);

  IERC20(_tokenA).approve(ROUTER, _amountA);
  IERC20(_tokenB).approve(ROUTER, _amountB);

  (uint amountA, uint amountB, uint liquidity) =
    IUniswapV2Router(ROUTER).addLiquidity(
      _tokenA,
      _tokenB,
      _amountA,
      _amountB,
      1,
      1,
      address(this),
      block.timestamp
    );

  emit Log("amountA", amountA);
  emit Log("amountB", amountB);
  emit Log("liquidity", liquidity);

以及我们必须如何考虑消除流动性

function removeLiquidity(address _tokenA, address _tokenB) external 
  address pair = IUniswapV2Factory(FACTORY).getPair(_tokenA, _tokenB);

  uint liquidity = IERC20(pair).balanceOf(address(this));
  IERC20(pair).approve(ROUTER, liquidity);

  (uint amountA, uint amountB) =
    IUniswapV2Router(ROUTER).removeLiquidity(
      _tokenA,
      _tokenB,
      liquidity,
      1,
      1,
      address(this),
      block.timestamp
    );

  emit Log("amountA", amountA);
  emit Log("amountB", amountB);

通过Github 获取更多区块链学习资料!

https://github.com/Manuel-yang/BlockChainSelfLearning

时隔两年再次回顾DeFi的代表项目—Uniswap


如果我们回顾加密世界从 2020 年开始的爆发,DeFi应该是标志性的事件。

如果我们回顾DeFi,Uniswap 应该是标志性的协议。在用户的角度,Uni应该是整个DeFi世界的入口,承担了最重要的交易功能,而这个产品本身只有几百行代码。

Uni 的团队,公开信息显示其实也就 20 到 30 个人,但最高的时候 UNI 的市值超过 300 亿美金。那如果平均一下,人效比应该是传统公司的很多倍。作为对比,纳斯达克目前的市值也将近 300 亿美金,但是他们有超过 4800 名员工。那这样看来,crypto确实是一个非常不一样的新领域。

关于创始人也有一些比较有意思的故事。比如创始人 Hayden Adams 本来是西门子的机械工程师,但之后被裁员,就自学 Solidity 做了 Uniswap 这个明星协议。虽然Uni在今天已经过了早期被热烈讨论的时期,但作为一个标志性的协议有它独特的长期价值,我觉得还是能给我们带来很多启发。


Shifting是一档围绕加密货币、区块链、Web3展开的深度播客。

 

本期主持人炫皓,嘉宾陈佳,以下是本期播客的文字版:

炫皓:我之前听马斯克和 Lex Fridman 有一期访谈,他们聊到了货币和钱是什么。马斯克当时的回答大概意思是,钱实际上是许多采用批处理模式的大型机当中存储的数字信息,而美联储可以修改这些数字。我觉得这个回答非常符合马斯克的风格,有点直击本质或者 first principle 的意思。那你觉得从类似的角度来看,Uniswap 是什么?

陈佳:Uniswap是一个基于智能合约的去中心化交易所,它的运行完全基于不可修改的代码,根据用户提交的交易请求,由智能合约全自动的执行,完成用户之间的交易。

Uniswap的成交价格则由智能合约瑞托管的资产数量的比例决定。每次用户的交易行为都会影响托管的资产的数量,进而影响价格。Uniswap系统内的资产价格会和其他中心化交易所的资产价格保持同步,因为会有套利者进行套利,同时Uniswap还可以自行上架新的代币,解决传统中心化交易所上币难的问题。

炫皓:因为可能不是所有的听众都比较熟悉 Uniswap,请跟我们简单介绍一下Uniswap的其他功能?

陈佳:它主要几个核心功能:第一个是交易功能, 我们通常把 swap(即交易)的一个交易对称作流动池,每个池一般两个资产,这两个资产可以在该资产池中进行交换。同时Uniswap还实现了多个资产池之间的资产互换。举例说有 A、B 两个资产,它们都和 USDT有交易池,但是没有 A 和 B 的资产池。那么Uniswap可以实现 A 换成 USDT,USDT 再换成 B ,同时在一笔交易过程中实现了 A 到 B 的交换。

Uniswap同时还有另外一个功能,就是用户自行可以添加流动池,在传统的交易所里面叫做创建交易对。

用户可以把自己的 A 和 C 这两个资产上架Uniswap,那么我可以添加一定数量的资产A,添加一定数量的资产C,那么A\\C的比值就是当前的价格。每年有非常多的新项目在Unisawp率先开启交易,然后再去中心化交易所。目前的话有将近 7 万个交易对在Uniswap里面交易,同时我们可以看另外一个数据,在以太坊的 gas消耗中,Uniswap一般排行在前三左右。大概有 5% 到 10% 的gas消耗都是在使用Uniswap。

另外 Uniswap它还有几个功能,一个是闪电贷,用户可以在一个区块内、一笔交易里面向Uniswap借出一定资金进行一些套利活动,然后再把同样的资金还给Uniswap,这就解决了很多套利活动、套利者可能缺乏资金的问题。另一个就是基于时间加权的预言机,在很多DeFi协议里面,需要一个预言机来给资产做定价。

Uniswap V2的基于时间加权的预言机,解决了以前那些预言机价格容易被操控的问题,它引入了时间加权,可以得出一个平均比如说一小时内,或者一天内的加权时间的价格,然后用于第三方协议的资产定价。另外就是基于Uniswap的一些二次应用,比如说流动性挖矿。相信很多朋友也听说过它是基于Uniswap的流动池的 LP进行质押,再进行挖矿的,大致基本上主要这些功能。

炫皓:那主要功能就是交易,然后流动性做市,闪电贷,自由上币以及交易的自动路由,外加对其他协议提供的预言机功能。我觉得像自由创建交易对这样的功能还是很有开创性的。

如果我们说比特币是从技术层面实现了私有财产不可侵犯,如果套用这个句型,Uniswap应该实现了自由交易权利的不可侵犯。无论你来自哪里,年龄、性别、贫富、政治归属是什么样,大家都是平等的交易用户。

此外像闪电带这样的功能还是挺有意思的(虽然是Aave最先把这个功能做出来的)。有意思的地方是闪电带这个功能不再是把传统金融当中的产品或者逻辑在区块链上再做一遍,而是完完全全在区块链上面涌现出来的,在传统世界是不存在闪电带这个东西的。

除了 AMM 是 Uniswap 的一大创新之外,链上的协议治理其实也非常有意思,比如 Uniswap 的DAO应该是现在管理规模最大的DAO,资产管理规模大概 24 亿美金。我也看到一些治理相关的新闻,比如说社区投票提案通过的 DeFi 的教育基金,你能不能聊聊这个机制大概是怎么运作实现的呢?

陈佳:任何UNI的持有者都可以提交引入新功能的提案,然后经过一定流程得到社区的通过之后进入执行。它的流程分几个阶段:

第一个阶段是温度检查,需要有 25,000 个UNI 的赞成可以进入第二步。

第二步是共识检查,需要有 5 万个赞成票,最后阶段就是治理提案。经过前两步之后,这一步的难度会比较高,需要有 4000 万个 $UNI 的投票才能够通过。Uniswap设置这个机制主要是考虑如果有少部分人疯狂提案,比如提交 1 万个,整个社区的治理就没有办法进行了,所以说会设置几个阶段。每个阶段需要有一定的门槛,初次讨论通过之后, 就进入第二个阶段,第三个阶段,最后大家去讨论的议题才是一个有效的议题。

炫皓:那基本的模式就是分多个阶段,然后每一个阶段需要的 $UNI 或者这种质押的代币数量会越来越高。通过比如说一些 Snapshot这种工具进行投票表决,结果出来之后可能会再由社区的这些主要成员或者团队成员进行实际的操作。

陈佳:因为大多数的一些议案可能没办法自动执行,需要一些团队的成员通过多签操作实现,或者有些直接需要团队的开发者去其他链进行部署,或者说修改合约的参数。

炫皓:那实际上就是像这样的协议DAO,其实它的自动化程度或者说去中心化程度中间还是有一些区别。比如所有的投票过程实际上还是在链下完成的,只有在链下的这些投票工具得出一个结果之后,还是需要这些实际上多签的控制者或者说社区的主力成员,他们来执行具体的资金转移或者链上合约的部署。

陈佳:是的,因为从技术上来讲,目前很多操作没有办法实现一种自动化,只能通过一些人工的手段来执行。

炫皓:我们看下来Uniswap一部分是在区块链上无需许可运行的合约代码,然后另一部分就是前端。

然后今天看 Uniswap 可能是一个非常成熟甚至大家认为理所当然的应用,今天有七八十亿美金的锁仓,算是一个家喻户晓的DeFi协议。

但其实我觉得实际上一个产品或者协议在发展历程当中,大家对它的看法可能会有一个变化的过程。那如果我们现在回顾一下历史,比如回到 20 年的 5 月份或者 6 月份,当时大家是怎么看待 Uniswap 这个协议的发展呢?

因为我也看到一些比如 Coinbase 之前的 CTO Balaji, 在20年5月的时候他有点不太看好Uni,以及Multicoin、Dragonfly一开始他们也没有投Uniswap,认为可能机制的设计有一些问题,所以我觉得可能在当时不是所有人都会觉得 Uniswap 会长成一个非常繁荣或者一个非常明星的协议。我不知道你作为经历过那一段时间的 DeFi 的参与者,或者也算是从业者,你怎么看Uniswap的发展过程?

陈佳:Uniswap的发展过程,需要提到Uniswap之前的这些去中心化交易所,比如Bancor协议。Bancor最开始出来的时候,其实业界也都挺认可的,因为区块链一直就追求去中心化的目标,但是一直有个问题困扰着整个区块链,整个交易过程是非常非常中心化的。

Bancor协议的创建就给整个区块链引入了去中心化交易,但是Bancor协议因为它的一些模型设计问题不是很好用。那后面Uniswap出来之后,那么大家就通过Uniswap和Bancor的对比,就发现 Uniswap它的交易模型虽然非常简单,但是非常实用,对价格的追踪也非常有效。

当时在开发者领域还是比较看好Uniswap,但是可能说因为 Uniswap 有一些无法改变的缺陷,比如说它的交易速度慢和矿工费高,和传统的中心化交易所比可能在可见的未来是没办法解决的。但是也只能说是它因为有了去中心化的特点,不可能避免同时带来的不足。

所以像Coinbase他们是做中心化交易所的,一笔交易那么基本上就在一秒之内完成。那么对于Uniswap这种可能需要15秒甚至几分钟的交易体验,自然他们会觉得交易体验上有很大的缺陷。但是对于很多区块链的从业者、用户来讲,追求的是整个一个去中心化过程。

那么 Uniswap 通过这种机制能够实现在链上完全去中心化的交易,这是一个非常巨大的进步,在这一点上,时间的等待是可以接受的。

炫皓:那我觉得比如说像你刚刚提到的有一部分是贵的问题,有一部分是慢的问题,和中心化的交易所在交易体验上可能还是有一些差距,而且这个差距可能是由区块链本身决定的,所以在短期内可能也没有什么本质的、好的解决办法。

那你觉得在未来的话比如说像Uniswap和币安(当然现在绝大部分的交易量还是垄断在中心化的交易所)未来的交易量分布大概会是什么情况呢?比如说大量的交易量会到中心化交易所,还是说两者会是一个长期共存的状态。

陈佳:比较头部的资产,肯定会比较多交易量在中心化交易所,因为中心化交易所它的使用速度体验确实会更好。但是更多的长尾资产和以及涉及智能合约的资产,它会去Uniswap这种去中心化交易所进行交易。

还有一点就是Uniswap的使用门槛对于普通用户来讲相对比较高一些,它需要了解完整的创建钱包、矿工费、钱包授权这一套,而在中创交易所相对会简单很多。可以预见的未来,中心化交易所肯定还是整个市场的主流,但是去中心化交易所的占比会也不断提高。

但是因为一些去中心化的原因,它的体验上肯定会有一定的差距,这也会阻止一些新人玩家的使用,但是随着技术的发展,那么大家对新技术的掌握也会越来越深入,去中心化交易所的占比也会不断的提高。

炫皓:因为将来 layer two 可能会有比较大的发展,对于解决以太坊一层的贵和慢的问题也可能会有一些改善。那比如说像Uniswap这样的协议之后部署到Layer 2上,它贵和慢的问题,会不会有一个数量级的提升?

陈佳:肯定会有提升,但可能还涉及一些问题。举例说他的原生资产这些可以在Layer 2上使用,但是很多非原生资产可能没有跨过去,也是一个问题。因为Uniswap里面很多的资产都是非原生资产、长尾资产。

炫皓:你的意思是说,如果这些非原生的资产要迁移到Layer 2上去,阻力可能也会比较大是吗?

陈佳:是,因为在Layer 1、Layer 2都需要有流动池,本来很多资产的流动池的流动性深度都不高的情况下,再分开建两份流动池的话,相对成本就比较高了。

炫皓:那可能还是有一些迁移的阻力,可能需要有一个过程。那此外我觉得链上协议的竞争格局和竞争要素也是一个比较有意思的问题。比如说传统商业领域会有一个护城河的概念,说产品公司关键的竞争优势是什么?

我觉得这个问题对于链上协议来说其实也非常有趣。首先是链上协议基本都是开源的,很难有什么独家的秘密配方或者专利。然后用户的 switching cost 或者切换成本这方面似乎也不高。在 Web 2 的世界里,比如说像微信这样的社交网络,它实际上有非常高的切换成本。

最后链上的协议似乎也没有像微信这样的数据和内容的积累,至少目前是这样的,像抖音、 YouTube 这样的平台实际上可以沉淀大量的内容,其他的竞争者都很难追赶。那你觉得这个时候链上协议的竞争优势主要靠什么构建呢?可以针对Uniswap聊一聊,如果有其他的想法也可以发散。

陈佳:它主要有几个核心的竞争优势。首先第一点就是知名度,它的知名度在全球区块链行业算是比较头部的,很多新的用户新的资金肯定就会优先考虑Uniswap。

第二就是Uniswap有先发优势以及它的流量优势,它的流动池深度目前是最深的,流动池深度越深,那整个交易的体验就会更好,因为滑点更低。你可以用同样的价钱可以买到更多的资产,更多的资产可以卖出更多的钱。这个优势是指在体验上来讲比其他的竞品会好很多。

同时很多相关的一些协议也会依赖Uniswap,比如它的时间加权价格参数,或者清算的时候去走Uniswap这边进行清算。相当于强者恒强,那么Uniswap作为一个头部的协议,会持续性地把那些流量、资金、深度积累在他自己的身上,形成一个强大的护城河。

炫皓:像Uniswap这样采用 AMM 的 dex 其实还是蛮多的,比如说像 Sushi 和 Curve。然后他们可能针对一些特定的应用场景或者短期激励做了一些创新。当然还有一些基于订单簿的 Dex 比如说 IDEX 和 0x ,他们目前表现都一般,你觉得是为什么呢?

陈佳:主要的原因在于去中心化的订单簿交易所,它的体验和中心化的订单簿交易所有很大的差距。同时它又没有流动池这种去中心化交易所的一些便利,更多人在链上选择就Uniswap这种类型的交易所,在链下就选择中心化的订单簿,这两者相对在他们自己的领域是比较优的一个选择。

炫皓:因为所有的链上协议都是开与源的,比如说Uniswap做了一些版本的更新,或者有一些技术上的创新,其他的协议在抄袭的时候或者说 fork 的时候,因为不同的 Dex 可能大家的应用场景和业务场景都不太一样,你觉得这个直接 fork 的过程中会不会导致一些其他的问题。

陈佳:Fork Uniswap 项目特别多,他们绝大部分就会原封不动抄袭,少部分会加上自己的一些激励机制,比如说交易挖矿、流动性挖矿或者些是手续费的再分配这些,从它的核心框架来讲 99% 和Uniswap一样。

这些竞品肯定对Uniswap的流量会有影响,但是他们主要是在非以太坊网络上运行。那么在以太坊上主要就是Sushi或者类似的那些比较小的产品在竞争,他对Uniswap的流量肯定有影响,但是他同时又把Uniswap这个标准推广出去了。

现在可以看到基本上凡是涉及去中心化交易所的一些协议,那么它基本上都完全和Uniswap兼容。涉及资产定价、涉及资产交易的基本上也会和Uniswap兼容,让Uniswap成为事实上的标准。

炫皓:我觉得这个还是挺有意思的,因为在传统的互联网领域可能也有这样的例子,比如说 Google 的 Chrome 一开始开源了它的浏览器内核 Chromium,然后基于Chromium又衍生出来其他的一些不同版本或者不同公司做的浏览器。但实际上最后这些浏览器都成为了推广 Chrome 标准的一个贡献者。

所以 Chrome 最后成为了事实上浏览器领域的垄断者,觉得还是有一些相似。

陈佳:是的,现在Uniswap就是整个去中化交易所的一个标准。另外Uniswap V3协议里,提供流动性奖励的凭证,它是一个NFT,非同质化的token,传统的 Uniswap V2,它的流动池凭证是一个标准化的 token,如果竞争对手把Uniswap 3的功能抄过去,就会导致一个问题,他们现在正在提供各种流动性挖矿的产品,迁移到 V3 之后这些流动性挖矿产品全部都无法使用,或者必须用一种非常麻烦的方式才能进行流动性挖矿。

这也是很多 Uniswap的竞品没有抄袭 Uniswap V3 的一个很重要的原因。

炫皓:除此之外,其实Uniswap的背后好像也有一些顶尖的加密 VC,Paradigm他们应该是在 2019 年就投了Uniswap,像 Paradim 这样的 VC 也不是投完之后就拍拍屁股走人。好像 VC 团队本身和 Uniswap 的项目团队,在产品设计和机制设计方面也会有一些比较深度的合作。可能团队背后像顶尖 VC 这样在资金和发展路径上都能给出建议和帮助,也是竞争力的一个来源。

我觉得生态也是非常重要的,如果基于一个协议能够长出比较繁荣的生态,可能也是构造竞争力的一个点。就像以太坊一样,当然公链和协议还是有一些区别的。但就 Uniswap 来说,目前围绕在 Uniswap 上下游的一些协议和应用有哪些呢?因为 DeFi 经常强调可组合性,那被用得最多的那块乐高积木可能相对来说价值比较大,Unisawp 还是一个比较基础的协议。那你觉得在生态这一块的格局是什么样的?然后围绕Uniswap 有一些什么角色?

陈佳:目前主要有几种类型的项目或者协议比较依赖Uniswap。第一种比较常见的是很火的去中心化的DAO(的代币),他们最开始第一个上架的交易所就是Uniswap,像最近还流行去中心化的投资DAO(Cult)。

他们协议里会涉及每笔交易的时候自动手续会抽成转移到社区的金库,这个功能就是基于Uniswap开发的。另外很多协议依赖 Uniswap 基于时间加权的预言机,借贷协议清算机器人也依赖Uniswap的交易功能。

小狐狸钱包的 swap 功能会走 Uniswap 的池子。还有一些机枪池,它们可能也会在Uniswap里面提供流动性。所以有挺多的协议,它会有基于Uniswap进行的业务,有不同的场景,Uniswap算是一个使用和依赖比较多的一个底层协议。

炫皓:那相当于是有一些在链上的、DeFi系统的一些其它的组件,比如说像借贷协议,或者一些流动性聚合协议或者一些收益协议,可能把 Uniswap 作为一个底层的收益来源。

然后另一部分就是像离用户比较近的这些钱包软件,可能有一些内置的 swap 功能也是直接路由到 Uniswap 来完成的。那自然而然的问题就是 Uniswap 和这些它生态里边的不同的参与方,他们的绑定深度怎么样?比如现在诞生了一个在各方面使用体验都要比 Uniswap更好的一个Dex,或者说一个去中心化的交易平台。

如果现在这些生态的参与方想要迁移到这个新的平台上去,他们的需要付出的成本会很高吗?时间成本、开发成本、技术难度之类的。

陈佳:如果它是完全基于Uniswap的话,那迁移成本可能不高。但是如果它跟Uniswap完全不一样,迁移成本就比较高了。关键一点是很多协议。最开始在开发的过程中,就没有考虑过迁移到Uniswap之外的平台去,那么它的代码是无法进行修改增加支持的。大部分的协议基本上就是无法修改对Uniswap的支持。

炫皓:那这样看下来,其实它在生态里边的垄断性还是比较强的,因为有很多协议和它的绑定深度还是比较深,因为你的代码一旦部署上链之后就没有办法改了。如果你之后想要做版本的升级或者那种差别比较大的迭代,还是一个切换成本比较高的问题。

陈佳:是的,因为很多协议,尤其是比较简单、单一的协议,它的合约代码是不可更改的。你部署出去之后,就依赖Uniswap的池子,依赖Uniswap的价格预算机。这时候就一辆高速行驶的火车,很难给它停下来换更换轮子。

炫皓:还有另外一个话题是关于MEV,因为也Uniswap本身也是做交易,然后在 MEV 这一块可能有一些基于链上交易机制的套利,你可不可以跟我们聊聊这个套利的基本原理。

陈佳:简单讲一下,大家在Uniswap交易的时候,它其中有一个选项就是滑点,比如说你设置 10% 的滑点,那么现在以太坊的价格假设是 3000刀,那么你设置 10% 的滑点,也就是说你可以接受以太坊的价格最高是 3300刀。

那么你现在下单买一个ETH,把这个请求提交到区块链上之后,那么这个机器人或者叫“夹子”就监听到你的请求。它发现现在的价格是 3000 刀,马上在池子里面买一定数量的 ETH,把价格拉升到 3300 刀,可能它的平均购买成本大概是在 3150 刀。

那么你的交易请求在机器人执行完之后,实际上你用 3300 刀的价格去买了 ETH 。然后机器人在3300 刀把他之前买的 ETH 卖出去,这就能够赚一定的差价,交易用户就多付了更多的钱,本来你需要 3000 刀,现在你需要 3300 刀。

对于这种“夹子”(也称三明治攻击)其实有个办法可以以缓解或者优化。用户把价格的滑点设置为1%。也就是说 3000 刀的时候你最多接受 3030 刀的价格去买一个ETH,这种价格就没有套利空间,交易就不会被MEV影响。

炫皓:那你觉得MEV这种套利机器人会长期存在吗?因为可能说由于之后一些技术或者协议的改进,会不会逐渐压缩这一块的市场空间。因为可能我们也能看到一些站在用户角度来抗MEV的交易协议,想避免这些套利者的参与。那你觉得长期来看这一块的市场空间会不会越来越小?

陈佳:长期来看的话我觉得市场空间反而会更大,原因是整个Uniswap的用户在不断地增加。它有更多的交易是使用比较高的滑点进行交易,那么这里套利空间就存在。因为区块链它的特性,必须把一个交易先进广播,之后才被人打包,那么就始终无法解决这个问题,别人比你抢先一步抢跑。唯一的办法就是更友好地提示用户把滑点设置为 1% 或者千分之五,让这些“夹子”没有套利空间。

炫皓:那 MEV 这个机制还是由于区块链本身的一些特性,比如说交易打包的顺序,就是这个链的运作机制确实没有办法更改,所以可能长期来看 MEV可能会一直存在。那除此之外大家可能还会比较关心一个链上协议的价值捕获机制如何?

比如看起来目前 Uniswap 是DeFi生态中最重要的龙头协议,但是$UNI这个代币的价值捕获机制你觉得怎么样?因为其实Uniswap现在在DEX领域的市场份额几乎接近80%,形成了事实上的垄断,但是治理代币的价格其实并不理想,这也是一个比较有意思的现象, 不知道你在这个问题上怎么看。

陈佳:目前来讲的话,Uniswap主要是作为治理代币,主要的权利就是是对一些决策进行投票,并不涉及回购分红这些。UNI的持有者和Uniswap的利益关联没那么大,短期来讲它的价格是有一个瓶颈。这一块的话可能要看社区,后面通过投票有什么更多的机制或者产品能够给$UNI赋能,让Uniswap的一些价值转移到$UNI上去。

炫皓:关于价值捕获机制存在缺陷,但是又广泛应用成为基础设施的。这种例子其实也不少,比较极端的,比如以太网标准和 TCP/IP ,大家其实每天都在用,但其实和价值捕获没有什么关系。那可能未来基于投票治理开启手续费分红,或者说通过一些代币的回购议案,可能会让这个市场发生一些变化,但在目前好像这些都还没有看到。

陈佳:是的,社区里面有这样的声音,但是没有获得比较多的支持,还需要$UNI持有者社区,通过内部的讨论得出一个比较多支持者的方案。

炫皓:关于代币分红这个问题,也有一些说法是Uniswap可能跟监管层还有一些博弈,因为如果你要是开启分红机制的话,可能就要受到 SEC 的一些监管或者影响,所以这还是一个比较模糊的问题。那说到这里,crypto 世界和传统世界的博弈其实也是一个比较有意思的话题。

因为加密世界被大家所称道,也主要是因为抗审查、去中心化,无需准入这些特点。那现在对于一个协议来说,我觉得可以关于抗审查这一点聊一聊,比如现在Uniswap被监管部门或者强力部门打击,可能会在哪些方面受到影响,以及影响到什么样的程度。比如说一个具体的例子是去年 7 月末,然后有一些代币被Uniswap迫于 SEC 的压力下架了,你怎么看这个事情。

陈佳:首先我们就像最开始说的 Uniswap 是一个运行在以太坊上的基于智能合约、无法修改的一个程序,它已经部署了,它的开发团队是无法让它停止运行的。

首先保证了Uniswap可以持续运行下去。但是Uniswap的前端是由 Uniswap 团队进行控制的,团队可以因为一些政策对某些资产进行屏蔽处理,甚至可能因为政策把Uniswap的前端关闭,但是Uniswap的前端是可以自行搭建的,比如说国内的用户在使用Uniswap的时候,很多是走的第三方的 Uniswap 镜像。

也就是说而即使 Uniswap 官方团队因为政策的因素,把Uniswap前端关闭之后,也完全不影响用户使用 Uniswap。而且Uniswap中被屏蔽的代币还是可以在区块链进行交易,只是说无法通过Uniswap官方的前端进行交易。

炫皓:那基本上对于用户来说,主要是和前端进行交互,但实际上前端还是一个比较开放的东西,可能有一些第三方的前端,或者一些托管在不同国家或地区的物服务器上的前端。所以如果想把所有的前端都封掉,理论上难度还是比较大的。再就是关于域名解析的禁封,比如说在某一个区域把Uniswap的解析域名禁掉,也是一个可以实现的方式。

但好像也可以通过增加其他域名或者迁移域名的方式来解决这个问题。

看起来对于用户来说,受到的影响没有那么大。对于一些其他的基于Uniswap的链上协议,或者站在开发者的角度,其实如果面对一个已经部署在链上的合约,其实是没有办法把它停下来的,基于 Uniswap 的那些业务也都不会受到影响。

陈佳:是的,Uniswap它是运行在以太坊上的智能合约,那么这个智能合约无法被关闭,无法被删除。所以Uniswap可以持续的运行下去,前端可以由任何第三方进行搭建。

炫皓:之前被下架的代币,虽然在Uniswap的前端没有办法交易,但是在 1inch(一个DEX的聚合协议)的前端可以进行交易。

那实际上 1inch 就变成了 Uniswap 的一种广义上的前端,还是比较反脆弱的。我觉得我们还是聊了不少内容,从产品、赛道、竞争、监管这些角度都涉及了一些内容,也算比较立体地聊了聊 Uniswap。最后可以展望一下未来,你觉得Uniswap会持续保持领先或者垄断吗?或者说五年之后,你觉得Uniswap还是最主流、最基础的链上交易应用吗?

陈佳:我个人还是比较看好 Uniswap 团队的持续开发的可能性。Uniswap的 V2 是一个很好的版本,是一个非常划时代的一个产品,解决了之前 V1 的很多问题,但是在 V2 的基础上,后来又推出了V3, V3 有更多更高级的一些功能。我相信可能未来Uniswap可能还会有V4、V5,可能会在比较长的时间内保持在整个去中心化交易所领域内的头部地位。 作者:区块链蓝海 https://www.bilibili.com/read/cv16404689 出处:bilibili

以上是关于Uniswap V2 — 从代码解释 DeFi 协议的主要内容,如果未能解决你的问题,请参考以下文章

时隔两年再次回顾DeFi的代表项目—Uniswap

从Uniswap Discord社区看DeFi链下治理的三大难题 |链捕手

从 Uniswap V2 获取正确的执行价格

解析 DeFi 项目之Uniswap(一):Uniswap 是啥?

解析 DeFi 项目之Uniswap(二): 如何使用Uniswap?

复盘Uniswap赠款事件始末:获利千万美元的DeFi教育基金是个什么组织? |链捕手...