# Structures ## EventId Hash of `Event` ```rust type EventId = [u8; 32]; ``` ## EventAction The `Event` could have many actions according to the underlying data. ```rust enum EventAction { ... }; ``` ## Event | Description | Data Type | Comments | | ---------------------- | -------------- | --------------------------- | | previous_event_hash | `EventId` | Hash of the previous `Event`| | action | `EventAction` | `Event`'s action | | timestamp | u64 | `Event`'s timestamp | ## EventNode | Description | Data Type | Comments | | -------------- | ---------------------- | ----------------------------------------------------- | | parent | Option<`EventId`> | Only current root has this set to None | | event | `Event` | The `Event` itself | | children | Vec<`EventId`> | The `Event`s which has parent as this `Event` hash | ## Model The `Model` consists of chains (`EventNodes`) structured as a tree; whereby, each chain has an `Event`-based list. To maintain a strict order of chains, each `Event` depends on the hash of the previous `Event`. All of the chains share a root `Event` to preserve the tree structure. | Description | Data Type | Comments | | ------------- | -------------------------------- | ----------------------------- | | current_root | `EventId` | The root `Event` for the tree | | orphans | HashMap<`EventId`, `Event`> | Recently added `Event`s | | event_map | HashMap<`EventId`, `EventNode`> | The actual tree | | events_queue | `EventsQueue` | Communication channel | ## View The `View` checks the `Model` for new `Event`s and then dispatches these `Event`s to the clients. `Event`s are sorted according to the timestamp attached to each `Event`. | Description | Data Type | Comments | | ------------- | ----------------------------- | ---------------------- | | seen | HashMap<`EventId`, `Event`> | A list of `Event`s | ## EventsQueue The `EventsQueue` used to transport the event from `Model` to `View`. The `Model` fills the `EventsQueue` with the new `Event`, while the `View` continuously fetches `Event`s from queue. # Architecture Tau uses Model–view software architecture. All of the operations, main data structures, and message handling from the network protocol happen on the `Model` side. Further, this keeps the `View` independent of the `Model` and allows the `View` to focus on receiving continuous updates from it. ## Add new `Event` Upon receiving a new `Event` from the network protocol, the `Event` will be added to the orphans list. After the ancestor of the new orphan is found, the orphan `Event` will be added to the chain according to its ancestor. For example: in [Example1](#example1) below, an `Event` is added to the first chain if its previous hash is Event-A1. ## Remove old leaves Remove leaves which are too far from the head leaf (the leaf in the longest chain). The depth difference from the common ancestor between a leaf to be removed and a head leaf must be greater than `MAX_DEPTH`. ## Update the root Finding the highest common ancestor for the leaves and assign it as the root for the tree. The highest common ancestor must have a height greater than `MAX_HEIGHT`. ## Example1 ![data structure](../../assets/mv_event.png)