This repo was moved to Ciphercurve LLC here
The logos were created by Imran Piash. Rights have been granted to Jonas Pauli (the developer of this project).
Diseq is a distributed sequencer built by Jonas Pauli, a blockchain research engineer from Switzerland.
Note
Feel free to reach out and ask me any questions you may have regarding this project, I am always eager to exchange ideas and knowledge on consensus and distributed systems with fellow cryptographers & engineers.
Diseq acts as a distributed alternative to centralized (or decentralized) sequencing. Based on a novel zero knowledge consensus with deterministic validator selection, Diseq can operate with 51% percent of a fixed validator set being active and honest. Messages are added to a mempool and stored in the block once consensus has concluded and sufficiently many signatures from active nodes were collected. Nodes synchronize blocks to keep an immutable record of the message sequence.
Read the full Litepaper.
If you are an expert then consider also reading some context about BFT.
I began taking this passion project quite seriously, so I added an SQLite DB to store Blocks and Messages. Messages are still read as a single chunk so the txpool for each Block must fit in memory, I do intend to change this.
To run the docker image with 2 nodes that will each have a db e.g. node-1.sqlite, node-2.sqlite where the temporary txpool and all finalized Blocks are stored, run:
docker compose up
The docker image has been tested on amd64 ubuntu 22.04 and an M3 Macbook (arm64) with QEMU.
Port forwarding should make the nodes available a 8080
and 8081
. I plan to simulate larger networks in the future but for now it is designed
to spawn 2 instances that synchronize blocks and commit to proposals / contribute to consensus. The default consensus threshold is 1
- see config
directory.
.route("/schedule", post(schedule))
.route("/commit", post(commit))
.route("/propose", post(propose))
.route("/merkle_proof", post(merkle_proof))
.route("/get/pool", get(get_pool))
.route("/get/commitments", get(get_commitments))
.route("/get/block/height", get(get_block))
.route("/get/state_root_hash", get(state_root_hash))
To view a Block when running the example setup, request 127.0.0.1:8080/get/block/<id>
, or 127.0.0.1:8081/get/block/<id>
.
Whenever a Block is stored, all messages in that block are inserted into the custom Merkle Patricia Trie. For every individual message in the trie a merkle proof can be obtained. See an example for this here.
©️ Ciphercurve GmbH, 2025