Consensus
Engine
Makechain uses Simplex BFT via the commonware-consensus primitive. A single consensus chain orders all messages with parallel per-project execution within each block.
| Property | Value |
|---|---|
| Block time | ~200ms target |
| Finality | ~300ms (2-chain rule) |
| Fault tolerance | Byzantine fault tolerant up to 1/3 of validators |
Validators are selected by a permissioned set initially, with a path to permissionless staking.
Block Lifecycle
- Propose — The round leader drains the mempool, executes messages in two phases (account pre-pass + parallel project execution), and produces a state root digest
- Verify — Other validators re-execute the messages and verify the state root matches
- Notarize — Validators vote to notarize the block (2/3 threshold)
- Finalize — When two consecutive blocks are notarized, the first is finalized (2-chain rule)
- Commit — State diffs are applied to the base store and committed messages are broadcast to subscribers
Networking
- Transport:
commonware-p2p::authenticated— encrypted connections between peers identified by Ed25519 public keys - Channels: Three Simplex network channels — votes, certificates, and resolver (catch-up)
- Mempool: Messages submitted to any validator are propagated to the leader's mempool
- Sync: New nodes download periodic snapshots, then sync blocks from the snapshot height
Configuration
Key consensus parameters (configurable via ConsensusConfig):
| Parameter | Default | Description |
|---|---|---|
leader_timeout | 200ms | Time to wait for a leader proposal |
notarization_timeout | 500ms | Time to wait for notarization |
max_block_messages | 10,000 | Maximum messages per block |
max_project_messages | 500 | Maximum messages per project per block |
mempool_capacity | 100,000 | Maximum pending messages |
max_timestamp_age_secs | 600 | Reject messages older than 10 minutes |
max_timestamp_drift_secs | 30 | Reject messages more than 30s in the future |