0x-start-project源码学习 - 1

0x project在之前已经提过,它是一个去中心交易合约,它的作用是可以让ERC20或ERC721代币在链上进行交易,例如用户A希望用100TokenA换取50个TokenB,可以创建一个订单来实现这个交易,这个订单会在线上自动交易,这样不用担心用户之间交易的信用问题(如A把Token打给了B,但是B没有打给A对应的TOKEN)。

0x项目的特点是向比与中心化交易所,去中心化交易更加可靠,和其他去中心化交易所相比,在进行交易之前0x的订单是在链下保存,他保障了交易的效率。

更准确的说0x不仅是一个去中心化的交易的合约,而是一个去中心化交易的项目,他包括了一组合约来完成这个交易:

Mainnet

本节主要是在看0x-start-project项目之前,我们先来了解一些相关的内容。

WETH


WETH其实就是wrapped eth,意思是指被包裹的ETH,他与ETH1:1进行兑换,主要是因为ETH并不是ERC20代币,不符合0x的交易标准,所以可以通过WETH来代替ETH进行交易.

Relayer


(Relayer)中继者是0x线下管理订单的实体,他可以通过撮合交易来获取中间费用,中继者的存在可以让订单在成交之前储存在线下,这样可以提供在线交易的效率,不同中继者之间可以流转交易订单,通过把订单提交给中继者然后让中继者广播也可以增加订单的传播途径。

SRA


sra是指standard relayer api,通过standard relayer api可以快速构建一个relayer。

交易策略


  • Open orderbook(开放订单策略)

订单设置Taker为空地址(0x0000000000000000000000000000000000000000),将订单提交给Relayer,当taker看到订单后,可以Fill Order然后提交订单信息,执行交易。
例如:用户A想用1 WETH换取1000 ZRX,用户A将订单OrderA提交给Relayer,用户B看到后通过fillOrder(orderA, 1000)完成交易获得1个WETH,这个交易由用户B执行,负责提供Gas。

  • Matching(匹配策略)

匹配策略是指由Relayer匹配用户的订单执行交易。
例如:用户A想用1WETH换取1000ZRX,将订单A提交给Relayer,用户B想用1000ZRX换取1WETH,将订单B提交给Relayer,Relayer发现订单A和订单B刚好可以匹配,通过batchFillOrKillOrders(orderA, 1000, orderB, 1)执行交易

  • Quote provider(报价策略/买入策略)

报价策略是指由Relayer提供一个报价,用户可以按照Relayer提供的报价创建订单,将Taker设置为Relayer,将订单提供给Relayer由其完成交易。
例如:Relayer提供每个WETH换取1000ZRX的报价,用户A提交提供10000ZRX换取10WETH的订单A,Relayer通过fillOrder(orderA, 10000)来执行交易。

  • Reserve manager (储备策略/卖出策略)

储备策略是指Relayer卖出指定的token,可以多个用户向Relayer进行交易。
例如:Relayer广播订单A,希望出售100WETH来换取100000ZRX在60秒内。用户A可以通过fillOrder(orderA, 1000)来换取2WETH,用户B可以通过fillOrder(orderB, 2000)来换取2WETH。

订单(Order)


订单是0x交易的基础数据类型,具体构成如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
interface Order {
// 交易发送方地址 发送给0x
senderAddress: string;
// 卖方地址
makerAddress: string;
// 卖方地址
takerAddress: string;
// 卖方手续费
makerFee: BigNumber;
// 买房手续费
takerFee: BigNumber;
// 卖方币种金额
makerAssetAmount: BigNumber;
// 买方币种金额
takerAssetAmount: BigNumber;
// 卖方币种数据
makerAssetData: string;
// 买方币种数据
takerAssetData: string;
// 订单随机种子盐
salt: BigNumber;
// 交易地址(0x合约地址)
exchangeAddress: string;
// 手续费接收地址
feeRecipientAddress: string;
// 订单过期时间
expirationTimeSeconds: BigNumber;
}

ZRX


ZRX是0x发行的代币,作为Relayer的中间交易费用,同时也可以用于0x项目的投票份额。

Forwarder


Forwarder是促进者,运送者的意思,这里是指可以通过Forwarder实现ETH直接换取其他代币的操作,原本ETH不是ERC20代币,需要通过WETH进行交易,Forwarder可以直接自动换取WETH,实现了直接通过ETH换取其他代币,提升了用户体验。