use serde::{Deserialize, Serialize};
use ed25519_dalek::{SigningKey, VerifyingKey, Signature, Signer, Verifier};
use rand::{SeedableRng, RngCore};
use sha2::{Sha256, Digest};
use rand::rngs::OsRng;
use std::time::{SystemTime, UNIX_EPOCH};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DigitalDNA {
pub sequence: Vec<u8>,
pub generation: u64,
pub mutations: Vec<Mutation>,
pub fitness: f64,
pub parent_hash: Option<String>,
pub created_at: u64,
pub keypair: DNAKeypair,
pub metadata: DNAMetadata,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DNAKeypair {
pub public_key: [u8; 32],
#[serde(skip_serializing)]
pub secret_key: [u8; 32],
pub key_generation: u64,
pub derivation_path: Vec<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DNAMetadata {
pub species: String,
pub biological_age: u64,
pub mutation_rate: f64,
pub crossover_compatibility: f64,
pub adaptation_score: f64,
pub reproductive_success: f64,
pub neural_complexity: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Mutation {
PointMutation {
position: usize,
old_value: u8,
new_value: u8,
timestamp: u64,
},
Insertion {
position: usize,
sequence: Vec<u8>,
timestamp: u64,
},
Deletion {
position: usize,
length: usize,
timestamp: u64,
},
Duplication {
start: usize,
end: usize,
insert_at: usize,
timestamp: u64,
},
Inversion {
start: usize,
end: usize,
timestamp: u64,
},
Translocation {
from_start: usize,
from_end: usize,
to_position: usize,
timestamp: u64,
},
KeyEvolution {
old_generation: u64,
new_generation: u64,
timestamp: u64,
},
}
impl DigitalDNA {
pub fn generate_new() -> Result<Self, DNAError> {
let mut csprng = OsRng{};
let mut secret_bytes = [0u8; 32];
csprng.fill_bytes(&mut secret_bytes);
let signing_key = SigningKey::from_bytes(&secret_bytes);
let verifying_key = signing_key.verifying_key();
let mut hasher = Sha256::new();
hasher.update(verifying_key.to_bytes());
hasher.update(&SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_nanos()
.to_le_bytes());
hasher.update(&rand::random::<u64>().to_le_bytes());
let sequence = hasher.finalize().to_vec();
let mut extended_sequence = sequence.clone();
for _ in 0..8 {
let mut hasher = Sha256::new();
hasher.update(&extended_sequence);
hasher.update(&rand::random::<u64>().to_le_bytes());
extended_sequence.extend_from_slice(&hasher.finalize()[..4]);
}
Ok(DigitalDNA {
sequence: extended_sequence,
generation: 0,
mutations: Vec::new(),
fitness: 1.0,
parent_hash: None,
created_at: SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs(),
keypair: DNAKeypair {
public_key: verifying_key.to_bytes(),
secret_key: signing_key.to_bytes(),
key_generation: 0,
derivation_path: vec![0],
},
metadata: DNAMetadata {
species: "TRON".to_string(),
biological_age: 0,
mutation_rate: 0.01, crossover_compatibility: 0.8,
adaptation_score: 0.5,
reproductive_success: 0.0,
neural_complexity: 0.1,
},
})
}
pub fn from_signing_key(signing_key: SigningKey) -> Result<Self, DNAError> {
let verifying_key = signing_key.verifying_key();
let mut dna = Self::generate_new()?;
dna.keypair = DNAKeypair {
public_key: verifying_key.to_bytes(),
secret_key: signing_key.to_bytes(),
key_generation: 0,
derivation_path: vec![0],
};
Ok(dna)
}
pub fn mutate(&mut self, mutation: Mutation) -> Result<(), DNAError> {
match &mutation {
Mutation::PointMutation { position, new_value, .. } => {
if *position < self.sequence.len() {
self.sequence[*position] = *new_value;
} else {
return Err(DNAError::InvalidMutationPosition(*position));
}
},
Mutation::Insertion { position, sequence, .. } => {
if *position <= self.sequence.len() {
self.sequence.splice(*position..*position, sequence.iter().cloned());
} else {
return Err(DNAError::InvalidMutationPosition(*position));
}
},
Mutation::Deletion { position, length, .. } => {
if *position < self.sequence.len() && *position + *length <= self.sequence.len() {
self.sequence.drain(*position..*position + *length);
} else {
return Err(DNAError::InvalidMutationPosition(*position));
}
},
Mutation::Duplication { start, end, insert_at, .. } => {
if *start < self.sequence.len() && *end <= self.sequence.len() && *start < *end {
let duplicated = self.sequence[*start..*end].to_vec();
let insert_pos = (*insert_at).min(self.sequence.len());
self.sequence.splice(insert_pos..insert_pos, duplicated);
} else {
return Err(DNAError::InvalidMutationRange(*start, *end));
}
},
Mutation::Inversion { start, end, .. } => {
if *start < self.sequence.len() && *end <= self.sequence.len() && *start < *end {
self.sequence[*start..*end].reverse();
} else {
return Err(DNAError::InvalidMutationRange(*start, *end));
}
},
Mutation::Translocation { from_start, from_end, to_position, .. } => {
if *from_start < self.sequence.len() && *from_end <= self.sequence.len() && *from_start < *from_end {
let translocated = self.sequence.drain(*from_start..*from_end).collect::<Vec<_>>();
let insert_pos = (*to_position).min(self.sequence.len());
self.sequence.splice(insert_pos..insert_pos, translocated);
} else {
return Err(DNAError::InvalidMutationRange(*from_start, *from_end));
}
},
Mutation::KeyEvolution { new_generation, .. } => {
self.evolve_keys(*new_generation)?;
}
}
self.mutations.push(mutation);
self.generation += 1;
self.metadata.biological_age += 1;
self.fitness *= 0.98;
self.metadata.mutation_rate = (self.metadata.mutation_rate * 0.9) + (0.1 * 0.01);
self.metadata.adaptation_score *= 0.95;
Ok(())
}
pub fn generate_random_mutation(&self) -> Mutation {
let mutation_type = rand::random::<u8>() % 7;
let timestamp = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs();
match mutation_type {
0 => Mutation::PointMutation {
position: rand::random::<usize>() % self.sequence.len(),
old_value: 0, new_value: rand::random::<u8>(),
timestamp,
},
1 => Mutation::Insertion {
position: rand::random::<usize>() % (self.sequence.len() + 1),
sequence: (0..rand::random::<usize>() % 8 + 1)
.map(|_| rand::random::<u8>())
.collect(),
timestamp,
},
2 => Mutation::Deletion {
position: rand::random::<usize>() % self.sequence.len(),
length: rand::random::<usize>() % 4 + 1,
timestamp,
},
3 => {
let start = rand::random::<usize>() % self.sequence.len();
let end = start + rand::random::<usize>() % 8 + 1;
Mutation::Duplication {
start,
end: end.min(self.sequence.len()),
insert_at: rand::random::<usize>() % (self.sequence.len() + 1),
timestamp,
}
},
4 => {
let start = rand::random::<usize>() % self.sequence.len();
let end = start + rand::random::<usize>() % 8 + 1;
Mutation::Inversion {
start,
end: end.min(self.sequence.len()),
timestamp,
}
},
5 => {
let from_start = rand::random::<usize>() % self.sequence.len();
let from_end = from_start + rand::random::<usize>() % 4 + 1;
Mutation::Translocation {
from_start,
from_end: from_end.min(self.sequence.len()),
to_position: rand::random::<usize>() % (self.sequence.len() + 1),
timestamp,
}
},
_ => Mutation::KeyEvolution {
old_generation: self.keypair.key_generation,
new_generation: self.keypair.key_generation + 1,
timestamp,
},
}
}
pub fn crossover(&self, other: &DigitalDNA) -> Result<DigitalDNA, DNAError> {
if self.metadata.crossover_compatibility < 0.5 || other.metadata.crossover_compatibility < 0.5 {
return Err(DNAError::CrossoverIncompatible);
}
let min_len = self.sequence.len().min(other.sequence.len());
if min_len < 4 {
return Err(DNAError::SequenceTooShort);
}
let crossover_point1 = rand::random::<usize>() % (min_len / 2);
let crossover_point2 = (min_len / 2) + rand::random::<usize>() % (min_len / 2);
let mut new_sequence = Vec::new();
new_sequence.extend_from_slice(&self.sequence[..crossover_point1]);
new_sequence.extend_from_slice(&other.sequence[crossover_point1..crossover_point2]);
new_sequence.extend_from_slice(&self.sequence[crossover_point2..]);
let mut child = DigitalDNA::generate_new()?;
child.sequence = new_sequence;
child.generation = self.generation.max(other.generation) + 1;
child.parent_hash = Some(self.get_hash());
child.metadata.species = if rand::random::<bool>() {
self.metadata.species.clone()
} else {
other.metadata.species.clone()
};
child.metadata.mutation_rate = (self.metadata.mutation_rate + other.metadata.mutation_rate) / 2.0;
child.metadata.crossover_compatibility = (self.metadata.crossover_compatibility + other.metadata.crossover_compatibility) / 2.0;
child.metadata.adaptation_score = (self.metadata.adaptation_score + other.metadata.adaptation_score) / 2.0;
child.metadata.neural_complexity = (self.metadata.neural_complexity + other.metadata.neural_complexity) / 2.0;
child.fitness = self.fitness.max(other.fitness) * 0.95;
Ok(child)
}
pub fn evolve_keys(&mut self, new_generation: u64) -> Result<(), DNAError> {
let mut seed = [0u8; 32];
let mut hasher = Sha256::new();
hasher.update(&self.keypair.secret_key);
hasher.update(&new_generation.to_le_bytes());
hasher.update(&self.sequence);
seed.copy_from_slice(&hasher.finalize());
let mut csprng = rand::rngs::StdRng::from_seed(seed);
let mut secret_bytes = [0u8; 32];
csprng.fill_bytes(&mut secret_bytes);
let new_signing_key = SigningKey::from_bytes(&secret_bytes);
let new_verifying_key = new_signing_key.verifying_key();
self.keypair = DNAKeypair {
public_key: new_verifying_key.to_bytes(),
secret_key: new_signing_key.to_bytes(),
key_generation: new_generation,
derivation_path: {
let mut path = self.keypair.derivation_path.clone();
path.push(new_generation as u32);
path
},
};
Ok(())
}
pub fn get_hash(&self) -> String {
let mut hasher = Sha256::new();
hasher.update(&self.sequence);
hasher.update(&self.generation.to_le_bytes());
hasher.update(&self.keypair.public_key);
format!("{:x}", hasher.finalize())
}
pub fn sign_data(&self, data: &[u8]) -> Result<Vec<u8>, DNAError> {
let signing_key = SigningKey::from_bytes(&self.keypair.secret_key);
Ok(signing_key.sign(data).to_bytes().to_vec())
}
pub fn verify_signature(&self, data: &[u8], signature: &[u8]) -> bool {
if let Ok(verifying_key) = VerifyingKey::from_bytes(&self.keypair.public_key) {
if signature.len() == 64 {
let sig_bytes: [u8; 64] = signature.try_into().unwrap();
let sig = Signature::from_bytes(&sig_bytes);
return verifying_key.verify(data, &sig).is_ok();
}
}
false
}
pub fn genetic_distance(&self, other: &DigitalDNA) -> f64 {
let min_len = self.sequence.len().min(other.sequence.len());
let max_len = self.sequence.len().max(other.sequence.len());
if max_len == 0 {
return 0.0;
}
let mut differences = 0;
for i in 0..min_len {
if self.sequence[i] != other.sequence[i] {
differences += 1;
}
}
differences += max_len - min_len;
differences as f64 / max_len as f64
}
pub fn update_fitness(&mut self, performance_score: f64) {
self.fitness = (self.fitness * 0.9) + (performance_score * 0.1);
self.metadata.adaptation_score = (self.metadata.adaptation_score * 0.8) + (performance_score * 0.2);
self.fitness = self.fitness.max(0.0).min(2.0);
}
pub fn get_info(&self) -> DNAInfo {
DNAInfo {
hash: self.get_hash(),
generation: self.generation,
sequence_length: self.sequence.len(),
fitness: self.fitness,
mutation_count: self.mutations.len(),
biological_age: self.metadata.biological_age,
species: self.metadata.species.clone(),
mutation_rate: self.metadata.mutation_rate,
adaptation_score: self.metadata.adaptation_score,
neural_complexity: self.metadata.neural_complexity,
created_at: self.created_at,
key_generation: self.keypair.key_generation,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DNAInfo {
pub hash: String,
pub generation: u64,
pub sequence_length: usize,
pub fitness: f64,
pub mutation_count: usize,
pub biological_age: u64,
pub species: String,
pub mutation_rate: f64,
pub adaptation_score: f64,
pub neural_complexity: f64,
pub created_at: u64,
pub key_generation: u64,
}
#[derive(Debug, thiserror::Error)]
pub enum DNAError {
#[error("Invalid secret key format")]
InvalidSecretKey,
#[error("Invalid public key format")]
InvalidPublicKey,
#[error("Invalid mutation position: {0}")]
InvalidMutationPosition(usize),
#[error("Invalid mutation range: {0} to {1}")]
InvalidMutationRange(usize, usize),
#[error("Crossover incompatible - compatibility too low")]
CrossoverIncompatible,
#[error("Sequence too short for crossover")]
SequenceTooShort,
#[error("Key evolution failed")]
KeyEvolutionFailed,
#[error("Cryptographic operation failed: {0}")]
CryptographicError(String),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_dna_generation() {
let dna = DigitalDNA::generate_new().unwrap();
assert!(!dna.sequence.is_empty());
assert_eq!(dna.generation, 0);
assert_eq!(dna.fitness, 1.0);
assert!(dna.mutations.is_empty());
}
#[test]
fn test_dna_hash() {
let dna = DigitalDNA::generate_new().unwrap();
let hash1 = dna.get_hash();
let hash2 = dna.get_hash();
assert_eq!(hash1, hash2);
assert_eq!(hash1.len(), 64); }
#[test]
fn test_dna_signing() {
let dna = DigitalDNA::generate_new().unwrap();
let message = b"Hello, digital world!";
let signature = dna.sign_data(message).unwrap();
assert!(dna.verify_signature(message, &signature));
let wrong_message = b"Hello, analog world!";
assert!(!dna.verify_signature(wrong_message, &signature));
}
#[test]
fn test_point_mutation() {
let mut dna = DigitalDNA::generate_new().unwrap();
let original_sequence = dna.sequence.clone();
let mutation = Mutation::PointMutation {
position: 0,
old_value: original_sequence[0],
new_value: 255,
timestamp: 0,
};
dna.mutate(mutation).unwrap();
assert_eq!(dna.sequence[0], 255);
assert_eq!(dna.generation, 1);
assert_eq!(dna.mutations.len(), 1);
assert!(dna.fitness < 1.0);
}
#[test]
fn test_insertion_mutation() {
let mut dna = DigitalDNA::generate_new().unwrap();
let original_len = dna.sequence.len();
let mutation = Mutation::Insertion {
position: 0,
sequence: vec![1, 2, 3],
timestamp: 0,
};
dna.mutate(mutation).unwrap();
assert_eq!(dna.sequence.len(), original_len + 3);
assert_eq!(dna.sequence[0], 1);
assert_eq!(dna.sequence[1], 2);
assert_eq!(dna.sequence[2], 3);
}
#[test]
fn test_deletion_mutation() {
let mut dna = DigitalDNA::generate_new().unwrap();
let original_len = dna.sequence.len();
let mutation = Mutation::Deletion {
position: 0,
length: 2,
timestamp: 0,
};
dna.mutate(mutation).unwrap();
assert_eq!(dna.sequence.len(), original_len - 2);
}
#[test]
fn test_dna_crossover() {
let dna1 = DigitalDNA::generate_new().unwrap();
let dna2 = DigitalDNA::generate_new().unwrap();
let child = dna1.crossover(&dna2).unwrap();
assert_eq!(child.generation, dna1.generation.max(dna2.generation) + 1);
assert!(child.parent_hash.is_some());
assert!(!child.sequence.is_empty());
assert!(child.fitness <= dna1.fitness.max(dna2.fitness));
}
#[test]
fn test_genetic_distance() {
let dna1 = DigitalDNA::generate_new().unwrap();
let dna2 = DigitalDNA::generate_new().unwrap();
let distance = dna1.genetic_distance(&dna2);
assert!(distance >= 0.0 && distance <= 1.0);
let self_distance = dna1.genetic_distance(&dna1);
assert_eq!(self_distance, 0.0);
}
#[test]
fn test_fitness_update() {
let mut dna = DigitalDNA::generate_new().unwrap();
let initial_fitness = dna.fitness;
dna.update_fitness(0.8);
assert_ne!(dna.fitness, initial_fitness);
dna.update_fitness(1.2);
assert!(dna.fitness <= 2.0); }
#[test]
fn test_key_evolution() {
let mut dna = DigitalDNA::generate_new().unwrap();
let _original_generation = dna.keypair.key_generation;
let original_public_key = dna.keypair.public_key;
dna.evolve_keys(1).unwrap();
assert_eq!(dna.keypair.key_generation, 1);
assert_ne!(dna.keypair.public_key, original_public_key);
assert_eq!(dna.keypair.derivation_path.len(), 2);
}
#[test]
fn test_random_mutation_generation() {
let dna = DigitalDNA::generate_new().unwrap();
for _ in 0..10 {
let mutation = dna.generate_random_mutation();
match mutation {
Mutation::PointMutation { position, .. } => {
assert!(position < dna.sequence.len());
},
Mutation::Insertion { position, .. } => {
assert!(position <= dna.sequence.len());
},
Mutation::Deletion { position, length, .. } => {
assert!(position < dna.sequence.len());
assert!(length > 0);
},
_ => {
}
}
}
}
#[test]
fn test_dna_info() {
let dna = DigitalDNA::generate_new().unwrap();
let info = dna.get_info();
assert_eq!(info.hash, dna.get_hash());
assert_eq!(info.generation, dna.generation);
assert_eq!(info.sequence_length, dna.sequence.len());
assert_eq!(info.fitness, dna.fitness);
assert_eq!(info.species, "TRON");
}
}