Custom Consensus Mechanism Development

When standard consensus protocols don't meet the requirements of your blockchain project, we develop a custom mechanism turnkey. Our team of experts will audit, design, and implement a solution tailored to your network's specifics, ensuring reliability and security at every stage—from concept to ongoing support.

Blockchain Development Services

Frequently Asked Questions

Latest works

  • Development of a web application for FEEDME
    Development of a web application for FEEDME
    1365
  • Development of an online store for the company FURNORO
    Development of an online store for the company FURNORO
    1330
  • B2B Advance company logo design
    B2B Advance company logo design
    776
  • Development of a web application for Enviok
    Development of a web application for Enviok
    1077
  • AIDER company logo development
    AIDER company logo development
    1022
  • CRM development for Chasseurs
    CRM development for Chasseurs
    1113

Custom Consensus Mechanism Development

Most projects that come with a request to "develop our own consensus" actually don't need a custom consensus. They need an application-specific chain with modified parameters: a different block time, different transaction inclusion rules, a custom mempool. This is achievable via Cosmos SDK or OP Stack without writing a new consensus protocol. A true custom consensus requires 10–18 months of work from a team of experienced distributed systems engineers and formal verification of correctness. We help you assess the project and choose the optimal solution—from adapting an existing protocol to full turnkey development. Get a consultation for your project—contact us, we will estimate the timeline and complexity.

When Is a Custom Consensus Really Necessary?

Legitimate cases: specialized networks with non-standard performance requirements (>100k TPS, deterministic finality <100ms), consortium networks with custom validator admission rules, research/academic projects, experimental mechanisms (VDF-based randomness, threshold signatures as consensus). In most cases, it's simpler to take an existing algorithm and adapt it. Let's explore the architectural space of choices.

How to Choose a Consensus Mechanism for Your Project?

Consensus Protocol Taxonomy

Classical BFT: pBFT and Derivatives

pBFT (Practical Byzantine Fault Tolerance, Castro & Liskov, late 1990s) was the first practical BFT algorithm. O(n²) messages, works with < n/3 Byzantine nodes. In its pure form, it does not scale beyond ~20 nodes due to communication overhead.

Modern derivatives:

  • HotStuff (used in LibraBFT/DiemBFT/Jolteon): linear communication complexity O(n), leader-based scheme with pipelining. HotStuff requires half the messages of pBFT, reducing network fees.
  • Tendermint/CometBFT: round-based, deterministic finality per block, used in Cosmos SDK. Two phases: prevote and precommit. Requires >2/3 voting power for finality.
  • PBFT with threshold signatures: replaces n² communication with aggregation via BLS threshold signatures—each validator signs with a BLS key, the aggregator collects threshold signatures into one.

Nakamoto Consensus and Derivatives

PoW Nakamoto—probabilistic finality, fork choice rule (longest chain / most work). Never final, but practically irreversible after enough confirmations. Simplicity is the main advantage.

GHOST protocol (Greedy Heaviest-Observed Subtree): fork choice accounts for uncle blocks, not just the main chain. Used in Ethereum (Gasper—combination of GHOST + Casper FFG).

Proof-of-Stake variants: "computational work" replaced by stake. Validator selection via VRF (Verifiable Random Function)—Algorand, Cardano Ouroboros.

DAG-Based Consensus

Hashgraph (Hedera): events organized in a DAG, virtual voting without messages. A deterministic algorithm computes consensus timestamp and order from the DAG structure.

Narwhal/Bullshark (Sui): Narwhal—DAG-based mempool with certified availability (each block is certified by 2f+1 signatures). Bullshark—interprets the DAG for ordering. Separates data dissemination from ordering.

Mysticeti (new Sui consensus): removes the leader from the critical path, reduces latency.

Approach Comparison

Characteristic Classical BFT (HotStuff) Nakamoto (PoW) DAG (Hashgraph)
Finality Deterministic, in 1 block Probabilistic, ~6 blocks Deterministic, in 1 round
Communication complexity O(n) messages O(n) (gossip) O(n²) (virtual voting)
Byzantine tolerance < n/3 < 1/2 hash power < n/3
Latency (typical) 1–3 sec 10–60 min 1–5 sec
Throughput ~10k TPS ~10 TPS (Bitcoin) ~100k TPS (Hedera)

Implementation Language Comparison

Characteristic Go Rust
BLS libraries herumi/bls-eth-go-binary bls12-381, blst
P2P stack libp2p (go-libp2p) libp2p (rust-libp2p)
Example projects Cosmos, Ethereum CL Solana, NEAR, Substrate
Performance High (GC overhead) Very high (no GC)
Development complexity Lower Higher (ownership, traits)

Implementation: Example HotStuff-Inspired Protocol

Let's consider key components when implementing BFT consensus in Go:

Data Structures

type Block struct {
    Height       uint64
    ParentHash   [32]byte
    Txns         []Transaction
    QC           *QuorumCertificate
    Timestamp    int64
    ProposerID   NodeID
}

type QuorumCertificate struct {
    BlockHash  [32]byte
    Height     uint64
    Signatures []BLSSignature
    Signers    []NodeID
}

type Vote struct {
    BlockHash [32]byte
    Height    uint64
    Round     uint32
    VoterID   NodeID
    Signature BLSSignature
}

The Three Phases of HotStuff

HotStuff organizes consensus into three phases (prepare, pre-commit, commit) with pipelining—while block k goes through commit, block k+1 goes through pre-commit, block k+2 through prepare:

type HotStuffNode struct {
    id            NodeID
    height        uint64
    lockedQC      *QuorumCertificate
    preparedQC    *QuorumCertificate
    privateKey    bls.PrivateKey
    validators    ValidatorSet
}

func (n *HotStuffNode) onReceiveProposal(block *Block) {
    // Safety rule: accept only if block.QC >= n.lockedQC
    if block.QC.Height < n.lockedQC.Height {
        return // reject
    }
    // Liveness rule: accept if block.QC >= n.preparedQC
    // or block extends the locked block
    if !n.safeNode(block) {
        return
    }
    vote := n.createVote(block)
    n.sendToLeader(vote)
}

func (n *HotStuffNode) safeNode(block *Block) bool {
    // Extends locked branch OR QC is higher than lockedQC
    return block.QC.Height > n.lockedQC.Height || n.extendsLockedBlock(block)
}

BLS Threshold Signatures

Signature aggregation via the BLS12-381 curve is the standard for modern BFT protocols. Threshold scheme (t of n): each validator signs with its own key, the aggregator collects t signatures and creates one aggregated signature verifiable by a single public key:

import "github.com/herumi/bls-eth-go-binary/bls"

func aggregateSignatures(sigs []bls.Sign) bls.Sign {
	var agg bls.Sign
	agg.Add(&sigs[0])
	for i := 1; i < len(sigs); i++ {
		agg.Add(&sigs[i])
	}
	return agg
}

func verifyQC(qc *QuorumCertificate, validators ValidatorSet) bool {
	pubkeys := make([]bls.PublicKey, len(qc.Signers))
	for i, id := range qc.Signers {
		pubkeys[i] = validators.GetPublicKey(id)
	}
	aggPubkey := bls.AggregatePubkeys(pubkeys)
	return qc.Signatures[0].VerifyHash(&aggPubkey, qc.BlockHash[:])
}

View Change: Handling Leader Failures

Liveness under a Byzantine leader is the most challenging aspect. In HotStuff, view change occurs on timeout:

func (n *HotStuffNode) onTimeout(view uint32) {
	// Broadcast timeout message with current lockedQC
	timeout := TimeoutMsg{
		View:     view,
		LockedQC: n.lockedQC,
		SenderID: n.id,
		Sig:      n.sign(view, n.lockedQC),
	}
	n.broadcast(timeout)
}

func (n *HotStuffNode) onReceiveTimeouts(timeouts []TimeoutMsg) {
	if len(timeouts) < n.validators.QuorumSize() {
		return
	}
	// New leader: node with highest view in round-robin or VRF
	newLeader := n.electLeader(timeouts[0].View + 1)
	if newLeader == n.id {
		// Pick the highest QC from timeout messages
		highQC := n.highestQC(timeouts)
		n.proposeBlock(highQC)
	}
}

Why Formal Verification Is Critical

For a production consensus protocol, formal verification of safety and liveness properties is mandatory. Tools:

  • TLA+: a formal specification language. Specify safety invariants like "two honest nodes cannot commit different blocks at the same height." The TLC model checker verifies all reachable states for n ≤ 5–7 nodes.
  • Ivy: a language for verifying distributed protocols. Used by the Hedera team for Hashgraph. Coq/Lean for proof assistant approach.

Without formal verification, a custom consensus should never be used in production with real assets. Blockchain history is full of consensus bugs discovered years later (Ethereum Byzantium fork bugs, recent Cosmos SDK consensus vulnerabilities).

Network Layer: P2P Transport

Consensus messages require low-latency delivery. Protobuf serialization is mandatory (JSON is too slow for consensus-critical messages). Transport options:

  • libp2p: the de facto standard in Web3. GossipSub for broadcast, direct streams for unicast. Used in Ethereum, Filecoin, Polkadot.
  • QUIC/gRPC: for more controlled P2P topologies (enterprise blockchain).

Stack and Timelines

Implementation language: Go (Tendermint, Ethereum CL) or Rust (Solana, NEAR, Polkadot substrate)—both have mature BLS libraries and P2P stacks.

Realistic stages:

  • Specification and formal model in TLA+: 4–6 weeks
  • Basic happy path implementation: 8–12 weeks
  • View change and Byzantine fault handling: 8–12 weeks
  • Testing (chaos testing, Byzantine fault injection): 8–12 weeks
  • Formal verification: 4–8 weeks
  • Security audit: 6–8 weeks

Total: 10–18 months to production-ready consensus. Adapting an existing protocol (CometBFT/HotStuff reference implementation) with custom parameters: 3–6 months.

Turnkey Custom Consensus Development Process

  1. Requirements analysis and architecture selection — 1–2 weeks.
  2. Formal specification in TLA+ — 4–6 weeks.
  3. Happy path implementation in Go/Rust — 8–12 weeks.
  4. View change and Byzantine fault handling implementation — 8–12 weeks.
  5. Testing with chaos and Byzantine injection — 8–12 weeks.
  6. Formal verification — 4–8 weeks.
  7. Security audit — 6–8 weeks.
  8. Testnet deployment and documentation — 2–4 weeks.

What's Included in the Work

  • Full development cycle: from architectural design to mainnet deployment.
  • Formal specification and verification (TLA+ / Coq).
  • Open-source or commercial BLS libraries.
  • Integration with libp2p/gossipsub.
  • Load testing and Byzantine scenario simulation.
  • Security audit (in partnership with auditors).
  • Developer and operator documentation.
  • Training for your team.

Get a consultation for your project—contact us, we will estimate timelines and complexity. Turnkey development with formal correctness guarantees.