查看原文
其他

用dYdX做空以太坊时,内部合约是怎么运作的?

orangefans 橙皮书 2019-12-11

在传统的金融市场里,期货的规模可能是现货的100倍。显然金融衍生品是一块更大的市场。

现在许多中心化交易所除了币的买卖交易,也开始提供一部分的期货交易,做衍生品的生意。

火币在去年11月推出火币衍生品市场,最初提供比特币的撮合服务,后面又加上了以太坊和EOS,前段时间他们放出了一个新闻,说自己的衍生品市场交易额已经突破了200亿美元大关,量看起来还不错;而 OKEx 则在更早之前就推出了衍生品服务,后面还搞了一个“永续合约”的玩法,他们大部人的用户也都是炒的期货。当然,这样的代价是一旦爆仓,大家也会骂得更凶。毕竟期货的风险加上杠杆更大,很容易一夜清零。韭菜们私底下就有句话叫,「珍爱生命,远离期货」。但另一方面,虽然现在是熊市,但因为可以做空,很多投资者押注熊市里各种币会下跌,因此很多借贷市场反而比牛市的时候表现更好。

说了这么多,想表达的观点是,加密货币现在还属于一种非常初级的金融产品,衍生品和期货这块才刚开始接入。在这种背景下,就像交易所,一开始盛行的是中心化的交易所,于是就有人想要遵循区块链的原教旨主义做去中心化的交易所,金融衍生品这块大蛋糕,也有一些人想用智能合约做去中心化的版本。

dYdX就是一个去中心化的金融衍生品协议。这篇文章我们来了解下dYdX具体是怎么做的,相比中心化的金融衍生品服务,它有什么缺点和优点。

dYdX 简单介绍

dYdX的创始人很年轻,好像是15年才毕业的,学计算机的,毕业后在 Uber 干过。他一开始只是抱着学习下智能合约的心态,就开始写dYdX的协议,后来写着写着就拿到融资了,也挺牛逼的。

具体来看dYdX的协议,它其实就是用一些智能合约把金融衍生品的交易规则重写了一遍,重新实现出来。

在技术上,这里面有几个关键问题需要解决:

第一个问题是怎么让用户通过合约来做空或者做多。围绕dYdX的协议,开发者可以推出一个特定的期货token,比如一个token叫以太坊做空币,用户买这个币就可以做空以太坊,因为这个做空币的价格始终会与以太坊价格成反比。dYdX希望后续能为每个ERC20的币都推出相应的期货token;

第二个关键问题是,做空做多是需要有借贷和交易的,在传统金融模式下,这些由金融机构和中心化交易所提供,但在链上,这些事情则由智能合约自动执行,这样一来,合约就要有自己能买卖的能力,但它又不可能去接中心化交易所的api,去和火币或者币安做交易,所以,dYdX这部分功能是基于0x协议来做的,通过去中心化交易所来提供智能合约需要的流动性。

dYdX协议现在还在持续开发中,基于这套协议,他们已经推出了一个具体的产品叫expo,一个衍生品交易市场,目前expo上面只有一款产品叫保证金交易(即margin trading,如果你跟我一样是金融白痴,可以先拉到最下面把附录里“什么是保证金交易”搞懂),上面只有两种币可以买,一个叫sETH(short eth),用来做空以太坊;另一个叫lETH(long ETH),用来做多以太坊。

值得一提的是,现在使用这个产品的体验已经挺流畅的了,如果你浏览器上有装metamask,直接打开expo官网,买做空币或者做多币,输入具体的金额数量,然后按下回车键就能成交了。

期货的杠杆倍率、利率和到期时间都是预先设定好的,你只需要输入购买金额就可以了。我的以太坊地址实在太穷了,打码保护一下自尊。

这个体验跟传统金融衍生品的体验也不太一样。

有两个最大的不同点:

第一个不同是,整套保证金交易的机制,实际上都被抽象出来了,用户对此是“零感知”的,这简化了很多参与保证金交易的门槛和步骤,因为很多事expo都通过dYdX的协议自动帮你做完了,这些事包括:

  • 自动从dYdX的借贷合作伙伴里寻找衍生品底层所依靠的现货资产的流动性。

  • 自动从去中心化交易所里寻找交易的流动性。

  • 自动负责抵押品的管理。

  • 自动铸造新的做空币或者做多币,为用户提供保证金交易的服务。

第二个不同是安全性和透明性,因为你是在链上跟智能合约做交易,不是把钱打给中心化的机构。这部分的区别,跟去中心化交易所和中心化交易所的区别差不多。

那么,dYdX具体是怎么完成保证金交易的呢?我们通过 dYdX 的白皮书了解下。

dYdX协议的原理

dYdX协议通过一个主要的以太坊智能合约来提供基于 ERC20 代币的保证金交易。

  • 出借人通过合约签名一笔交易,指明自己愿意借出什么样的token、借出多少数量、保证金多少、利息多少,然后就可以借款给别人做保证金交易了。这些借款的offer可以同步到链下的交易平台,在上面列出order book。

  • 一个用户想要做保证金交易,通过向dYdX的智能合约发送一笔交易,指明自己要接受哪个借款、要借多少数量、指定一个未来把这些借贷来的 token(即owed token)卖出换成另一个持有token(即 held token)的买盘,来开始保证金交易。

  • 根据这笔交易,智能合约会把保证金从用户那里转移到合约内部,然后通过外部的去中心化交易所——比如0x——再把这些借贷来的owed token以指定的买盘价格卖出去换成held token,然后合约会一直帮我们保管这些保证金,一边帮我们自动卖出owed token换成held token,直到用户再次发来另一笔交易,指定卖盘结束这次保证金交易。

在这里面,总共有两种用户,他们分别扮演借贷人和交易者(交易者可以是做空者,也可以是做多者),这两种角色围绕智能合约一起运作。

三个合约

在实现上,dYdX协议由三个主要的智能合约构成。

  • Margin contract:负责保证金交易的业务逻辑。

  • Proxy contract:负责代表用户完成各种资产的转移。

  • Vault contract:作为一个存储金库,帮用户托管保证金交易中的资产。

合约更详细的信息,感兴趣的朋友可以直接参考 dYdX 在 github 上的代码。

接下来,我们来看看在dYdX上,一个保证金交易具体经历的流程和细节是什么样的。

Offering Message

要进行保证金交易,首先需要有人借款。

这个出借人想把自己手里持有的某个token借出去,需要指定借出的利率和保证金,然后就把借贷消息转发到各个地方,可以是链下的平台,具体怎么让出借人和借钱的人达成一个贷款共识,也就是所谓的“撮合”部分,dYdX的智能合约是不管的,换句话说,撮合可以通过传统的中心化的方式完成。

Buyer

保证金交易的另一部分就是买盘。买盘可以像贷款一样,通过任何方式来完成撮合,进行传播。这个买盘可以是任何价格,唯一的要求是必须由交易者选定,然后买盘的总价值要不少于交易者借款的token的价值。通常交易者会选择价格最好的订单。

dYdX允许交易者使用任何标准的去中心化交易所。这一点是通过dYdX自己把外部的去中心化交易所的智能合约,重新封装进了另一个智能合约来完成的。这个新的智能合约叫ExchangeWrapper,它会向保证金交易提供标准的接口。

交易者可以指定使用任何 ExchangeWrapper,不需要任何许可。这意味着任何人都可以编写、发布或者使用自己的ExchangeWrapper。dYdX官方实现了第一个封装0x协议的ExchangeWrapper,所以任何0x的订单都可以被交易者用于保证金交易中。

Position Opening

要开启一个保证金交易,交易者向Margin智能合约发送这样一笔交易,包括以下信息:

  • 接受哪笔借款。

  • 一个买盘,指定怎样用owed token 购买 held token 。

  • 买盘的 ExchangeWrapper 地址。

  • 希望借多少owed token,借贷的数量。

  • 保证金使用owed token支付还是使用held token支付。

  • 保证金数量

  • 交易者的地址

当Margin智能合约收到消息后,会执行以下动作:

  1. 确认借贷生效

  2. Margin合约首先会调用Proxy合约,把保证金从交易者那里转移到新的地方(如果保证金是held token,就转移到 Vault 合约里,如果是owed token,就转移到 ExchangeWrapper 上,通过去中心化交易所交易出去。

  3. Margin合约调用Proxy合约,把owed token从出借人那里转移到 ExchangeWrapper 上。

  4. Margin合约记录下借来的token被用掉了多少,然后保存成一个mapping。这是为了防止黑客使用签名过的借款消息发动replay攻击。

  5. Margin合约调用ExchangeWrapper,按照买盘的说明,把owed token交易成相应的held token。在这个交易里,买家是maker,ExchangeWrapper是taker。交易合约(如果是使用0x的ExchangeWrapper,那么交易合约就是0x)会确认交易信息,然后执行交易。

  6. Margin合约调用Proxy合约,把ExchangeWrapper卖掉收到的held token转移到Vault合约里。在保证金交易有效期间,Vault合约会把这些held token一直锁在自己的合约里。

  7. 这个保证金交易的详细信息被存在了合约里,通过一个公共标识映射起来。后续交易者或者出借人可以通过这个公共标识和这个postion进行交互。

所有这一切都是原子交易,也就是说,要么成功发生,要么完全不发生。

最终,Vault合约里会持有一定数额的held token,如果交易者上交的保证金是held token,那么,这个数额就等于保证金的数额加上卖出owed token挣到的held token的数额;如果交易者上交的保证金是owed token,那么,这个数额就等于借来的owed token和保证金一起卖出挣到的held token的数额。Vault合约在保证金交易没有结束之前都会一直锁定这些held token。

Closing

交易者可以选择在任何时间结束一部分的postion。结束的方法是向Margin合约发送一个卖盘,这个卖盘指定,把held token卖掉,卖多少呢?卖出多于或等于欠出借人owed token的数量(包括一点利息)。这个卖盘可以指定任何价格,只要held token的数量(根据要结束的position的比例换算)足够完成支付。通常交易者会倾向于选择价格最低的订单。

当Margin合约收到关闭position消息的时候,它会执行以下动作:

  1. 计算当前总共欠出借人多少owed token。使用连续复利的方式进行计算。

  2. 如果是通过held token偿还,Margin合约调用 ExchangeWrapper 归还一定的held token数量(根据欠下的owed token的数额计算);如果是通过owed token偿还,则调用ExchangeWrapper 卖出所有的held token,买入相应的owed token。交易过后,Vault 合约将持有等同于欠款数额的owed token ,以及一定数额的owed token或者held token,这些token等于保证金+交易者的利润(利润可以是负值)。

  3. Margin合约调用Proxy合约,把欠款数额的owed token 从 ExchangeWrapper 那里转移到出借人手里。

  4. Margin合约把等于保证金+利润数额的held token或者owed token发送给交易者。

  5. Margin合约从存储里删除了一个postion,如果当前数额为零的话,或者把当前positon的数额根据关闭position的数量大小做相应的减少。

当然,不止是交易者,出借人也是可以提前终止postion的。出借人可以向Margin合约发送消息,要求交易者必须在xx时间之前补足多少数量的held token作为保证金,否则这次margin trading的postion就会被结束。交易者在限定时间之前要么必须补足保证金,要么必须偿还干净所有的owed token。如果交易者两件事都没有及时完成,那么合约里所有的held token余额都会归出借人所有。

出借人根据自己的利益,会在owed token相对于held token的价格上升到保证金里的held token已经几乎无法购买相应的owed token的时候,要求结束position。出借人可以授权第三方帮他们看管这个价格信息。第三方持续观察价格走势,一有危险就提出结束position的请求。这个第三方可以通过中心化的oracle来完成。

这样也要求交易者要随时在线,在收到出借人要关闭position的时候能及时响应,交齐保证金或者清还贷款。交易者可以授权一个外部合约,让合约代表自己进行一些操作,这样一来就不用保持随时在线了。这个合约可以通过运行一个荷兰拍卖合约来完成,买回相应的owed token欠款。

例子

上面把所有的原理和过程都说清楚了,但可能还是很难看懂。没关系,我们代入一个实际的例子,跑一遍流程,也许你就会懂了。

假设现在我想通过比特币来做空以太坊(即:我认为未来一个月,以太坊相对于比特币的价格会暴跌),那我要怎么办呢?

  1. 首先寻找市面上的eth贷款,找别人借eth。Margin合约把eth从借款人那里转移到ExchangeWrapper上。

  2. 然后要交一部分的保证金,比如10%,用held token来交,也就是比特币,Margin合约调用Proxy合约把比特币从你手上转移到Vault 合约里。

  3. 接下来,Margin合约调用ExchangeWrapper,按照你给出的买盘说明,把eth出售交易成相应的比特币。

  4. 然后,Margin合约调用Proxy合约,把ExchangeWrapper买回的比特币转移到Vault合约里。在保证金交易有效期间,Vault合约会把这些比特币一直锁在自己的合约里。

一个月后,以太坊相对比特币的价格真的跌成狗了,那么你可以退出了,发消息给Margin合约要结束这次保证金交易,合约会执行以下操作:

  1. 首先计算你当前总共欠出借人多少个以太坊,使用连续复利的方式进行计算。

  2. 然后,如果是通过比特币偿还,Margin合约就会去调用 ExchangeWrapper 归还一定的比特币(数量等于之前欠下的以太坊的总价值,加上事先说好的一部分利息),然后剩余的比特币就是你交的保证金+赚到的利润了;

  3. 如果是通过以太坊偿还,则调用ExchangeWrapper 卖出一定数量的比特币,买入相应的以太坊,交易过后,Vault 合约将持有等同于欠款数额的以太坊 ,以及一定数额的以太坊或者比特币,这些剩下的比特币或者以太坊就等于你交的保证金+赚到的利润了。

  4. 当然,如果一个月后,以太坊相对比特币的价格没有跌反而涨了,那么你的利润也可以是负值。

总的过程大概就是这样。当然,还有两个问题需要注意:

  1. 如果出借人看到以太坊的价格反而上涨了,他怕你交的保证金完全抵押不了损失,会爆仓,那他就可以提前召回自己的贷款,回收你欠他的以太坊,或者叫你交更多的比特币作为保证金,以确保不会爆仓。

  2. 如果我认为未来一个月,以太坊相对于比特币的价格会暴涨,我想做多以太坊怎么办呢?把上面的owed token和held token互换一下,就能达到这个效果了,即:找别人借比特币,用btc交易eth。

dYdX 的未来

去中心化的数字货币衍生品是非常有趣的一个市场,但我并不是金融专业出身,所以,我其实不知道,dYdX这种去中心化的金融衍生品服务和中心化的相比,它们对用户来说,具体的优缺点究竟在哪?目前看起来,dYdX的还不完善,种类相对比较单一,玩起来不够刺激?如果有金融行业的朋友有自己的独到见解,欢迎在评论里分享。

不过,我个人还是有一种感觉,衍生品这个领域,和中心化交易所与去中心化交易所的发展境况,其实是差不多的——中心化交易所目前占据主流,交易深度和流动性都更好;而去中心化交易所还比较小众,但它在未来有更多的可能性。衍生品也是如此。

dYdX的协议现在还很简单,没有中心化交易所提供的那么丰富的期货玩法和期货品类,大部分真正在炒数字货币期货的用户,也主要是在中心化的衍生品交易市场里玩。现在我能想到的会使用 dYdX 玩保证金交易的人,应该是既懂金融又懂计算机、且不是为了挣大钱(因为dYdX目前还太基础了)的人,而这样的人并不多。

dYdX 的协议如果未来得到更完善的发展,那它实际上可以作为一个桥梁,去连接许多不同的金融服务。换句话说,dYdX可以产生很多以前从来没想过的智能合约的新玩法,因为这套协议是完全开源的,任何人都可以在上面添砖加瓦,也可以通过这套协议在上面创造自己的新玩法。

传统的中心化交易所想要提供一个币的衍生品,往往需要内部做流程决策,交易所的老板觉得有搞头就推出相应的交易市场,但在dYdX上面,只要有人会写代码就行了,补充一个xx币的做空币、做多币,任何人都可以买卖。

这就像中心化交易所是用中心化的方式去上币,而DEX可以自由地上任何币种。你不需要有华尔街的经验和历史,就可以通过智能合约创造一个新的期货品类,(比如开个脑洞,把dYdX这套衍生品玩法和预测市场结合起来会怎样?ERC721 非同质化代币可以拿来做一个新的期货市场吗?),这在以前是一件不可想像的事。

这样看来,也许未来万物皆可“衍生品化”——当然,不可避免地,它可能会造成一定的问题,但也有可能会增加金融市场的活力。

(完)

附:什么是 margin trading?

所谓的margin trading就是保证金交易。在这种交易里面,张三找大财主借了一项资产,借完之后马上转手又卖给了李四。等到借款合约到期的时候,张三必须把借来的资产再还给大财主,当然,还要附带一部分利息。张三、大财主、李四,他们属于保证金交易里的三种角色,各取所需地挣钱。

看看下面这些详细的例子。

保证金交易有两种类型:做空或者做多。

做空(short sells)

张三觉得比特币未来一个月会跌,于是他就找大财主借了1个比特币,然后把这1个比特币以当前价格卖给李四。等到一个月后,约定张三需要还大财主1个比特币,再加一点利息。

如果到时比特币真的跌成狗了,那么张三可以按更便宜的价格买回1个比特币还给大财主,这样一借一还的差价,就是张三通过做空赚到的利润。

当然,如果比特币一个月反而涨了,那张三就完蛋了,因为他现在要买回1个比特币的价格,比自己当初卖出去的还要高,一借一还的差价就是自己的亏损。

做多(leveraged longs )

有做空就有做多。

李四觉得比特币未来一个月会涨,于是他去找大财主借钱,借了4万块钱。李四借到4万块钱后,立即买了一个比特币。等到一个月之后,约定李四要还大财主4万块钱,再加一点利息。

如果这时比特币价格确实涨了,那么李四就可以把手里的比特币卖出高于4万块的价钱,再还4万块给大财主。一借一还的差价,就是李四通过做多赚到的利润。

当然,如果比特币一个月后反而跌了,那李四就傻逼了,因为他手里的比特币已经不值4万块了,为了还大财主,他需要亏损。

特别值得注意的一点是,上面这些交易里,张三和李四并不是全款去找大财主借资产,而是通过一个保证金乘以倍率,加杠杆来撬动更多的资金。比如交10%,用4000块钱就可以撬动4万块的交易,这样投资回报率就很高了,当然风险也是相对增高了很多,容易被爆仓。总之就是玩得更刺激了。而为了避免你的保证金不足以抵消你给大财主造成的损失,保证金都是即日结算的,也就是说,如果行情不妙,你可能还需要补交更多的保证金,或者大财主有权提前收回他的借款。

  • 做空可以被张三用来投机,或者做风险对冲。投机大家都懂就不说了,风险对冲是怎么回事呢?比如张三觉得比特币未来一个月会跌,他手里有一堆比特币,很害怕承担这个损失,那他就可以通过做空比特币相关联的资产来赚回一点钱,减少一些可能的损失,这样就叫做对冲。

  • 做多也可以被李四拿来投机,它可以产生更高的资金利用效率,因为加上了杠杆,当然也更容易血本无归,一夜清零。

  • 至于借款的人,也就是大财主,他可以通过借出资产来赚钱一定的利息,作为利润。

一些延伸阅读

  • 什么是期货?期货市场是如何运转的? - 傅建朝的回答 - 知乎 https://www.zhihu.com/question/19903936/answer/78060981

  • dYdX白皮书 https://whitepaper.dydx.exchange/

  • expo官网 https://www.expotrading.com/


如果你对dYdX和Defi感兴趣,可以转发这篇文章到朋友圈,截图发给橙皮书小姐姐(微信号18519507233)并自我介绍,加入“神奇技术在哪里”讨论群~

橙皮书正在招人,如果你真心喜欢区块链,希望和我们一起创作更好的内容,欢迎添加橙皮书小姐姐微信(微信号 18519507233),备注“应聘”;或者发送简历到邮箱inneverland2013@gmail.com。


我们正在招聘的职位有:


1、记者,研究新技术和产品,和业内的创造者交流,写出影响行业的文章;

2、运营,负责社区、公众号、线下活动等方面的运营工作。

3、翻译小组志愿者,纯线上协作,一起翻译优质的英文文章;

4、内容实习生,一起参与优质项目的采访与撰稿,要求每周至少有三天时间

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存