套利、投资、创业,从0到1打造更好的点对点交易协议

由CSDN主办,区块链大本营、EthFans、PDJ、极客帮创投协办的第7期CSDN区块链技术沙龙上,Hydro Protocol及DDEX技术负责人 David Qin带来题为《点对点交易技术与实践》的分享,从自身的区块链技术创业历程,解读以太坊上点对点交易的技术实践。

Hydro Protocol及DDEX点对点交易所

技术负责人 David Qin

整理 | 王国玺

一、从套利开始,发现中心化交易所的安全危机

从套利引擎开始,我们需要接多家交易所API,我们需要把这些单糅到一起,糅成一个引擎,从中发现一些套利的机会。什么是套利机会?我们的引擎,类似一个撮合引擎,它不停扫描当前币种,哪个地方价格最低,哪个地方价格最高,如果这两个地方不是同一交易所,刨除掉持仓风险、平仓风险、滑点概率,如果仍然有套利利润在,那我们就把这个单吃掉。

当时市场分为两种币:公链币(比特币、以太坊)、ERC20。90%货币基本基于以太坊,比如基于ERC20的代币,所以我们选择基于ERC20开始套利。

首先,当时没有点对点交换的概念,我们只能接中心交易所。发现资产不安全。中心交易所的本质把所有钱充值到交易所一个钱包,然后它来负责所有人的资产安全。

当资产转移时,在数据库里给记了一笔账,比如说张三的钱给了李四,但实际在区块链上没有任何表示,只有提现时资产才真正结算。

在套利时,因为对接是多家交易所,所以资产存在了多家交易所上,我们特别担心自己的资产。

其次,API质量也是问题。有些交易所提供了WebAPI,但有些交易所只提供了WebSocket API。WebAPI的响应时间、质量以及变动,都会影响套利的滑点概率。

关于充值提现速度慢的问题。好的交易所,在提币时可能两个小时就能完成提币,把仓位重新弄平,套利机制重新跑起来。但有些交易所可能两天或一周都不会放币。这里面肯定有些技术问题,比如中心交易所使用小额充值的方式,它要把币汇总后,才能给别人提币。但这不是提现时间慢的借口。问题由于中心化导致,因为权限太高。

二、从参与投资,发现点对点交易的创业机会

套利之余,我参与了一个朋友之间组织的数字货币基金。当时主要针对的方向是数字货币,和点对点交换协议,发现了点对点交换协议后,加上底层套利逻辑,以及对中心版本的种种不满,我们发现点对点交换是强需求。我们为什么不自己做一个?就针对ERC20,只要我们支持ERC20的点对点交换,就能覆盖90%的交易币种需求。

常用钱包里有卡、现金、信用卡、存折。以太坊的钱包是是系统给我们私钥,对应着一份公钥,公钥对应着一份地址。钱包的功能仅仅是用这个私钥去产生数字签名,证明你拥有某个地址,仅此而已,其实它里面没存任何东西。

什么是ERC20?首先是合约,ERC20其实是个标准,凡是符合ERC20标准的代币都会支持几个接口,比如name、symbol、decimals以及用来转账和代理转账的transfer、transferFrom的接口,类似于类中的抽象类,它是一个标准。所有满足ERC20的货币,都可通过一个标准方式进行转账。

点对点交易,可以解决中心化问题,但是,点对点交易完美吗?会有什么问题?

钱包与合约很繁琐。在2017年6月,市面上还没有现在这么多的钱包,只能下以太坊官方的钱包Mist,下载Mist需要同步几十G数据的节点,这样才能跑起这个钱包。

用惯了中心化交易所的人肯定会对交易需求工具要求特别多。但在点对点交换版本里,目前只能实现一个limit order,market order还不成熟,这就是基本交易工具上的缺失。

现在以太坊每秒钟的节点吞吐量是每秒钟20-30笔交易。这个速度意味着每交换一笔资产,都会占以太坊区块链上每秒20笔交易中的一份,所以交易速度特别慢。

以上的种种难度决定了用户入门的门槛极高,所以没有人参与、挂买、挂卖,导致了流动性差的问题。

EtherDelta是典型的点对点交易所。它除了满足上述的去点对点交换不足的特性外,还有些弊端,比如充值就很危险,因为钱要从钱包转到另外一个地方。The DAO事件是2016年特别典型的一个事件。因为合约出了问题,所以导致以太坊分拆,分拆成ETH和ETC。Polkadot-Multisig也出了一些问题,现在你去以太坊区块链上看,Top Accounts里面的第二页,Polkadot-Multisig锁了30万个以太坊在钱包里。原因是它所依赖的以太坊合约库被调到suicide,自己依赖的一个lib已经被kill掉,然后导致30万个以太坊永远锁在虚空中,没有人能提走。

Partiy的多签名钱包同样也出现了问题。它把一些方法代理到自己的依赖库上,包括构造函数,而构造函数是可以声明钱包主人的。由此引发了一系列的资产丢失,大概都在千万美元级别,而Polkadot可能是上亿美元级别的。所以充值是一件很危险的事。

三、ZRX是点对点交换协议的升级版,但它还不够好

链上撤单是一个特别严重的问题,会贯穿整个点对点交换,它会直接导致被front run以及没办法做市。

经常在盘口大量的移动价格,如果撤单成本高,事情基本不可能完成。没有做事也会导致流动性差,流动性差就没有用户,没有用户就什么都转不起来,这会恶性循环。

上图ZRX是点对点交换协议的升级版。它的出现给很多点对点交换带来曙光。针对需要充值的问题,ZRX解决的办法是用转账的授权来替代充值。

首先要把资产授权给Proxy,Proxy权限很高,但逻辑很蠢,什么都不会,唯一干的就是把钱从A转到B。因为足够简单,很难出现bug,它是一个永远不会升级的东西。

Exchange封装了所有的交易逻辑、是Proxy的调用方。用户就可以通过DAPP,调用Exchange里面的函数,通过Proxy转移用户的资产,完成一个区块链的交易。

但是ZRX机制没有解决链上撤单问题,这是DDEX团队首先发现的:在ZRX的核心数据结构里有一个taker属性,这个taker属性有两种设置方法:

1. 固定的地址;

2. Open的地址。

open的地址就是Open Match,Open Match意思就是单可被任何人吃,卖单时候,别人可跑在你的前面,front run的问题依然存在。然后,当你去撤销这单的时候,依然需要链上确认。

DDEX采用Closed Match,taker的永远是固定的地址,这个单只有DDEX可以去taker这个单,然后取消这个单子仅需要在DDEX上把单从数据库里面撤掉,就可以去撤单,而且保证区块链没有任何人可以在你之前去take所以说这样就完全避免了front run的问题,然后对做市商是友好的,因为做市商可以随时下单、撤单,整个过程只要这单没有被撮合,没有进入最终结算阶段,都是不消耗任何手续费,仅消耗的就是流量和数据库空间而已,跟一个普通的中心化交易下单、撤单的感觉是一样。

DDEX选用了这种权限的办法,解决了front runing的问题。但仍然有一些新的挑战。现在的0X协议使用代币来交手续费的,这事极其不合理,具体体现比如说我想完成一笔交易,我说你必须握着一些0X,这个就特别不合理。

用现在的点对点交换协议,来完成一个交易所的事情仍然很困难。还要要理解什么叫Exchange里面的一个基本交易单元,了解怎么签名、下单、授权,这些事情都很繁琐。

closed match导致单只能被自己吃,怎么才能让流动性共享起来,让更多人参与点对点交换。

四、我们想要做更好的点对点交易协议——Hydro

经过思考,我们决定自己设计一个协议。链下撮合,链上成交。流动性的奖励机制。为提供高流动性的个体提供奖励。

Hydro是一个流体,类似于water、流动性。一个交易所没有流动性就永远没有人用。

这协议很抽象,但我们不想做一个抽象、不具化的东西。于是我们决定先做一家交易所,让这家交易所成为Hydro协议的第一个用户。如果把交易所做成了,才能证明这个协议可以成功,别人也会加入这个协议。顺理成章的,我们做了这家交易所叫DDEX (Decentralized Digital Exchange)。点对点交易是我们的第一版模型,经历了10周开发上线,今年1月份上线,现在已支持多个钱包。每笔交易都可以在链上看到,没有任何东西是不公开不透明的。

上图我们初做的版本,现在有一些UI和功能上的迭代。架构分为三部分:DAPP、Backend、Services。

DAPP是一个React项目。

Backend分为的API、Engine和Watcher。Engine与普通交易所的Engine有差别,不仅仅是记账,它还需要把所有用户的交易发到链上。

Watcher用来监视区块链变化,并通知其他服务。

底层的Services会有一些基础的东西,比如说PostgreSQL、Redis和Geth Node。Geth Node是一个以太坊节点。

Watcher不能以一个结点目前的最新信息来当成判断依据,因为区块链最新的几个节点总是处于混沌状态,这也是为什么比特币的转账交易需要6个区块确认,而以太坊可能需要更多。因为以太坊的块时间更短,比如至少60个区块,资产量越大,需要确认的区块就越多。

然后Watcher将进行一系列的改变。蓝色区块是指已经确认相对久远的区块,这个虚线的区块就证明可能刚被挖出来的,这个区块可能是不太安全的区块。

所以说我们会用刚挖出来的区块通知用户,让他感到交易运算的发生。然后用一些更久远的块来确认区块链最终的交易状态,用这些来最终决定用户的一笔交易是不是真正的发生了。

由于SSR的需求,前端框架从多次切换。

DAPP运行需要一个钱包的环境。目前的钱包有MetaMask、Mist,这些wap3钱包实现的基本上没有一个完全符合标准的,因为MetaMask它在签名的时候没有加上Ethereum的send message签名消息头。当在前端去匹配不同的钱包的时候,会有一些冲突,需要特殊处理。

后端针对之前的版本做了一些重构,从一个单人的开发模式换成Gitlab CI + docker + kubernetes来压缩运维成本。

Engine当时做了很多事情,Engine不仅要撮合交易,要落库,而且还要跟以太坊之间打交道,这个Engine的代码就会越来越耦合,所以用微服务的方式拆分逻辑,用kafka做消息队列。

Log收集是为了方便后期debug,所有的后面这些架构其实在一些通常的开发里面都是很常见的。

五、丢失了122个以太坊后,我意识到资产安全的重要性

安全问题很严重,由此我们也付出了一些代价。常规的安全项目,比如2018年,EtherDelta出了一些问题,他们的域名过期了,被别人买了,搭了一个一模一样的节点,然后大家把钱充进去就没了。

去年有一个项目叫Decentraland,特别火,据我所知有无数人要抢他们的ICO,但是特别难抢。它的合约写的是当在第41万多少个区块开始,它这个合约开始接受往里面转以太坊,然后会往外转Decentraland的币叫MANA。

这件事是不可能通过手动来完成,一是找不到好的时间点,可能很快就结束了。所以说我就决定用他们本身的代码来去抢ICO,我把我的私钥放到了一个以太坊节点上,打开了rpc的默认端口,为提前测试,我解密了私钥,我两个账号里面一个有100个以太坊,一个有22个以太坊, 10分钟以后,我的钱包里一分钱也没有了。我就开始翻etherscan上的一些消息,一个叫bruce的人就提供了一些线索,我也回忆了一下我到底都做了什么。

以太坊钱包的节点其实相当于它会负责同步数据,如果你解锁私钥了以后,凡是能访问你节点的方式,都能去转走你的钱,这件是一个特别大的坑,我也认为这是以太坊bug,前一段我也看了一个文章在介绍这个事情。

那如何管理好自己的以太坊节点?首先,能用内网绝对不用外网。如果说你不想给大众做一个公用节点的话,永远不要开公网,还有一个从根本上解决的办法,就是永远不要把私钥和任何私钥相关的东西存到以太坊节点上,用一个新的东西ProviderEngine,让我们的私钥永远都在我们的项目里面,自己来保护。

所有的交易都是只要签过名之后,把签名的消息发到公网的节点上。这样的好处就是说最终的权限全留在代码里,出代码的东西都是可以见光的,这个就是在部署以太坊节点的时候的一些经验。

六、想写自己的DAPP,我的建议是什么

刚开发时候,会有一些测试的需求,还有部署合约的需求,就是很麻烦,因为当时用主网测的话太贵,用测试网来测的话太慢,然后就开始寻找各种各样的工具,然后就找到了这个Truffle。

Truffle主要提供了一套合约、部署和测试的框架,它会提供一套类似于Migration的机制,可以频繁部署更多的合约,不用操心合约部署到哪。然后在测试的时候可以写一个Contract来测试Contract,也可以用JS来测试Contract。

Ganache是一个node.js版本的以太坊虚拟机,它启动的时候会启动有10个有钱的以太坊账号,产生区块的方式也特别特殊,它的区块产生是同步的,把一笔交易发到这个测试区块上,它会严格的把这笔交易打包成一个新的区块,然后返回。这对于测试和开发极其友好。

Ropsten几乎像素级的模拟了以太坊的官方节点,然后上面的币基本上是免费的,拿一个GTX1070挖一天,就能挖出个100币,所以它基本上可以在项目想要上线之前提供一个比较好的,相对真实的测试环境。

如果想写DAPP, smart-contract-best-practices很有参考价值。Rops比如写合约时候,什么时候开始用什么函数,在处理外部调用和内部状态时候,应该先处理外部依赖还是先处理内部的状态。在网上随便一搜就可以搜到它的官网包括里面有好多合约的实践。

目前Hydro协议已正式开源 Hydro 1.0 代码库,未来会把做点对点交易所的更多代码开源。通过 Hydro开源代码库,节点可以在Hydro 协议上开发自己的点对点化交易所(Relayer),赋能流量入口、Dapp 部署自己的 DEX , 实现界面内无缝的原子级别币币交换(Atomic Swap)。

通过Hydro协议,我们提供节点一个没有技术门槛的交易平台和一个完全的点对点的交易的整体解决方案。比如你想开一个点对点交易的交易平台,所需要的只是在阿里云、腾讯云、亚马逊云或者谷歌的数据中心买一个服务器,我们就可以给他做一个私有化部署,你就可以成为一个hydro协议上的节点,通过共享流动性来保护这个网络的强劲跟安全。作为一个hydro节点,永远都是让用户保护资金同时点对点交易。最重要的一点是APP内嵌,比如我们CSDN有一个自己的app,然后这个app是我们所有咨询平台,然后这些咨询平台会有一个tap,这个tap里面会有钱包,点对点交易的界面,这个时候在任何的app里面就会直接进行点对点的交易,依靠以太坊网络。

原文发布于微信公众号 - 区块链大本营(blockchain_camp)

原文发表时间:2018-05-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Netkiller

智能合约收发 ETH 实例详解

中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>

34021
来自专栏带你撸出一手好代码

浅谈比特币

最近比特币以及各种数字货币火的不行,区块链这个概念也三天两头霸占各种科技头条。以前虽然经常能听到「比特币」这个字眼,可完全没有足够的诱惑力吸引到我, 直到最近,...

3285
来自专栏企鹅号快讯

17年大盘点:区块链领域常见术语详析

摘要: 以下是区块链领域中的一些常见术语,供有兴趣了解区块链技术的朋友参考。 2、协议分类账(Agreement ledger)是由两方或多方用来协商和达成协...

1886
来自专栏申龙斌的程序人生

比特币分叉在即,你会被重放攻击吗?

前几天BIP91被锁定,大家以为比特币不会分叉了,没想到这几天杀出来一个比特现金Bitcoin Cash(前身是Bitcoin ABC),忽悠了一些矿池的算力来...

3387
来自专栏区块链入门

【安全】Fomo3D死亡3分钟的交易攻击

【本文目标】 (1)通过本文分析,了解Fomo3D游戏第一轮结束的交易攻击流程及具体地址; (2)介绍“拒绝服务攻击”(Denial of Service,...

864
来自专栏CDA数据分析师

轻松看懂什么是以太坊

虽然"比特币"和"以太坊"这两个术语常常一起出现,但实际上这两者有很大的区别。以太坊与比特币的唯一联系在于,两者均为成功的区块链技术应用。

922
来自专栏申龙斌的程序人生

取现【区块链生存训练】

老猫在4月发表的《一切才刚刚开始》文章中,把区块链资产当做未来的现金,而把一切法币称为白条,话语虽有点偏激,但却是未来的价值互联网的发展方向。 刚刚接触比特币...

3609

对以太坊的优雅介绍

重要提示:如果您拥有价值超过1,000美元的加密货币,那么您肯定应该使用硬件钱包,而不是在交易所保留硬币。我推荐Trezor,您可以直接从他们的网站购买€89 ...

4325
来自专栏申龙斌的程序人生

我所喜欢的Big.One应该是这样的

我从2016年8月从Okcoin买入了人生的第一笔比特币,当时的价格不到4000元。由于学习了区块链生存知识,深知私钥的重要性,所以我把币一直存在自己的Bitc...

37510

数字令牌的入门介绍

最近数字令牌已经出现,首先是对比特币等加密货币兴奋不已,然后用数字令牌来代表区块链上的不同资产。他们是什么?你如何数字化一个令牌?它为什么如此重...

5947

扫码关注云+社区