Crate chie_shared

Crate chie_shared 

Source
Expand description

Shared types, errors, and utilities for CHIE Protocol.

This crate provides common types and utilities used across all CHIE Protocol components:

  • Core protocol types (content, bandwidth proofs, chunks)
  • Error types for protocol operations
  • Database conversion traits
  • Utility functions for common operations
  • JSON schema generation (optional)

§Examples

§Creating Content Metadata

use chie_shared::{ContentMetadataBuilder, ContentCategory, ContentStatus};
use uuid::Uuid;

let creator_id = Uuid::new_v4();
let metadata = ContentMetadataBuilder::new()
    .cid("QmExampleCID123")
    .title("My 3D Model")
    .description("A high-quality 3D model")
    .category(ContentCategory::ThreeDModels)
    .add_tag("blender")
    .add_tag("game-ready")
    .size_bytes(5 * 1024 * 1024) // 5 MB
    .price(1000)
    .creator_id(creator_id)
    .status(ContentStatus::Active)
    .build()
    .expect("Failed to build metadata");

assert!(metadata.is_valid());
assert_eq!(metadata.size_mb(), 5.0);

§Building a Bandwidth Proof

use chie_shared::BandwidthProofBuilder;

let proof = BandwidthProofBuilder::new()
    .content_cid("QmTest123")
    .chunk_index(0)
    .bytes_transferred(262144) // 256 KB
    .provider_peer_id("12D3KooProvider")
    .requester_peer_id("12D3KooRequester")
    .provider_public_key(vec![1u8; 32])
    .requester_public_key(vec![2u8; 32])
    .provider_signature(vec![3u8; 64])
    .requester_signature(vec![4u8; 64])
    .challenge_nonce(vec![5u8; 32])
    .chunk_hash(vec![6u8; 32])
    .timestamps(1000, 1250) // 250ms latency
    .build()
    .expect("Failed to build proof");

assert!(proof.is_valid());
assert!(proof.meets_quality_threshold());
assert_eq!(proof.bandwidth_bps(), 1048576.0); // ~1 MB/s

§Creating a Chunk Request

use chie_shared::{ChunkRequest, generate_nonce};

let request = ChunkRequest::new(
    "QmExampleContent",
    0,
    generate_nonce(),
    "12D3KooRequester",
    [1u8; 32],
);

assert!(request.is_timestamp_valid());

§Using Utility Functions

use chie_shared::{format_bytes, format_points, calculate_demand_multiplier};

// Format bytes for display
assert_eq!(format_bytes(1_048_576), "1.00 MB");

// Format points with thousands separator
assert_eq!(format_points(1_234_567), "1,234,567");

// Calculate reward multiplier based on demand/supply
let multiplier = calculate_demand_multiplier(100, 50);
assert_eq!(multiplier, 3.0); // High demand = 3x multiplier

§Working with Cache Statistics

use chie_shared::CacheStats;

// Create cache statistics
let stats = CacheStats::new(50, 100, 80, 20);
println!("Hit rate: {:.2}%", stats.hit_rate * 100.0);
println!("Fill: {:.2}%", stats.fill_percentage() * 100.0);
println!("Efficiency: {:.2}", stats.efficiency_score());

§Tracking Performance Metrics

use chie_shared::{OperationStats, BandwidthMetrics};

// Operation timing statistics
let ops_stats = OperationStats::new(100, 5000.0, 10.0, 200.0);
println!("Average: {:.2}ms", ops_stats.avg_duration_ms);
println!("Throughput: {:.2} ops/sec", ops_stats.ops_per_second());

// Bandwidth metrics
let bw_metrics = BandwidthMetrics::new(1_000_000, 1000.0, 10, 2_000_000.0);
println!("Average: {:.2} Mbps", bw_metrics.avg_mbps());
println!("Peak: {:.2} Mbps", bw_metrics.peak_mbps());

§Managing User Quotas

use chie_shared::{UserQuota, StorageQuota, BandwidthQuota, RateLimitQuota};

// Create storage quota
let storage = StorageQuota::new(
    10 * 1024 * 1024 * 1024, // 10 GB total
    5 * 1024 * 1024 * 1024,  // 5 GB used
    1 * 1024 * 1024 * 1024,  // 1 GB reserved
);
println!("Storage available: {} GB", storage.available_bytes() / (1024 * 1024 * 1024));
println!("Utilization: {:.1}%", storage.utilization() * 100.0);

// Create bandwidth quota (100 GB/month)
let bandwidth = BandwidthQuota::new(
    100 * 1024 * 1024 * 1024, // 100 GB total
    50 * 1024 * 1024 * 1024,  // 50 GB used
    30 * 24 * 60 * 60,        // 30 days in seconds
    chie_shared::now_ms() as u64,
);
println!("Bandwidth remaining: {} GB", bandwidth.remaining_bytes() / (1024 * 1024 * 1024));

// Create rate limit quota (100 requests/minute)
let rate_limit = RateLimitQuota::new(100, 45, 60, chie_shared::now_ms() as u64);
println!("Requests remaining: {}", rate_limit.remaining_requests());

§Batch Operations

use chie_shared::{BatchProofSubmission, BandwidthProof, BandwidthProofBuilder};

// Create multiple proofs
let proof1 = BandwidthProofBuilder::new()
    .content_cid("QmTest1")
    .chunk_index(0)
    .bytes_transferred(262144)
    .provider_peer_id("12D3Koo1")
    .requester_peer_id("12D3Koo2")
    .provider_public_key(vec![1u8; 32])
    .requester_public_key(vec![2u8; 32])
    .provider_signature(vec![3u8; 64])
    .requester_signature(vec![4u8; 64])
    .challenge_nonce(vec![5u8; 32])
    .chunk_hash(vec![6u8; 32])
    .timestamps(1000, 1250)
    .build()
    .expect("Failed to build proof");

// Submit proofs in batch
let batch = BatchProofSubmission::new(vec![proof1], "12D3Koo1");
println!("Batch contains {} proofs", batch.proof_count());
println!("Total bytes: {}", batch.total_bytes_transferred());

Re-exports§

pub use config::*;
pub use constants::*;
pub use conversions::*;
pub use encoding::*;
pub use errors::*;
pub use messages::*;
pub use result::*;
pub use types::*;
pub use utils::*;

Modules§

config
Configuration types with builder patterns
constants
Protocol constants for CHIE.
conversions
Conversion traits between shared types and database models.
encoding
Compact binary encoding with versioning
errors
Error types for CHIE Protocol.
messages
Message types for inter-component communication.
result
Generic result type with error context for better error handling
types
Common types used across CHIE Protocol.
utils
Utility functions for CHIE Protocol.