tp钱包官网下载最新版本|Uniswap:在以太坊上构建自动化做市商——AMM 解码

tp钱包官网下载最/2024-01-02/ 分类:tp钱包苹果版/阅读:
在本系列关于 AMM(自动做市商)的第一个案例研究中,我们以 Uniswap 为例。Uniswap 是以太坊上最常用的三个 AMM 之一,可以认为是第一个常量函数 AM… ...

在本系列关于 AMM(自动做市商)的第一个案例研究中,我们以 Uniswap 为例。Uniswap 是以太坊上最常用的三个 AMM 之一,可以认为是第一个常量函数 AMM。 该协议的第一个版本于 2018 年 11 月 Devcon 4 期间推出。它是一个去中心化交易平台,使用恒定功能协议为交易者提供流动性。

Uniswap V1 的设计很简单:一个专门为以太坊用户交易 ERC-20 代币的 DEX。其开发团队希望建立一个模型,其中去中心化、安全性和抗审查性都是最佳的。 Uniswap 的源代码是开源的,可以在此 GitHub 存储库中找到。

Uniswap 原理

Uniswap 在其去中心化代币交换协议的核心使用恒定乘积公式。其用户可以交易任何类型的 ERC-20 代币。Uniswap 基于一组智能合约。平台上列出的每个 ERC-20 都有其专用合约,称为交换合约。

一个名为 Uniswap Factory 的程序允许任何用户为任何 ERC-20 创建交换合约。因此,工厂是一个寄存器,它将添加到整个系统的所有令牌汇集在一起​​。

每个交易合约都有两个储备金(金库、数字保险箱)。一个有以太币 (ETH) 余额,另一个有 ERC-20 余额,与合约相对应。这些储备也称为该 ERC-20 代币的流动性池。任何以太坊用户都可以将流动性(ETH 和 ERC-20)存入池中。当他们的资金被锁定在智能合约中时,该用户就成为流动性提供者(LP)。然后他将因其贡献而获得奖励。

该奖励与权益成正比,即流动性提供者存入的资金量。为了跟踪存入池中的流动性,该协议使用一种特殊的代币。这些代币称为 LP 代币(流动性提供者代币),是在添加流动性时创建的。如果流动性提供者决定提取资金,相应的 LP 代币将被销毁。最后,他相应份额的储备金被发送给他。

Uniswap:在以太坊上构建自动做市商 – AMM 解码-1

Uniswap V1 特点

Uniswap 开发团队已经建立了一个模型的基础,在接下来的几个月里,许多 AMM 都受到了启发。该平台的功能很基本,注重用户体验:

  • 通过 Uniswap Factory 集成任何 ERC-20 代币;
  • 单笔交易为 ETH/ERC-20 对;
  • 能够使用以太坊名称服务 (ENS) 从任何钱包购买任何 ERC-20 代币;
  • 创建私人和个性化的 Uniswap DEX;
  • 移动端界面(前端)的实现。

目标是实现低交易费用(汽油费)(结果证明这是一个大问题)和最大程度的安全性。Uniswap V1 智能合约是在 Vyper 中编码的。他们使用一种称为轻量级形式验证的方法进行审核。

Uniswap 是如何运作的?

Uniswap 的自动做市 (AMM) 算法明智地使用恒定乘积公式:x*y = k。代币定价对流动性敏感。它由常数乘积自动确定。每个掉期合约(每个 ETH/ERC-20 对一个)包含该对每个元素的流动性。

价格是根据两个储备(流动性池)的相对规模和交易所(交易)规模的函数计算的。

代币互换

当交易者想要以任何方向(ETH 到 ERC-20 或 ERC-20 到 ETH)交易代币时,只需将流动性添加到相应的池中即可。同时,从相反储备中提取流动性。由于以太币是以太坊网络的主要燃料,并且存在于每个 ETH/ERC-20 交易所中,因此它是用于在单笔交易中将 ERC-20 代币交换为其他 ERC-20 代币的支付中介。Uniswap 用户还可以在单​​笔交易中将代币交换并转移到与原始地址不同的地址。

因此,没有订单簿:Uniswap 用户用协议的储备交换他们的代币。

三个变量决定代币的价格:

  • 专门用于交换的 ERC-20 的 ETH 储备的大小(数量);
  • ERC-20代币储备的规模(数量);
  • 出售(输入)或购买(输出)的数量。

对流动性的影响

恒定乘积公式使用 ETH 储备与相应 ERC-20 代币之间的比率来设定代币的价格。因此,任何交换都会影响这个比率:

  • 当出售 ETH 换取 ERC-20 代币时,ETH 储备会增加,而 ERC-20 储备会减少。
  • 当使用 ERC-20 代币购买 ETH 时,ETH 储备会减少,而 ERC-20 储备会增加。

因此,这意味着交易规模越大,对池中 ETH/ERC-20 比率的影响就越大。因此,交易量会影响价格滑点。AMM 报出的价格可以称为“相对价格”,因为它可以从代币的整体市场价值中得出。

旨在减少滑点的参与者是套利者。因此,他们将在必要时增加流动性并利用价格波动。

ETH/ERC-20 订单

对于销售订单(精确输入),采购数量(输出)计算如下:

// ERC20 的 ETH 供应商 const inputAmount = userInputEthValue const inputReserve = web3.eth.getBalance(exchangeAddress) const outputReserve = tokenContract.methods.balanceOf(exchangeAddress).call()

// ERC20 的 ETH 供应商 const inputAmount = userInputTokenValue const inputReserve = tokenContract.methods.balanceOf(exchangeAddress).call() const outputReserve = web3.eth.getBalance(exchangeAddress)

// 输出金额 (quantité achetée) const numerator = inputAmount * outputReserve * 997 const denominator = inputReserve * 1000 + inputAmount * 997 const outputAmount = 分子 / 分母

对于采购订单(确切的输出),成本(输入)计算如下:

// Achat d’ERC20 avec des ETH const outputAmount = userInputTokenValue const inputReserve = web3.eth.getBalance(exchangeAddress) const outputReserve = tokenContract.methods.balanceOf(exchangeAddress).call()

// ERC20 的 ETH const outputAmount = userInputEthValue const inputReserve = tokenContract.methods.balanceOf(exchangeAddress).call() const outputReserve = web3.eth.getBalance(exchangeAddress)

// 计算 const 分子 = 输出量 * inputReserve * 1000 const 分母 = (outputReserve – 输出量) * 997 const inputAmount = 分子 / 分母 + 1

应付给流动性提供者的费用如下:

费用 = 输入金额 * 0.003

汇率是输出量除以输入量:

消耗率 = 输出量 / 输入量

ERC-20/ERC-20订单

在一对 ERC-20 代币之间进行交易时,我们需要 4 个变量来确定价格:

  • 首先,输入ERC-20代币的ETH池的大小;
  • 然后是输入代币在 ERC-20 中的储备大小;
  • 接下来,ERC-20输出的ETH池的大小;
  • 最后,输出ERC-20代币池的大小。

当然,出售的代币数量(确切的输入)和购买的代币数量(输出)也是必要的参数。

对于销售订单(精确输入),我们计算购买数量(输出)如下:

//代币A (ERC20) 与 ETH 的转换 const inputAmountA = userInputTokenAValue const inputReserveA = tokenContractA.methods.balanceOf(exchangeAddressA).call() const outputReserveA = web3.eth.getBalance(exchangeAddressA)

const 分子A = 输入量A * 输出保留A * 997 常量分母A = 输入保留A * 1000 + 输入量A * 997 常量输出量A = 分子A / 分母A

// ETH 与代币B 的转换 const inputAmountB = outputAmountA const inputReserveB = web3.eth.getBalance(exchangeAddressB) const outputReserveB = tokenContract.methods.balanceOf(exchangeAddressB).call()

const 分子B = 输入量B * 输出保留B * 997 常量分母B = 输入保留B * 1000 + 输入量B * 997 常量输出量B = 分子B / 分母B

对于采购订单(确切的输出),成本(输入)计算如下:

//代币B 和 ETH const outputAmountB = userInputTokenBValue const inputReserveB = web3.eth.getBalance(exchangeAddressB) const outputReserveB = tokenContractB.methods.balanceOf(exchangeAddressB).call()

// 计算 const numeratorB = outputAmountB * inputReserveB * 1000 const denominatorB = (outputReserveB – outputAmountB) * 997 const inputAmountB = numeratorB / denominatorB + 1

// Achat d’ETH avec代币A const outputAmountA = userInputEthValue const inputReserveA = tokenContractA.methods.balanceOf(exchangeAddressA).call() const outputReserveA = web3.eth.getBalance(exchangeAddressA)

// 计算 const numeratorA = 输出量 A * inputReserveA * 1000 const 分母A = (outputReserveA – 输出量A) * 997 const inputAmountA = 分子A / 分母A + 1

在这种情况下,流动性提供者费用适用两次(0.3% + 0.3%):

常量交换AFee = 输入金额A * 0.003 常量交换BFee = 输入金额B * 0.003

由于用户只携带代币A,因此可以这样表示:

const 组合费用 = 输入金额A * 0.00591

那么汇率是:

消耗率 = 输出量 B / 输入量 A

仲裁

套利机制确保资产的相对价格不会与其内在价格偏离太多。有了这些套利机会,流动性也会定期添加到储备中。事实上,如果价格大幅波动,套利者可以通过增加资金池的流动性来获利。

费用和 LP 代币

Uniswap 费用为 0.3%。这些佣金适用于每笔交易,相应的代币将添加到流动性池中。因此,这确保了储备中的资产数量将随着时间和使用而增加,无论配对中两种资产之间的比率如何变化。

这些费用有利于流动性提供者。当 LP 想要提取资金时,相应的 LP 代币就会被烧毁。这些代币决定了流动性提供者拥有多少资金池。因此,费用会按照所提供的流动性的比例添加到提取的资金中作为奖励。

使用“标准”Uniswap 池(使用 Factory 创建),流动性提供者只能为单个专用 ERC-20 池创建 LP 代币。这确保了给定 ERC-20 的流动性不会分散在多个储备中。

流动性代币(LP代币)是高度可分割的。流动性提供者可以随时决定销毁它们。然后他们按照贡献的比例收到资金。

深入研究 Uniswap 代码

在这一部分中,我们将回顾 Uniswap 协议的主要功能。

流动性铸造功能

每个掉期合约都包含 ETH 储备及其相关的 ERC-20。因此,这些是每个合约的 ETH 和 ERC-20 余额:

const ethReserve = web3.eth.getBalance(exchangeAddress) const tokenReserve = tokenContract.methods.balanceOf(exchangeAddress)

增加流动性

当流动性提供者存入储备金时,该协议使用 addLiquidity() 函数。然后创建流动性代币:

Exchange.methods.addLiquidity(min_liquidity,max_tokens,截止日期).send({ value:ethAmount })

LP 代币的数量取决于发送到该函数的 ETH 数量。流动性提供者还必须存入相应价值的ERC-20代币。因此,它是定义初始汇率的池中的第一个流动性提供者。如果它偏离外部市场的汇率,那么套利者可以使价格恢复平衡,但代价是流动性提供者的损失。

  • ethAmount 是存入 ETH 的确切金额,是 LP 提供的流动性总额的一半。该变量用于确定要存入的 ERC-20 数量。
  • max_tokens 用于限制汇率波动。对于第一个流动性提供者来说,这就是存入的代币的确切数量。
  • min_liquidity 通过组合前两个变量来限制流动性代币的创建速率。
  • 截止日期允许您设置一个时间限制,在此之后交易将无法执行。因此,矿工没有能力持有已签署的交易并根据对自己有利的市场价格执行交易。

取现金

removeLiquidity() 函数允许有限合伙人提取他们的储备份额:

Exchange.methods.removeLiquidity(金额,min_eth,min_tokens,截止日期).send()

amount 指定要销毁的流动性代币的数量。将其除以流动性代币总量即可得出流动性提供者提取的 ETH 和 ERC20 的百分比。

因此,这些流动性的提取比例与提取时准备金的比例相同。同样,如果汇率不好,那么就有一个套利机会来纠正价格。

订单调整

Uniswap AMM 完全部署在链上。因此,在交易签署(交易启动)的时刻和包含该交易的区块之间存在延迟。这会导致价格波动。

可以调整卖单的最小销售数量或买单的最大购买数量。同样,我们可以设置一个截止日期,超过该截止日期后交易将不再执行。因此,交易者可以保证,如果不满足所需条件(数量、价格和延迟),他的订单将不会被执行。

交易的截止日期以秒为单位定义:

web3.eth.getBlock(‘latest’, (error, block) => { Deadline = block.timestamp + 300 // 交易在 300 秒(5 分钟)后过期 })

例如,延迟300秒后,该交易将不会被矿工收录。这些交易截止日期有两个优点:

  • 交易者可以阻止矿工长时间“暂停”交易。事实上,他们可能会根据市场走势将它们纳入一个区块中;
  • 这限制了用户天然气成本的不确定性。

个性化流动性储备

虽然在 Factory 注册的公共储备与其专用的 DEX 相关联,但 Uniswap 用户可以创建自定义池。他们有自己的设置。价格形成机制可能不同,创建流动性代币的费用或系统也可能不同。

当然,偏离 Uniswap 的初始模型可能会导致协议安全方面的问题。

Uniswap 类型 AMM 的挑战

设计恒定功能 AMM 面临许多需要克服的挑战。每个去中心化 AMM 设计都是协议所需属性和由此产生的限制之间的折衷。

第一个约束显然是建立一个确保流动性提供者资金最大安全的体系。然后我们必须最大化有限合伙人的投资回报,鼓励他们存入准备金。最后,资本配置必须是最优的,以确保市场拥有最佳的流动性。

无常损失

当流动性提供者在准备金率发生变化后提取资金时,就会发生无常损失。

当流动性提供者销毁其 LP 代币时,为了从流动性池中提取其以太坊和 ERC-20 份额,这些资金将按当前汇率提取,由准备金率决定:

  • ethWithdrawn = ehtPool * (烧毁金额 / 总金额)
  • tokensWithdrawn = tokenPool * (销毁金额 / 总金额)

流动性提供者面临的风险

随着市场价格波动,如果当前准备金率与初始准备金率(存款时)不同,流动性提供者可能会损失价值。这就是我们所说的无常损失:存入AMM储备中的两种资产的初始价值与其当前价值之间的差额。

这是流动性提供者面临的主要风险之一:通过借贷和锁定其代币而不是简单地将其安全地保存在钱包中而损失价值。无常损失的风险取决于为池提供资金的流动性提供者的数量以及存在的代币数量。

无论资产对的价格走向如何,都会发生无常损失。唯一重要的是存款价格和取款价格之间的差值的绝对值。

无常损失的机制

因此,无常损失是 LP 代币提取时的价值与标的资产的理论价值(如果它们没有被锁定在储备金中)之间的差额。我们将通过一个例子来说明这个机制。

假设 Bob 将 10 ETH 和相应数量的 ERC-20 存入流动性池。存款时,1 ETH = 1000 美元。因此,按照 50/50 的比例,Bob 必须将 10 ETH + 10,000 美元存入储备金。

如果池子的总价值为 100,000 美元(50 ETH 和 50,000 美元),那么 Bob 拥有池子的 20% – (20000/100000)*100。

因此,鲍勃通过存入他的以太币和稳定币份额来为该池做出贡献。他可以随时通过销毁他的 LP 代币来提取他的股份。我们说的是份额,而不是固定数量的筹码!

如果存入资产(在我们的例子中是 ETH)的价值在借贷期间发生变化,鲍勃将遭受无常损失。以太币的当前价格与初始价格偏离越大,损失就越大。

我们使用“无常”一词是因为如果资产价格回到其初始价值,流动性提供者不会损失任何东西。交易费用作为对流动性提供者的奖励,有助于抵消潜在的无常损失。

无常损失的计算

假设自从 Bob 存入 10 ETH 以来,以太币的价格从 1000 美元上涨到 2000 美元。恒定的乘积函数为我们提供:

以太币价格如下:

货币对中每种资产的流动性计算如下:

eth_liquidity_pool = sqrt(constant_product / eth_price)

token_liquidity_pool = sqrt(constant_product * eth_price)

如果以太币的新价格为 2000 美元,则:

ETH流动性 = 35,355

USDT流动性 = 70 710,6

我们可以使用常数积来验证 k 确实相同:

如果 Bob 希望从储备中提取他的份额,他将获得池中以太币和 USDT 数量的 20%:

  • 35 ETH 或 7 ETH 的 20%;
  • 70 710 USDT 的 20% 相当于 14142 USDT。

如果我们计算其资产的总价值,我们会得到:

7 * 2000 + 14 142 = 28 142 USDT

如果他没有存款,鲍勃的资产总价值将为:

10 * 2000 + 10 000 = 30 000 USDT

因此,Bob 遭受了 30000 – 28142 = 1858 USDT 的无常损失。

模型化

可以将无常损失建模为当前价格(作为初始价格的百分比)和总资产价值变化(也作为百分比)的函数:

Uniswap:在以太坊上构建自动做市商 – AMM 解码-2来源:AlfaBlock

我们可以观察到:

  • 1.25 倍的价格变化会带来 0.6% 的无常损失
  • 1,5x => 2%
  • 1,75x => 3,8 %
  • 2x => 5,7 %
  • 3x => 13,4 %
  • 4x => 20 %
  • 5x => 25.5%。

因此,养殖期间积累的费用必须补偿价格波动造成的无常损失。因此,如果流动性提供者想要产生利润,这些变化不应该太大。

减少无常损失

由于加密货币市场高度波动,只有一种方法可以避免无常损失。这仅涉及为稳定币对提供流动性!

同样,通过为包括稳定币在内的资产对提供流动性,可以降低无常损失的风险。因此,货币对中的资产波动性越大,风险就越高。然而,如果流动性提供者采取“仅稳定币”策略,则不会从牛市中受益。

因此,想要降低无常损失风险的流动性提供者将选择低波动性加密货币和代币(如果存在)。他们还必须谨慎选择何时通过销毁流动性代币来提取资金。

在使用 AMM 的大交易量 DEX 上,在正常市场条件下,费用可以补偿无常损失。这就是农业对流动性提供者保持盈利的方式。

资本效率

像 Uniswap 这样的常数函数 AMM 还有另一个值得一提的缺点。这涉及到存入资金池的资本相对低效。

这些储备需要比传统中心化平台的订单簿大得多的流动性。因此,只有当处于恒定乘积函数双曲线的极值部分时,才能获得大量流动性。也正是当我们趋向于曲线的这些渐近线之一时,该函数对价格的影响最强。因此,相应的流动性虽然可以获得,但永远不会被理性交易者使用。

这种现象是 Uniswap 等恒定功能 AMM 的典型现象。我们谈论“惰性流动性”。在中心化交易所,做市商可以准确确定在给定价格水平下他们想要在订单簿中放置多少流动性。CFMM 的情况并非如此:流动性提供者对价格水平没有影响。

通过使用其他函数定义流动性池之间的关系可以提高资本效率。还有流动性集中机制,我们将在本 AMM 系列的后续文章中探讨。Curve 和 Uniswap V3 的情况尤其如此。

滑倒

上面我们已经量化了交易对代币价格的影响。这样我们就知道大批量交易是如何导致滑点的。这是常数函数 AMM 的典型缺点。对于通过执行大批量订单消耗过多流动性的交易者来说,这会导致巨大的滑点成本。

Uniswap:DeFi AMM 的概念证明

最后,让我们提一下 Uniswap 是在 Vitalik Buterin 本人的建议下诞生的。2016年,他鼓励开发者和研究人员设计一个基于AMM的去中心化交易平台。当时,链上去中心化交易所的利差非常高。维塔利克随后建议转向自动化做市商,类似于预测市场中使用的做市商。

Hayden Adams 开始致力于这个项目,几个月后部署了第一个版本。作为概念证明,Uniswap 迅速发展,吸引了世界各地许多用户的流动性。真正的革命是它的经济激励机制,它吸引了整个以太坊社区的资金。

得益于以太坊基金会的资助,Uniswap 项目得以发展。开发团队很快就得到了 Paradigm 的资助。尽管遇到障碍,团队不断改进他们的产品,如今,Uniswap 已成为整个加密行业中最具价值的聚合去中心化交易所。

Uniswap 还充当了整整一代 AMM 的基础。它的一些智能合约仍然被更现代的平台使用。因此,它是成功通过时间考验的AMM模型。

当然,DeFi 世界一直在发酵。许多自动做市商根据其用例采用了不同的定价功能。我们将在接下来的文章中看到,可以重新定义这些功能,以交换特定的加密资产,例如稳定币。同样,Uniswap 实验使得开发和提供众多功能和经济激励机制成为可能,以改进致力于去中心化金融的 AMM。

TAG:
阅读:

热门文章

HOT NEWS
  • 周榜
  • 月榜
TP钱包官方下载_TP钱包app官网版/最新版本/安卓版下载_tpwallet钱包
微信二维码扫一扫
关注微信公众号
Copyright © 2021-2023 TP钱包官方下载_TP钱包app官网版/最新版本/安卓版下载_tpwallet钱包|网站地图|推送
二维码
意见反馈 二维码