Consensus Mechanisms Reference
Related workflows: Event Submission · BFT Consensus
HieraChain supports three pluggable consensus mechanisms, configured via the HRC_CONSENSUS_TYPE environment variable. The event submission flow (Event Submission) is identical regardless of which mechanism is selected — only the finalize_block() step differs.
Mechanism Comparison
| Aspect | PoA | PoF | BFT |
|---|---|---|---|
| Config value | proof_of_authority |
proof_of_federation |
byzantine_fault_tolerant |
| Who finalizes | Any registered authority | Only rotating leader: Validators[index % n] |
2f+1 of n validators via PBFT |
| Signature type | Ed25519 (asymmetric) | SHA-256 federation signature | Aggregated PBFT votes |
| Leader rotation | Optional round-robin | Enforced — deterministic by block index | View-based, changes on failure |
| ZK Proof check | Optional | Enforced in validate_block() |
N/A |
| Min validators | 1 authority sufficient | ≥ 3 (min_validators config) |
n ≥ 3f + 1 |
| Fault model | Trust the authority identity | Distributed trust, tolerate absent validator | Tolerates up to f Byzantine nodes |
| Use case | Private / internal networks | Consortium / multi-org | Critical / adversarial environments |
Proof of Authority (PoA)
Activated when
HRC_CONSENSUS_TYPE=proof_of_authority(default). A single pre-registered authority signs the block with its Ed25519 private key.
sequenceDiagram
autonumber
participant OS as ⚙️ OrderingService
participant POA as 🔏 ProofOfAuthority
OS->>POA: finalize_block(block, authority_id)
POA->>POA: is_authority(authority_id)
Note right of POA: Reject if not in authority registry
POA->>POA: _check_block_timing(block, previous_block)
Note right of POA: block.timestamp - prev.timestamp >= block_interval / 2
POA->>POA: _validate_block_events()
Note right of POA: Scan all events for forbidden crypto terms
POA->>POA: _create_authority_signature(block, authority_id, private_key)
Note right of POA: Ed25519 sign(hash + authority_id + timestamp)<br/>Fallback to random KeyPair in test mode
POA->>POA: Append consensus_finalization event<br/>{ authority_id, authority_signature, finalized_at }
POA-->>OS: Finalized Block ✅
Key Classes — PoA
| Step | Class / Method | File |
|---|---|---|
| Authority check | ProofOfAuthority.is_authority() |
consensus/proof_of_authority.py |
| Timing check | _check_block_timing() |
consensus/proof_of_authority.py |
| Sign block | _create_authority_signature() |
consensus/proof_of_authority.py |
| Finalize | ProofOfAuthority.finalize_block() |
consensus/proof_of_authority.py |
Proof of Federation (PoF)
Activated when
HRC_CONSENSUS_TYPE=proof_of_federation. Leader is elected deterministically by block index. ZK proof is enforced.
sequenceDiagram
autonumber
participant OS as ⚙️ OrderingService
participant POF as 🤝 ProofOfFederation
OS->>POF: finalize_block(block, authority_id)
POF->>POF: can_create_block(authority_id)
Note right of POF: Requires >= min_validators (default 3)
POF->>POF: get_current_leader(block.index)<br/>= Validators[ block.index % n ]
POF->>POF: validate_block_proposer(block.index, authority_id)
Note right of POF: Reject if authority_id != expected leader
POF->>POF: _validate_block_events()
Note right of POF: Scan all events for forbidden crypto terms
POF->>POF: _verify_block_zk_proof(block, previous_block)
Note right of POF: Enforced — fails block if ZK invalid
POF->>POF: _create_federation_signature(block, leader_id)<br/>SHA-256(hash:leader_id:block.index:time)
POF->>POF: Append consensus_finalization event<br/>{ leader_id, validators_count, round, signature }
POF-->>OS: Finalized Block ✅
Key Classes — PoF
| Step | Class / Method | File |
|---|---|---|
| Leader election | ProofOfFederation.get_current_leader() |
consensus/proof_of_federation.py |
| Proposer check | validate_block_proposer() |
consensus/proof_of_federation.py |
| ZK verify | _verify_block_zk_proof() |
consensus/proof_of_federation.py |
| Federation sign | _create_federation_signature() |
consensus/proof_of_federation.py |
| Finalize | ProofOfFederation.finalize_block() |
consensus/proof_of_federation.py |
Byzantine Fault Tolerance (BFT / PBFT)
Activated when
HRC_CONSENSUS_TYPE=byzantine_fault_tolerant. Full 3-phase PBFT. See BFT Consensus for the complete flow.
Requirements: n ≥ 3f + 1 nodes to tolerate f faulty nodes.
View Change: If the leader fails within timeout, view += 1, new leader = Validators[view % n], protocol restarts from Phase 1.
Configuration Reference
| Variable | Values | Description |
|---|---|---|
HRC_CONSENSUS_TYPE |
proof_of_authority (default), proof_of_federation, byzantine_fault_tolerant |
Active consensus mechanism |
HRC_ENABLE_ZK_PROOFS |
true / false |
Toggle ZK verification (required for PoF production) |
HRC_ZK_MODE |
mock, production |
ZK implementation: SHA-256 simulation or ZoKrates circuits |