加密货币市场的繁荣离不开蓬勃发展的交易所的支撑,Poloniex、Bittrex、Bitfinex、Yunbi、Okcoin、Kraken、Liqui 等等,它们为区块链市场的资产代币化发展提供了全球化全天候的充足流动性。然而这些中心化交易所存在一些显著的风险和问题。因此基于区块链去中心的特性在区块链网络上来搭建去中心化交易所的尝试,看起来就顺理成章了。
 
然而去中心化交易所目前还属于比较年轻的技术,对很多人来说都有些陌生。日前 hackernoon 知名博主 Dominiek Ter Heide 发布博文,简单探讨了去中心化交易所的内部运作。如下编译:
 
 
世界上大多数的加密货币交易都是通过 Coinbase / GDax,Binance,Bittrex 等中心化交易所完成的。这些交易所管理着人们的资本(和私人密钥)并帮助交易。在过去的几年乃至几周中,发生过一些高调的黑客事件,窃取了大量的资金。我认为,在短期内这个问题不太可能得到解决,且只会变得更糟。软件和硬件越来越复杂,这将导致更严重的安全漏洞,例如英特尔 CPU 固件中最近发生的熔断和幽灵漏洞。
 
去中心化交易所也被称为 DEX,是一种促使在分布式账本上进行加密货币交易的新技术。这些交易所将资金和交易的控制权交还给用户,消除了单个故障点。其次,政府征税或资金没收几乎不可能再发生。这对宏观经济和地缘政治格局可以说具有深远的长期影响。
 
然而,DEX 技术仍然年轻,仍然有相当多不足之处,包括某些攻击途经。在这篇文章中,我们将研究去中心化交易所的内部运作。
 
EtherDelta 和 0x
有一个叫做 0x(Zero X)的流行项目。该项目的目标是为基于以太坊的去中心化交易所提供开放协议。该项目还出售$ ZRX 代币,目前交易市值?5.42 亿美元。(顺便说一句,我持有其中一些)。该代币的目的是为智能合约和协议提供治理机制。
 
0x 有一些很好的想法,开源代码应用现象和文件记录。然而,我不确定 0x 要如何通过去中心化交易来盈利,以及如何维持 5.42 亿美元的市值。?
 
基本上来说,0x 白皮书很好的描述了 EtherDelta 去中心化交易所。EtherDelta 是首批具备吸引力的去中心化交易所之一。它主要基于以太坊运行,其最近的智能合约价值约为 1.4 亿美元。即使是最懂技术的用户,也觉得它们的用户界面很难使用,因此这个数额可以说是相当惊人的。?
 
EtherDelta UI
了解 EtherDelta 交易所如何工作,就能让我们透彻的了解去中心化交易所的当前状态,以及 0x 将如何运行。0x 的本质是具有更好的代码和附加功能的 EtherDelta。
 
下面我们将分析合同中最重要的两个方面:资金管理和交易逻辑。?
EtherDelta 智能合约
以太坊智能合约是能够以分布式和不可变的方式在以太坊区块链上执行的代码块。EtherDelta 和基于以太坊的交易所的核心逻辑就在于这些智能合约。与传统的编程相比,实施这些智能合约就像是发射火箭。需要超级安全和强大,因为任何错误都可能导致巨额的资金损失。
 
智能合同通常是用人类可读的语言(称为 Solidity)编写的,被编译成以太坊虚拟计算机指令(Ethereum Virtual Machine instructions,简称 EVM 指令)。这些 EVM 指令实际上是人类无法读取的。有些项目选择永远不共享智能合约的“Solidity”代码,通过隐匿实现安全性。例如,Crypto Kitties(加密猫咪)遗传多样性智能合约就是“闭源”的。即便如此,从理论上讲,我们通常都能够把智能合约的原始结构拼凑起来,所以闭源智能合约总让人感到厌倦。
 
资金管理
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 的核心,都使用了相同的基本流程和密码原则。
 
但据目前以德的表现来说,在安全、可信方面,协议仍有许多待完善之处。