synor/crates/synor-consensus/src/lib.rs
Gulshan Yadav 5c643af64c fix: resolve all clippy warnings for CI
Fix all Rust clippy warnings that were causing CI failures when built
with RUSTFLAGS=-Dwarnings. Changes include:

- Replace derivable_impls with derive macros for BlockBody, Network, etc.
- Use div_ceil() instead of manual implementation
- Fix should_implement_trait by renaming from_str to parse
- Add type aliases for type_complexity warnings
- Use or_default(), is_some_and(), is_multiple_of() where appropriate
- Remove needless borrows and redundant closures
- Fix manual_strip with strip_prefix()
- Add allow attributes for intentional patterns (too_many_arguments,
  needless_range_loop in cryptographic code, assertions_on_constants)
- Remove unused imports, mut bindings, and dead code in tests
2026-01-08 05:58:22 +05:30

151 lines
5.2 KiB
Rust

//! Consensus rules and UTXO management for Synor blockchain.
//!
//! This crate implements:
//! - UTXO (Unspent Transaction Output) model with DAG support
//! - Transaction validation rules
//! - Block validation rules
//! - Difficulty adjustment algorithm (DAA)
//! - Coinbase and reward calculations
//!
//! # Architecture Overview
//!
//! ```text
//! ┌─────────────────────────────────────────────────┐
//! │ BlockValidator │
//! │ (validates headers, PoW, merkle roots, etc.) │
//! └────────────────────┬────────────────────────────┘
//! │
//! ┌───────────┴───────────┐
//! │ │
//! ▼ ▼
//! ┌─────────────────┐ ┌─────────────────────┐
//! │ TransactionValidator │ │ UtxoSet │
//! │ (structure, sigs) │ │ (UTXO tracking) │
//! └─────────────────┘ └─────────────────────┘
//! │ │
//! └───────────┬───────────┘
//! ▼
//! ┌─────────────────┐
//! │ DifficultyManager │
//! │ (DAA adjustments) │
//! └─────────────────┘
//! ```
//!
//! # UTXO Model with DAG
//!
//! Unlike traditional blockchains with linear chains, Synor uses a DAG.
//! This means multiple blocks can be created in parallel, potentially
//! spending the same UTXOs. The UTXO model must:
//!
//! 1. Track UTXOs per block (not global state)
//! 2. Handle conflicting transactions (double spends)
//! 3. Use block ordering from GHOSTDAG for conflict resolution
//!
//! # Quick Start
//!
//! ## Validating Transactions
//!
//! ```rust,ignore
//! use synor_consensus::{TransactionValidator, UtxoSet};
//!
//! // Create validator with default settings
//! let validator = TransactionValidator::new();
//!
//! // Validate transaction structure (no UTXO check)
//! validator.validate_structure(&tx)?;
//!
//! // Validate against UTXO set
//! let fee = validator.validate_against_utxos(&tx, &utxo_set, current_daa_score)?;
//! ```
//!
//! ## Working with UTXOs
//!
//! ```rust,ignore
//! use synor_consensus::{UtxoSet, UtxoDiff, UtxoEntry};
//!
//! // Create a new UTXO set
//! let utxo_set = UtxoSet::new();
//!
//! // Add a UTXO
//! utxo_set.add(outpoint, entry)?;
//!
//! // Create a diff from a transaction
//! let diff = utxo_set.create_transaction_diff(&tx, block_daa_score)?;
//!
//! // Apply the diff
//! utxo_set.apply_diff(&diff)?;
//! ```
//!
//! ## Difficulty Adjustment
//!
//! ```rust,ignore
//! use synor_consensus::{DifficultyManager, DaaParams};
//!
//! // Create manager with default params (10 blocks/second target)
//! let manager = DifficultyManager::with_defaults();
//!
//! // Calculate next difficulty from block window
//! let new_bits = manager.calculate_next_difficulty(&block_window)?;
//!
//! // Validate proof of work
//! let valid = manager.validate_pow(&block_hash, bits);
//! ```
//!
//! # Key Constants
//!
//! | Constant | Value | Description |
//! |----------|-------|-------------|
//! | `MAX_TRANSACTION_SIZE` | 100 KB | Maximum transaction size |
//! | `MAX_BLOCK_MASS` | 500,000 | Maximum block weight |
//! | `COINBASE_MATURITY` | 100 blocks | Blocks before coinbase spendable |
//! | `TARGET_BLOCK_TIME_MS` | 100ms | Target time between blocks |
//! | `BLOCKS_PER_SECOND` | 10 | Target block production rate |
#![allow(dead_code)]
pub mod difficulty;
pub mod genesis;
pub mod rewards;
pub mod utxo;
pub mod validation;
pub use difficulty::{DaaParams, DifficultyManager};
pub use genesis::{ChainConfig, Checkpoint, GenesisAllocation, GenesisError};
pub use rewards::{BlockReward, RewardCalculator};
pub use utxo::{UtxoDiff, UtxoEntry, UtxoError, UtxoSet};
pub use validation::{BlockValidator, TransactionValidator, ValidationError};
/// Maximum transaction size in bytes.
pub const MAX_TRANSACTION_SIZE: usize = 100_000; // 100 KB
/// Maximum block mass (weight).
pub const MAX_BLOCK_MASS: u64 = 500_000;
/// Maximum signature operations per block.
pub const MAX_SIG_OPS_PER_BLOCK: u64 = 20_000;
/// Minimum transaction fee (in sompi).
pub const MIN_RELAY_FEE: u64 = 1_000; // 0.00001 SYNOR
/// Coinbase maturity (blocks before coinbase can be spent).
pub const COINBASE_MATURITY: u64 = 100;
/// Target block time in milliseconds.
pub const TARGET_BLOCK_TIME_MS: u64 = 100; // 10 blocks per second
/// Blocks per second target.
pub const BLOCKS_PER_SECOND: u64 = 10;
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[allow(clippy::assertions_on_constants)]
fn test_constants() {
assert!(MAX_TRANSACTION_SIZE > 0);
assert!(MAX_BLOCK_MASS > 0);
assert!(COINBASE_MATURITY > 0);
assert_eq!(1000 / TARGET_BLOCK_TIME_MS, BLOCKS_PER_SECOND);
}
}