How to design a decentralized exchange

What’s Decentralized Exchange

A decentralized exchange (better known as a DEX) is a peer-to-peer marketplace where transactions occur directly between crypto traders. DEXs fulfill one of crypto’s core possibilities: fostering financial transactions that aren’t officiated by banks, brokers, payment processors, or any other kind of intermediary.
So a Dex will have the following features:

  • Anonymous
  • Many coin pair
  • Peer-to-Peer exchange

Requirements

  1. User should be able to sell or buy coin pairs.
  2. User should get realtime updates of price changes.
  3. User should be able to see their own order history.

Goal of the system design

  1. High availability, Scalable
  2. Low latency

Design Overview

I prefer to use Domain-Driven Design(DDD) to differentiate each microservice.

Step 1. Roughly distinguish the various components and find the core component.

graph TD
    subgraph boundary ["Boundary"]
        subgraph trading ["Trading"]
        end

        subgraph user ["User"]
        end

        subgraph product ["Product"]
        end

        subgraph chia ["Chia"]
        end

        subgraph pubsub ["Pubsub"]
        end
    end

    style trading fill:#79c4f2

Step 2. Write the functions of each component.

graph TD
    subgraph boundary ["Boundary"]
        subgraph trading ["Trading"]
            order["Order Context"]
            matching["Matching Context"]
        end

        subgraph user ["User"]
            authentication["Authentication Context"]
        end

        subgraph product ["Product"]
            market["Market Context"]
        end

        subgraph chia ["Chia"]
            offer["Offer Context"]
            onchain["Onchain Context"]
        end

        subgraph pubsub ["Pubsub"]
            publish["Publish Context"]
        end
    end

    style trading fill:#79c4f2

Step 3. Connect the dependencies of each component.

graph TD
    subgraph boundary ["Boundary"]
        subgraph trading ["Trading"]
            order["Order Context"]
            matching["Matching Context"]
        end

        subgraph user ["User"]
            authentication["Authentication Context"]
        end

        subgraph product ["Product"]
            market["Market Context"]
        end

        subgraph chia ["Chia"]
            offer["Offer Context"]
            onchain["Onchain Context"]
        end

        subgraph pubsub ["Pubsub"]
            publish["Publish Context"]
        end
    end

    authentication-->order
    market-->order

    order-->matching
    order-->offer
    order-->publish

    matching-->publish
    matching-->onchain

    style trading fill:#79c4f2

Step 4. Define the kind of domain for each component.

graph TD
    subgraph boundary ["Boundary"]
        subgraph trading ["Trading (core subdobmain)"]
            order["Order Context"]
            matching["Matching Context"]
        end

        subgraph user ["User (support subdobmain)"]
            authentication["Authentication Context"]
        end

        subgraph product ["Product (support subdobmain)"]
            market["Market Context"]
        end

        subgraph chia ["Chia (generic subdobmain)"]
            offer["Offer Context"]
            onchain["Onchain Context"]
        end

        subgraph pubsub ["Pubsub (generic subdobmain)"]
            publish["Publish Context"]
        end
    end

    authentication-->order
    market-->order

    order-->matching
    order-->offer
    order-->publish

    matching-->publish
    matching-->onchain

    style trading fill:#79c4f2

And then we can get high level system diagram for our system.

System Overview

graph TD
    subgraph boundary ["Boundary"]
        subgraph user ["User"]
            login(Login)
        end

        subgraph product ["Product"]
            currency(Currency)
            market(Market)
        end

        subgraph trading ["Trading"]
            submit(Submit Order)
            matching(Matching Engine)
        end

        subgraph chia ["Chia"]
            offer(Parse offer)
            onchain(OnChain)
        end

        subgraph pubsub ["Pubsub"]
            publish(publish)
        end
    end

    login-->submit

    currency-->market

    market-->submit

    submit-->matching
    submit-->offer
    submit-->publish

    matching-->onchain
    matching-->publish

    style trading fill:#79c4f2

Components

  • User: It’s an anonymous user component which only create an id for user exclude any identify personal information achieve decentralized system.
  • Product:
    • Currency: It’s a Chia Asset Token (CATs) or coin.
    • Market: It’s a coin pair to exchange different currencies for user.
  • Trading: It’s a core component in DEX which handle whole transaction.
  • Chia:
    • Offer: We need a service can parse offer file content from Chia lightweight wallet generate offer.
    • OnChain: We need a service to bundle many offer to Chia blockchain then the trading transaction before you can.
  • Pubsub: It’s a message queue which publish order or any information to user.