# Censoring Simulation
This simulation creates a number of malicious nodes which do not propagate
received messages. This simulation is aimed to help fine-tune gossipsub scoring
parameters to mitigate censoring attacks on gossipsub networks.
## Running the simulation
```shell
testground run composition -f censoring/compositions/composition.toml --wait
```
## How the Simulation Works
Note: Attackers connect to a single publisher (victim). [`Publisher1` is the victim](./src/attacker.rs#L76) in this test plan.
```mermaid
sequenceDiagram
participant Publishers
participant Lurkers
participant Attackers
%% Discovery
Note over Publishers,Lurkers: Setup discovery
Connect to some of the honest nodes (publishers + lukers)
randomly selected
Note over Attackers: Setup discovery
Connect to a single publisher
Publishers->>Lurkers: Connect
Lurkers->>Publishers: Connect
Attackers->>Publishers: Connect to a single publisher (victim)
%% Subscribe topics
Note over Publishers,Lurkers: Subscribe topic(s)
Publishers->>Lurkers: Subscribe/GRAFT
Lurkers->>Publishers: Subscribe/GRAFT
Publishers->>Attackers: Subscribe/GRAFT
Note over Attackers: Subscribe to the topic in the message from the publisher,
and send back Subscribe/GRAFT.
Attackers->>Publishers: Subscribe/GRAFT
%% Publish messages
Note over Publishers: Periodically publish messages on all topics subscribing.
loop Publish messages
Publishers->>Lurkers: Message
Publishers->>Attackers: Message
Note over Attackers: **Don't propagate messages**
end
%% Record metrics
Note over Publishers,Lurkers: Record metrics.
```
## Dashboards
Please see the root [README](../README.md) for how to run Grafana.
### Gossipsub Metrics
The metrics of gossipsub are recorded once the simulation has been completed. [All of the metrics on libp2p-gossipsub](./src/honest.rs#L235-L275) are available in this dashboard.
Variables for this dashboard:
- `run_id`: The run_id for the test run you want to see.
- `topic`: The gossipsub topic, currently it's fixed to `emulate`.
- `instance_name`: Some panels in this dashboard need an instance name to be specified. (e.g. score_per_mesh histogram)
### Peer Scores
The peer scores are recorded periodically (every second) while the simulation is running.
Variables for this dashboard:
- `run_id`: The run_id for the test run you want to see.
- `instance_name`: It's default to `All`, you can select specific instances.