---
title: Architecture overview of Mosaic node
tags: docs, draft
---
# Mosaic node architecture
Mosaic streams node. Layout of code components:
```graphviz
digraph Mosaic{
node[shape=record]
Cmd
eth [label="Ethereum" shape=box];
App [label="AppProxy"]
Nde
Landscape
Explorer
GraphQL;
subgraph cluster_brd {
Boards
Net [label="Threads"]
Libp2p
Switch
subgraph cluster_reactors{
View
Slice
ViewReactor
SliceReactor
}
}
Cmd -> {App Nde Landscape};
Nde -> {Boards, Scout};
Landscape -> {Explorer};
Landscape -> Scout;
Scout->Boards
Explorer -> {GraphQL eth};
GraphQL -> eth;
App -> {Slice View};
View->ViewReactor;
Slice->SliceReactor;
ViewReactor -> Switch;
SliceReactor -> Switch;
Boards -> {Net Libp2p Switch}
Net -> Libp2p
{rank=same; App Nde Landscape}
}
```
## Structured ACL message flow
A board creates a context to separate message flows so that the libp2p network can prioritise peer connections closer to boards of interest to the node.
Threads ensure ACL enforcement, and grouping for easy cleanup of outdated messages.
Logs are append-only single-writer logs, ensuring authentication and ordering of message by author.
```
Board (contract representation)
|--Threads (groups ACL with service and read key encryption)
|--Logs (appended by a single writer participating in the board)
|--Messages (topicId identifies reactor responsible)
```
A tuple `(BoardID, TopicID)` forms a `locus` defining "where" and "what" (about) a message is.