synor/crates/synor-dag/src/lib.rs
Gulshan Yadav 4983193f63 feat(dag): add Phase 13 M1 - DAGKnight 32/100 BPS support
- Add BlockRateConfig enum with Standard (10 BPS), Enhanced (32 BPS),
  and Maximum (100 BPS) presets
- Add AdaptiveKBounds with scaled k ranges per block rate:
  - Standard: k 8-64, default 18
  - Enhanced: k 16-128, default 32
  - Maximum: k 50-255, default 64
- Add DagKnightManager::with_config() constructor for block rate selection
- Update adaptive k calculation to use configurable bounds
- Add NetworkConfig module in synor-consensus with:
  - BpsMode enum and NetworkConfig struct
  - DAA window, finality depth, pruning depth scaling
  - BPS comparison table generator
- Add comprehensive tests for all block rate configurations
2026-01-19 20:10:05 +05:30

155 lines
5.2 KiB
Rust

//! GHOSTDAG consensus implementation for Synor blockchain.
//!
//! This crate implements the GHOSTDAG (Greedy Heaviest-Observed Sub-Tree Directed Acyclic Graph)
//! protocol, based on Kaspa's design with modifications for Synor.
//!
//! # GHOSTDAG Overview
//!
//! GHOSTDAG allows multiple blocks to be created in parallel while maintaining
//! a consistent ordering through a "blue set" selection algorithm.
//!
//! Key concepts:
//! - **DAG**: Directed Acyclic Graph where blocks can have multiple parents
//! - **Blue Set**: The "honest" chain of blocks, selected using k-cluster
//! - **Blue Score**: Cumulative count of blue blocks in ancestry
//! - **k parameter**: Controls how many parallel blocks are allowed (antichain width)
//!
//! # Performance Targets
//!
//! - Block time: ~100ms (10 blocks/second)
//! - Max parents per block: 64
//! - k parameter: 18 (allows ~18 parallel miners)
#![allow(dead_code)]
pub mod dag;
pub mod dagknight;
pub mod ghostdag;
pub mod latency;
pub mod ordering;
pub mod pruning;
pub mod reachability;
pub use dag::{BlockDag, BlockRelations, DagError};
pub use dagknight::{
calculate_optimal_k, calculate_optimal_k_for_config, estimate_throughput,
AdaptiveKBounds, ConfirmationConfidence, ConfirmationStatus, DagKnightManager,
};
pub use ghostdag::{GhostdagData, GhostdagError, GhostdagManager};
pub use latency::{LatencySample, LatencyStats, LatencyTracker};
pub use ordering::{BlockOrdering, OrderedBlock};
pub use pruning::{PruningConfig, PruningManager};
pub use reachability::{ReachabilityError, ReachabilityStore};
use synor_types::Hash256;
/// Block ID type (hash of block header).
pub type BlockId = Hash256;
/// Blue score - cumulative count of blue ancestors.
pub type BlueScore = u64;
/// DAA score - difficulty adjustment algorithm score.
pub type DaaScore = u64;
/// GHOSTDAG k parameter - controls antichain width.
/// Higher k = more parallel blocks allowed = higher throughput
/// but also more complex blue set calculation.
pub const GHOSTDAG_K: u8 = 18;
/// Maximum number of parents a block can have.
pub const MAX_BLOCK_PARENTS: usize = 64;
/// Merge depth - how many blocks back we consider for merging.
pub const MERGE_DEPTH: u64 = 3600; // ~6 minutes at 10 bps
/// Finality depth - after this many confirmations, blocks are final.
pub const FINALITY_DEPTH: u64 = 86400; // ~2.4 hours at 10 bps
/// Pruning depth - how many blocks to keep in memory.
pub const PRUNING_DEPTH: u64 = 288_000; // ~8 hours at 10 bps
// ============================================================================
// DAGKnight Block Rate Configurations
// ============================================================================
/// Block rate configuration for different throughput modes.
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum BlockRateConfig {
/// Standard 10 BPS (100ms block time) - default GHOSTDAG
Standard,
/// Enhanced 32 BPS (~31ms block time) - Phase 13 upgrade
Enhanced,
/// Maximum 100 BPS (10ms block time) - stretch goal
Maximum,
}
impl BlockRateConfig {
/// Returns the blocks per second for this configuration.
pub const fn bps(&self) -> f64 {
match self {
BlockRateConfig::Standard => 10.0,
BlockRateConfig::Enhanced => 32.0,
BlockRateConfig::Maximum => 100.0,
}
}
/// Returns the target block time in milliseconds.
pub const fn block_time_ms(&self) -> u64 {
match self {
BlockRateConfig::Standard => 100,
BlockRateConfig::Enhanced => 31,
BlockRateConfig::Maximum => 10,
}
}
/// Returns the recommended k parameter for this block rate.
/// Higher block rates need higher k to accommodate network latency.
pub const fn recommended_k(&self) -> u8 {
match self {
BlockRateConfig::Standard => 18,
BlockRateConfig::Enhanced => 32,
BlockRateConfig::Maximum => 64,
}
}
/// Returns the merge depth adjusted for block rate.
pub const fn merge_depth(&self) -> u64 {
match self {
BlockRateConfig::Standard => 3600, // ~6 min at 10 bps
BlockRateConfig::Enhanced => 11520, // ~6 min at 32 bps
BlockRateConfig::Maximum => 36000, // ~6 min at 100 bps
}
}
/// Returns the finality depth adjusted for block rate.
pub const fn finality_depth(&self) -> u64 {
match self {
BlockRateConfig::Standard => 86400, // ~2.4 hours at 10 bps
BlockRateConfig::Enhanced => 276480, // ~2.4 hours at 32 bps
BlockRateConfig::Maximum => 864000, // ~2.4 hours at 100 bps
}
}
/// Returns the pruning depth adjusted for block rate.
pub const fn pruning_depth(&self) -> u64 {
match self {
BlockRateConfig::Standard => 288_000, // ~8 hours at 10 bps
BlockRateConfig::Enhanced => 921_600, // ~8 hours at 32 bps
BlockRateConfig::Maximum => 2_880_000, // ~8 hours at 100 bps
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[allow(clippy::assertions_on_constants)]
fn test_constants() {
assert!(GHOSTDAG_K > 0);
assert!(MAX_BLOCK_PARENTS >= GHOSTDAG_K as usize);
assert!(FINALITY_DEPTH > MERGE_DEPTH);
}
}