Uniswap官方文档 ——(三)Uniswap智能合约

去中心化金融评论1,831阅读模式

Uniswap V2是一个二进制智能合约系统。核心合约为Uniswap进行交互的各方提供了基本的安全保证。外围合约与一个或多个核心合约交互,但外围合约本身并不是核心合同的一部分。

Core(核心合约)

核心由一个单例工厂和多个“交易对”(parirs)组成,单例工厂负责创建和建立索引。这些合约是很小的,甚至非常粗糙。这样做理由很简单,因为内容较少合约更易于推理,其漏洞少且功能更优雅。这种设计的最大优点也许是可以直接在代码中声明系统所需的诸多属性,且几乎很少出错。但是,它也有不好的地方,那就是某种程度上对用户不太友好。实际上,在大多数用例中,建议大家不要直接与这些合同进行交互,而应该更多地与外围合约交互。

Factory(工厂合约)

工厂合约持有为支持“交易对”的通用字节码,它的主要工作是为每个交易对创建有且只有一个的智能合约(单例特性),它还包含进向协议进行充值的逻辑。

Pairs(交易对)

交易对有两个主要目的:自动充当做市商和跟踪代币池中的余额,它们还公开了可用于构建分散价格预言的数据。

Uniswap官方文档 ——(三)Uniswap智能合约

外围合约(Periphery)

外围合约是一组旨在支持与核心合约进行特定功能交互的智能合约。由于Uniswap的未经许可的性质,以下所述的智能合约没有特殊权限,并且它们实际上只是看上去像外围合约中的一小部分。然而,它们是有用的示例,提供安全有效的与Uniswap V2交互的方式。

Library(库)

该库提供了各种便利功能,用于获取数据和定价。

Router(路由器)

使用该库的路由器可完全支持前端产品提供交易和流动性管理的功能。值得注意的是,它本身就支持多对交易(例如x到y到z),且将ETH视为一等公民,并提供用于消除流动性的元交易。

合约设计思路

下面讲一下Uniswap V2这样设计的理由。如有兴趣深入了解V2的工作原理或编写基于它开发智能合约,否则可以略过这些内容!

发送代币

通常情况下,某些智能合约可能需要代币来执行某些功能,首先要求交互者对代币合约进行批准,然后再调用该功能,该功能又调用代币合约上的transferFrom。这不是V2对接受代币的方式。相反,交易对在每次交互结束时都会检查自己代币的余额。然后在下一次交互开始时,将当前余额与存储的余额进行比较,以确定当前交互者发送的代币数量。可以参阅白皮书来了解为什么要这样做,但这里要说的重点是,在调用任何需要操作代币的方法之前,代币必须先被转移到“交易对”(这个规则的一个例外是Flash Swaps)。

WETH

与Uniswap V1池不同,V2交易对不直接支持ETH,因此必须使用WETH模拟进行ETH⇄ERC20之间互兑。之所以这样做,是为了删除核心合约中的ETH特定代码,从而使基础代码更精简。最终使用户可完全不了解此实现细节,而只需简单地在外围合约中使用ETH。

顺便说一嘴,路由器合约完全支持通过ETH与任何WETH对进行交互。

最低流动性

为了减少四舍五入的误差并增加针对提供流动性的理论最小刻度值,交易对会燃烧掉(burn)第一个MINIMUM_LIQUIDITY池的代币。对于绝大多数交易对来说,这是微不足道的。在第一个流动性准备阶段,燃烧会自动发生,此后,总供应量将永远被限制。