provide details about peers discovery implementation in client

This commit is contained in:
Adam Babik 2019-08-30 08:59:06 +02:00
parent 04c92f2f02
commit 14f48ed652
No known key found for this signature in database
GPG Key ID: ED02515A1FC0D1B4
1 changed files with 74 additions and 25 deletions

View File

@ -16,11 +16,12 @@ This document consists of two parts. The first outlines the specifications that
have to be implemented in order to be a full Status client. The second gives a design rationale and answers some common questions. have to be implemented in order to be a full Status client. The second gives a design rationale and answers some common questions.
## Table of Contents ## Table of Contents
- [Abstract](#abstract) - [Status Client Specification](#status-client-specification)
- [Table of Contents](#table-of-contents) - [Abstract](#abstract)
- [Introduction](#introduction) - [Table of Contents](#table-of-contents)
- [Introduction](#introduction)
- [Protocol layers](#protocol-layers) - [Protocol layers](#protocol-layers)
- [Components](#components) - [Components](#components)
- [P2P Overlay](#p2p-overlay) - [P2P Overlay](#p2p-overlay)
- [Node discovery and roles](#node-discovery-and-roles) - [Node discovery and roles](#node-discovery-and-roles)
- [Bootstrapping](#bootstrapping) - [Bootstrapping](#bootstrapping)
@ -30,8 +31,9 @@ have to be implemented in order to be a full Status client. The second gives a d
- [Secure Transport](#secure-transport) - [Secure Transport](#secure-transport)
- [Data Sync](#data-sync) - [Data Sync](#data-sync)
- [Payloads and clients](#payloads-and-clients) - [Payloads and clients](#payloads-and-clients)
- [Security Considerations](#security-considerations) - [Security Considerations](#security-considerations)
- [Design Rationale](#design-rationale) - [Censorship-resistance](#censorship-resistance)
- [Design Rationale](#design-rationale)
- [P2P Overlay](#p2p-overlay-1) - [P2P Overlay](#p2p-overlay-1)
- [Why devp2p? Why not use libp2p?](#why-devp2p-why-not-use-libp2p) - [Why devp2p? Why not use libp2p?](#why-devp2p-why-not-use-libp2p)
- [What about other RLPx subprotocols like LES, and Swarm?](#what-about-other-rlpx-subprotocols-like-les-and-swarm) - [What about other RLPx subprotocols like LES, and Swarm?](#what-about-other-rlpx-subprotocols-like-les-and-swarm)
@ -40,8 +42,10 @@ have to be implemented in order to be a full Status client. The second gives a d
- [Why is PoW for Whisper set so low?](#why-is-pow-for-whisper-set-so-low) - [Why is PoW for Whisper set so low?](#why-is-pow-for-whisper-set-so-low)
- [Why do you not use Discovery v5 for node discovery?](#why-do-you-not-use-discovery-v5-for-node-discovery) - [Why do you not use Discovery v5 for node discovery?](#why-do-you-not-use-discovery-v5-for-node-discovery)
- [I heard something about mailservers being trusted somehow?](#i-heard-something-about-mailservers-being-trusted-somehow) - [I heard something about mailservers being trusted somehow?](#i-heard-something-about-mailservers-being-trusted-somehow)
- [Footnotes](#footnotes) - [Data sync](#data-sync)
- [Acknowledgements](#acknowledgements) - [Why is MVDS not used for public chats?](#why-is-mvds-not-used-for-public-chats)
- [Footnotes](#footnotes)
- [Acknowledgements](#acknowledgements)
## Introduction ## Introduction
@ -97,7 +101,19 @@ nodes allow you to discover other nodes of the network.
Currently the main bootstrap nodes are provided by Status Gmbh, but anyone can Currently the main bootstrap nodes are provided by Status Gmbh, but anyone can
run these provided they are connected to the rest of the Whisper network. run these provided they are connected to the rest of the Whisper network.
<!-- TODO: Add a link to bootstrap nodes --> Status maintains a list of boootstrap nodes in the following locations:
- Asia:
- `enode://e8a7c03b58911e98bbd66accb2a55d57683f35b23bf9dfca89e5e244eb5cc3f25018b4112db507faca34fb69ffb44b362f79eda97a669a8df29c72e654416784@47.91.224.35:443`
- `enode://43947863cfa5aad1178f482ac35a8ebb9116cded1c23f7f9af1a47badfc1ee7f0dd9ec0543417cc347225a6e47e46c6873f647559e43434596c54e17a4d3a1e4@47.52.74.140:443`
- Europe:
- `enode://436cc6f674928fdc9a9f7990f2944002b685d1c37f025c1be425185b5b1f0900feaf1ccc2a6130268f9901be4a7d252f37302c8335a2c1a62736e9232691cc3a@174.138.105.243:443`
- `enode://5395aab7833f1ecb671b59bf0521cf20224fe8162fc3d2675de4ee4d5636a75ec32d13268fc184df8d1ddfa803943906882da62a4df42d4fccf6d17808156a87@206.189.243.57:443`
- North America:
- `enode://7427dfe38bd4cf7c58bb96417806fab25782ec3e6046a8053370022cbaa281536e8d64ecd1b02e1f8f72768e295d06258ba43d88304db068e6f2417ae8bcb9a6@104.154.88.123:443`
- `enode://ebefab39b69bbbe64d8cd86be765b3be356d8c4b24660f65d493143a0c44f38c85a257300178f7845592a1b0332811542e9a58281c835babdd7535babb64efc1@35.202.99.224:443`
These bootstrap nodes do not change, however, we can't guarantee that it will stay this way forever
and at some point we might be forced to change them.
#### Discovery #### Discovery
@ -109,10 +125,43 @@ v5](https://github.com/ethereum/devp2p/blob/master/discv5/discv5.md) and
[modifications](https://github.com/status-im/rendezvous#differences-with-original-rendezvous)). [modifications](https://github.com/status-im/rendezvous#differences-with-original-rendezvous)).
Additionally, some static nodes MAY also be used. Additionally, some static nodes MAY also be used.
This part of the system is currently underspecified and requires further detail. A Status client MUST use at least one discovery method or use static nodes
to communicate with other clients.
<!-- TODO: This section is way too vague, amend with concrete spec for how to do discovery of Status nodes. --> Discovery V5 uses bootstrap nodes to discover other peers. Bootstrap nodes MUST support
<!-- TODO: Add info on peer list, Discover v5 timespan, static nodes etc - should be enough to discover nodes from a different stack --> Discovery V5 protocol as well in order to provide peers. It is kademlia-based discovery mechanism
and it might consume significant (at least on mobile) amount of network traffic to operate.
In order to take advantage from simpler and more mobile-friendly peers discovery mechanism,
i.e. Rendezvous protocol, one MUST provide a list of Rendezvous nodes which speak
Rendezvous protocol. Rendezvous protocol is request-response discovery mechanism.
It uses Ethereum Node Records (ENR) to report discovered peers.
Both peers discovery mechanisms use topics to provide peers with certain capabilities.
There is no point in returning peers that do not support a particular protocol.
Status nodes that want to be discovered MUST register to Discovery V5 and/or Rendezvous
with the `whisper` topic. Status nodes that are mail servers and want to
be discoverable MUST additionally register with the `whispermail` topic.
The recommended strategy is to use both mechanisms but at the same time implement a structure
called `PeerPool`. `PeerPool` is responsible for maintaining an optimal number of peers.
For mobile nodes, there is no significant advantage to have more than 2-3 peers and one mail server.
`PeerPool` can notify peers discovery protocol implementations that they should suspend
their execution because the optimal number of peers is found. They should resume
if the number of connected peers drops or a mail server disconnects.
It is worth noticing that an efficient caching strategy can be of great use, especially,
on mobile devices. Discovered peers can be cached as they rarely change and used
when the client starts again. In such a case, there might be no need to even start
peers discovery protocols because cached peers will satisfy the optimal number of peers.
Alternatively, a client MAY rely exclusively on a list of static peers. This is the most efficient
way because there is no peers discovery algorithm overhead introduced. The disadvantage
is that these peers might be gone and without peers discovery mechanism, it won't be possible to find
new ones.
The current list of static peers is published on https://fleets.status.im/. `eth.beta` is the current
group of peers the official Status client uses. The others are test networks.
#### Mobile nodes #### Mobile nodes
@ -254,7 +303,7 @@ very bandwidth heavy.
## Footnotes ## Footnotes
1. <https://github.com/status-im/status-protocol-go/> 1. <https://github.com/status-im/status-protocol-go/>
1. <https://github.com/status-im/status-console-client/> 2. <https://github.com/status-im/status-console-client/>
1. <https://github.com/status-im/status-react/> 3. <https://github.com/status-im/status-react/>
## Acknowledgements ## Acknowledgements