qualia_core_db/foundation/
crdt.rs1use crate::NQuin;
2use serde::{Deserialize, Serialize};
3
4#[derive(Serialize, Deserialize, Debug, Clone)]
12pub struct DelegatedAccess {
13 #[serde(with = "serde_bytes")]
15 pub principal_did: [u8; 32],
16 #[serde(with = "serde_bytes")]
18 pub delegate_did: [u8; 32],
19 pub context_bound: u64, pub expiration_timestamp: u64,
21 #[serde(with = "serde_bytes")]
23 pub cryptographic_proof: [u8; 64],
24}
25
26pub struct CrdtResolver;
29
30impl CrdtResolver {
31 pub fn resolve_lww(local: &NQuin, remote: &NQuin, is_selfhood_domain: bool) -> NQuin {
34 if is_selfhood_domain {
35 return local.clone(); }
37
38 let local_clock = local.extract_lamport_clock();
39 let remote_clock = remote.extract_lamport_clock();
40
41 if remote_clock > local_clock {
42 remote.clone()
43 } else if local_clock > remote_clock {
44 local.clone()
45 } else {
46 if remote.object > local.object {
50 remote.clone()
51 } else {
52 local.clone()
53 }
54 }
55 }
56
57 pub fn verify_delegation(
61 access: &DelegatedAccess,
62 target_context: u64,
63 current_timestamp: u64,
64 ) -> bool {
65 if access.expiration_timestamp < current_timestamp {
66 return false; }
68 if access.context_bound != target_context && access.context_bound != 0 {
69 return false; }
71
72 true
74 }
75}
76
77#[cfg(test)]
78mod tests {
79 use super::*;
80
81 #[test]
82 fn qualia_crdt_resolution() {
83 let mut q_local = NQuin {
84 subject: 1,
85 predicate: 2,
86 object: 100,
87 context: 5,
88 metadata: 0,
89 parity: 0,
90 };
91 q_local.set_lamport_clock(5);
92
93 let mut q_remote = NQuin {
94 subject: 1,
95 predicate: 2,
96 object: 200,
97 context: 5,
98 metadata: 0,
99 parity: 0,
100 };
101 q_remote.set_lamport_clock(8); let winner_clock = CrdtResolver::resolve_lww(&q_local, &q_remote, false);
105 assert_eq!(
106 winner_clock.object, 200,
107 "CRDT failed to resolve higher lamport clock"
108 );
109
110 let mut q_concurrent = NQuin {
112 subject: 1,
113 predicate: 2,
114 object: 50,
115 context: 5,
116 metadata: 0,
117 parity: 0,
118 };
119 q_concurrent.set_lamport_clock(5);
120
121 let winner_tie = CrdtResolver::resolve_lww(&q_local, &q_concurrent, false);
123 assert_eq!(
124 winner_tie.object, 100,
125 "CRDT failed deterministic tie-breaker"
126 );
127 }
128
129 #[test]
130 fn test_crdt_bifurcation() {
131 let mut q_local = NQuin {
132 subject: 1,
133 predicate: 2,
134 object: 100,
135 context: 5,
136 metadata: 0,
137 parity: 0,
138 };
139 q_local.set_lamport_clock(5);
140
141 let mut q_remote = NQuin {
142 subject: 1,
143 predicate: 2,
144 object: 200,
145 context: 5,
146 metadata: 0,
147 parity: 0,
148 };
149 q_remote.set_lamport_clock(8); let winner_commons = CrdtResolver::resolve_lww(&q_local, &q_remote, false);
153 assert_eq!(
154 winner_commons.object, 200,
155 "CRDT failed to resolve higher lamport clock in Commons"
156 );
157
158 let winner_selfhood = CrdtResolver::resolve_lww(&q_local, &q_remote, true);
160 assert_eq!(
161 winner_selfhood.object, 100,
162 "CRDT failed to protect selfhood domain from external merge"
163 );
164 }
165}
166
167#[derive(Clone, Copy)]
170pub struct SuspendedTransaction {
171 pub agreement_id: u64,
172 pub threshold: u8,
173 pub collected_signatures: u8,
174 pub registers: [Option<u64>; 16],
175 pub bytecode_buffer: [Option<crate::modalities::logic::core::WebizenOpcode>; 64],
176 pub yielded_op: Option<crate::modalities::logic::core::WebizenOpcode>,
177 pub suspended_quin: NQuin,
178}
179
180pub struct SuspendedTransactionQueue {
182 pub queue: [Option<SuspendedTransaction>; 32],
183}
184
185impl SuspendedTransactionQueue {
186 pub const fn new() -> Self {
187 Self { queue: [None; 32] }
189 }
190
191 pub fn push(&mut self, transaction: SuspendedTransaction) -> Result<(), &'static str> {
193 for slot in self.queue.iter_mut() {
194 if slot.is_none() {
195 *slot = Some(transaction);
196 return Ok(());
197 }
198 }
199 Err("SuspendedTransactionQueue is full!")
200 }
201
202 pub fn apply_consensus_token(&mut self, token_quin: &NQuin) -> Option<SuspendedTransaction> {
204 for slot in self.queue.iter_mut() {
205 if let Some(tx) = slot {
206 if tx.agreement_id == token_quin.context {
207 tx.collected_signatures += 1;
208 if tx.collected_signatures >= tx.threshold {
209 return slot.take(); }
211 }
212 }
213 }
214 None
215 }
216}