EOSfinex is a high-performance decentralised exchange built on EOSIO which will run fully on-chain — custody, order book, and matching engine are all part of the EOS contracts. EOSfinex is set for full launch in Q1 of 2019.

In the below article, we will take a look at the additional WebSocket protocols which we are offering to traders, as well as using the gateway in practise.

EOS On WebSockets

Usually, EOS contracts offer an HTTP-based API, which will be one way of trading on EOSfinex. In addition to this, we will also support low latency WebSockets. WebSockets allow users to react quickly to drastic market movements and are at the same time a web standard.

The WebSocket protocol for EOSfinex is based on the v2 protocol that is in use at Bitfinex. To make trading in the decentralised environment possible, we added a few changes.

We’ve designed the gateway to be capable of high-performance, and to make it simple for existing Bitfinex users to use it.

The following section shows a trade update message from the EOSfinex WebSocket gateway.

Looks pretty familiar to our API v2 messages, doesn’t it?

[ '0',

'tu',

[ '10',

'EOS.USD',

1549888790502,

'26195',

-10.99,

3,

'LIMIT',

0,

6594000,

'USD',

15498887884290,

1 ] ]

Auth & Pre-Signing

To be able to trade via WebSockets, we have to connect to the WebSocket gateway. The gateway itself runs as a native EOS plugin, on an EOS node next to the contract. The trader presigns the orders with their private key before sending it to the gateway.

The gateway then applies it to the contract. This way, no private keys ever leave the traders machine.

Our WebSocket library currently supports private key based signing and Scatter. In the future, we will add hardware wallet support.

Below is a sample message, sent from the client to the gateway, which would submit a trade:

[0,"on",null,{"meta":{"expiration":"2019-02-11T13:59:55","ref_block_num":53303,"ref_block_prefix":3288141905,"max_net_usage_words":0,"max_cpu_usage_ms":0,"delay_sec":0,"context_free_actions":[],"actions":[{"account":"exchgcntract","name":"place","authorization":[{"actor":"testuser4321","permission":"active"}],"data":"10c42057619db1ca620c6d9e180e000000003020610d305510270000000000004cad01000000000000"}],"transaction_extensions":[],"signatures":["SIG_K1_KfW7wg125Rc9Jt7HWTu3gzfXZqw24PjE4boTvYHuu1u3CTLeQGnz2xv2LLcWvBD1Paff7mV8qFUpnN4ttyp2jCpUGT8LaF"]}}]

By nature, all updates are public for an on-chain exchange. But how can one decide which trade update message belongs to the right user? This is an important question required for sending the right message to their socket.

For this reason we have added a special endpoint to our contract. The name of the EOS action is validate . Sunbeam, our WebSocket library uses it as part of an auth process.

By calling auth(), Sunbeam sends a locally signed message to the websocket gateway. The message sent to the validate action itself is empty and does not trigger anything.

The gateway only uses it to verify the user by comparing the signed message with their public keys on-chain. With an successful auth, we receive "private" wallet messages, trades and order updates.