1use crate::operation::*;
2use blake2::digest::{Update, VariableOutput};
3use blake2::VarBlake2b;
4use bytes::{Buf, BufMut, Bytes, BytesMut};
5use std::cell::RefCell;
6use std::cmp::Ordering;
8use std::fmt;
9use std::rc::Rc;
10
11pub(crate) const LEAF_IN_PACKAGED_PROOF: u8 = 2;
13pub(crate) const LABEL_IN_PACKAGED_PROOF: u8 = 3;
14pub(crate) const END_OF_TREE_IN_PACKAGED_PROOF: u8 = 4;
15
16pub type Balance = i8;
17pub type SerializedAdProof = Bytes;
18pub type NodeId = Rc<RefCell<Node>>;
19pub type Resolver = fn(&Digest32) -> Node;
20
21#[derive(Debug, Clone)]
22pub struct NodeHeader {
23 pub visited: bool,
24 pub is_new: bool,
25 pub label: Option<Digest32>,
26 pub key: Option<ADKey>,
27}
28
29#[derive(Debug, Clone)]
30pub struct InternalNode {
31 pub hdr: NodeHeader,
32 pub balance: Balance,
33 pub left: NodeId,
34 pub right: NodeId,
35}
36
37#[derive(Debug, Clone)]
38pub struct LeafNode {
39 pub hdr: NodeHeader,
40 pub value: ADValue,
41 pub next_node_key: ADKey,
42}
43
44#[derive(Debug, Clone)]
45pub enum Node {
46 LabelOnly(NodeHeader),
47 Internal(InternalNode),
48 Leaf(LeafNode),
49}
50
51const INTERNAL_NODE_PREFIX: u8 = 0;
52const LEAF_NODE_PREFIX: u8 = 1;
53
54impl Node {
55 pub fn visited(&self) -> bool {
56 self.hdr().visited
57 }
58
59 pub fn reset(&mut self) -> bool {
60 let hdr = self.hdr_mut();
61 let was_new = hdr.is_new;
62 hdr.is_new = false;
63 hdr.visited = false;
64 was_new
65 }
66
67 pub fn mark_visited(&mut self, visited: bool) {
68 let hdr = self.hdr_mut();
69 hdr.visited = visited;
70 }
71
72 pub fn is_new(&self) -> bool {
73 self.hdr().is_new
74 }
75
76 pub fn get_label(&self) -> Digest32 {
77 self.hdr().label.unwrap()
78 }
79
80 pub fn label(&mut self) -> Digest32 {
81 if let Some(label) = self.hdr().label {
82 return label;
83 }
84 match self {
85 Node::LabelOnly(hdr) => hdr.label.unwrap(),
86 Node::Leaf(node) => {
87 let mut hasher = VarBlake2b::new(32).unwrap();
88 hasher.update(&[0u8; 1]);
89 hasher.update(&node.hdr.key.as_ref().unwrap()[..]);
90 hasher.update(&node.value[..]);
91 hasher.update(&node.next_node_key[..]);
92 let mut label: Digest32 = Default::default();
93 label.copy_from_slice(&hasher.finalize_boxed());
94 node.hdr.label = Some(label);
95 label
96 }
97 Node::Internal(node) => {
98 let mut hasher = VarBlake2b::new(32).unwrap();
99 hasher.update(&[1u8; 1]);
100 hasher.update(&[node.balance as u8; 1]);
101 hasher.update(node.left.borrow_mut().label());
102 hasher.update(node.right.borrow_mut().label());
103 let mut label: Digest32 = Default::default();
104 label.copy_from_slice(&hasher.finalize_boxed());
105 node.hdr.label = Some(label);
106 label
107 }
108 }
109 }
110
111 pub fn left(&self) -> NodeId {
112 if let Node::Internal(node) = self {
113 node.left.clone()
114 } else {
115 panic!("not internal node");
116 }
117 }
118
119 pub fn right(&self) -> NodeId {
120 if let Node::Internal(node) = self {
121 node.right.clone()
122 } else {
123 panic!("not internal node");
124 }
125 }
126 pub fn balance(&self) -> Balance {
127 if let Node::Internal(node) = self {
128 node.balance
129 } else {
130 panic!("not internal node");
131 }
132 }
133 pub fn value(&self) -> ADValue {
134 if let Node::Leaf(node) = self {
135 node.value.clone()
136 } else {
137 panic!("not leaf node");
138 }
139 }
140 pub fn key(&self) -> ADValue {
141 let hdr = self.hdr();
142 hdr.key.as_ref().unwrap().clone()
143 }
144 pub fn next_node_key(&self) -> ADKey {
145 if let Node::Leaf(node) = self {
146 node.next_node_key.clone()
147 } else {
148 panic!("not leaf node");
149 }
150 }
151 pub fn is_leaf(&self) -> bool {
152 match self {
153 Node::Leaf(_) => true,
154 _ => false,
155 }
156 }
157 pub fn is_internal(&self) -> bool {
158 match self {
159 Node::Internal(_) => true,
160 _ => false,
161 }
162 }
163 pub fn new_label(label: &Digest32) -> NodeId {
164 Rc::new(RefCell::new(Node::LabelOnly(NodeHeader::new(
165 Some(*label),
166 None,
167 ))))
168 }
169
170 fn hdr(&'_ self) -> &'_ NodeHeader {
172 match self {
173 Node::LabelOnly(hdr) => &hdr,
174 Node::Internal(node) => &node.hdr,
175 Node::Leaf(node) => &node.hdr,
176 }
177 }
178
179 fn hdr_mut(&'_ mut self) -> &'_ mut NodeHeader {
180 match self {
181 Node::LabelOnly(ref mut hdr) => hdr,
182 Node::Internal(ref mut node) => &mut node.hdr,
183 Node::Leaf(ref mut node) => &mut node.hdr,
184 }
185 }
186
187 fn reset_recursive(node: &NodeId) {
188 if node.borrow_mut().reset() {
189 if let Node::Internal(r) = &*node.borrow() {
190 Self::reset_recursive(&r.left);
191 Self::reset_recursive(&r.right);
192 }
193 }
194 }
195}
196
197impl NodeHeader {
198 pub fn new(label: Option<Digest32>, key: Option<ADKey>) -> NodeHeader {
199 NodeHeader {
200 visited: false,
201 is_new: true,
202 key,
203 label,
204 }
205 }
206}
207
208impl InternalNode {
209 pub fn new(key: Option<ADKey>, left: &NodeId, right: &NodeId, balance: Balance) -> NodeId {
210 Rc::new(RefCell::new(Node::Internal(InternalNode {
211 hdr: NodeHeader::new(None, key),
212 left: left.clone(),
213 right: right.clone(),
214 balance,
215 })))
216 }
217
218 pub fn update_key(node: &NodeId, key: &ADKey) -> NodeId {
219 if let Node::Internal(this) = &mut *node.borrow_mut() {
220 if this.hdr.is_new {
221 this.hdr.key = Some(key.clone());
222 } else {
223 return Self::new(Some(key.clone()), &this.left, &this.right, this.balance);
224 }
225 } else {
226 panic!("Not internal node");
227 }
228 node.clone()
229 }
230
231 pub fn update(node: &NodeId, left: &NodeId, right: &NodeId, balance: Balance) -> NodeId {
232 if let Node::Internal(this) = &mut *node.borrow_mut() {
233 if this.hdr.is_new {
234 this.left = left.clone();
235 this.right = right.clone();
236 this.balance = balance;
237 this.hdr.label = None;
238 } else {
239 return Self::new(this.hdr.key.clone(), left, right, balance);
240 }
241 } else {
242 panic!("Not internal node");
243 }
244 node.clone()
245 }
246}
247
248impl LeafNode {
249 pub fn update(node: &NodeId, key: &ADKey, value: &ADValue, next_node_key: &ADKey) -> NodeId {
250 if let Node::Leaf(this) = &mut *node.borrow_mut() {
251 if this.hdr.is_new {
252 this.hdr.key = Some(key.clone());
253 this.value = value.clone();
254 this.next_node_key = next_node_key.clone();
255 this.hdr.label = None;
256 } else {
257 return Self::new(key, value, next_node_key);
258 }
259 } else {
260 panic!("Not leaf node");
261 }
262 node.clone()
263 }
264
265 pub fn new(key: &ADKey, value: &ADValue, next_node_key: &ADKey) -> NodeId {
266 Rc::new(RefCell::new(Node::Leaf(LeafNode {
267 hdr: NodeHeader::new(None, Some(key.clone())),
268 value: value.clone(),
269 next_node_key: next_node_key.clone(),
270 })))
271 }
272}
273
274#[derive(Clone)]
275pub struct AVLTree {
276 pub root: Option<NodeId>,
277 pub height: usize,
278 pub key_length: usize,
279 pub value_length: Option<usize>,
280 pub resolver: Resolver,
281}
282
283impl AVLTree {
284 pub fn new(resolver: Resolver, key_length: usize, value_length: Option<usize>) -> AVLTree {
285 AVLTree {
286 key_length,
287 value_length,
288 resolver,
289 height: 0,
290 root: None,
291 }
292 }
293
294 pub fn left(&self, node: &NodeId) -> NodeId {
295 if let Node::Internal(r) = &mut *node.borrow_mut() {
296 self.resolve(&mut r.left)
297 } else {
298 panic!("Not internal node");
299 }
300 }
301
302 pub fn right(&self, node: &NodeId) -> NodeId {
303 if let Node::Internal(r) = &mut *node.borrow_mut() {
304 self.resolve(&mut r.right)
305 } else {
306 panic!("Not internal node");
307 }
308 }
309
310 pub fn balance(&self, node: &NodeId) -> Balance {
311 node.borrow().balance()
312 }
313
314 pub fn label(&self, node: &NodeId) -> Digest32 {
315 node.borrow_mut().label()
316 }
317
318 pub fn key(&self, node: &NodeId) -> ADKey {
319 node.borrow().key()
320 }
321
322 pub fn value(&self, node: &NodeId) -> ADValue {
323 node.borrow().value()
324 }
325
326 pub fn next_node_key(&self, node: &NodeId) -> ADKey {
327 node.borrow().next_node_key()
328 }
329
330 pub fn visited(&self, node: &NodeId) -> bool {
331 node.borrow().visited()
332 }
333
334 pub fn is_new(&self, node: &NodeId) -> bool {
335 node.borrow().is_new()
336 }
337
338 pub fn mark_visited(&self, node: &NodeId, visited: bool) {
339 node.borrow_mut().mark_visited(visited)
340 }
341
342 pub fn resolve(&self, child: &mut NodeId) -> NodeId {
343 let mut resolved_node: Option<NodeId> = None;
344 if let Node::LabelOnly(hdr) = &*child.borrow() {
345 resolved_node = Some(Rc::new(RefCell::new((self.resolver)(&hdr.label.unwrap()))));
346 }
347 if let Some(node) = resolved_node {
348 *child = node
349 }
350 child.clone()
351 }
352
353 pub fn copy(&self, node: &NodeId) -> Node {
354 let n = &mut *node.borrow_mut();
355 if let Node::Internal(r) = n {
356 let _ = self.resolve(&mut r.left);
357 let _ = self.resolve(&mut r.right);
358 }
359 n.clone()
360 }
361
362 pub fn extract_nodes(
363 &self,
364 extractor: &mut dyn FnMut(&mut Node) -> bool,
365 ) -> Option<Vec<NodeId>> {
366 if let Some(root) = &self.root {
367 let mut set = Vec::new();
368 self.extract_nodes_recursive(extractor, root, &mut set);
369 Some(set)
370 } else {
371 None
372 }
373 }
374
375 pub fn extract_first_node(
376 &self,
377 extractor: &mut dyn FnMut(&mut Node) -> bool,
378 ) -> Option<NodeId> {
379 if let Some(root) = &self.root {
380 self.extract_first_node_recursive(extractor, root)
381 } else {
382 None
383 }
384 }
385
386 fn extract_first_node_recursive(
387 &self,
388 extractor: &mut dyn FnMut(&mut Node) -> bool,
389 node: &NodeId,
390 ) -> Option<NodeId> {
391 let nr = &mut *node.borrow_mut();
392 if let Node::Internal(r) = nr {
393 self.extract_first_node_recursive(extractor, &self.resolve(&mut r.left))
394 .or(self.extract_first_node_recursive(extractor, &self.resolve(&mut r.right)))
395 } else if extractor(nr) {
396 Some(node.clone())
397 } else {
398 None
399 }
400 }
401
402 pub fn contains(&self, node: &NodeId) -> bool {
403 if let Some(root) = &self.root {
404 self.contains_recursive(root, &self.key(node), &self.label(node), false)
405 } else {
406 false
407 }
408 }
409
410 pub fn contains_key(&self, key: &ADKey, label: &Digest32) -> bool {
411 if let Some(root) = &self.root {
412 self.contains_recursive(root, key, label, false)
413 } else {
414 false
415 }
416 }
417
418 fn contains_recursive(
419 &self,
420 node: &NodeId,
421 key: &ADKey,
422 label: &Digest32,
423 key_found: bool,
424 ) -> bool {
425 if &self.label(node) == label {
426 true
427 } else {
428 if let Node::Internal(r) = &mut *node.borrow_mut() {
429 if key_found {
430 self.contains_recursive(&self.resolve(&mut r.left), key, label, true)
431 } else {
432 match (*key).cmp(r.hdr.key.as_ref().unwrap()) {
433 Ordering::Equal =>
434 {
436 self.contains_recursive(&self.resolve(&mut r.right), key, label, true)
437 }
438 Ordering::Less =>
439 {
441 self.contains_recursive(&self.resolve(&mut r.left), key, label, false)
442 }
443 Ordering::Greater => {
444 self.contains_recursive(&self.resolve(&mut r.right), key, label, false)
445 }
446 }
447 }
448 } else {
449 false
450 }
451 }
452 }
453
454 fn extract_nodes_recursive(
455 &self,
456 extractor: &mut dyn FnMut(&mut Node) -> bool,
457 node: &NodeId,
458 set: &mut Vec<NodeId>,
459 ) {
460 let nr = &mut *node.borrow_mut();
461 if let Node::Internal(r) = nr {
462 self.extract_nodes_recursive(extractor, &self.resolve(&mut r.left), set);
463 self.extract_nodes_recursive(extractor, &self.resolve(&mut r.right), set);
464 } else if extractor(nr) {
465 set.push(node.clone())
466 }
467 }
468
469 fn fmt_recursive(&self, f: &mut fmt::Formatter, node: &NodeId, depth: usize) -> fmt::Result {
470 write!(f, "{:1$}", " ", depth)?;
471 match &*node.borrow() {
472 Node::Leaf(leaf) => {
473 writeln!(
474 f,
475 "At leaf label={:?}, key={:?} next_node_key={:?}, value={:?}",
476 leaf.hdr.label, leaf.hdr.key, leaf.next_node_key, leaf.value
477 )
478 }
479 Node::Internal(r) => {
480 writeln!(
481 f,
482 "Internal node label={:?}, balance={:?}",
483 r.hdr.label, r.balance
484 )?;
485 self.fmt_recursive(f, &r.left, depth + 1)?;
486 self.fmt_recursive(f, &r.right, depth + 1)
487 }
488 Node::LabelOnly(hdr) => {
489 writeln!(f, "Label-only node label={:?}", hdr.label)
490 }
491 }
492 }
493
494 pub fn reset(&self) {
495 if let Some(root) = &self.root {
496 Node::reset_recursive(root);
497 }
498 }
499
500 pub fn pack(&self, node: NodeId) -> Bytes {
501 let mut buf = BytesMut::new();
502 match &*node.borrow() {
503 Node::Internal(node) => {
504 buf.put_u8(INTERNAL_NODE_PREFIX);
505 buf.put_i8(node.balance);
506 buf.extend_from_slice(&node.hdr.key.as_ref().unwrap());
507 buf.extend_from_slice(&node.left.borrow_mut().label());
508 buf.extend_from_slice(&node.right.borrow_mut().label());
509 }
510 Node::Leaf(leaf) => {
511 buf.put_u8(LEAF_NODE_PREFIX);
512 buf.extend_from_slice(&leaf.hdr.key.as_ref().unwrap());
513 if let Some(value_length) = self.value_length {
514 assert!(leaf.value.len() == value_length as usize);
515 buf.extend_from_slice(&leaf.value);
516 } else {
517 buf.put_u32(leaf.value.len() as u32);
518 buf.extend_from_slice(&leaf.value);
519 }
520 buf.extend_from_slice(&leaf.next_node_key);
521 }
522 Node::LabelOnly(_) => panic!("LabelOnly nodes should not be serialized"),
523 }
524 buf.freeze()
525 }
526
527 pub fn unpack(&self, bytes: &Bytes) -> NodeId {
528 let mut buf = BytesMut::from(&bytes[..]);
529 match buf.get_u8() {
530 INTERNAL_NODE_PREFIX => {
531 let balance = buf.get_i8();
532 let key = Some(buf.copy_to_bytes(self.key_length));
533 let mut left: Digest32 = Default::default();
534 buf.copy_to_slice(&mut left);
535 let mut right: Digest32 = Default::default();
536 buf.copy_to_slice(&mut right);
537 InternalNode::new(
538 key,
539 &Node::new_label(&left),
540 &Node::new_label(&right),
541 balance,
542 )
543 }
544 LEAF_NODE_PREFIX => {
545 let key = buf.copy_to_bytes(self.key_length);
546 let value: Bytes;
547 if let Some(value_length) = self.value_length {
548 value = buf.copy_to_bytes(value_length);
549 } else {
550 let value_length = buf.get_u32() as usize;
551 value = buf.copy_to_bytes(value_length);
552 }
553 let next_node_key = buf.copy_to_bytes(self.key_length);
554 LeafNode::new(&key, &value, &next_node_key)
555 }
556 _ => {
557 panic!("Unexpected node prefix");
558 }
559 }
560 }
561
562 pub fn positive_infinity_key(&self) -> ADKey {
563 Bytes::from(vec![0xFFu8; self.key_length])
564 }
565
566 pub fn negative_infinity_key(&self) -> ADKey {
567 Bytes::from(vec![0u8; self.key_length])
568 }
569}
570
571impl fmt::Display for AVLTree {
572 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
573 if let Some(root) = &self.root {
574 self.fmt_recursive(f, &root, 0)
575 } else {
576 writeln!(f, "Empty tree")
577 }
578 }
579}