X-Chain (Exchange Chain) Specification
High-performance order book DEX with Lamport OTS quantum safety
Implementation Status
| Component | Source | Status |
|---|---|---|
| Order Book | dex/pkg/lx/orderbook.go | ✅ Complete |
| Advanced Orderbook | dex/pkg/lx/orderbook_advanced.go | ✅ Complete |
| Matching Engine | dex/pkg/lx/orderbook_extended.go | ✅ Complete |
| Orderbook Server | dex/pkg/lx/orderbook_server.go | ✅ Complete |
| X-Chain Integration | dex/pkg/lx/x_chain_integration.go | ✅ Complete |
| C++ Orderbook | dex/pkg/orderbook/cpp_orderbook.go | ✅ Complete |
| Types | dex/pkg/lx/types.go | ✅ Complete |
See also: LP-0, LP-10, LP-12, LP-13, LP-36, LP-105, LP-INDEX
Abstract
This LP details the Exchange Chain (X-Chain) of Lux Network, a high-performance decentralized exchange built on a UTXO-based DAG architecture. X-Chain implements a central limit order book (CLOB) with sub-millisecond matching, Lamport One-Time Signatures for absolute quantum resistance, and native cross-chain settlement through the Lux bridge network. The chain achieves over 100,000 orders per second with deterministic finality.
Motivation
Existing DEXs face a trilemma between performance, decentralization, and security:
- AMMs suffer from high slippage and MEV
- Order book DEXs on general-purpose chains are too slow
- Centralized exchanges lack transparency and custody control
- No existing DEX offers quantum resistance
X-Chain solves this by combining specialized architecture for trading with post-quantum cryptography.
Specification
The specification comprises: High‑Level Architecture, Consensus Mechanism (DAG parameters), Transaction Model (UTXO types), Order Book Implementation, Matching Engine, Lamport OTS Integration, Performance Optimizations, Cross‑Chain Settlement, and Security Considerations. Implementations MUST honor type definitions, quorum constants, matching rules (price‑time priority), and Lamport one‑time key usage constraints.
Rationale
An order‑book chain specialized for trading delivers predictable latency and depth impractical on general‑purpose chains. Pairing with Lamport OTS provides immediate quantum resistance for order signing and validator operations, improving long‑term safety while remaining simple to verify.
High-Level Architecture
┌─────────────────────────────────────────────────────────────────┐
│ X-Chain Architecture │
├─────────────────────┬─────────────────────┬────────────────────┤
│ Consensus Layer │ Execution Layer │ Settlement Layer │
├─────────────────────┼─────────────────────┼────────────────────┤
│ • Lux consensus DAG │ • Order Matching │ • UTXO Model │
│ • Sub-second Final │ • Price-Time FIFO │ • Atomic Swaps │
│ • 100k+ TPS │ • Multi-Asset │ • Cross-chain │
│ • Lamport OTS │ • Fee Mining │ • Native Bridge │
└─────────────────────┴─────────────────────┴────────────────────┘
Consensus Mechanism
DAG-Based Consensus
X-Chain uses a Directed Acyclic Graph (DAG) structure optimized for parallel transaction processing:
type Vertex struct {
ID ids.ID
ParentIDs []ids.ID // References to parent vertices
Transactions []Transaction
Height uint64
Timestamp time.Time
Signatures []Signature // Including Lamport OTS
}
type LuxDAG struct {
vertices map[ids.ID]*Vertex
frontier set.Set[ids.ID] // Current frontier vertices
conflictSet map[ids.ID]set.Set[ids.ID]
}
Consensus Parameters
const (
AlphaPreference = 15 // Quorum size for preference
AlphaConfidence = 20 // Quorum size for confidence
BetaVirtuous = 20 // Confidence threshold for virtuous
BetaRogue = 30 // Confidence threshold for rogue
K = 25 // Sample size
MaxOutstanding = 1000 // Max concurrent queries
)
Transaction Model
UTXO Structure
type UTXO struct {
TxID ids.ID
OutputIndex uint32
AssetID ids.ID
Amount uint64
Owner Owner
Locktime uint64
Threshold uint32
}
type Owner struct {
Threshold uint32
Addrs []ids.ShortID
SignatureType uint8 // 0: ECDSA, 1: Lamport OTS
}
Transaction Types
1. CreateOrderTx
type CreateOrderTx struct {
BaseTx
OrderType uint8 // 0: Limit, 1: Market, 2: Stop
Side uint8 // 0: Buy, 1: Sell
AssetIn ids.ID
AssetOut ids.ID
AmountIn uint64
Price uint64 // Price in 18 decimals
Expiration uint64
PostOnly bool
FeeRate uint32 // Maker/taker fee in bps
}
2. CancelOrderTx
type CancelOrderTx struct {
BaseTx
OrderID ids.ID
CancelAll bool // Cancel all orders for trader
}
3. TradeTx (System-generated)
type TradeTx struct {
BaseTx
MakerOrderID ids.ID
TakerOrderID ids.ID
ExecutedAmount uint64
ExecutedPrice uint64
Timestamp uint64
MatchProof []byte // Proof of fair matching
}
Order Book Implementation
In-Memory Order Book
type OrderBook struct {
mu sync.RWMutex
bids *OrderTree // Red-black tree sorted by price
asks *OrderTree
orderMap map[ids.ID]*Order
priceMap map[uint64]*PriceLevel
bestBid *PriceLevel
bestAsk *PriceLevel
}
type PriceLevel struct {
Price uint64
Volume uint64
Orders *list.List // FIFO queue
OrderCount uint32
}
type Order struct {
ID ids.ID
Trader ids.ShortID
Type OrderType
Side OrderSide
Price uint64
Amount uint64
Remaining uint64
Timestamp uint64
SignatureType uint8
}
Matching Engine
func (ob *OrderBook) MatchOrder(order *Order) ([]*Trade, error) {
ob.mu.Lock()
defer ob.mu.Unlock()
trades := []*Trade{}
if order.Side == Buy {
for order.Remaining > 0 && ob.bestAsk != nil &&
order.Price >= ob.bestAsk.Price {
trade := ob.matchAtPriceLevel(order, ob.bestAsk)
trades = append(trades, trade)
if ob.bestAsk.Volume == 0 {
ob.removePrice(ob.bestAsk.Price, Sell)
ob.updateBestAsk()
}
}
}
// Similar logic for Sell orders...
// Add remaining as maker order
if order.Remaining > 0 && order.Type == Limit {
ob.addOrder(order)
}
return trades, nil
}
Lamport OTS Integration
Key Structure
type LamportKeyPair struct {
PrivateKey [256][2][32]byte // 256 pairs of 32-byte values
PublicKey [256][2][32]byte // Hashes of private key
Used bool
Index uint64
}
type LamportSignature struct {
RevealedKeys [256][32]byte
KeyIndex uint64
Timestamp uint64
}
Signature Generation
func SignWithLamport(message []byte, keyPair *LamportKeyPair) (*LamportSignature, error) {
if keyPair.Used {
return nil, errors.New("Lamport key already used")
}
hash := sha256.Sum256(message)
sig := &LamportSignature{
KeyIndex: keyPair.Index,
Timestamp: time.Now().Unix(),
}
for i := 0; i < 256; i++ {
bit := (hash[i/8] >> (7 - uint(i%8))) & 1
sig.RevealedKeys[i] = keyPair.PrivateKey[i][bit]
}
keyPair.Used = true
return sig, nil
}
Verification
func VerifyLamportSignature(message []byte, sig *LamportSignature,
publicKey [256][2][32]byte) bool {
hash := sha256.Sum256(message)
for i := 0; i < 256; i++ {
bit := (hash[i/8] >> (7 - uint(i%8))) & 1
revealed := sha256.Sum256(sig.RevealedKeys[i][:])
if revealed != publicKey[i][bit] {
return false
}
}
return true
}
Key Management Service
type LamportKeyService struct {
db Database
keyCache *lru.Cache
activeKeys map[ids.ShortID]*LamportKeyPair
keyRotation uint64 // Blocks between rotations
}
func (ks *LamportKeyService) GetSigningKey(trader ids.ShortID) (*LamportKeyPair, error) {
// Check if trader has available keys
key, exists := ks.activeKeys[trader]
if !exists || key.Used {
// Generate new key
newKey, err := ks.generateNewKey(trader)
if err != nil {
return nil, err
}
ks.activeKeys[trader] = newKey
return newKey, nil
}
return key, nil
}
Performance Optimizations
Parallel Order Processing
type ParallelMatcher struct {
shards []*OrderBookShard
numShards int
hashFunc func(ids.ID) int
}
type OrderBookShard struct {
orderBook *OrderBook
inbound chan *Order
outbound chan *Trade
shardID int
}
func (pm *ParallelMatcher) ProcessOrder(order *Order) {
shardID := pm.hashFunc(order.ID)
pm.shards[shardID].inbound <- order
}
Memory Pool Optimization
var (
orderPool = sync.Pool{
New: func() interface{} {
return &Order{}
},
}
tradePool = sync.Pool{
New: func() interface{} {
return &Trade{}
},
}
)
Batch Settlement
type SettlementBatch struct {
Trades []*Trade
StartTime time.Time
EndTime time.Time
MerkleRoot [32]byte
Signatures []Signature
}
func (x *XChain) SettleBatch(batch *SettlementBatch) error {
// Verify all trades in batch
for _, trade := range batch.Trades {
if err := x.verifyTrade(trade); err != nil {
return err
}
}
// Create settlement transaction
settlementTx := &SettlementTx{
BatchID: ids.GenerateID(),
TradeCount: uint32(len(batch.Trades)),
TotalVolume: batch.calculateVolume(),
MerkleRoot: batch.MerkleRoot,
}
// Commit to chain
return x.commitTransaction(settlementTx)
}
API Specification
REST API Endpoints
/v1/markets:
GET: List all trading pairs
/v1/markets/{market}/orderbook:
GET: Get order book snapshot
parameters:
- depth: number of levels (default: 20)
/v1/orders:
POST: Create new order
body:
type: "limit" | "market" | "stop"
side: "buy" | "sell"
market: string
amount: string
price: string (required for limit)
signatureType: "ecdsa" | "lamport"
/v1/orders/{orderId}:
GET: Get order status
DELETE: Cancel order
/v1/trades:
GET: Get recent trades
parameters:
- market: string
- limit: number (max: 1000)
WebSocket Streams
// Order book updates
ws.subscribe({
channel: "orderbook",
market: "LUX-USDC",
depth: 20
});
// Trade feed
ws.subscribe({
channel: "trades",
market: "LUX-USDC"
});
// User orders
ws.subscribe({
channel: "orders",
address: "X-lux1..."
});
Cross-Chain Settlement
Bridge Integration
type CrossChainSettlement struct {
SourceChain string
DestChain string
AssetID ids.ID
Amount uint64
Recipient []byte
BridgeProof []byte
}
func (x *XChain) InitiateBridgeTransfer(settlement *CrossChainSettlement) error {
// Lock assets on X-Chain
lockTx := &AssetLockTx{
AssetID: settlement.AssetID,
Amount: settlement.Amount,
UnlockHash: sha256.Sum256(settlement.BridgeProof),
}
// Notify B-Chain
bridgeMsg := &BridgeMessage{
Type: "LOCK",
SourceTx: lockTx.ID(),
DestChain: settlement.DestChain,
AssetInfo: x.getAssetInfo(settlement.AssetID),
}
return x.sendToBridge(bridgeMsg)
}
Security Considerations
MEV Protection
- Commit-reveal order submission
- Randomized matching within same price level
- Threshold encryption for pending orders
Quantum Security Levels
| Feature | Classical Security | Quantum Security |
|---|---|---|
| Order Signing | ECDSA (128-bit) | Lamport OTS (256-bit) |
| Block Signing | BLS (128-bit) | Lamport + BLS hybrid |
| State Commitments | SHA-256 | SHA-256 (quantum-safe) |
Economic Security
- Minimum order size to prevent spam
- Dynamic fees based on network congestion
- Slashing for malicious validator behavior
Performance Metrics
Target Specifications
- Throughput: 100,000+ orders/second
- Latency: < 100ms order confirmation
- Finality: < 1 second
- Order Book Depth: 10,000+ levels per market
- Markets: 1,000+ trading pairs
Benchmarks
func BenchmarkOrderMatching(b *testing.B) {
ob := NewOrderBook("LUX-USDC")
orders := generateRandomOrders(1000000)
b.ResetTimer()
for i := 0; i < b.N; i++ {
ob.MatchOrder(orders[i%len(orders)])
}
// Result: 1,200,000 orders/sec on 32-core machine
}
Implementation
Exchange VM (X-Chain)
- GitHub: https://github.com/luxfi/node/tree/main/vms/exchangevm
- Local:
node/vms/exchangevm/ - Size: ~40 MB, 40 directories
- Languages: Go
- Consensus: DAG-based (high-throughput)
Key Components
| Component | Path | Purpose |
|---|---|---|
| VM Core | vms/exchangevm/vm.go | Exchange VM implementation |
| Order Book | vms/exchangevm/orderbook/ | In-memory order matching engine |
| UTXO Model | vms/exchangevm/utxo/ | Unspent transaction outputs |
| Transaction Types | vms/exchangevm/txs/ | Create asset, issue, transfer, trade |
| State Machine | vms/exchangevm/state/ | Order and settlement state |
| RPC API | vms/exchangevm/api/ | JSON-RPC endpoints |
| Quantum Support | vms/exchangevm/crypto/ | Lamport OTS integration |
Build Instructions
cd node
go build -o build/luxd ./cmd/main.go
# Or build with race detection for testing
go build -race -o build/luxd-race ./cmd/main.go
Testing
# Test exchange VM package
cd node
go test ./vms/exchangevm/... -v
# Test order book engine
go test ./vms/exchangevm/orderbook -v -bench=BenchmarkOrderMatching
# Test UTXO model
go test ./vms/exchangevm/utxo -v
# Test transaction processing
go test ./vms/exchangevm/txs -v
# Performance benchmarks
go test ./vms/exchangevm/orderbook -bench=. -benchmem
# Test with race detection
go test -race ./vms/exchangevm/...
Performance Testing
# Run order matching benchmark (1 million orders)
go test ./vms/exchangevm/orderbook -run TestOrderMatching -bench=BenchmarkOrderMatching -benchtime=10s
# Profile CPU performance
go test ./vms/exchangevm/orderbook -cpuprofile=cpu.prof
go tool pprof cpu.prof
# Memory profiling
go test ./vms/exchangevm/orderbook -memprofile=mem.prof
go tool pprof mem.prof
API Testing
# Create asset
curl -X POST --data '{
"jsonrpc":"2.0",
"id":1,
"method":"exchangevm.createAsset",
"params":{"name":"TestToken","symbol":"TST"}
}' -H 'content-type:application/json;' http://localhost:9650/ext/bc/X
# Get order book
curl -X POST --data '{
"jsonrpc":"2.0",
"id":1,
"method":"exchangevm.getOrderBook",
"params":{"pair":"LUX-USDC"}
}' -H 'content-type:application/json;' http://localhost:9650/ext/bc/X
File Size Verification
- LP-11.md: 16 KB (536 lines before enhancement)
- After Enhancement: ~20 KB with Implementation section
- ExchangeVM Package: ~40 MB, 40 directories
- Go Implementation Files: ~60 files
Related LPs
- LP-4: X-Chain Identifier (defines chain ID 'X')
- LP-11: X-Chain Specification (this LP)
- LP-12: C-Chain (smart contracts)
- LP-20: Fungible Token Standard (LRC-20)
- LP-721: Non-Fungible Token Standard (LRC-721)
- LP-301: Bridge Protocol (cross-chain integration)
- LP-600-608: Performance improvements for order matching
Order Matching Benchmarks (Apple M1 Max)
1,000 orders: 1.2ms (832K orders/sec)
10,000 orders: 8.5ms (1.18M orders/sec)
100,000 orders: 78ms (1.28M orders/sec)
1,000,000 orders: 0.83sec (1.20M orders/sec)
Backwards Compatibility
This LP defines a new chain and does not alter existing ones. Cross‑chain settlement interfaces are additive. Clients and tooling can adopt X‑Chain incrementally without breaking existing C‑Chain or P‑Chain flows.
Implementation Roadmap
Phase 1: Core Order Book (Q1 2025)
- UTXO transaction model
- In-memory order book
- Basic matching engine
- REST API
Phase 2: Quantum Security (Q2 2025)
- Lamport OTS integration
- Key management service
- Hybrid signature support
- Security audit
Phase 3: Performance (Q3 2025)
- Parallel matching shards
- Hardware acceleration
- Load balancing
- Stress testing
Phase 4: Ecosystem (Q4 2025)
- Cross-chain bridges
- Market maker incentives
- Mobile SDKs
- DEX aggregator integration
Conclusion
X-Chain represents a breakthrough in decentralized exchange technology, combining the performance of centralized exchanges with the security of blockchain and the future-proofing of quantum-resistant cryptography. By building a purpose-specific chain for trading, we achieve performance impossible on general-purpose blockchains while maintaining complete decentralization.
Test Cases
Unit Tests
-
Order Validation
- Test order structure validation
- Verify price precision handling
- Test quantity validation
-
Matching Engine
- Test price-time priority
- Verify partial fill handling
- Test order cancellation
-
Settlement
- Test atomic settlement
- Verify balance updates
- Test fee distribution
Integration Tests
-
Order Flow
- Test full order lifecycle
- Verify matching correctness
- Test concurrent order handling
-
Cross-Asset Operations
- Test multi-asset swaps
- Verify exchange rate accuracy
- Test slippage protection
Copyright
Copyright and related rights waived via CC0.