Skip to content
This repository was archived by the owner on Jun 14, 2024. It is now read-only.
This repository was archived by the owner on Jun 14, 2024. It is now read-only.

RFC: Nodes and their capabilities #87

@oskarth

Description

@oskarth

Abstract

Currently we describe the various types of capabilities as different node types, such as bootstrap nodes, mailserver servers, mailserver clients, relay nodes, and light nodes. In some places we describe these as actual capabilities that different things a node can do. This inconsistency and lack of clarity around a node and what it can do makes it harder to do many things. Among others, to reason about and extend things related to specs, analysis, clients, simulations, running a node and explaining things to end users.

A cleaner mental model is to be consistent about it being a node with a set of capabilities. The "X node" then becomes more of a shortcut to refer to certain optimized client configurations. This is more in-line with the adaptive nodes ethos that we want to practice, as well as future enhancements we want to make (libp2p, dagger). It is conceptually simpler and more accurate. If clients implement this correctly, it also simplifies the use of different capabilities for people who want to run their own node.

Specific proposal

Use the following terminology consistently throughout the spec:

  1. A node is defined by its set of capabilities.

  2. For Waku, these capabilities are:

  • send messages
  • receive messages, including historical messages
  • relay messages
  • bootstrap nodes
  • store historical messages and return these upon request
  1. We use the following shortcuts to refer to nodes with certain set of common capabilities:
  • A light node only has send and receive capability
  • A full node has all capabilities (send/receive/relay/bootstrap/store)
  • A bootstrap node only has capability to bootstrap nodes
  1. These common configurations and their capabilities can be cleanly visualized as follows:
  • Light node [x] send [x] receive [ ] relay [ ] bootstrap [ ] store
  • Full node [x] send [x] receive [x] relay [x] bootstrap [x] store
  • Bootstrap node [ ] send [ ] receive [ ] relay [x] bootstrap [ ] store
  1. Each capability have a set of requirements. For example, to have the bootstrap capability you currently:
  • MUST be connectable through a static IP
  • SHOULD be long-running process
  1. A client SHOULD be able to specify all (legal) set of capabilities through a simple configuration and the same executable.

  2. The previously used "Waku server node", "mailserver node" and "Whisper relay node" is supplanted by simply a "full node" as in "run a full node to make the network more robust".

  • This doesn't preclude nodes, e.g. in a specific cluster configuration, choosing to have fewer capabilities. In that case they'll simply be referred to as the set of their capabilities.

Next steps

  • Consensus within protocol team
  • Update Waku specs with more precise terminology
  • Update Status client spec
  • Update client configuration and docs to reflect and enable this
  • Update infra configuration snad docs to reflect and enable this
  • Update relevant places in core app

Notes

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions