use std::collections::HashMap;
use std::sync::{Arc, RwLock};
use crate::error::Result;
pub trait ProofBackend: Send + Sync {
fn generate_range_proof(&self, value: u64, min: u64, max: u64) -> Result<Vec<u8>>;
fn verify_range_proof(&self, proof: &[u8], min: u64, max: u64) -> Result<bool>;
fn merkle_root(&self, leaves: &[Vec<u8>]) -> Result<[u8; 32]>;
fn generate_merkle_proof(&self, leaves: &[Vec<u8>], index: usize) -> Result<MerkleProof>;
fn verify_merkle_proof(&self, proof: &MerkleProof, root: &[u8; 32], leaf: &[u8]) -> Result<bool>;
}
#[derive(Debug, Clone)]
pub struct MerkleProof {
pub leaf: Vec<u8>,
pub path: Vec<[u8; 32]>,
pub indices: Vec<u8>,
}
#[derive(Debug, Clone, Copy)]
pub struct DefaultProofBackend;
impl ProofBackend for DefaultProofBackend {
fn generate_range_proof(&self, value: u64, min: u64, max: u64) -> Result<Vec<u8>> {
if value < min || value > max {
return Err(crate::error::CompressionError::InvalidParameter(
format!("Value {} outside range [{}, {}]", value, min, max)
));
}
Ok(value.to_le_bytes().to_vec())
}
fn verify_range_proof(&self, proof: &[u8], min: u64, max: u64) -> Result<bool> {
if proof.len() != 8 {
return Ok(false);
}
let value = u64::from_le_bytes(proof.try_into().unwrap());
Ok(value >= min && value <= max)
}
fn merkle_root(&self, leaves: &[Vec<u8>]) -> Result<[u8; 32]> {
if leaves.is_empty() {
return Ok([0u8; 32]);
}
let mut current_level: Vec<[u8; 32]> = leaves
.iter()
.map(|leaf| blake3::hash(leaf).into())
.collect();
while current_level.len() > 1 {
let mut next_level = Vec::new();
for chunk in current_level.chunks(2) {
let hash = if chunk.len() == 2 {
let mut hasher = blake3::Hasher::new();
hasher.update(&chunk[0]);
hasher.update(&chunk[1]);
hasher.finalize()
} else {
blake3::Hasher::new().finalize()
};
next_level.push(hash.into());
}
current_level = next_level;
}
Ok(current_level[0])
}
fn generate_merkle_proof(&self, leaves: &[Vec<u8>], index: usize) -> Result<MerkleProof> {
if index >= leaves.len() {
return Err(crate::error::CompressionError::InvalidParameter(
format!("Index {} out of bounds for {} leaves", index, leaves.len())
));
}
let leaf_hash = blake3::hash(&leaves[index]);
let mut path = Vec::new();
let mut indices = Vec::new();
let mut current_level: Vec<[u8; 32]> = leaves
.iter()
.map(|leaf| blake3::hash(leaf).into())
.collect();
let mut current_index = index;
while current_level.len() > 1 {
let sibling_index = if current_index % 2 == 0 {
current_index + 1
} else {
current_index - 1
};
if sibling_index < current_level.len() {
path.push(current_level[sibling_index]);
indices.push((current_index % 2) as u8);
}
let mut next_level = Vec::new();
for chunk in current_level.chunks(2) {
let hash = if chunk.len() == 2 {
let mut hasher = blake3::Hasher::new();
hasher.update(&chunk[0]);
hasher.update(&chunk[1]);
hasher.finalize()
} else {
blake3::Hasher::new().finalize()
};
next_level.push(hash.into());
}
current_level = next_level;
current_index /= 2;
}
Ok(MerkleProof {
leaf: leaf_hash.as_bytes().to_vec(),
path,
indices,
})
}
fn verify_merkle_proof(&self, proof: &MerkleProof, root: &[u8; 32], leaf: &[u8]) -> Result<bool> {
let mut current_hash: [u8; 32] = blake3::hash(leaf).into();
for (i, sibling) in proof.path.iter().enumerate() {
let mut hasher = blake3::Hasher::new();
if proof.indices[i] == 0 {
hasher.update(¤t_hash);
hasher.update(sibling);
} else {
hasher.update(sibling);
hasher.update(¤t_hash);
}
current_hash = hasher.finalize().into();
}
Ok(current_hash == *root)
}
}
pub trait DhtStorage: Send + Sync {
fn store(&self, key: &[u8], data: &[u8]) -> Result<()>;
fn retrieve(&self, key: &[u8]) -> Result<Option<Vec<u8>>>;
fn delete(&self, key: &[u8]) -> Result<()>;
fn exists(&self, key: &[u8]) -> Result<bool>;
}
#[derive(Clone)]
pub struct MemoryDht {
data: Arc<RwLock<HashMap<[u8; 32], Vec<u8>>>>,
}
impl Default for MemoryDht {
fn default() -> Self {
Self::new()
}
}
impl MemoryDht {
pub fn new() -> Self {
Self {
data: Arc::new(RwLock::new(HashMap::new())),
}
}
}
impl DhtStorage for MemoryDht {
fn store(&self, key: &[u8], data: &[u8]) -> Result<()> {
let mut key_array = [0u8; 32];
key_array.copy_from_slice(&key[..32.min(key.len())]);
let mut guard = self.data.write().unwrap();
guard.insert(key_array, data.to_vec());
Ok(())
}
fn retrieve(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
let mut key_array = [0u8; 32];
key_array.copy_from_slice(&key[..32.min(key.len())]);
let guard = self.data.read().unwrap();
Ok(guard.get(&key_array).cloned())
}
fn delete(&self, key: &[u8]) -> Result<()> {
let mut key_array = [0u8; 32];
key_array.copy_from_slice(&key[..32.min(key.len())]);
let mut guard = self.data.write().unwrap();
guard.remove(&key_array);
Ok(())
}
fn exists(&self, key: &[u8]) -> Result<bool> {
let mut key_array = [0u8; 32];
key_array.copy_from_slice(&key[..32.min(key.len())]);
let guard = self.data.read().unwrap();
Ok(guard.contains_key(&key_array))
}
}
pub trait ModelCompressor: Send + Sync {
fn compress(&self, data: &[u8]) -> Result<Vec<u8>>;
fn decompress(&self, data: &[u8]) -> Result<Vec<u8>>;
fn name(&self) -> &str;
}
#[derive(Debug, Clone, Copy)]
pub struct DefaultModelCompressor;
impl ModelCompressor for DefaultModelCompressor {
fn compress(&self, data: &[u8]) -> Result<Vec<u8>> {
Ok(data.to_vec())
}
fn decompress(&self, data: &[u8]) -> Result<Vec<u8>> {
Ok(data.to_vec())
}
fn name(&self) -> &str {
"passthrough"
}
}