深入了解dYdX,去中心化衍生品协议的基本构成是怎样的
前言:在当前的DeFi生态系统当中,借贷应用牢牢占据着主导地位,诸如Maker、Compound都属于此类,而衍生品交易应用则处于第二梯队,而dYdX就属于其中之一。
此前,译者已 简单介绍 了dYdX项目的概念与情况。
而在这篇文章中,我们将深入了解dYdX协议的基本构成。
dYdX协议(又称"Solo")由运行在以太坊区块链上的 智能合约 组成,正是这些合约,在支持去中心化保证金交易及借贷操作。
目前, trade.dydx.exchange 已经在使用Solo协议。
基于账户
Solo是基于账户的,Solo支持的每个资产账户都有余额,而余额可以是正的(表示资产的净供应),也可以是负的(表示资产的净借入),另外,账户必须维持一定水平的抵押品,否则将被清算。
例子
以太坊地址
0x6b5Bb4E60821eCE7363CaFf836Be1A4f9e3559B3
在其账户号
123456
中拥有以下这些余额:
- ETH: 1,000
- DAI: -10,000
- USDC: -5,000
(Market)市场
Solo为其支持的每个ERC20代币资产提供了一个市场。每个市场都规定了价格预言机(Price Oracle)(用于确定其资产价格),以及决定市场利率是多少的利率设定合约。
目前Solo只支持了以下几个市场,并由数字ID来表示:
利率
Solo系统中的利率是动态的,每个市场的设定也会不同。每一个市场利率都是根据市场(总借款)/(总供给)的比率自动按算法设定的。当账户余额为正时,其将持续赚钱利息,而当余额为负时,其将持续支付利息。利息是连续赚取/支付的,协议中的费率以年百分率表示。
Wei & Par
在Solo中有两种类型的余额:Wei 和 Par。
1、Wei
Wei是指账户中持有实际资产代币的金额,随着余额利息的增加,Wei的数额不断变化。例如,如果Bob将10 DAI存入一个Solo账户,其Wei余额最初将为10,而随着Bob开始在DAI上获得利息,其余额将开始每秒增长。
大多数时候,你很可能会想用Wei余额来显示自己的资产变化。
2、Par
Par是指利息调整后金额,该金额是静态的,在协议中不会有变化。
这些是实际存储在协议智能合约中的余额。协议使用当前市场指数(见下文)将Par值转换为Wei值。
指数
每个市场都有一个全球借贷指数和供应指数,这些指数被用于转换Par Wei值(使用以下公式):
借款Wei余额 = (借款Par余额)*(借款市场指数)以及
供给Wei余额 = (供给Par余额)* (供给市场指数)在市场加入到协议后,指数是从1开始的,它们会根据资产的累积利息而增加。例如,在加入USDC后,USDC的借款指数和供给指数均为1。比方说,在下一个月,借款人将获得2%的利息,贷款人将获得1%的利息。之后,供给指数为1.01,而借款指数则为1.02。这些指数将随累积利息的增加而增加。
例子:
Alice向协议存入了10 个DAI (则其Wei余额为10 DAI),目前DAI的供给指数为2。使用供给Par余额 = (供给Wei余额)/(供给市场指数)= 10/2 = 5,协议将5 Par 余额记入Alice的账户。
后来,协议累积了DAI利息,现在DAI的供给指数为3。现在,Alice提走自己的DAI,而她的DAI Par余额仍然是5(Par不会随时间变化)。现在,协议计算供给Wei余额 = (供给Par余额)* (供给市场指数)= 5*3 = 15,并将15个 DAI发送给Alice。
Action(操作)
帐户的所有状态更改都是通过Action(操作)进行的。Action(操作)可以修改一个或多个帐户的余额。Solo中没有所谓的“借款”Action操作,如果账户余额减少,Action可自动借入资金。Solo支持以下Action(操作):
Deposit(存款)
将资金存入账户,资金从发送者或批准地址那转移到Solo,账户的余额递增。
Withdraw(提款)
从帐户中提取资金,资金从Solo发送到指定的地址,然后账户的余额递减。
Transfer(转移)
在两个Solo账户之间内部转移资金。
Buy(购买)
使用一种资产在一家去中心化交易所上购买资产。使用dYdX的 交易所封装器 与不同的去中心化交易所(DEX)进行交互。导致购买资产的余额上升,而用于购买的资产余额下降。示例:使用DAI在eth2dai上购买1个WETH。
Sell(出售)
在去中心化交易所将一项资产出售换取另一项资产。使用dYdX的交易所封装器与不同的DEX进行交互。导致售出资产余额下降,而收到资产余额上升。示例:在eth2dai上出售1个WETH,换取DAI。
Trade(交易)
在Solo系统内部与另一个账户进行资产交易。实际上不会移动任何代币,但账户余额会发生更新。使用 AutoTrader 接口,允许指定智能合约,该合约被调用以确定交易价格。
Call(调用)
通过帐户的上下文调用 ICallee 接口指定的函数,不修改账户余额。如何使用它的一个例子是,设定 Expiry 合约的到期日。
Liquidate(清算)
清算抵押不足的账户。对两个账户进行操作:清算账户以及抵押不足账户。该操作不会传输任何代币,而是在系统内部更新账户余额。以示例指定的价格进行清算:
起始帐户余额:
清算账户(L):+100 DAI 抵押不足账户(U): -1 ETH,+150 DAI ETH预言机(oracle)价格: $125 DAI 预言机(oracle)价格 : $1 清算价差 : 5%
清算行动导致1 ETH 从L转移至U,
1 ETH * (($125/ETH) / ($1/DAI)) * 1.05 = 131.25 DAI
从U转移至L。清算后余额为:
清算账户(L): +231.25 DAI , -1 ETH 抵押不足账户(U) : +18.75 DAI
Vaporize(汽化)
从保险基金中提取资金,使一个只有负余额的“水下账户”(underwater account,指已清算账户)实现再抵押。
Operation(操作)
对协议的每个状态更改操作,都是通过Operation发生的。Operation包含一系列Action,每个操作对一个帐户执行。
在一个Operation中,可以将多个Action串接在一起,以实现与协议更复杂的交互。例如,在Solo上执行做空ETH,可通过包含以下Action的Operation来实现:
Sell ETH for DAI Deposit DAI重要的是,抵押只在operation操作结束时检查,因此允许在一次Operation的范围内对账户进行暂时性的欠抵押。这允许像Sell -> Trade这样的Operation操作,在这种操作中,首先出售资产,然后将抵押品锁定为Operation中的第二个Action。
Amount(金额)
Solo中的金额按以下三项命名:
1、
value
金额的数值
2、
reference
AmountReference.Delta
: 指相对于现有余额的金额
AmountReference.Target
: 表示绝对金额
3、
denomination
AmountDenomination.Wei
:指被转移代币实际单位的金额(见Wei)
AmountDenomination.Par
:表示金额以本金计价,Solo在其内部会计中使用这些类型的金额,并且它们不会随时间的推移而改变(见Par)
需要注意的是,金额总是与账户余额的变化有关,而不是与所发生的Action数量有关。例如使用[伪代码]
withdraw(-10)
,当你取款时,账户余额就会减少。