From 09661301948bf9ed8016f5f1042e0f4709032a55 Mon Sep 17 00:00:00 2001 From: chirag-parmar Date: Wed, 24 Jul 2024 12:15:11 +0530 Subject: [PATCH 1/2] design rationale for DHT --- docs/wiki/protocol/design-rationale.md | 16 +++++++++++++++- docs/wiki/protocol/img/p2p-nets-comp.png | Bin 0 -> 75063 bytes 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 docs/wiki/protocol/img/p2p-nets-comp.png diff --git a/docs/wiki/protocol/design-rationale.md b/docs/wiki/protocol/design-rationale.md index 5bc8c129..77340ef8 100644 --- a/docs/wiki/protocol/design-rationale.md +++ b/docs/wiki/protocol/design-rationale.md @@ -100,7 +100,21 @@ Latest Message Driven Greediest Heaviest Observed Sub-Tree (LMD-GHOST) is a *for ![LMD-GHOST-Algorithm](./img/lmt-ghost.png) -Gasper is full Proof-of-stake protocol that serves as an idealized abstraction of the Ethereum implementation. It combines Casper FFG and LMD-GHOST to drive the consensus mechanism for the Eth2. +Gasper is full Proof-of-stake protocol that serves as an idealized abstraction of the Ethereum implementation. It combines Casper FFG and LMD-GHOST to drive the consensus mechanism for the Eth2. + +### Using a DHT + +![P2P Networks Comparison](./img/p2p-nets-comp.png) + +The obvious benefit of DHTs(structured networks) is that lookups only generate logarithmic communication overhead in the network. This makes them suitable to *find*(query) content in a p2p network. But an immediate question arises, why do we need to *find* content in Ethereum if most nodes are interested in the same content, the latest block? Every slot has only one block which is gossiped anyways, so why *find* the block? A DHT makes sense for protocols like bittorrent and IPFS which store a wide range of content and users try to *find* the content they are interested in [[1]](https://www.bittorrent.org/beps/bep_0005.html). Why use a DHT in ethereum then? That's because we don't use the DHT to find blocks, we use it to find different peers + +The discovery domain in the networking layer of ethereum uses a [kademlia based DHT](https://github.com/ethereum/devp2p/blob/master/discv5/discv5.md) to store [ENR records](https://github.com/ethereum/devp2p/blob/master/enr.md). ENR records contain routing information (of the internet layer) to establish connections between peer. Peers joining the network use *bootstrap* nodes to relay lookup queries for its own `node_id` in the DHT. In the process they discover ENR records of other peers which help them populate their routing table. Routinely, peers also look up random `node_id`s to enumerate the network i.e. find all peers. + +A follow up question is, if the DHT only helps *find* peers, how are blocks distributed? In Ethereum, after discovering peers through an underlying DHT, peers use an overlay network ([gossipsub](https://github.com/libp2p/specs/blob/f25d0c22e5ef045c8c050bc91c297468de35f720/pubsub/gossipsub/gossipsub-v1.0.md)) to disseminate the block throughout the network. The overlay network creates *its own* routing table with routing information to establish connection AND overlay specific information(topics subscribed, fanout etc.) This overlay network is indeed an unstructured network. + +Why not just connect to known peers (F2F a.k.a friends-to-friends model) and directly and download/gossip the required content directly? Why go through an extra step of DHT to later join an unstructured network? From the perspective of bootstrapping, kademlia provides a global view whereas [friend-to-friend](https://en.wikipedia.org/wiki/Friend-to-friend) networks, inherently, can only provide a local view of the network. Informally, a DHT provides public and non-localized (arguably, slightly more decentralized too) mechanism for nodes to join a network. This hybrid approach of using a structured network(DHT) to bootstrap into an unstructured network, is observed in bittorrent's [Peer Exchange(PEX)](https://www.bittorrent.org/beps/bep_0011.html) protocol as well. [Unstructured networks](https://en.wikipedia.org/wiki/Peer-to-peer#Unstructured_networks) are preferred as overlays because they are robust in high-churn networks. + +Over everything else, the biggest benefit of structured networks like kademlia DHT is their [simplicity](https://github.com/ethereum/devp2p/blob/master/discv5/discv5-rationale.md#why-kademlia) in design. # References diff --git a/docs/wiki/protocol/img/p2p-nets-comp.png b/docs/wiki/protocol/img/p2p-nets-comp.png new file mode 100644 index 0000000000000000000000000000000000000000..c7b94b4779eec017e99b8632e9e47a270f30c50e GIT binary patch literal 75063 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 H9`t_z5^edZ literal 0 HcmV?d00001 From 254ed6a15fed02be24d1b37e6428b91476de358f Mon Sep 17 00:00:00 2001 From: Chirag Parmar Date: Wed, 24 Jul 2024 21:55:52 +0530 Subject: [PATCH 2/2] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mário Havel <61149543+taxmeifyoucan@users.noreply.github.com> --- docs/wiki/protocol/design-rationale.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/wiki/protocol/design-rationale.md b/docs/wiki/protocol/design-rationale.md index 77340ef8..da310377 100644 --- a/docs/wiki/protocol/design-rationale.md +++ b/docs/wiki/protocol/design-rationale.md @@ -106,13 +106,14 @@ Gasper is full Proof-of-stake protocol that serves as an idealized abstraction o ![P2P Networks Comparison](./img/p2p-nets-comp.png) -The obvious benefit of DHTs(structured networks) is that lookups only generate logarithmic communication overhead in the network. This makes them suitable to *find*(query) content in a p2p network. But an immediate question arises, why do we need to *find* content in Ethereum if most nodes are interested in the same content, the latest block? Every slot has only one block which is gossiped anyways, so why *find* the block? A DHT makes sense for protocols like bittorrent and IPFS which store a wide range of content and users try to *find* the content they are interested in [[1]](https://www.bittorrent.org/beps/bep_0005.html). Why use a DHT in ethereum then? That's because we don't use the DHT to find blocks, we use it to find different peers +The main benefit of DHTs is that lookups only generate logarithmic communication overhead in the network. This makes them suitable to find (query) content in a p2p network. But an immediate question arises, why do we need to *find* content in Ethereum if most nodes are interested in the same content, the latest block? The tip of the chain is always the same based on consensus slot which has only one block to be gossiped. A DHT is used in protocols like [bittorrent](https://www.bittorrent.org/beps/bep_0005.html) and IPFS which store a wide range of content and users try to *find* the content they are interested in. DHT is used in Ethereum networking to find to find different peers, not blocks. -The discovery domain in the networking layer of ethereum uses a [kademlia based DHT](https://github.com/ethereum/devp2p/blob/master/discv5/discv5.md) to store [ENR records](https://github.com/ethereum/devp2p/blob/master/enr.md). ENR records contain routing information (of the internet layer) to establish connections between peer. Peers joining the network use *bootstrap* nodes to relay lookup queries for its own `node_id` in the DHT. In the process they discover ENR records of other peers which help them populate their routing table. Routinely, peers also look up random `node_id`s to enumerate the network i.e. find all peers. +The discovery protocol in the networking layer of Ethereum uses, discv5, a [kademlia based DHT](https://github.com/ethereum/devp2p/blob/master/discv5/discv5.md) to store [ENR records](https://github.com/ethereum/devp2p/blob/master/enr.md). ENR records contain routing information (of the internet layer) to establish connections between peer. Peers joining the network use *bootstrap* nodes to relay lookup queries for its own `node_id` in the DHT. In the process they discover ENR records of other peers which help them populate their routing table. Routinely, peers also look up random `node_id`s to enumerate the network i.e. find all peers. -A follow up question is, if the DHT only helps *find* peers, how are blocks distributed? In Ethereum, after discovering peers through an underlying DHT, peers use an overlay network ([gossipsub](https://github.com/libp2p/specs/blob/f25d0c22e5ef045c8c050bc91c297468de35f720/pubsub/gossipsub/gossipsub-v1.0.md)) to disseminate the block throughout the network. The overlay network creates *its own* routing table with routing information to establish connection AND overlay specific information(topics subscribed, fanout etc.) This overlay network is indeed an unstructured network. +Blocks in Ethereum network are distributed using gossip protocol of the p2p stack. After discovering peers through an underlying DHT, peers use an overlay network ([gossipsub](https://github.com/libp2p/specs/blob/f25d0c22e5ef045c8c050bc91c297468de35f720/pubsub/gossipsub/gossipsub-v1.0.md)) to disseminate the block throughout the network. The overlay network creates its own routing table with routing information to establish connection AND overlay specific information(topics subscribed, fanout etc.) This overlay network is indeed an unstructured network. -Why not just connect to known peers (F2F a.k.a friends-to-friends model) and directly and download/gossip the required content directly? Why go through an extra step of DHT to later join an unstructured network? From the perspective of bootstrapping, kademlia provides a global view whereas [friend-to-friend](https://en.wikipedia.org/wiki/Friend-to-friend) networks, inherently, can only provide a local view of the network. Informally, a DHT provides public and non-localized (arguably, slightly more decentralized too) mechanism for nodes to join a network. This hybrid approach of using a structured network(DHT) to bootstrap into an unstructured network, is observed in bittorrent's [Peer Exchange(PEX)](https://www.bittorrent.org/beps/bep_0011.html) protocol as well. [Unstructured networks](https://en.wikipedia.org/wiki/Peer-to-peer#Unstructured_networks) are preferred as overlays because they are robust in high-churn networks. +DHT goes the extra step to join an unstructured network over simply connecting to peers ([friends-to-friends model](https://en.wikipedia.org/wiki/Friend-to-friend) or PEX) and directly downloading/gossiping the required content directly. +Why go through an extra step of DHT to later join an unstructured network? From the perspective of bootstrapping, kademlia provides a global view whereas f2f networks, inherently, can only provide a local view of the network. Informally, a DHT provides public and non-localized (arguably, slightly more decentralized too) mechanism for nodes to join a network. This hybrid approach of using a structured network(DHT) to bootstrap into an unstructured network, is observed in bittorrent's [Peer Exchange(PEX)](https://www.bittorrent.org/beps/bep_0011.html) protocol as well. [Unstructured networks](https://en.wikipedia.org/wiki/Peer-to-peer#Unstructured_networks) are preferred as overlays because they are robust in high-churn networks. Over everything else, the biggest benefit of structured networks like kademlia DHT is their [simplicity](https://github.com/ethereum/devp2p/blob/master/discv5/discv5-rationale.md#why-kademlia) in design.