原文标题:《用 dYdX 做空以太坊时,内部合约是怎么运作的?》

在传统的金融市场里,期货的规模可能是现货的 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 官网,买做空币或者做多币,输入具体的金额数量,然后按下回车键就能成交了。

一文读懂去中心化的金融衍生品协议 dYdX

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

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

有两个最大的不同点:

第一个不同是,整套保证金交易的机制,实际上都被抽象出来了,用户对此是「零感知」的,这简化了很多参与保证金交易的门槛和步骤,因为很多事 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 万块的交易,这样投资回报率就很高了,当然风险也是相对增高了很多,容易被爆仓。总之就是玩得更刺激了。而为了避免你的保证金不足以抵消你给大财主造成的损失,保证金都是即日结算的,也就是说,如果行情不妙,你可能还需要补交更多的保证金,或者大财主有权提前收回他的借款。

  • 做空可以被张三用来投机,或者做风险对冲。投机大家都懂就不说了,风险对冲是怎么回事呢?比如张三觉得比特币未来一个月会跌,他手里有一堆比特币,很害怕承担这个损失,那他就可以通过做空比特币相关联的资产来赚回一点钱,减少一些可能的损失,这样就叫做对冲。
  • 做多也可以被李四拿来投机,它可以产生更高的资金利用效率,因为加上了杠杆,当然也更容易血本无归,一夜清零。
  • 至于借款的人,也就是大财主,他可以通过借出资产来赚钱一定的利息,作为利润。

一些延伸阅读