soft3/strata/core/src/lib.rs

#![no_std]
//! strata-core โ€” algebraic trait hierarchy for verifiable computation.
//!
//! four tiers of traits organized by consumer need:
//!
//! ## tier 1: universal (this crate)
//!
//! every algebra implements at least one of these.
//!
//! ```text
//! Codec      encode, decode โ€” serialization
//! Semiring   add, mul, zero, one โ€” tropical lives here
//! Ring       + sub, neg โ€” polynomial rings live here
//! Field      + inv, sqrt, double, pow โ€” finite fields live here
//! ```
//!
//! ## tier 2: proof system (`strata-proof`)
//!
//! traits needed by lens (commitment) and zheng (verification).
//!
//! ```text
//! Reduce   reduce(bytes) โ†’ element โ€” Fiat-Shamir challenges
//! Dot      dot(a, b) โ†’ scalar โ€” inner product for constraint evaluation
//! ```
//!
//! ## tier 3: computation (`strata-compute`)
//!
//! traits needed by nox (execution) and jali (ring arithmetic).
//!
//! ```text
//! Spectral   roots_of_unity, two_adicity โ€” fields with NTT/transform domain
//! Bits       to_bits, from_bits โ€” bit decomposition for binary operations
//! ```
//!
//! ## tier 4: structure (`strata-ext`)
//!
//! traits for specific algebraic structures.
//!
//! ```text
//! Extension<Base>   base field, degree, frobenius โ€” tower fields
//! Batch             batch_inv โ€” Montgomery's trick
//! Blind             ct_eq, ct_select โ€” timing-safe operations
//! ```
//!
//! ## the five algebras
//!
//! | type | crate | tiers |
//! |------|-------|-------|
//! | Goldilocks | nebu | Field + Reduce + Dot + Spectral + Bits + Extension + Batch |
//! | Fโ‚‚ยนยฒโธ | kuro | Field + Reduce + Dot + Bits + Extension + Batch |
//! | RingElement | jali | (uses Goldilocks for scalar ops) |
//! | Tropical | trop | Semiring + Codec |
//! | Fq | genies | Field + Reduce + Dot + Batch + Blind |

pub mod testing;

use core::ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign};

// โ”€โ”€ tier 1: universal โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€

/// serialize algebraic elements to and from bytes.
///
/// `encode` produces canonical bytes. `decode` rejects non-canonical input
/// (returns None) โ€” it NEVER silently reduces. this is critical for soundness:
/// a verifier accepting non-canonical elements can break proof security.
pub trait Codec: Sized {
    /// byte length of the canonical serialized form.
    fn byte_len() -> usize;

    /// serialize to canonical little-endian bytes.
    /// buffer must be at least `byte_len()` bytes.
    fn encode(&self, buf: &mut [u8]);

    /// deserialize from bytes.
    /// returns None if bytes are too short OR the value is non-canonical
    /// (e.g., >= modulus for prime fields).
    fn decode(bytes: &[u8]) -> Option<Self>;
}

/// semiring: two operations with identities. no subtraction.
///
/// addition and multiplication are associative and commutative.
/// multiplication distributes over addition. zero annihilates (a * 0 = 0).
///
/// the tropical semiring (min, +) satisfies this โ€” min has no inverse.
pub trait Semiring:
    Copy + Eq + Add<Output = Self> + Mul<Output = Self> + AddAssign + MulAssign
{
    const ZERO: Self;
    const ONE: Self;
}

/// ring: semiring with subtraction and negation.
///
/// the additive structure is a group (every element has an additive inverse).
/// polynomial ring R_q = F_p[x]/(x^n+1) satisfies this.
pub trait Ring: Semiring + Sub<Output = Self> + Neg<Output = Self> + SubAssign {}

/// field: ring with multiplicative inverse and related operations.
///
/// every nonzero element has a unique multiplicative inverse.
/// Goldilocks (nebu), Fโ‚‚ยนยฒโธ (kuro), F_q (genies) satisfy this.
pub trait Field: Ring {
    /// multiplicative inverse.
    ///
    /// # Panics
    /// panics if self is zero. use `try_inv` for non-panicking version.
    fn inv(self) -> Self;

    /// multiplicative inverse, returning None for zero.
    ///
    /// production code should prefer this over `inv` โ€” panicking on zero
    /// in a verifier is a denial-of-service vector.
    fn try_inv(self) -> Option<Self> {
        if self == Self::ZERO {
            None
        } else {
            Some(self.inv())
        }
    }

    /// aยฒ โ€” often faster than a * a (single squaring vs general multiply).
    fn square(self) -> Self {
        self * self
    }

    /// 2a โ€” via addition, avoids multiply overhead.
    fn double(self) -> Self {
        self + self
    }

    /// square root. returns None if self is a quadratic non-residue.
    ///
    /// for prime fields: Tonelli-Shanks or special-case (3 mod 4, 5 mod 8).
    /// for binary fields: inverse Frobenius (a^(2^(n-1))).
    fn sqrt(self) -> Option<Self>;

    /// a^e via square-and-multiply. e is a single u64.
    fn pow(self, mut e: u64) -> Self {
        let mut base = self;
        let mut result = Self::ONE;
        while e > 0 {
            if e & 1 == 1 {
                result *= base;
            }
            base = base.square();
            e >>= 1;
        }
        result
    }

    /// a^e where e is a multi-limb exponent (little-endian u64 limbs).
    ///
    /// required for genies (512-bit exponents) and any field where
    /// the group order exceeds u64.
    fn pow_bytes(self, exp: &[u64]) -> Self {
        let mut result = Self::ONE;
        for &limb in exp.iter().rev() {
            for bit in (0..64).rev() {
                result = result.square();
                if (limb >> bit) & 1 == 1 {
                    result *= self;
                }
            }
        }
        result
    }

    /// aยฒ in-place โ€” avoids allocation for large elements.
    fn square_in_place(&mut self) {
        *self = self.square();
    }

    /// double in-place.
    fn double_in_place(&mut self) {
        *self = self.double();
    }
}

Homonyms

cyb/optica/src/lib.rs
soft3/strata/src/lib.rs
cyb/honeycrisp/src/lib.rs
warriors/trisha/honeycrisp/lib.rs
warriors/trisha/wgpu/lib.rs
soft3/glia/import/lib.rs
soft3/foculus/src/lib.rs
soft3/nox/rs/lib.rs
soft3/cybergraph/src/lib.rs
soft3/tru/rs/lib.rs
soft3/mudra/src/lib.rs
soft3/glia/run/lib.rs
cyb/prysm/rs/lib.rs
warriors/trisha/rs/lib.rs
cyb/src-tauri/src/lib.rs
soft3/mir/src/lib.rs
soft3/lens/src/lib.rs
neural/trident/src/lib.rs
neural/rune/rs/subject/lib.rs
cyb/cyb/cyb-services/src/lib.rs
soft3/strata/nebu/rs/lib.rs
soft3/lens/core/src/lib.rs
neural/rs/mir-format/src/lib.rs
soft3/zheng/rs/src/lib.rs
neural/rune/rs/interp/lib.rs
soft3/radio/iroh-willow/src/lib.rs
neural/rune/rs/parse/lib.rs
neural/eidos/rs/src/lib.rs
neural/rs/darwin-sys/src/lib.rs
soft3/radio/iroh-gossip/src/lib.rs
soft3/radio/iroh-ffi/src/lib.rs
soft3/radio/iroh-car/src/lib.rs
soft3/radio/iroh-relay/src/lib.rs
soft3/bbg/rs/src/lib.rs
soft3/radio/iroh-docs/src/lib.rs
soft3/lens/ikat/src/lib.rs
neural/rune/rs/lex/lib.rs
cyb/honeycrisp/aruminium/src/lib.rs
soft3/hemera/rs/src/lib.rs
neural/rune/rs/ast/lib.rs
soft3/radio/iroh-blobs/src/lib.rs
cyb/honeycrisp/acpu/src/lib.rs
soft3/lens/porphyry/src/lib.rs
cyb/honeycrisp/rane/src/lib.rs
neural/rune/rs/compile/lib.rs
neural/rune/rs/parse-pure/lib.rs
neural/rs/codegen/src/lib.rs
soft3/lens/binius/src/lib.rs
neural/rune/rs/prysm/lib.rs
neural/rs/link/src/lib.rs
neural/rune/rs/mold/lib.rs
soft3/strata/proof/src/lib.rs
soft3/lens/brakedown/src/lib.rs
soft3/strata/kuro/rs/lib.rs
soft3/lens/assayer/src/lib.rs
neural/rs/core/src/lib.rs
neural/rs/macros/src/lib.rs
soft3/radio/cyber-bao/src/lib.rs
soft3/strata/compute/src/lib.rs
soft3/radio/iroh-base/src/lib.rs
soft3/radio/iroh-dns-server/src/lib.rs
neural/rune/rs/lower/lib.rs
soft3/strata/ext/src/lib.rs
soft3/hemera/wgsl/src/lib.rs
soft3/radio/iroh/src/lib.rs
cyb/honeycrisp/unimem/src/lib.rs
cyb/evy/crates/evy_engine_tasks/src/lib.rs
cyb/evy/crates/evy_dialect/src/lib.rs
cyb/wysm/crates/wasi/src/lib.rs
cyb/wysm/crates/fuzz/src/lib.rs
soft3/strata/genies/rs/src/lib.rs
cyb/evy/crates/evy_platform_caps/src/lib.rs
neural/inf/rs/oracle/src/lib.rs
soft3/strata/jali/wgsl/src/lib.rs
cyb/evy/forks/bevy_transform/src/lib.rs
soft3/tape/impl/rust/src/lib.rs
cyb/wysm/crates/wasmi/src/lib.rs
cyb/evy/forks/bevy_render/src/lib.rs
cyb/evy/crates/evy_ecs_storage/src/lib.rs
cyb/evy/forks/naga/src/lib.rs
soft3/strata/trop/wgsl/src/lib.rs
cyb/wysm/crates/c_api/artifact/lib.rs
cyb/evy/forks/bevy_ecs/src/lib.rs
cyb/wysm/crates/ir/src/lib.rs
cyb/evy/forks/bevy_animation/src/lib.rs
cyb/evy/forks/bevy_sprite_render/src/lib.rs
cyb/wysm/crates/c_api/src/lib.rs
neural/inf/rs/parse/src/lib.rs
soft3/strata/trop/rs/src/lib.rs
soft3/strata/kuro/wgsl/src/lib.rs
neural/trident/editor/zed/src/lib.rs
cyb/evy/forks/bevy_mesh/src/lib.rs
cyb/evy/crates/evy_radio/src/lib.rs
cyb/evy/forks/bevy_anti_alias/src/lib.rs
soft3/strata/jali/rs/src/lib.rs
cyb/wysm/crates/wast/src/lib.rs
neural/inf/rs/plan/src/lib.rs
neural/rs/tests/macro-integration/src/lib.rs
soft3/radio/iroh-ffi/iroh-js/src/lib.rs
cyb/evy/forks/bevy_image/src/lib.rs
cyb/evy/forks/bevy_post_process/src/lib.rs
neural/inf/rs/source/src/lib.rs
cyb/wysm/crates/core/src/lib.rs
cyb/evy/crates/evy_diagnostic/src/lib.rs
cyb/evy/crates/evy_engine_dispatch/src/lib.rs
cyb/evy/forks/bevy_pbr/src/lib.rs
cyb/evy/forks/bevy_gizmos/src/lib.rs
cyb/evy/forks/bevy_gizmos_render/src/lib.rs
soft3/radio/iroh/bench/src/lib.rs
neural/inf/rs/lex/src/lib.rs
neural/inf/rs/ast/src/lib.rs
soft3/strata/genies/wgsl/src/lib.rs
soft3/strata/nebu/wgsl/src/lib.rs
cyb/wysm/crates/collections/src/lib.rs
neural/inf/rs/lower/src/lib.rs
cyb/evy/forks/bevy_sprite/src/lib.rs
cyb/evy/forks/bevy_diagnostic/src/lib.rs
neural/inf/rs/eval/src/lib.rs
cyb/wysm/crates/c_api/macro/lib.rs
cyb/evy/forks/bevy_tasks/src/lib.rs
cyb/evy/forks/bevy_core_pipeline/src/lib.rs
cyb/evy/crates/evy_prysm_core/src/lib.rs
neural/inf/rs/value/src/lib.rs
cyb/evy/crates/evy_engine_core/src/lib.rs
soft3/radio/tests/integration/src/lib.rs
bootloader/go-cyber/cw/packages/cyber-std-test/src/lib.rs
bootloader/go-cyber/cw/contracts/std-test/src/lib.rs
bootloader/go-cyber/cw/contracts/graph-filter/src/lib.rs
bootloader/go-cyber/cw/packages/cyber-std/src/lib.rs

Graph