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.