EtherDelta交易所介绍

in #blockchain7 years ago

第1章前言

1.1编写目的
Etherdelta是运行在以太坊上的去中心化交易平台。实现了充值,提现,挂单交易等功能。以下内容是我们这篇文章主要想讨论的地方。
一,如何解决以太坊速度慢的问题
二,怎么对交易双方收费
三,怎么处理用户的订单和交易

1.2本文适用对象
本文章针对对以太坊和智能合约由一定了解,想进一步理解以太坊平台上交易所的内部运行逻辑。

第2章技术原理
2.1背景与现状
以太坊实现了智能合约使得自身得以迅速发展,但为了让所有的节点保持同步,使得以太坊的成块速度较慢,这显然是不能满足交易平台的需求,而且以太坊对使用者也会收取高额的手续费。EtherDelta作为以太坊上的交易平台,在提升速度和合理收费方面都做了改进,这也是本篇文章感兴趣的地方,本文通过对智能合约源码分析,来讨论这些内容的改进细节。

2.2源码分析
Etherdelta的代码包括前端和智能合约,本文章只分析智能合约部分。
智能合约包含七个Contract,分别为SafeMath,Token,StandardToken,ReserveToken,AccountLevels,AccountLevelsTest和EtherDelta.本文章根据各个合约的不同功能和之间的相互联系,分成四个大类分析。
一,SafeMath定义了两个数字的安全加,减,乘运算,在出现加法,乘法的越界,减法出现负数时抛出异常。
二,Token,StandardToken,ReserveToken. 这三个合约主要和发币相关。Token 定义了ERC-20标准协议,主要给出用智能合约创建新币时需要实现的接口。StandardToken实现了Token合约的接口,创建了一个新币。ReserveToken的功能为保存和删除货币。
三,AccountLevels,AccountLevelsTest用来设置用户等级,在交易所执行交易时,会根据订单提交者的等级返还一定的手续费。
四,EtherDelta,我们下面根据合约中的数据结构分析整个交易所对订单和交易的处理。

admin: 管理员,管理整个Etherdelta,包括:更改管理员,改变账户等级,改变手续费。
feeAccount: 系统账户,用来保存玩家在交易时的手续费。
accountLevelsAddr: 记录账户等级的合约地址
feeMake: 订单发起者(maker)的手续费
feeTake: 交易发起者(taker)的手续费
feeRebate: 根据maker在accountLevelsAddr中的等级,返还一定手续费给maker
等级0:不返还
等级1:返还feeRebate定义的比例
等级2:返还全部手续费
这里通过对maker账户级别的设置,会对maker返还一定的费用,激励用户在Etherdelta进行发订单,促进交易所的发展。
tokens:货币数量,双重key分别是货币地址和用户地址,货币地址=0时表示ether。
orders:订单
orderFills: 记录订单当前状态
Etherdelta采用了“off-chain order relay with on-chain settlement”。从最开始的订单到交易完成的处理过程如下图所示:

当订单发起者(maker)生成一个订单时,Relayer对订单信息以及订单发起者进行检查,确认手续费等信息满足条件后,将订单放在订单列表中,这时订单的信息可以被所有人看到。当用户(taker)选择了某个订单进行交易时,这时交易的发起者时taker将交易信息统一发送给交易所(smartcontract),交易平台检查交易双方条件是否满足,之后平台执行交易,扣除交易费,更新订单的信息。通过分析我们可以看到,在taker选择执行交易之前,所有的操作都是在链外进行。这使得交易手续费和交易速度大幅度提升。
第3章代码分析
下面是智能合约对订单的处理
1,生成订单

在生成订单时,会将订单发起者和订单详情保存起来。
2,交易时对订单的处理

在交易时,先判断交易是否在订单需求范围内,计算双方交易手续费,执行交易。然后将订单状态更新。
3,取消订单

取消订单亦即将订单状态更新为已经全部满足。
第4章结论
通过代码分析我们知道,Etherdelta将订单信息放在链外解决速度问题,通过对订单发起者返还手续费激励用户在交易所执行交易。

参考文献
1,https://github.com/etherdelta
2,https://www.reddit.com/r/EtherDelta/comments/6kdiyl/smart_contract_overview/
3,https://gitter.im/etherdelta/etherdelta.github.io/archives/2016/10/25