Orderbook Checksum

Every orderbook message contains a 32-bit integer checksum (represented as a base-10 string). This checksum is used to compare a client's orderbook state versus the matching engine's orderbook state.

Should these checksums differ between client and server, the Websocket client is encouraged to re-subscribe to the channel to fetch the new orderbook snapshot in order to re-build the orderbook state.

  • The preimage of the checksum is generated by concatenating each order's price and size, sorted by their price levels
  • Only the best 100 price levels are included for purposes of checksumming.
  • Format: <best_bid_price>:<best_bid_size>:<best_ask_price>:<best_ask_size>:<second_best_bid_price>:<second_best_bid_size>:...

Example:

  • orderbook: { "bids": ["9", "2"]], "asks": [["10", "1"] }
  • resulting concatenation: 9:2:10:1
// Code Example

import zlib

def checksum(bids, asks):
    preimage = ""
    iterations = max(len(bids), len(asks))

    for index in range(min(iterations, 100)):
        if len(bids) > index:
            price, size = bids[index]
            preimage += price + ":" + size + ":"

        if len(asks) > index:
            price, size = asks[index]
            preimage += price + ":" + size + ":"
    
    preimage = preimage[:-1] # strip last colon
    crc = zlib.crc32(preimage.encode("utf8")) & 0xFFFFFFFF
    return crc

print(checksum([["9", "2"]], [["10", "1"]])) # 1226559413