分散取引所（0x）と集権的な取引所の比較とオーダープロセス

# モチベーション
なぜ分散型取引所が集権的な取引所よりも大事なのかを簡単に解説し、オーダーの取引概要を大雑把に掴むこと。

# 集権的な取引所と0x
<h3>ユーザーの資産保護</h3>
<p>中央集権的な取引所（以下CEX）では、取引を行う際に、ユーザーはCEXのコントロールする交換アドレスにアセットをデポジットする必要がある。<b>秘密鍵をCEXが管理するので</b>、CEXはユーザーのアセットに対する所有権を完全所有しハッカーや様々な攻撃からユーザーのアセットを守らなければならない。一方で、0xでトレーディングを行う際は、Ethereumアドレスと秘密鍵を実際にトレードが行われるときまでユーザーが管理することになるので、ハッキングのリスクを減らすことができる。</p>

<h3>オーダーのホストと分配</h3>
CEXでは、単一のエンティティがオーダーをホスティングしているが、0xの場合、誰でもオーダーをホスティングすることができる。（誰でもオーダーの板を作れる）。このオーダーをホスティングするエンティティはリレイヤーと呼ばれている。なのでより分散化された取引の形が実現している。


<h3>トレードの実行</h3>
<p>2つのエンティティが取引に関して合意すると、Ethereum上の0xのスマートコントラクトでその取引が実行される。0xのスマートコントラクトがトークン保有者に代わりトークンを交換するために、トークンの保有者は Allowanceを行う必要がある。</p> Allowanceの詳しい説明に関してはRaderRelayの[こちら](https://medium.com/0x-japan/0x-coinlist-hackathon-ja-a1d18f8c173f)のサイトからチェックすることができる。スマートコントラクトでトレードの実行を行い、そのスマートコントラクトはEthereumネットワークに支えられているので、より分散的であり単一のエンティティに支えられているわけではないので障害耐性が強い。0xプロトコルの場合、リレイヤーの戦略には大きく分けてMatchingとOpen Order Bookがあるが、その両者において、0xはプライベートキーの管理を一切行っていない。

#取引の大まかな流れ
###オーダーを作る
0xプロトコルはOff-chain order matching, On-chain settlement（オーダーのオフチェーンでのマッチングとオンチェーンでの決済）を導入している。オーダーはオフチェーンで管理され、オーダーを作るのは無料である。オーダーを作成するには[@0x/order-utils](https://0x.org/docs/order-utils#introduction)のJavascriptとTypescriptを使う。

###オーダーをサブミットする
オーダーの形式を整えることができたら、そのオーダーをリレイヤーに提出する必要がある。オーダーがfillされたかを確認したい場合、[OrderWatcher](https://0x.org/docs/order-watcher#introduction)にも提出する。

オーダーを提出するコントラクト

```javascript:submitOrderAsync
httpClient.submitOrderAsync(signedOrder: SignedOrder, requestOpts?: RequestOpts): Promise<void>
```

RequestOptsはオプショナルで指定するネットワークID。

提出する際には以下のフォーマットが必要

```
{
    "makerAddress": "0x9e56625509c2f60af937f23b7b532600390e8c8b",
    "takerAddress": "0xa2b31dacf30a9c50ca473337c01d8a201ae33e32",
    "feeRecipientAddress": "0xb046140686d052fff581f63f8136cce132e857da",
    "senderAddress": "0xa2b31dacf30a9c50ca473337c01d8a201ae33e32",
    "makerAssetAmount": "10000000000000000",
    "takerAssetAmount": "20000000000000000",
    "makerFee": "100000000000000",
    "takerFee": "200000000000000",
    "expirationTimeSeconds": "1532560590",
    "salt": "1532559225",
    "makerAssetData": "0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498",
    "takerAssetData": "0x02571792000000000000000000000000371b13d97f4bf77d724e78c16b7dc74099f40e840000000000000000000000000000000000000000000000000000000000000063",
    "exchangeAddress": "0x12459c951127e0c374ff9105dda097662a027093",
    "signature": "0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33"
}
```

成功した際のレスポンスは`Returns HTTP 201 upon success.`で失敗すると`Error response will be sent with a non-2xx HTTP status code. See the Errors section for more information.`を返す。

###オーダーをfillする （fillの方法の相違点に関しては別記事で書きます）
オーダーを0xスマートコントラクトでfillする際には、大きく分けて3つの方法がある。

<b>Single order fills</b>
single ordersをfillする場合

* [fillOrder](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#fillorder)
* [fillOrKillOrder](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#fillorkillorder)
* [fillOrderNoThrow](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#fillordernothrow)

<b>Multiple order fills</b>
1回のトランザクションで複数のオーダーをfillする場合に有効。

* [batchFillOrders](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#batchfillorders)
* [batchFillOrKillOrders](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#batchfillorkillorders)
* [batchFillOrdersNoThrow](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#batchfillordersnothrow)
* [marketSellOrders](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#marketsellorders)
* [marketSellOrdersNoThrow](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#marketsellordersnothrow)
* [marketBuyOrders](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#marketbuyorders)
* [marketBuyOrdersNoThrow](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#marketbuyordersnothrow)

<b>Matching order fills</b>
2者間で交換したいものの一致が起こった場合に有効。[matchOrders](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#matchorders)関数を呼び出すことによりfillする。

#参考
[0x doc](https://0x.org/wiki#Market-Making-on-0x)