---
# System prepended metadata

title: Stader monitoring

---

# Stader monitoring

### Overview

The stader monitoring project consist of the following parts:

- Brain: in charge of collecting signatures and sending them to the infra
- Infra: in charge of verifying and storing the signatures, data visualization.


### Brain

The brain implementation will consist of:

- Infra API client: to communicate with the infra API for sending requests
- Web3signer new singing endpoint (see [PR](https://github.com/Consensys/web3signer/pull/982)). The request/response format are:
   - Body REQUEST format will be
    ```json 
    {
    "message": {
        "platform": "dappnode",
        "timestamp": "185921877",
        "pubkey": "0xb48c495c19082d892f38227bced89f7199f4e9b642bf94c7f2f1ccf29c0e6a6f54d653002513aa7cd3b56c88368797ec"
    }
    ```
    - Body RESPONSE format:
    ```json 
    {
  "payload": "ewogICAgIm1lc3NhZ2UiOiB7CiAgICAgICAgInBsYXRmb3JtIjogImRhcHBub2RlIiwKICAgICAgICAidGltZXN0YW1wIjogIjE4NTkyMTg3NyIsCiAgICAgICAgInB1YmtleSI6ICIweGI0OGM0OTVjMTkwODJkODkyZjM4MjI3YmNlZDg5ZjcxOTlmNGU5YjY0MmJmOTRjN2YyZjFjY2YyOWMwZTZhNmY1NGQ2NTMwMDI1MTNhYTdjZDNiNTZjODgzNjg3OTdlYyIKICAgIH0KfQ==",
  "signature": "0xa8b00e7746a523346c5165dfa80ffafe52317c6fe6cdcfabd41886f9c8209b829266c5000597142b58dddbcc9c23cfd81315180acf18bb000db50d08293bc539e06a7c751d3d9dec89fb441b3ba6aefdeeff9cfed72fb41171173f22e2993e74"
    }    
   ```
- Cron for sending signatures to dappnode infra:
    - The cron will append to the existing reponse from the web3signer the keys `label` and `network` so it will result into:
    ```json 
    {
  "payload": "ewogICAgIm1lc3NhZ2UiOiB7CiAgICAgICAgInBsYXRmb3JtIjogImRhcHBub2RlIiwKICAgICAgICAidGltZXN0YW1wIjogIjE4NTkyMTg3NyIsCiAgICAgICAgInB1YmtleSI6ICIweGI0OGM0OTVjMTkwODJkODkyZjM4MjI3YmNlZDg5ZjcxOTlmNGU5YjY0MmJmOTRjN2YyZjFjY2YyOWMwZTZhNmY1NGQ2NTMwMDI1MTNhYTdjZDNiNTZjODgzNjg3OTdlYyIKICAgIH0KfQ==",
  "signature": "0xa8b00e7746a523346c5165dfa80ffafe52317c6fe6cdcfabd41886f9c8209b829266c5000597142b58dddbcc9c23cfd81315180acf18bb000db50d08293bc539e06a7c751d3d9dec89fb441b3ba6aefdeeff9cfed72fb41171173f22e2993e74",
  "network": "prater",
  "label": "stader"
    },
   ```

See upstream work https://github.com/dappnode/StakingBrain/pull/304/files#diff-b6700726da8096923be646537b8b185a1dd1a40f8966d7d5f0f6f9fc6cfa4154

### Infra

The infra will consist of the following pieces:

- API: a process that will listen to the endpoint `/signature` with the HTTP method POST. The format of the request must follow the brain format otherwise request will not be allowed:
    ```json 
    {
  "payload": "ewogICAgIm1lc3NhZ2UiOiB7CiAgICAgICAgInBsYXRmb3JtIjogImRhcHBub2RlIiwKICAgICAgICAidGltZXN0YW1wIjogIjE4NTkyMTg3NyIsCiAgICAgICAgInB1YmtleSI6ICIweGI0OGM0OTVjMTkwODJkODkyZjM4MjI3YmNlZDg5ZjcxOTlmNGU5YjY0MmJmOTRjN2YyZjFjY2YyOWMwZTZhNmY1NGQ2NTMwMDI1MTNhYTdjZDNiNTZjODgzNjg3OTdlYyIKICAgIH0KfQ==",
  "signature": "0xa8b00e7746a523346c5165dfa80ffafe52317c6fe6cdcfabd41886f9c8209b829266c5000597142b58dddbcc9c23cfd81315180acf18bb000db50d08293bc539e06a7c751d3d9dec89fb441b3ba6aefdeeff9cfed72fb41171173f22e2993e74",
    "network": "prater",
  "label": "stader"
    },
   ```
   1. valid request format
   2. decode 
   3. write
   If the format is valid the API will write to the mongoDB with the status "pending" and the . The request must be decoded before, the signautre and the payload are encoded following this format:
    ```json
    {
  "payload": BASE64_ENCODED_PAYLOAD,
  "signature": HEX_ENCODED_SIGNATURE
    }
    ```
    Being the signature signed with algorithm  keccak256.
    The payload decoded has the format
    ```json
    "platform": "dappnode",
    "timestamp": "185921877",
    "pubkey": "0xb48c495c19082d892f38227bced89f7199f4e9b642bf94c7f2f1ccf29c0e6a6f54d653002513aa7cd3b56c88368797ec"
    ```
    
  **ADDITION: Would be nice to make sure this is a unique signature (meaining unique pubkey, timestamp, and network) before adding it to mongodb**
- Mongo DB: it will be a mongoDB where the verifyier and the API processese can read and write. The mongo db will have the following format:
    ```json
    "pubkey": "",
    "network": "mainnet",
    "label": "solo",
    "signatures": {
        "signature": "",
        "timestamp": "",
        "platform": "dappnode",
        "status": "pending"
    }[],
    ```
    This database format will assume as unique keys in the database the combination of pubke + network + (label?)
    
- Verifyier: the verifyer will be another nodejs process that will be polling the mongo DB for new entries, every new entry it will run a verification of:
    - 1. Verify its actually a validator in the given network, otherwise drop the public key entry from the database
    - 2. The signature. If the signature is valid it will write it with the status "valid" and if invalid it will be written with status "invalid"
    - Future: implement veryfier as CLI
    - TODO: research how to do polling https://chat.openai.com/c/472ab981-7a8d-428d-ae47-2ab2e82b25e5
- Grafana: a service for data visualization of the mongodb database, see [mongodb implementation as datasource in grafana](https://grafana.com/docs/plugins/grafana-mongodb-datasource/latest/).
    - TODO: define the dashboards to create

