雷锋网AI金融评论按:加密货币市场的繁荣离不开蓬勃发展的交易所的支撑,Poloniex、Bittrex、Bitfinex、Yunbi、Okcoin、Kraken、Liqui等等,它们为区块链市场的资产代币化发展提供了全球化全天候的充足流动性。然而这些中心化交易所存在一些显著的风险和问题。因此基于区块链去中心的特性在区块链网络上来搭建去中心化交易所的尝试,看起来就顺理成章了。
然而去中心化交易所目前还属于比较年轻的技术,对很多人来说都有些陌生。日前hackernoon知名博主Dominiek Ter Heide发布博文,简单探讨了去中心化交易所的内部运作。雷锋网为您做如下编译:
世界上大多数的加密货币交易都是通过Coinbase / GDax,Binance,Bittrex等中心化交易所完成的。这些交易所管理着人们的资本(和私人密钥)并帮助交易。在过去的几年乃至几周中,发生过一些高调的黑客事件,窃取了大量的资金。我认为,在短期内这个问题不太可能得到解决,且只会变得更糟。软件和硬件越来越复杂,这将导致更严重的安全漏洞,例如英特尔CPU固件中最近发生的熔断和幽灵漏洞。
去中心化交易所也被称为DEX,是一种促使在分布式账本上进行加密货币交易的新技术。这些交易所将资金和交易的控制权交还给用户,消除了单个故障点。其次,政府征税或资金没收几乎不可能再发生。这对宏观经济和地缘政治格局可以说具有深远的长期影响。
然而,DEX技术仍然年轻,仍然有相当多不足之处,包括某些攻击途经。在这篇文章中,我们将研究去中心化交易所的内部运作。
有一个叫做0x(Zero X)的流行项目。该项目的目标是为基于以太坊的去中心化交易所提供开放协议。该项目还出售$ ZRX代币,目前交易市值 5.42亿美元。(顺便说一句,我持有其中一些)。该代币的目的是为智能合约和协议提供治理机制。
0x有一些很好的想法,开源代码应用现象和文件记录。然而,我不确定0x要如何通过去中心化交易来盈利,以及如何维持5.42亿美元的市值。
基本上来说,0x白皮书很好的描述了EtherDelta去中心化交易所。EtherDelta是首批具备吸引力的去中心化交易所之一。它主要基于以太坊运行,其最近的智能合约价值约为1.4亿美元。即使是最懂技术的用户,也觉得它们的用户界面很难使用,因此这个数额可以说是相当惊人的。
了解EtherDelta交易所如何工作,就能让我们透彻的了解去中心化交易所的当前状态,以及0x将如何运行。0x的本质是具有更好的代码和附加功能的EtherDelta。
下面我们将分析合同中最重要的两个方面:资金管理和交易逻辑。
EtherDelta智能合约
以太坊智能合约是能够以分布式和不可变的方式在以太坊区块链上执行的代码块。EtherDelta和基于以太坊的交易所的核心逻辑就在于这些智能合约。与传统的编程相比,实施这些智能合约就像是发射火箭。需要超级安全和强大,因为任何错误都可能导致巨额的资金损失。
智能合同通常是用人类可读的语言(称为Solidity)编写的,被编译成以太坊虚拟计算机指令(Ethereum Virtual Machine instructions,简称EVM指令)。这些EVM指令实际上是人类无法读取的。有些项目选择永远不共享智能合约的“Solidity”代码,通过隐匿实现安全性。例如,Crypto Kitties(加密猫咪)遗传多样性智能合约就是“闭源”的。即便如此,从理论上讲,我们通常都能够把智能合约的原始结构拼凑起来,所以闭源智能合约总让人感到厌倦。
EtherDelta合同的Solidity代码可以在Etherscan这里免费获得:https://etherscan.io/address/0x8d12a197cb00d4747a1fe03395095ce2a5cc6819
资金管理
EtherDelta将资金控制权完全给了用户。即便如此,要使用EtherDelta资金,需要将其转移到智能合约中。资金基本上集中在智能合约中,但全部在分布式账本上完成。我知道这令人困惑。归根到底,在任何时候用户都可以在没有任何第三方介入的情况下提取或存入资金。
EtherDelta资金管理Solidity代码
正如你在上面的摘要中所看到的,有两种移动资金的机制。一个是针对移动ETH——也就是以太坊的本币。另一个是移动代币ERC20。事实上,现在大多数ICO和可交易代币实际上就是基于太坊区块链的ERC20代币。以太坊提供了处理这些标准代币的特殊机制。
您可能会注意到,在上面的代码中,只有一种方法被标记为“应付”。这是Solidity的一个安全机制,明确允许将ETH资金发给该调用。任何客户要存储代币都需要执行额外的步骤,来授权ERC20代币的转移。
EtherDelta的资金管理看起来非常稳固。一些智能合同有管理员用户吸取资金的机制。IDEX分散交易智能合约就是这种情况。人们对这样的机制应该是很不耐烦的。
交易逻辑
在EtherDelta中,新的市场订单可以“链上”或“链下”存储。链上存储意味着它们被存储在智能合约中,链下则意味着存储在第三方如中央服务器中。在实践中,由于成本和速度的影响,EtherDelta没有链上存储订单。相反,它们使用以下机制。
人们可以为给定的ERC20代币提交一个公开的买入或卖出定单——用交换术语来说,这个人就是Maker。另一个交易者可以浏览这些订单,并选择执行它们——这个人被称为Taker。
接下来,使链下订单开始运转的关键因素来自区块链的核心——椭圆曲线数字签名算法 ,也可以简称为ECDSA。这是不对称密码的一个特殊变体,它允许公钥和私钥加密以及签名验证——所有这些都以有利于计算的方式进行。
在较高层面来说,这是它在EtherDelta中的工作原理:
Maker创建一个新的订单:ERC20代币,它的数额,它的ETH金额,以及是买入还是卖出订单。
Maker创建该订单的密码散列(使用SHA3)
然后Maker使用以太坊私钥为订单散列签名(使用ECDSA,还有特别是在比特币中也使用的Secp256k1来实现)
Maker在链下发送订单以及签名(在EtherDelta中,这一个步骤通过一组服务器用WebSockets传递JSON消息来完成)
当Taker想要与该订单进行交易时,签名和订单信息被发送到智能合约的交易功能。
智能合约验证签名来源于Maker
智能合约确认订单没有过期或已经履行
资金转移并收取费用。
步骤5到7发生在合同代码的以下关键位置:
代码的第5行中,订单的金额、价格、到期日期和被称为nonce的一次随机数,一起生成一个散列。这个散列是一个32字节的序列,代表一个独一无二的市场订单。
第7行首先检查链上订单簿(是未使用过的订单簿),如果没有链上订单,则对签名进行验证。
此签名验证采用由Maker签署的订单——并验证是否源自Maker的帐户地址。如果订单参数有任何更改,该散列将需要不同的签名。
一旦验证完成,tradeBalances功能将围绕金钱并收费。
必须指出的是,首先是从(活跃的)Taker处收钱,最后只记入Taker借方。我认为这对合同的安全至关重要,因为有可能会发送(并验证)一个错误的用户地址。如果这是有意为之,会很容易让Taker赔钱。可见,保护这样的软件安全是多么棘手和具有挑战性。
我们现在已经简单的回顾了基于以太坊的DEX的本质。0x项目还有很多的内容,比如链下订单管理的开放标准,经过充分测试和记录的智能合约,更多类型的交易机制等等。但是在DEX的核心,都使用了相同的基本流程和密码原则。
但据目前以德的表现来说,在安全、可信方面,协议仍有许多待完善之处。
在以后的文章中,雷锋网将继续为您编译一些关于DEX以及以太坊智能合约的内容,敬请期待。