LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 行情分析 > Uniswap v2白皮书翻译,揭秘那些值得关注的新功能和行业亮点

Uniswap v2白皮书翻译,揭秘那些值得关注的新功能和行业亮点

2020-05-23 洁sir 来源:区块链网络

该技术白皮书解释了Uniswap v2核心合约背后的一些设计决策。它涵盖了合约的新功能,包括ERC20之间的任意对,强化的价格预言系统,允许其他合约在给定时间间隔内,估计时间加权平均价格;“互换交易”(flash swaps),使交易者能够在之前获取资产并用于其他地方,在交易的后期付款,以及将来可以开启的协议费。它还会重新设计合约以减少攻击面。

此外,本例白皮书描述了Uniswap v2核心合约的机制,包括存储流动性提供者资金的配对合约以及用于实例化配对合约的工厂合约。

1.简介

Uniswap v1是在以太坊区块链上的智能合约的链上系统,基于“不变产品公式” [1]实现了自动流动性协议。每对Uniswap v1对都存储两个资产的合并储备,并为这两个资产提供流动性,从而保持了储备产品不能减少的不变性。交易者为交易支付30个基点的费用,该费用由流动性提供者支付。合约不可升级。

Uniswap v2是基于相同公式的新实现,具有一些非常令人希望的新功能。最重要的是,它支持创建任意ERC20 / ERC20对,而不是仅支持ERC20和ETH之间的对。它还提供了一个标准化的价格预言,该价格预言在每个块的开头累加了两种资产的相对价格。这使得以太坊上的其他合约可以在任意间隔内估算这两种资产的时间加权平均价格。最后,它启用了“互换交易”功能,用户可以自由接收资产并在链上的其他地方使用它们,而仅在交易结束时支付或返还这些资产。

虽然合约通常不能升级,但是有一个私钥可以更新工厂合约中的变量以开启交易中的5个基点的链上费用。最初将关闭此费用,但将来可能会启用,此后,流动性提供者将在每笔交易中获得25个基点,而不是30个基点。

Uniswap v2还解决了Uniswap v1的一些小问题,并重新实现,减少了Uniswap的攻击面,并通过最小化持有流动性提供者的“核心”合约中的逻辑,使系统更易于升级。

实际使用Uniswap v2将需要通过“路由器”合约调用配对合约,该合约计算交易或存款金额并将资金转移到配对合约。

2.新功能

2.1 ERC-20

对Uniswap v1使用ETH作为过渡货币。每对都将ETH作为其资产之一。这使路由更简单(ABC和XYZ之间的每笔交易都通过ETH / ABC对和ETH / XYZ对),并减少了流动性的分散。但是,该规则对流动性提供者施加了巨大的成本。所有流动性提供者都有以太坊的敞口,并且由于其他资产相对于以太坊的价格变化而遭受永久损失。当两个资产ABC和XYZ相关时(例如,如果它们都是美元稳定币),Uniswap对上的流动性提供者ABC / XYZ所承受的永久损失通常会比ABC / ETH或XYZ / ETH对更少。

使用ETH作为强制性过渡货币也会给交易者带来成本。交易者必须支付的费用是直接购买ABC / XYZ对的费用的两倍,并且遭受两次滑点。 Uniswap v2允许流动性提供商为任意两个ERC-20创建对合约。任意ERC-20之间的线对数量激增,可能会更难找到交易特定线对的最佳路径,但路由可以在更高的层上通过链外或通过链上路由器或聚合器进行处理 。

2.2价格预言


可以通过将资产a的准备金除以资产b的准备金来计算Uniswap在时间t提供的边际价格(不包括费用)。 pt = ratrbt(1)由于如果此价格不正确(套利金额足以弥补费用),套利者将与Uniswap进行交易,因此Uniswap提供的价格倾向于跟踪资产的相对市场价格,如Angeris所示。

[2]意味着它可以用作近似价格的预言。但是,Uniswap v1不能安全用作链上价格预言,因为它非常易于操作。假设其他一些合约使用当前的ETH-DAI价格结算衍生产品。希望操纵所测价格的攻击者可以从ETH-DAI对中购买ETH,触发衍生合约的结算(导致其根据虚高价格进行结算),然后将ETH卖回该对以进行交易。甚至可以作为原子交易完成,也可以由控制区块内交易顺序的矿工完成。

Uniswap v2通过测量和记录每个块的第一次交易之前的价格来改进此预言机功能。这个价格比起区块价格要难操纵。如果攻击者提交的交易试图在区块末尾操纵价格,则其他套利者可能能够提交另一笔交易,随后立即在同一区块中进行交易。矿工或使用足够的gas来填满整个区块的攻击者可以在区块末尾操纵价格,但是除非他们也开采下一个区块,否则他们在套利交易方面可能没有特别的优势。

具体来说,Uniswap v2通过在有人与合约进行交互的每个区块的开头跟踪价格的累积总和来累计此价格。根据区块时间戳2,每个价格均按自上次更新区块以来经过的时间加权。2意味着在任何给定时间(更新后)的累加器值应为该价格的总和。合约历史上每秒的现货价格。


为了估算从时间t1到t2的时间加权平均价格,外部可以在t1处检查累加器的值,然后在t2处再次检查,将第二个值减去第一个值,然后除以经过的秒数。 (请注意,合约本身并不存储该累加器的历史值,调用者必须在时段开始时调用合同以读取和存储该值。)


预言机用户可以选择何时开始和结束此时间段。选择较长的时间段会使攻击者操纵TWAP的成本更高,尽管这会导致价格降低。一种复杂情况:我们应该以资产B来衡量资产A的价格,还是以资产A来衡量资产B的价格?尽管以B表示的A的现货价格始终是以B表示的B的现货价格的倒数,但是在特定时间段内,资产A相对于资产B的平均价格不等于B的现货价格的倒数。资产B相对于资产A的平均价格。

例如,如果美元/ ETH价格在第1区块中为100,在第2区块中为300,则平均USD / ETH价格将为200 USD / ETH,但平均ETH /美元价格将是1/150 ETH / USD。由于合约无法知道用户要使用两个资产中的哪个作为帐户单位,因此Uniswap v2会跟踪两个价格。另一个复杂之处是,有人可以将资产发送到配对合约,从而更改其余额和边际价格,而无需与之交互,因此也不会触发预言机更新。如果合约只是简单地检查自己的余额并根据当前价格更新了预言机,则攻击者可以通过在首次调用该资产之前立即向合同发送资产来操纵预言机。

为防止这种情况,核心合约在每次交互后都会缓存其储备,并使用从缓存的储备而非当前储备中得出的价格来更新预言。除了保护预言机不受操纵外,此更改还可以使合约重新架构。

2.3闪电贷

在Uniswap v1中,使用XYZ购买ABC的用户需要先将XYZ发送到合约,然后才能接收ABC。如果该用户需要他们要购买的ABC以获得他们要支付的XYZ,这将很不方便。例如,用户可能正在使用该ABC在某些其他合同中购买XYZ,以便从Uniswap套利价格差,或者他们可能通过出售抵押品以偿还Uniswap来平仓Maker或Compound的头寸。

Uniswap v2添加了一项新功能,即只要用户在同一原子交易中进行付款,用户就可以在付款之前接收和使用该资产。交换功能在转移出用户请求的代币和强制执行不变式之间调用可选的用户指定的回调协定。

如果合约没有足够的资金,它将还原整个交易。用户也可以使用相同的代币偿还Uniswap池,而不用完成交换。这实际上与允许任何人快速借入Uniswap池中存储的任何资产相同,收取与Uniswap交易费用相同的0.30%的费用。

2.4协议费用

Uniswap v2包含0.05%的协议费用,可以将其打开和关闭。如果启用,则此费用将发送到工厂合约中指定的FeeTo地址。最初,未设置feeTo,并且不收取任何费用。预先指定的地址feeToSetter可以调用Uniswap v2工厂合约上的setFeeTo函数,将feeTo设置为其他值。 feeToSetter也可以调用setFeeToSetter来更改feeToSetter地址本身。如果设置了feeTo地址,则协议将开始收取5个基本点的费用,这是流动性提供商赚取的30个基本点的费用的1 6减。也就是说,交易者将继续为所有交易支付0.30%的费用;该费用的83.3%(交易量的0.25%)将流向流动性提供者,而该费用的16.6%(交易量的0.05%)将流向该费用收件人。在交易时收取这0.05%的费用会给每笔交易带来额外的gas成本。为避免这种情况,仅在存入或提取流动性时才收取累积费用。合同计算累计费用,并在铸造或燃烧任何代币之前立即向受益者铸造新的流动性代币。可以通过测量自上次收取费用以来的√k(即√x·y)的增长来计算总费用。公式为你提供了t1和t2之间累积的费用,以占其流动性的百分比表示。 t2的池:


如果费用是在t1之前激活的,则feeTo地址应捕获在t1和t2之间累积的费用中的1 6。因此,我们想向新的流动性代币铸造到FeeTo地址,以表示池的φ·f1,2,其中φ为1 6。也就是说,我们要选择满足以下关系的sm,其中s1是时间t1的流通股总数:


经过一些操作,包括将1 ?√√k1 k2替换为f1,2并求解sm,我们可以将其重写为:


2.5池份额的元交易

Uniswap v2对创建的池份额本机支持元交易。这意味着用户可以使用签名,而不是通过其地址进行链上交易来授权其池份额的转移。任何人都可以通过调用许可功能,支付gas以及可能在同一笔交易中执行其他操作来代表用户提交此签名。

3.其他

3.1 Solidity

Uniswap v1是在Vyper,类似于Python的智能合约语言中实现的。 Uniswap v2在更广泛使用的Solidity中实现,因为它需要Vyper中尚未提供的某些功能,例如,解释非标准ERC-20代币的返回值的功能,以及访问新操作码的功能 。

3.2合约重新架构

Uniswap v2的一个设计优先事项是最大程度地减少核心对合约(存储流动性提供者的资产的合约)的表面积和复杂性。该合约中的任何错误都可能是灾难性的,因为数百万美元的流动资金可能被盗或冻结。在评估此核心合约的安全性时,最重要的问题是它是否可以保护流动性提供者避免其资产被盗或锁定。可以用来支持或保护交易者的任何功能,允许将池中的一种资产交换为另一种的基本功能除外,都可以在“路由器”合约中处理。

实际上,甚至交换功能的一部分都可以拉到路由器合约中。如上所述,Uniswap v2存储每个资产的最后记录的余额,以防止对预言机机制进行特定的操纵性利用。新架构利用这一优势进一步简化了Uniswap v1合约。在Uniswap v2中,卖方在调用掉期功能之前将资产发送到核心合约。然后,合约通过将最近记录的余额与当前余额进行比较,来衡量其已收到多少资产。

3.3处理非标准和异常代币ERC-20标准

要求transfer()和transferFrom()返回一个布尔值,指示调用成功或失败。这些功能中的一个或两个都在某些代币(包括诸如Tether(USDT)和Binance Coin(BNB)等流行代币)上的实现却没有返回值。 Uniswap v1将这些不正确定义的函数的缺失返回值解释为false(即,表示传输不成功的指示),并还原事务,从而导致尝试的传输失败。

Uniswap v2对非标准实现的处理方式有所不同。具体来说,如果transfer()call没有返回值,则Uniswap v2会将其解释为成功而不是失败。此更改不应影响任何符合标准的ERC-20代币(因为在这些代币中,transfer()始终具有返回值)。 Uniswap v1还假设对transfer()和transferFrom()的调用不能触发对Uniswap对合约的可重入调用。

某些ERC-20代币违反了这一假设,包括支持ERC-777的“挂钩”的代币。为了完全支持此类代币,Uniswap v2包含一个“锁”,可直接防止重新进入所有公共状态更改功能。

3.4包装ETH

与以太坊的本机资产ETH进行交易的界面不同于与ERC-20代币进行交互的标准界面。结果,以太坊上的许多其他协议不支持ETH,而是使用规范的“包装的ETH”代币WETH 。 Uniswap v1是一个例外。由于每对Uniswap v1对都将ETH作为一项资产,因此直接处理ETH是有意义的,这样可以节省更多的gas。

由于Uniswap v2支持任意ERC-20对,因此现在不再需要支持未封装的ETH。增加这样的支持将使核心代码库的大小增加一倍,并有可能导致ETH和WETH对之间流动性的分散化。原始ETH需要包装在WETH中,然后才能在Uniswap v2上进行交易。

3.5确定性地址对

与Uniswap v1中一样,所有Uniswap v2对合约都由单个工厂合约实例化。在Uniswap v1中,这些对合约是使用CREATE操作码创建的,这意味着此类合同的地址取决于该对的创建顺序。 Uniswap v2使用以太坊的新CREATE2操作码生成具有确定性地址的成对合约。这意味着无需查看链的状态,就可以在链外计算对的地址。

3.6最大代币余额

为了有效地实现预言机机制,Uniswap v2仅支持高达2112 ? 1的备用余额。此数字足以支持18个小数位数的代币,其总供应量超过1千万。如果任何一个准备金余额确实超过2112-1,则对swap函数的任何调用将开始失败。为了从这种情况中恢复过来,任何用户都可以调用skim()函数从流动资金池中删除多余的资产。

原文链接:https://uniswap.org/whitepaper.pdf

—-

编译者/作者:洁sir

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...