From c6ad2b548344cf108799bdf6083e21e214972feb Mon Sep 17 00:00:00 2001 From: David Dias Date: Mon, 16 Nov 2020 12:44:40 +0000 Subject: [PATCH 01/34] docs: update/clean up the beyond bitswap project (#8) * docs: update/clean up the beyond bitswap project * docs: update main README * Revised PR #8 Co-authored-by: Alfonso de la Rocha --- {beyond-bitswap => BEYOND_BITSWAP}/README.md | 57 +++++++++++------- .../RFC}/images/rfcBBL102-stage1.png | Bin .../RFC}/images/rfcBBL102-stage2.png | Bin .../RFC}/images/rfcBBL102-stage3.png | Bin .../RFC}/images/rfcbbL104-result-baseline.png | Bin .../RFC}/images/rfcbbL104-results-rfc.png | Bin .../RFC}/images/rfcbbL104.png | Bin .../RFC}/images/ttl_slow.gif | Bin .../rfc => BEYOND_BITSWAP/RFC}/rfcBBL102.md | 0 .../rfc => BEYOND_BITSWAP/RFC}/rfcBBL104.md | 0 .../rfc => BEYOND_BITSWAP/RFC}/rfcBBL1201.md | 0 .../rfc => BEYOND_BITSWAP/RFC}/rfcBBL203A.md | 0 .../rfc => BEYOND_BITSWAP/RFC}/rfcBBL207.md | 0 .../rfc => BEYOND_BITSWAP/RFC}/template.md | 0 README.md | 55 ++++------------- 15 files changed, 46 insertions(+), 66 deletions(-) rename {beyond-bitswap => BEYOND_BITSWAP}/README.md (64%) rename {beyond-bitswap/rfc => BEYOND_BITSWAP/RFC}/images/rfcBBL102-stage1.png (100%) rename {beyond-bitswap/rfc => BEYOND_BITSWAP/RFC}/images/rfcBBL102-stage2.png (100%) rename {beyond-bitswap/rfc => BEYOND_BITSWAP/RFC}/images/rfcBBL102-stage3.png (100%) rename {beyond-bitswap/rfc => BEYOND_BITSWAP/RFC}/images/rfcbbL104-result-baseline.png (100%) rename {beyond-bitswap/rfc => BEYOND_BITSWAP/RFC}/images/rfcbbL104-results-rfc.png (100%) rename {beyond-bitswap/rfc => BEYOND_BITSWAP/RFC}/images/rfcbbL104.png (100%) rename {beyond-bitswap/rfc => BEYOND_BITSWAP/RFC}/images/ttl_slow.gif (100%) rename {beyond-bitswap/rfc => BEYOND_BITSWAP/RFC}/rfcBBL102.md (100%) rename {beyond-bitswap/rfc => BEYOND_BITSWAP/RFC}/rfcBBL104.md (100%) rename {beyond-bitswap/rfc => BEYOND_BITSWAP/RFC}/rfcBBL1201.md (100%) rename {beyond-bitswap/rfc => BEYOND_BITSWAP/RFC}/rfcBBL203A.md (100%) rename {beyond-bitswap/rfc => BEYOND_BITSWAP/RFC}/rfcBBL207.md (100%) rename {beyond-bitswap/rfc => BEYOND_BITSWAP/RFC}/template.md (100%) diff --git a/beyond-bitswap/README.md b/BEYOND_BITSWAP/README.md similarity index 64% rename from beyond-bitswap/README.md rename to BEYOND_BITSWAP/README.md index a8b7426..bfede8c 100644 --- a/beyond-bitswap/README.md +++ b/BEYOND_BITSWAP/README.md @@ -1,4 +1,4 @@ -# Beyond Bitswap +# Project: Beyond Bitswap ## Motivation & Vision @@ -15,49 +15,60 @@ In high level, this project is about: In short, the aim of the project is two-fold: to drive speed-ups in file-sharing for IPFS and other P2P networks; and to enable a framework for anyone to join the quest of designing, implementing and evaluating brand new file-sharing strategies in P2P networks. ## Why the project code name? + Bitswap has been for some time the file-sharing subsystem within IPFS, then Graphsync came to propose a new way of approaching file-sharing on IPFS. The scope of the project is not only to improve Bitswap's performance, but file-sharing in P2P networks as a whole. We don't restrict ourselves exlusively to Bitswap or IPFS for our exploration. Being said that, the fact that IPFS had an infrastructure in place to start testing our ideas, and Bitswap being its file-sharing module, made us start our initial explorations over Bitswap and IPFS, but our aim is to go way farther and improve file-sharing performance with new protocols and proposals every P2P network can leverage and benefit from. In short, we want to go "Beyond Bitswap". The project can be considered a success if by the end of it one has a set of pluggable protocols and modules to achieve file-sharing in P2P environments, along with all the testbeds, tools and benchmarks required to improve this protocols and go _"Beyond Bitswap"_. +## 💌 Invite to Research with us + +ResNetLab collaborates with over 10 Research Groups all over the world and Protocol Labs Research has developed research collaborations in multiples of ten in the last few years. We are always eager to collaborate with more researchers in all kinds of capacity, from thesis project (M.Sc or PhD), to Post-Doc, Grants, RFPs and independent research projects. + +We are making all our contributions, ideas, testbed, benchmarking and analysis scripts available below. You are more than welcome to pick any of these assets and build on top of it. If you have questions, please [mail us](mailto:resnetlab@protocol.ai). + ## Contributions & Results ### Documents + * [Related Work](https://docs.google.com/document/d/14AE8OJvSpkhguq2k1Gfc9h0JvorvLgOUSVrj3CnOkQk/edit#heading=h.nxkc23tlbqhl): It gives an overview of the problem, how it will be tackled, and a collection of references and community proposals. -* [Beyond Bitswap Slides](https://docs.google.com/presentation/d/18_aRTye2t6Xs_VhKwEbhvCYYu9ePaLgamIrJkpUDtfY/edit#slide=id.p): Set of slides introducing the project and summarizing the Related Work document from above. These slides were used to introduce the project in the following [talk](). -* [Survey of the state of the art](https://docs.google.com/document/d/172q0EQFPDrVrWGt5TiEj2MToTXIor4mP1gCuKv4re5I/edit#heading=h.nxkc23tlbqhl): It summarizes a list of papers on file-sharing strategies in P2P networks used as a groundwork for the projects. +* [Beyond Bitswap Slides](https://docs.google.com/presentation/d/18_aRTye2t6Xs_VhKwEbhvCYYu9ePaLgamIrJkpUDtfY/edit?usp=sharing): Set of slides introducing the project and summarizing the Related Work document from above. + +* [Survey of the state of the art](https://docs.google.com/document/d/172q0EQFPDrVrWGt5TiEj2MToTXIor4mP1gCuKv4re5I/edit?usp=sharing): It summarizes a list of papers on file-sharing strategies in P2P networks used as a groundwork for the projects. * [Evaluation Plan](https://docs.google.com/document/d/1LYs3WDCwpkrBdfrnB_LE0xsxdMCIhXdCchIkbzZc8OE/edit#heading=h.nxkc23tlbqhl): Document describing the testbed and evaluation plan designed to test the performane of current implementation of file-sharing systems, and compare it with the improvements implemented within the scope of this work. -* [Enhancements RFC](https://docs.google.com/document/d/1zjJCZel8zJzgK3XuHK0YZlNffEHThq7tUOssGgRTryY/edit#heading=h.nxkc23tlbqhl): A list of enhancements proposals and ideas to improve file-sharing in IPFS and P2P networks. -* [Test Results](https://docs.google.com/document/d/1zPpgnr9ykJr5PAvShJBGhKKRDRbsglb00MPc5eVEU4Q/edit#): This document collects the results of the tests performed in the scope of the project. +* [Enhancements RFC](#enhancements-rfcs): A list of enhancements proposals and ideas to improve file-sharing in IPFS and P2P networks. + ### Enhancement RFCs + This section shares a list of improvement RFCs that are being currently tackled, discussed and prototyped. Each RFC aims to test a specific idea or assumption, and they may initially be implemented over Bitswap, but that doesn't mean the conclusions drawn are exclusively applicable to the Bitswap protocol. RFCs are divided in the different layers for file-sharing in P2P sytems identified in the [Related Work](https://docs.google.com/document/d/14AE8OJvSpkhguq2k1Gfc9h0JvorvLgOUSVrj3CnOkQk/edit#heading=h.nxkc23tlbqhl). -> Layer 1 RFCs: Discovery and announcement of content -* [RFC|BB|L1-04: Track WANT messages for future queries](./rfc/rfcBBL104.md): Evaluates how using information from a nodes surrounding can help the discovery and fetching of popular content in the network. -* [RFC|BB|L1-02: TTLs for rebroadcasting WANT messages](./rfc/rfcBBL102.md): It evaluates how broadcasting exchange requests TTL hops away may help the discovery of content improving performance. +**Layer 1 RFCs: Discovery and announcement of content:** +* [RFC|BB|L1-04: Track WANT messages for future queries](./RFC/rfcBBL104.md): Evaluates how using information from a nodes surrounding can help the discovery and fetching of popular content in the network. +* [RFC|BB|L1-02: TTLs for rebroadcasting WANT messages](./RFC/rfcBBL102.md): It evaluates how broadcasting exchange requests TTL hops away may help the discovery of content improving performance. -> Layer 2 RFCs: Negotiation and transmission of content. -* [RFC|BB|L2-07: Request minimum piece size and content protocol extension](./rfc/rfcBBL207.md): Evaluates how the size of the chunks that comprises content requested in a P2P network may affect performance. -* [RFC|BB|L12-01: Bitswap/Graphsync exchange messages extension and transmission choice](./rfc/rfcBBL1201.md): Proposes dividing the exchange of content in two phases: a negotiation phase used to discover the holders of the different chunks of a file, and a transfer file to explicitly request blocks from different chunk holders. This opens the door to additional exchange strategies and schemes to improve performance. -* [RFC|BB|L2-03A: Use of compression and adjustable block size](./rfc/rfcBBL203A.md): Evaluates the potential performance improvementes on the use of compression for the exchange of content in P2P networks. +**Layer 2 RFCs: Negotiation and transmission of content:** +* [RFC|BB|L2-07: Request minimum piece size and content protocol extension](./RFC/rfcBBL207.md): Evaluates how the size of the chunks that comprises content requested in a P2P network may affect performance. +* [RFC|BB|L12-01: Bitswap/Graphsync exchange messages extension and transmission choice](./RFC/rfcBBL1201.md): Proposes dividing the exchange of content in two phases: a negotiation phase used to discover the holders of the different chunks of a file, and a transfer file to explicitly request blocks from different chunk holders. This opens the door to additional exchange strategies and schemes to improve performance. +* [RFC|BB|L2-03A: Use of compression and adjustable block size](./RFC/rfcBBL203A.md): Evaluates the potential performance improvementes on the use of compression for the exchange of content in P2P networks. Feel free to jump into the discussions around the project or to propose your own RFC opening an issue in the repo. +### Code & Testbed + +* [Testbed, benchmarking, analysis scripts and related assets](https://github.com/protocol/beyond-bitswap/): All the code used for the implementation and other auxiliary testing assets. Additional documentation is provided in the repo. +* [Bitswap fork](https://github.com/adlrocha/go-bitswap): This fork of `go-bitswap` is the one being used to implement and evaluate some of the RFCs and where additional metrics that want to be tracked in the testbed are being included. RFCs are imeplemented in different branches with the name of the RFC code. -### Code -* [Testbed and related assets](https://github.com/adlrocha/beyond-bitswap/): This repo includes all the code used for the implementation and other auxiliary testing assets. Additional documentation is provided in the repo. -* [Bitswap fork](https://github.com/adlrocha/go-bitswap): This fork of `go-bitswap` is the one being used to implement and evaluate some of the RFCs and where additional metrics that want to be tracked in the testbed are being included. RFCs are imeplemented in different branches with the code of the RFC. -* [Graphsync fork](): This fork of `go-graphsync` is also being used to test some of the RFCs. -* [New exchange protocol?](): This is a work in progress to be determined with the result of our explorations. +### Talks / Videos -### Talks -* [Introduction to Beyond Bitswap project](): Introductory talk to show the initial work and motivate the project. -* [How rfcBBL104 was implemented](https://drive.google.com/file/d/1YS3RoNdeeG1vauJpfvHvKUQzPHr97eHF/view?usp=sharing): Video on how the implementation of rfcBBL104 was approached. + * [Progress update September 2020](https://drive.google.com/file/d/1vUWnfQMIqz9hoqWB941vbzqkP16-_ydd/view?usp=sharing): Progress update of the project explaining the RFCs implemented, the testbed and some preliminary results. +* [How rfcBBL104 was implemented](https://drive.google.com/file/d/1YS3RoNdeeG1vauJpfvHvKUQzPHr97eHF/view?usp=sharingg): Video on how the implementation of rfcBBL104 was approached. +* [A Deep Dive In Bitswap](https://drive.google.com/file/d/1jgTOFFtRL0UYeDk98NHoNlEuujBaK08b/view?usp=sharing): Workshop describing in detail the operation of Bitswap and the implementation of some of the improvement RFCs. +* [Demo of compression in libp2p](https://drive.google.com/file/d/1YcemfkS5ZNnH66-tTGmerNrgrsW-bbpD/view?usp=sharing): A demo of the exchange of files between two IPFS nodes with compression enabled in libp2p. -### Blog Posts +### Publications * ["Two ears, one mouth": how to leverage bitswap chatter for faster transfers](https://research.protocol.ai/blog/2020/two-ears-one-mouth-how-to-leverage-bitswap-chatter-for-faster-transfers/) -* [Honey, I shrunk our libp2p streams ](https://research.protocol.ai/blog/2020/honey-i-shrunk-our-libp2p-streams/) +* [Honey, I shrunk our libp2p streams](https://research.protocol.ai/blog/2020/honey-i-shrunk-our-libp2p-streams/) * [Beyond Bitswap](https://adlrocha.substack.com/p/adlrocha-beyond-bitswap-i) * [Network Coding in P2P Networks](https://adlrocha.substack.com/p/adlrocha-network-coding-in-p2p-networks) -* [Hash Array Mapped Tries](https://adlrocha.substack.com/p/adlrocha-hash-array-mapped-tries) +* [Hash Array Mapped Tries](https://adlrocha.substack.com/p/adlrocha-hash-array-mapped-tries) \ No newline at end of file diff --git a/beyond-bitswap/rfc/images/rfcBBL102-stage1.png b/BEYOND_BITSWAP/RFC/images/rfcBBL102-stage1.png similarity index 100% rename from beyond-bitswap/rfc/images/rfcBBL102-stage1.png rename to BEYOND_BITSWAP/RFC/images/rfcBBL102-stage1.png diff --git a/beyond-bitswap/rfc/images/rfcBBL102-stage2.png b/BEYOND_BITSWAP/RFC/images/rfcBBL102-stage2.png similarity index 100% rename from beyond-bitswap/rfc/images/rfcBBL102-stage2.png rename to BEYOND_BITSWAP/RFC/images/rfcBBL102-stage2.png diff --git a/beyond-bitswap/rfc/images/rfcBBL102-stage3.png b/BEYOND_BITSWAP/RFC/images/rfcBBL102-stage3.png similarity index 100% rename from beyond-bitswap/rfc/images/rfcBBL102-stage3.png rename to BEYOND_BITSWAP/RFC/images/rfcBBL102-stage3.png diff --git a/beyond-bitswap/rfc/images/rfcbbL104-result-baseline.png b/BEYOND_BITSWAP/RFC/images/rfcbbL104-result-baseline.png similarity index 100% rename from beyond-bitswap/rfc/images/rfcbbL104-result-baseline.png rename to BEYOND_BITSWAP/RFC/images/rfcbbL104-result-baseline.png diff --git a/beyond-bitswap/rfc/images/rfcbbL104-results-rfc.png b/BEYOND_BITSWAP/RFC/images/rfcbbL104-results-rfc.png similarity index 100% rename from beyond-bitswap/rfc/images/rfcbbL104-results-rfc.png rename to BEYOND_BITSWAP/RFC/images/rfcbbL104-results-rfc.png diff --git a/beyond-bitswap/rfc/images/rfcbbL104.png b/BEYOND_BITSWAP/RFC/images/rfcbbL104.png similarity index 100% rename from beyond-bitswap/rfc/images/rfcbbL104.png rename to BEYOND_BITSWAP/RFC/images/rfcbbL104.png diff --git a/beyond-bitswap/rfc/images/ttl_slow.gif b/BEYOND_BITSWAP/RFC/images/ttl_slow.gif similarity index 100% rename from beyond-bitswap/rfc/images/ttl_slow.gif rename to BEYOND_BITSWAP/RFC/images/ttl_slow.gif diff --git a/beyond-bitswap/rfc/rfcBBL102.md b/BEYOND_BITSWAP/RFC/rfcBBL102.md similarity index 100% rename from beyond-bitswap/rfc/rfcBBL102.md rename to BEYOND_BITSWAP/RFC/rfcBBL102.md diff --git a/beyond-bitswap/rfc/rfcBBL104.md b/BEYOND_BITSWAP/RFC/rfcBBL104.md similarity index 100% rename from beyond-bitswap/rfc/rfcBBL104.md rename to BEYOND_BITSWAP/RFC/rfcBBL104.md diff --git a/beyond-bitswap/rfc/rfcBBL1201.md b/BEYOND_BITSWAP/RFC/rfcBBL1201.md similarity index 100% rename from beyond-bitswap/rfc/rfcBBL1201.md rename to BEYOND_BITSWAP/RFC/rfcBBL1201.md diff --git a/beyond-bitswap/rfc/rfcBBL203A.md b/BEYOND_BITSWAP/RFC/rfcBBL203A.md similarity index 100% rename from beyond-bitswap/rfc/rfcBBL203A.md rename to BEYOND_BITSWAP/RFC/rfcBBL203A.md diff --git a/beyond-bitswap/rfc/rfcBBL207.md b/BEYOND_BITSWAP/RFC/rfcBBL207.md similarity index 100% rename from beyond-bitswap/rfc/rfcBBL207.md rename to BEYOND_BITSWAP/RFC/rfcBBL207.md diff --git a/beyond-bitswap/rfc/template.md b/BEYOND_BITSWAP/RFC/template.md similarity index 100% rename from beyond-bitswap/rfc/template.md rename to BEYOND_BITSWAP/RFC/template.md diff --git a/README.md b/README.md index e14cd47..e77c2b4 100644 --- a/README.md +++ b/README.md @@ -47,115 +47,84 @@ The lab's genesis comes from a need present in the IPFS and libp2p projects to a Research Area Open Problem(s) Short Description - RFPs Networks Observability NEEDs OPEN PROBLEM - Resilliency in Adversarial Networks NEEDs OPEN PROBLEM - Heterogeneous Runtimes NEEDs OPEN PROBLEM (e.g. Browsers, IoT, Low Powered and/or Battery powered devices) - Content Addressing Routing at Scale (1M, 10M, 100M, 1B.. nodes) Content-addressable networks face the challenge of routing scalability, as the amount of addressable elements in the network rises by several orders of magnitude compared to the host-addressable Internet of today. - - - Preseve full users' privacy when providing and fetching Content How to ensure that the user's of the IPFS network can collect and provide information while mainting their full anonymity. - - - Mutability Mutable Data (Naming, Real-Time, Guarantees) Enabling a multitude of different patterns of interactions between users, machines and both. In other words, what are the essential primitives that must be provided for dynamic applications to exist, what are the guarantees they require (consistency, availability, persistancy, authenticity, etc) from the underlying layer in order create powerful and complete applications in the Distributed Web. - - - Human Readable Naming You can only have two of three properties for a name: Human-meaningful, Secure and/or Decentralized. This is Zooko's Trilemma. Can we have all 3, or even more? Can context related to some data help solve this problem? - - - PubSub at Scale (1M, 10M, 100M, 1B.. nodes) As the IPFS system is evolving and growing, communicating new entries to the IPNS is becoming an issue due to the increased network and node load requirements. The expected growth of the system to multiple millions of nodes is going to create significant performance issues, which might render the system unusable. Despite the significant amount of related literature on the topic of pub/sub, very few systems have been tested to that level of scalability, while those that have been are mostly cloud-based, managed and structured infrastructures. - - - Data Exchange Enhanced Bitswap/GraphSync with more Network Smarts Bitswap is a simple protocol and it generally works. However, we feel that its performance can be substantially improved. One of the main factors that hold performance back is the fact that a node cannot request a subgraph of the DAG and results in many round-trips in order to “walk down” the DAG. The current operation of bitswap is also very often linked to duplicate transmission and receipt of content which overloads both the end nodes and the network. - - - Distributed Type Systems Improved layouts to represent data in hash-linked graphs (using IPLD) Future™ ⚙️ - - - ### Projects -- P2P Observatory -- Beyond Bitswap -- drand - Hydra Booster - Gossipsub v1.1 +- drand +- [Beyond Bitswap](BEYOND_BITSWAP) +- P2P Observatory + +### RFPs + +- ACTIVE + - n/a +- PAST + - RFP-7: Multi-Level DHT Design and Evaluation + - RFP-8: Scalability Bounds of P2P Pub/Sub (libp2p floodsub, gossipsub and episub) ### Collaborations @@ -181,4 +150,4 @@ The lab's genesis comes from a need present in the IPFS and libp2p projects to a ### Contact -You can reach out to us anytime with your question and interest in these projects by emailing [resnetlab@protocol.ai](mailto:resnetlab@protocol.ai) +You can reach out to us anytime with your question and interest in these projects by emailing [resnetlab@protocol.ai](mailto:resnetlab@protocol.ai) \ No newline at end of file From d8df2f88248b9230520e2f7c4dae4d4c9ae891b5 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Mon, 16 Nov 2020 18:43:05 +0100 Subject: [PATCH 02/34] Minor fix --- BEYOND_BITSWAP/README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/BEYOND_BITSWAP/README.md b/BEYOND_BITSWAP/README.md index 2900b6a..d2ff9ac 100644 --- a/BEYOND_BITSWAP/README.md +++ b/BEYOND_BITSWAP/README.md @@ -31,12 +31,10 @@ We are making all our contributions, ideas, testbed, benchmarking and analysis s ### Documents * [Related Work](https://docs.google.com/document/d/14AE8OJvSpkhguq2k1Gfc9h0JvorvLgOUSVrj3CnOkQk/edit#heading=h.nxkc23tlbqhl): It gives an overview of the problem, how it will be tackled, and a collection of references and community proposals. -* [Beyond Bitswap Slides](https://docs.google.com/presentation/d/18_aRTye2t6Xs_VhKwEbhvCYYu9ePaLgamIrJkpUDtfY/edit?usp=sharing): Set of slides introducing the project and summarizing the Related Work document from above. - +* [Beyond Bitswap Slides](https://docs.google.com/presentation/d/18_aRTye2t6Xs_VhKwEbhvCYYu9ePaLgamIrJkpUDtfY/edit?usp=sharing): Set of slides introducing the project and summarizing the Related Work document from above. * [Survey of the state of the art](https://docs.google.com/document/d/172q0EQFPDrVrWGt5TiEj2MToTXIor4mP1gCuKv4re5I/edit?usp=sharing): It summarizes a list of papers on file-sharing strategies in P2P networks used as a groundwork for the projects. * [Evaluation Plan](https://docs.google.com/document/d/1LYs3WDCwpkrBdfrnB_LE0xsxdMCIhXdCchIkbzZc8OE/edit#heading=h.nxkc23tlbqhl): Document describing the testbed and evaluation plan designed to test the performane of current implementation of file-sharing systems, and compare it with the improvements implemented within the scope of this work. -* [Enhancements RFC](#enhancements-rfcs): A list of enhancements proposals and ideas to improve file-sharing in IPFS and P2P networks. - +* [Enhancements RFC](#enhancements-rfcs): A list of enhancements proposals and ideas to improve file-sharing in IPFS and P2P networks. ### Enhancement RFCs From 06fab125f815b54a5090444e8505b2476438383f Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Mon, 16 Nov 2020 18:46:50 +0100 Subject: [PATCH 03/34] Minor table fixes --- BEYOND_BITSWAP/README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/BEYOND_BITSWAP/README.md b/BEYOND_BITSWAP/README.md index d2ff9ac..5c69801 100644 --- a/BEYOND_BITSWAP/README.md +++ b/BEYOND_BITSWAP/README.md @@ -45,16 +45,16 @@ If you want to familiarize with our work, we highly recommend exploring first th | RFC | Status | |-------------------------------------------------------------------------------------------------------------|-------------| -| [RFC|BB|L0-09: Hashing algorithm improvements](./RFC/rfcBBL009) | `brainstorm`| -| [RFC|BB|L1-04: Track WANT messages for future queries](./RFC/rfcBBL104.md) | `prototype` | -| [RFC|BB|L1-02: TTLs for rebroadcasting WANT messages](./RFC/rfcBBL102.md) | `prototype` | -| [RFC|BB|L1-06: Content Anchors](https://github.com/protocol/ResNetLab/issues/6) | `brainstorm`| -| [RFC|BB|L1/2-05: Use of super nodes and decentralized trackers](./RFC/rfcBBL1205.md) | `brainstorm`| -| [RFC|BB|L12-01: Bitswap/Graphsync exchange messages extension and transmission choice](./RFC/rfcBBL1201.md) | `draft` | -| [RFC|BB|L2-03A: Use of compression and adjustable block size](./RFC/rfcBBL203A.md) | `prototype` | -| [RFC|BB|L2-03B: Use of network coding and erasure codes](./RFC/rfcBBL203B.md) | `brainstorm`| -| [RFC|BB|L2-07: Request minimum piece size and content protocol extension](./RFC/rfcBBL207.md) | `brainstorm`| -| [RFC|BB|L2-08: Delegate download to other nodes (bandwidth aggregation)](./RFC/rfcBBL208.md) | `brainstorm`| +| [RFC\|BB\|L0-09: Hashing algorithm improvements](./RFC/rfcBBL009) | `brainstorm`| +| [RFC\|BB\|L1-04: Track WANT messages for future queries](./RFC/rfcBBL104.md) | `prototype` | +| [RFC\|BB\|L1-02: TTLs for rebroadcasting WANT messages](./RFC/rfcBBL102.md) | `prototype` | +| [RFC\|BB\|L1-06: Content Anchors](https://github.com/protocol/ResNetLab/issues/6) | `brainstorm`| +| [RFC\|BB\|L1/2-05: Use of super nodes and decentralized trackers](./RFC/rfcBBL1205.md) | `brainstorm`| +| [RFC\|BB\|L12-01: Bitswap/Graphsync exchange messages extension and transmission choice](./RFC/rfcBBL1201.md) | `draft` | +| [RFC\|BB\|L2-03A: Use of compression and adjustable block size](./RFC/rfcBBL203A.md) | `prototype` | +| [RFC\|BB\|L2-03B: Use of network coding and erasure codes](./RFC/rfcBBL203B.md) | `brainstorm`| +| [RFC\|BB\|L2-07: Request minimum piece size and content protocol extension](./RFC/rfcBBL207.md) | `brainstorm`| +| [RFC\|BB\|L2-08: Delegate download to other nodes (bandwidth aggregation)](./RFC/rfcBBL208.md) | `brainstorm`| **Layer 0: Data Structure:** * [RFC|BB|L0-09: Hashing algorithm improvements](./RFC/rfcBBL009): From 45d88e4237091dfadaa54fc24aa9971a5b6f59c7 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Mon, 16 Nov 2020 18:48:02 +0100 Subject: [PATCH 04/34] Text collocation --- BEYOND_BITSWAP/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/BEYOND_BITSWAP/README.md b/BEYOND_BITSWAP/README.md index 5c69801..f2895a3 100644 --- a/BEYOND_BITSWAP/README.md +++ b/BEYOND_BITSWAP/README.md @@ -37,12 +37,7 @@ We are making all our contributions, ideas, testbed, benchmarking and analysis s * [Enhancements RFC](#enhancements-rfcs): A list of enhancements proposals and ideas to improve file-sharing in IPFS and P2P networks. ### Enhancement RFCs - This section shares a list of improvement RFCs that are being currently tackled, discussed and prototyped. Each RFC aims to test a specific idea or assumption, and they may initially be implemented over Bitswap, but that doesn't mean the conclusions drawn are exclusively applicable to the Bitswap protocol. RFCs are divided in the different layers for file-sharing in P2P sytems identified in the [Related Work](https://docs.google.com/document/d/14AE8OJvSpkhguq2k1Gfc9h0JvorvLgOUSVrj3CnOkQk/edit#heading=h.nxkc23tlbqhl). - -If you want to familiarize with our work, we highly recommend exploring first the RFCs in `prototype` state, and then move to the ones at a `draft` or `brainstorm` state. `prototyped` RFCs are in a stage where there is working prototype you can start evaluating and playing with. The `draft` state means that the RFC is ready for implementation, while `brainstorm` RFCs require further discussions and design work. - - | RFC | Status | |-------------------------------------------------------------------------------------------------------------|-------------| | [RFC\|BB\|L0-09: Hashing algorithm improvements](./RFC/rfcBBL009) | `brainstorm`| @@ -56,6 +51,11 @@ If you want to familiarize with our work, we highly recommend exploring first th | [RFC\|BB\|L2-07: Request minimum piece size and content protocol extension](./RFC/rfcBBL207.md) | `brainstorm`| | [RFC\|BB\|L2-08: Delegate download to other nodes (bandwidth aggregation)](./RFC/rfcBBL208.md) | `brainstorm`| + +If you want to familiarize with our work, we highly recommend exploring first the RFCs in `prototype` state, and then move to the ones at a `draft` or `brainstorm` state. `prototyped` RFCs are in a stage where there is working prototype you can start evaluating and playing with. The `draft` state means that the RFC is ready for implementation, while `brainstorm` RFCs require further discussions and design work. + + + **Layer 0: Data Structure:** * [RFC|BB|L0-09: Hashing algorithm improvements](./RFC/rfcBBL009): From f847a7a1cb9f7d9810fdc898cfc862ce888197e8 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Tue, 17 Nov 2020 07:58:34 +0100 Subject: [PATCH 05/34] Minor fixes --- BEYOND_BITSWAP/README.md | 2 +- BEYOND_BITSWAP/RFC/images/rfcBBL102-stage1.png | Bin 87239 -> 0 bytes BEYOND_BITSWAP/RFC/images/rfcBBL102-stage2.png | Bin 69532 -> 0 bytes BEYOND_BITSWAP/RFC/images/rfcBBL102-stage3.png | Bin 83780 -> 0 bytes BEYOND_BITSWAP/RFC/rfcBBL1205.md | 2 +- 5 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 BEYOND_BITSWAP/RFC/images/rfcBBL102-stage1.png delete mode 100644 BEYOND_BITSWAP/RFC/images/rfcBBL102-stage2.png delete mode 100644 BEYOND_BITSWAP/RFC/images/rfcBBL102-stage3.png diff --git a/BEYOND_BITSWAP/README.md b/BEYOND_BITSWAP/README.md index f2895a3..d32c9f6 100644 --- a/BEYOND_BITSWAP/README.md +++ b/BEYOND_BITSWAP/README.md @@ -62,7 +62,7 @@ If you want to familiarize with our work, we highly recommend exploring first th **Layer 1 RFCs: Discovery and announcement of content:** * [RFC|BB|L1-04: Track WANT messages for future queries](./RFC/rfcBBL104.md): Evaluates how using information from a nodes surrounding can help the discovery and fetching of popular content in the network. * [RFC|BB|L1-02: TTLs for rebroadcasting WANT messages](./RFC/rfcBBL102.md): It evaluates how broadcasting exchange requests TTL hops away, and allowing other nodes to discover and retrieve content on behalf of other peers, may help the discovery of content improving performance. -* [RFC|BB|L1/2-05: Use of super nodes and decentralized trackers](./RFC/rfcBBL1205.md): Aknowledge the fact that P2P networks are also social networks and there are different types of nodes in the network. Explore the use of side-channel discovery mechanisms. +* [RFC|BB|L1/2-05: Use of super nodes and decentralized trackers](./RFC/rfcBBL1205.md): Aknowledge the fact that P2P networks are also social networks and nodes in the network have different relationships and capabilities. Explore the use of side-channel discovery mechanisms. * [RFC|BB|L1-06: Content Anchors](https://github.com/protocol/ResNetLab/issues/6): Evaluate the use of gossipsub to perform more efficient content routing. **Layer 2 RFCs: Negotiation and transmission of content:** diff --git a/BEYOND_BITSWAP/RFC/images/rfcBBL102-stage1.png b/BEYOND_BITSWAP/RFC/images/rfcBBL102-stage1.png deleted file mode 100644 index b411f5ad8925c3538836a7c7148c8be7fd5d35fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87239 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

}pJC&-4UWYy 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 R)lA}LxzO75`~sI9{{`*GKV1L- diff --git a/BEYOND_BITSWAP/RFC/images/rfcBBL102-stage2.png b/BEYOND_BITSWAP/RFC/images/rfcBBL102-stage2.png deleted file mode 100644 index f8db38d8aad8f921491b93ea8b2f430d5244670b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69532 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%0Db^&v) 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 N9`4iJ3MK@{{s;YWLVf@M diff --git a/BEYOND_BITSWAP/RFC/rfcBBL1205.md b/BEYOND_BITSWAP/RFC/rfcBBL1205.md index 0b817aa..eb6c122 100644 --- a/BEYOND_BITSWAP/RFC/rfcBBL1205.md +++ b/BEYOND_BITSWAP/RFC/rfcBBL1205.md @@ -5,7 +5,7 @@ This RFC proposes the classification of nodes in different types according to their capabilities, and the use of side-channel information to track and discover content in the network. We propose the use of decentralized trackers (with good knowledge of where content is stored in the network and a discovery service for "magnet links"), and supernodes (nodes with high bandwidth and low latency which can significantly improve the transmission of content). Thus, nodes can follow different strategies to speed-up the discovery and transmission by "looking-up" content in decentralized trackers and delegating the download of content to near supernodes. -This RFC will leverage the "high-quality" infrastructure deployed by entities such as Pinata, Infura or PL. We need to acknowledge the existence of this "high-class" nodes and leverage them to improve the performance of the network. +This RFC will leverage the "high-quality" infrastructure deployed by entities such as Pinata, Infura or PL. We need to acknowledge the existence of these "high-class" nodes and leverage them to improve the performance of the network. ### Description From 1e84b5b54b04cc2fbef2e969496eabd49aa6f3ea Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Thu, 10 Dec 2020 14:53:28 +0100 Subject: [PATCH 06/34] Heterogeneous Runtimes General Open Problem (#10) * Added NHR general open problem * Minor fixes * Update OPEN_PROBLEMS/HETEROGENEOUS_RUNTIMES.md Co-authored-by: David Dias * Apply suggestions from code review Co-authored-by: David Dias * Minor update Co-authored-by: David Dias --- OPEN_PROBLEMS/HETEROGENEOUS_RUNTIMES.md | 188 ++++++++++++++++++++++++ README.md | 5 +- 2 files changed, 191 insertions(+), 2 deletions(-) create mode 100644 OPEN_PROBLEMS/HETEROGENEOUS_RUNTIMES.md diff --git a/OPEN_PROBLEMS/HETEROGENEOUS_RUNTIMES.md b/OPEN_PROBLEMS/HETEROGENEOUS_RUNTIMES.md new file mode 100644 index 0000000..73ba5e9 --- /dev/null +++ b/OPEN_PROBLEMS/HETEROGENEOUS_RUNTIMES.md @@ -0,0 +1,188 @@ +# Networking in Heterogeneous Runtimes + +## Short Description +Annual global IP traffic will reach 396 exabytes per month. The number of devices connected to the internet is expected to double in the same time. Access to high speed broadband connectivity is limited by poor last mile connections. Optic-fiber deployments are cost-prohibitive and slow to deploy [1](https://www.cisco.com/c/en/us/solutions/collateral/executive-perspectives/annual-internet-report/white-paper-c11-741490.html). + +Edge computing has emerged as a distributed computing paradigm to overcome practical scalability limits of cloud computing. The main principle of edge computing is to leverage computational resources outside of the cloud to perform computations closer to data sources, avoiding unnecessary data transfers to the cloud and enabling faster responses for clients. Given the enormous amount of data that is expected to be produced at the edge of the network (by end-user devices), the edge-computing principle builds on the fact that “it is cheaper to bring computation to data, rather than data to computation”. + +Data storage and computation points at the edge of the network, be it in cell stations, WiFi access points, or even the same user devices that produce the data ultimately form a peer-to-peer network. + +*Both IPFS and libp2p can have a pivotal role in this new trend of distributed technologies and expansion of the Internet beyond traditional boundaries*. Both technologies already have implementations in several programming languages and are compatible for their execution in a great gamut of runtimes (desktop, browser, cloud, etc.) and network conditions (public IP addresses, behind NATs, etc.). Nevertheless, there is significant work to be done to make IPFS and libp2p compatible with every runtime and network condition in a way that offers a flawless experience, just like one expects when using the net or http package of any language. This open problem is built upon *the vision of making libp2p / IPFS modules and protocols the de-facto distributed substrate for connected devices in the near-future Internet*. + +At high-level, the aim of this research endeavor is to: + +- Enable libp2p to leverage the available protocols from the multiple runtimes, so that it can execute and form a p2p network. This will require a coordinated approach to cover as much ground possible (possible approach inspired by [Are we yet?](https://wiki.mozilla.org/Areweyet) initiatives) +- Allow global connectivity between devices. Any two libp2p nodes should be able to communicate using a compatible network link available without having to rely on a connection to the broad Internet (e.g direct connectivity through wireless transports, mesh connectivity, etc.). +- (Bonus) Libp2p/IPFS should include a general execution framework to be easily extensible for any runtime using the same format. + - [Extensibility through Web Assembly](https://istio.io/latest/blog/2020/wasm-announce/) + - [Web Assembly for proxies (ABI specification)](https://github.com/proxy-wasm/spec) + - [Self-described blocks (embedded IPLD codecs)](https://hackmd.io/AAfd9WnWQZSC7HT7Pr5G9A?view) + +## Long Description +This open problem can be divided in the following subproblems: + +### 📲️ Area I: Runtimes +The aim of this open problem would be to have libp2p and essential IPFS modules and protocols running in different runtimes (ensuring their compatibility). A lot of work has already been done around this line with libp2p and IPFS running in the browser and implemented in several programming languages. + +By the end of this research effort we should consider at least supporting the following runtime categories (each category includes a list of related projects): +- Browsers and Desktop +- Embedded systems (IoT, low powered devices) + - [IPFS Tiny](https://gitlab.com/librespacefoundation/ipfs-tiny/-/wikis/home) + - [Embed-ipfs](https://github.com/ipfs-rust/ipfs-embed) +- Routing devices: + - [OpenWrt](https://openwrt.org/) + - [Gotenna](https://gotenna.com/) + - [Liberouter](http://www.liberouter.mobi/) +- Mobile devices: + - [Thali Project](http://thaliproject.org/) +- VR/AR devices. +- Trusted Execution Environments + - [Enarx](https://github.com/enarx/enarx/wiki/Enarx-Introduction) + - [T-Rust](http://t-rust.com/#/): [TEA (Trusted Execution and Attestation)](http://t-rust.org/#/doc_list/What_is_TEA%3F%2FREADME.md) + +We may be able to support many of the aforementioned with the same protocol implementations (e.g. routing devices and embedded systems). This work will set a strong foundation for the rest of the projects to come. + +#### What defines a complete solution? +- TBD + +#### References: +- Support for libp2p intra process: +- Build for gomobile: +- Use of vias for protocols: +- Enarx SDK: +- Are we distributed yet? +- Issues listing open problems to support full distribution: + +### 📦️ Area II: Data Link / Network Connectivity +Apart from being able to run libp2p nodes anywhere, we should also be able to connect two libp2p nodes using different types of connectivities. Not every node will have a proper Internet connection, or be able to directly connect to every single peer using the exact same connectivity data link. Analogously to how it is currently done in libp2p at a transport level with the transport upgrader, we should have similar support for different data link technologies. Nodes will try to fallback to the common data link for connectivity. Some of the data link technologies we should consider supporting are: + +- Wireless communications + - Bluetooth, Zigbee, WiFi direct. +- Side-channels + - NFC, RFID. + - Audio waves +- Relays and bridges + - See the next section. + +#### What defines a complete solution? +- Demonstrate that two libp2p nodes within range of each other can discover each other: + - through a local, fixed, network element, such as WiFi access point, raspberry pi, or similar + - directly, without relying on any fixed network element, i.e., device-to-device (D2D) + - the devices can connect on demand, i.e., when one of the two devices wants to request (pull) or send (push) content from the other +- The setup and supporting protocol stack should make use of at least one of the wireless connectivity technologies mentioned above. +- Bonus: the protocol setup should enable the option of seamless connectivity between the devices, that is, without the user having to accept incoming connections as is currently the case with bluetooth pairing. This is needed to enable large-scale mesh-networks and applications to disseminate content in mobile environments. + +#### References: +- Alternative transport / discovery protocols for libp2p: + - Bluetooth: + - +- Wave-share: + +### 🛣️ Area III: Routing + +One of the big aims of this open problem is to achieve global connectivity between libp2p nodes. Supporting several runtimes and connectivities will allow "anything" to become a connected libp2p node. Unfortunately, to be able to connect any two libp2p nodes independently of their network setting and location, and to offer node mobility, additional libp2p routing infrastructure may be needed (e.g. for the translation of data links, or bridge unreachable network segments). This infrastructure will be responsible for discovering and forwarding messages to directly unreachable peers. In this project, we can open several lines of research and exploration: +- Relay and bridges + - Use bridges as gateways for low-powered device with limited support for network ([IPFS tiny bridges](https://gitlab.com/librespacefoundation/ipfs-tiny/-/wikis/home)) + - Libp2p routers and gateways to discover and forward data to peers at unreachable segments of the network (extending the current implementation of relays). +- Mesh networking. + - Hierarchical routing of libp2p traffic through the construction of interconnected local mesh networks. + +#### What defines a complete solution? +- Set up an environment where low-powered devices can communicate between them through a gateway of some form (e.g., a WiFi access point). +- Demonstrate that one device can send data to the other, on demand. +- Bonus: more powerful mobile devices can act as relays, realising a multi-hop environment. + +#### References: +- OpenR - Distributed routing protocol for mesh networks: +- Liberouter: +- OpenWrt - Embedded firmware OS: + +### 📴️ Area IV: Offline-first + +Libp2p and IPFS nodes should be able to work offline-first and offer capabilities to easily implement offline-first applications and protocols over them. Being offline first means being able to easily recover from network interruptions, and operate seamlessly under unstable network conditions. To achieve this we may require the use of CRDTs and "synchronizable" datastores. + +#### What defines a complete solution? +- Assume an environment where several mobile devices run the same application and the application content between devices needs to be synchronised at all times. When one of the devices produces new content, the content should propagate to the rest of the devices realising a "push" model. +- Setup an environment with a sample application that produces content every so often. +- The devices can either be permanently connected in a mesh, or connect on demand and transfer content to each other. +- As nodes propagate content, they have to optimise the amount of data they exchange. Instead of just flooding full messages, nodes should first check whether their neighbours already have the latest content items. This can be achieved through CRDTs, or bloom-filters. At least one should be demonstrated. + +#### References: +- Improve offline support: +- Offline message queue: +- IPFS CRDT datastore: +- Optimize Circuit Relays to make it packet-oriented in libp2p: +- NAT Traversal effors around libp2p: + +### 🛠️ (Bonus) Area V: Extensibility / P2P VM a.k.a InterPlanetary Runtime +This area of research is still a work in progress, and it may becoming a full-fledge open problem of its own, but for now we still consider it as an area inside the heterogeneous runtime problem. +Maintaining and growing libp2p protocols for the gamut of runtimes and connections we want to support can be cumbersome. This is why we should consider embedding a common execution framework to every libp2p implementation so libp2p modules are compiled targeting this common framework and can be thus used in any of the runtimes. With this, protocols and modules are implemented once and used anywhere. + +Not only protocol implementations can benefit from embedding an *"InterPlanetary Runtime* in libp2p nodes, but also any other standard computation in the ecosystem such as IPLD codecs. IPLD codecs can be implemented targeting the *IP Runtime* so they don't have to also be implemented for every libp2p implementation and runtime. This opens the door to future lines of research such as *self-describing blocks*, where the block descriptions embeds the type of data and a pointer to the codec (and which can be another block in stored in the network); *content-addressable code executions*, where code snippets are stored in the network, and data is specified in the code as pointers to blocks in th network; *computation delegation*, as once every node in the network shares the same common runtime and has a way to retrieve code and data directly from the network with a standard interface, delegating the execution of code to other's is as easy as sharing a link to the code and the data. Some of these themes, such as the use of *self-describing blocks*, although useful for the interoperability and extensibility problems of networking heterogeneous runtimes, they belong to the [Distributed Type Systems](https://github.com/protocol/resnetlab#areas) open problem, and may be finally tackled there. + +#### What defines a complete solution? +- TBD + +### References +- Wasmtime (Wasm runtime): +- UnisonWeb: Example of content-addressable programming language: +- Wasmer (Wasm runtime): +- WASM ❤️ IPLD: +- For this project we can take inspiration from the[Wasm extensibility approach](https://istio.io/latest/blog/2020/wasm-announce/) currently introduced in Istio and Envoy. Thus, our libp2p node implementations would expose the basic operation with a common runtime framework from which new Wasm modules are instantiated and run to extend the operation of our node with additional modules and protocols. +- Wasm bindgen designs: + +### 🛰️ (Bonus) Area VI: High Latency Connection (e.g. Space) +In the future, we may want to extend the edge computing trend into space, and follow the same approach we've followed to support libp2p for existing runtimes and link connectivities but considering the requirements and limitations of space communications. This research are may also become in the future its own open problem. + +#### What defines a complete solution? +- TBD + +#### References: +- Libp2p for space. +- [[2021 Theme Proposal] IPFS ❤️ Starlink](https://github.com/ipfs/roadmap/issues/72#) +- SpaceX Starlink: +- Issue with ideas: + - Software update among satellites + - Load-balancing and rerouting when sat failure + - Sky-based bootstrap/ Peer discovery, if Starlink is cooperative + - **Retrieval Market Filecoin Nodes (@adlrocha: my personal favorite)** + - Organic CDN (because of IPFS) + - Provider paid CDN ('coz offer and demand, baby) + - Open source embedded devices coms / sat coms +- Efficient Telemetry Storage on IPFS: + +### Additional areas of research to potentially explore. +Other research areas and projects that may land this heterogeneous runtime open problem. Additional inspiration can be taken from [this paper](https://asc.di.fct.unl.pt/~jleitao/pdf/NewEdgeApplications.pdf). +- Libp2p in 5G RAN infrastructure +- Distributed monitoring +- Collaborative services in libp2p (execution, monitoring, relaying). +- Distributed Resource Management. + +## Use cases +### Use Case I: User-Operated Mobile CDN +#### Brief Overview +Assume an environment where content publishers publish content through mobile phone applications. Content publishers utilise the mobility of users, the mobile device storage and connectivity opportunities to disseminate content. Users’ devices connect with each other as they move around to check whether their app instance has the latest content available and if not they update with the neighbours’ content. +In this use case, we explore the potential of a user-operated, smartphone-centric content distribution model for smartphone applications. In particular, we assume source nodes that are updated directly +from the content provider (e.g., BBC, CNN), whenever updates are available; destination nodes are then directly updated by source nodes in a device-to-device (D2D) manner. We leverage on sophisticated information-aware and application-centric connectivity techniques to distribute content between mobile devices in densely-populated urban environments. +#### Business case +Content publishers utilise storage and connectivity opportunities of mobile devices as a medium of content distribution and save from CDN costs. They pay users for the amount of storage and mobility opportunities that they contribute to the mobile CDN. + +See [this paper](https://drive.google.com/file/d/1UpH6r3Q0gKaf00CgEImgK_SImENR8NQ9/view) for more details. + +### Use Case II: Local Social Network +#### Brief Overview +Imagine a crowded entertainment or business event, such as a concert, sports event, or conference. People gather having the same interest, that is, “consume” content from the event. Everyone is capturing content on their mobile device and everyone is interested in the best content available. Connectivity in these environments is normally terrible, if existent at all. Offline-first, D2D connectivity can facilitate content propagation between devices in the area. +#### Business case +Event organisers can save costs from expensive infrastructure setup (e.g., mobile cell stations, WiFi access points and bandwidth capacity) and instead subsidise users’ resources to disseminate content. + +### Use Case III: Industry 4.0. +#### Brief Overview +The next generation of factory networks is expected to rely on smart, automated setups for the operation of production lines, robots, sensors and actuators. Connectivity between devices can be intermittent due to challenged environments, e.g., mines, or intentionally disconnected for security reasons. At the same time, connectivity and communication between devices needs to be stable given the expensive and time-critical operations. +#### Business case +Factories and industrial plants are an aggressive environment for wide-range wireless communications. Companies generally deploy private LTE networks to meet their needs of connectivity and performance. + +### Use Case IV: Mobile Active Networks - aka Ubiquitous code +#### Brief Overview +Traditionally, applications are installed in the end-user devices. With mobile active networks we propose that instead of having to download an application in order to use it natively, users can just send a request to the network to run the application. The nearest devices would serve the code in the right format for the user to run the application seamlessly in his device. Instead of having to install apps, we “pin” apps. Furthermore, if the application in hand is computationally intensive, a device can delegate computations (like graphics rendering) to other capable devices in the surroundings (this is why I mentioned that the code is served in the “right format” according to the device. The code may include pointers to primitives that require the delegation of computation). This use case merges the Stadia approach (you don’t need hardware to play videogames because everything runs on the edge) with the browser (running an application means searching for an address to download the content). +#### Business case +Users in the edge can share their spare bandwidth/computational resources. Remove the need for expensive end-user devices to run expensive applications. Instead of storing code the device only stores user’s application-related data. This opens the door to the seamless sharing of data (in IPLD format) between different applications, and local-first applications. diff --git a/README.md b/README.md index e77c2b4..50af7de 100644 --- a/README.md +++ b/README.md @@ -63,8 +63,9 @@ The lab's genesis comes from a need present in the IPFS and libp2p projects to a Heterogeneous Runtimes - NEEDs OPEN PROBLEM - (e.g. Browsers, IoT, Low Powered and/or Battery powered devices) + General open problem + Making libp2p / IPFS modules and protocols the de-facto distributed substrate for connected devices in the near-future Internet. Enable the execution of libp2p nodes and its underlying protocols anywhere (any device and any runtime). Allow global connectivity between devices. Enable “offline-first” applications. + From e72d27c11c3491efeee1d9b4877a35470af9bac6 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Mon, 14 Dec 2020 14:15:56 +0100 Subject: [PATCH 07/34] Removed BEYOND_BITSWAP. Pointer to repo. --- BEYOND_BITSWAP/README.md | 95 --------------- .../RFC/images/rfcbbL104-result-baseline.png | Bin 34196 -> 0 bytes .../RFC/images/rfcbbL104-results-rfc.png | Bin 33483 -> 0 bytes BEYOND_BITSWAP/RFC/images/rfcbbL104.png | Bin 62516 -> 0 bytes BEYOND_BITSWAP/RFC/images/ttl_slow.gif | Bin 124715 -> 0 bytes BEYOND_BITSWAP/RFC/rfcBBL009.md | 30 ----- BEYOND_BITSWAP/RFC/rfcBBL102.md | 95 --------------- BEYOND_BITSWAP/RFC/rfcBBL104.md | 67 ----------- BEYOND_BITSWAP/RFC/rfcBBL1201.md | 84 -------------- BEYOND_BITSWAP/RFC/rfcBBL1205.md | 49 -------- BEYOND_BITSWAP/RFC/rfcBBL203A.md | 109 ------------------ BEYOND_BITSWAP/RFC/rfcBBL203B.md | 65 ----------- BEYOND_BITSWAP/RFC/rfcBBL207.md | 48 -------- BEYOND_BITSWAP/RFC/rfcBBL208.md | 33 ------ BEYOND_BITSWAP/RFC/template.md | 23 ---- README.md | 2 +- 16 files changed, 1 insertion(+), 699 deletions(-) delete mode 100644 BEYOND_BITSWAP/README.md delete mode 100644 BEYOND_BITSWAP/RFC/images/rfcbbL104-result-baseline.png delete mode 100644 BEYOND_BITSWAP/RFC/images/rfcbbL104-results-rfc.png delete mode 100644 BEYOND_BITSWAP/RFC/images/rfcbbL104.png delete mode 100644 BEYOND_BITSWAP/RFC/images/ttl_slow.gif delete mode 100644 BEYOND_BITSWAP/RFC/rfcBBL009.md delete mode 100644 BEYOND_BITSWAP/RFC/rfcBBL102.md delete mode 100644 BEYOND_BITSWAP/RFC/rfcBBL104.md delete mode 100644 BEYOND_BITSWAP/RFC/rfcBBL1201.md delete mode 100644 BEYOND_BITSWAP/RFC/rfcBBL1205.md delete mode 100644 BEYOND_BITSWAP/RFC/rfcBBL203A.md delete mode 100644 BEYOND_BITSWAP/RFC/rfcBBL203B.md delete mode 100644 BEYOND_BITSWAP/RFC/rfcBBL207.md delete mode 100644 BEYOND_BITSWAP/RFC/rfcBBL208.md delete mode 100644 BEYOND_BITSWAP/RFC/template.md diff --git a/BEYOND_BITSWAP/README.md b/BEYOND_BITSWAP/README.md deleted file mode 100644 index d32c9f6..0000000 --- a/BEYOND_BITSWAP/README.md +++ /dev/null @@ -1,95 +0,0 @@ -# Project: Beyond Bitswap - -## Motivation & Vision - -File-transfer is at the core of IPFS and every subsystem inside IPFS is built to enable it in a fast and secure way, while maintaining certain guarantees (e.g. discoverability, data integrity and so on). - -There are a thousand ways to slice a file into pieces and how to transfer it over the wire. However, finding what is the optimal way for the runtime (high powered, low powered device) and network conditions (stable, unstable, remote, offline) is the key challenge. - -In high level, this project is about: -* Continuing the previous work on Block Exchange (i.e. Bitswap) and Graph Exchange (i.e. GraphSync) -* Creating a harness that enables to reproducibly run tests that demonstrate the performance of different file-transfer strategies. -* Research and prototype new strategies to acquire new speed ups. -* Acquire leverage by exposing the harness to the whole Open Source and Research community, in a way that others feel compelled to join the effort and try their own strategies. - -In short, the aim of the project is two-fold: to drive speed-ups in file-sharing for IPFS and other P2P networks; and to enable a framework for anyone to join the quest of designing, implementing and evaluating brand new file-sharing strategies in P2P networks. - -## Why the project code name? - -Bitswap has been for some time the file-sharing subsystem within IPFS, then Graphsync came to propose a new way of approaching file-sharing on IPFS. The scope of the project is not only to improve Bitswap's performance, but file-sharing in P2P networks as a whole. We don't restrict ourselves exlusively to Bitswap or IPFS for our exploration. - -Being said that, the fact that IPFS had an infrastructure in place to start testing our ideas, and Bitswap being its file-sharing module, made us start our initial explorations over Bitswap and IPFS, but our aim is to go way farther and improve file-sharing performance with new protocols and proposals every P2P network can leverage and benefit from. In short, we want to go "Beyond Bitswap". The project can be considered a success if by the end of it one has a set of pluggable protocols and modules to achieve file-sharing in P2P environments, along with all the testbeds, tools and benchmarks required to improve this protocols and go _"Beyond Bitswap"_. - -## 💌 Invite to Research with us - -ResNetLab collaborates with over 10 Research Groups all over the world and Protocol Labs Research has developed research collaborations in multiples of ten in the last few years. We are always eager to collaborate with more researchers in all kinds of capacity, from thesis project (M.Sc or PhD), to Post-Doc, Grants, RFPs and independent research projects. - -We are making all our contributions, ideas, testbed, benchmarking and analysis scripts available below. You are more than welcome to pick any of these assets and build on top of it. If you have questions, please [mail us](mailto:resnetlab@protocol.ai). - -## Contributions & Results - -### Documents - -* [Related Work](https://docs.google.com/document/d/14AE8OJvSpkhguq2k1Gfc9h0JvorvLgOUSVrj3CnOkQk/edit#heading=h.nxkc23tlbqhl): It gives an overview of the problem, how it will be tackled, and a collection of references and community proposals. -* [Beyond Bitswap Slides](https://docs.google.com/presentation/d/18_aRTye2t6Xs_VhKwEbhvCYYu9ePaLgamIrJkpUDtfY/edit?usp=sharing): Set of slides introducing the project and summarizing the Related Work document from above. -* [Survey of the state of the art](https://docs.google.com/document/d/172q0EQFPDrVrWGt5TiEj2MToTXIor4mP1gCuKv4re5I/edit?usp=sharing): It summarizes a list of papers on file-sharing strategies in P2P networks used as a groundwork for the projects. -* [Evaluation Plan](https://docs.google.com/document/d/1LYs3WDCwpkrBdfrnB_LE0xsxdMCIhXdCchIkbzZc8OE/edit#heading=h.nxkc23tlbqhl): Document describing the testbed and evaluation plan designed to test the performane of current implementation of file-sharing systems, and compare it with the improvements implemented within the scope of this work. -* [Enhancements RFC](#enhancements-rfcs): A list of enhancements proposals and ideas to improve file-sharing in IPFS and P2P networks. - -### Enhancement RFCs -This section shares a list of improvement RFCs that are being currently tackled, discussed and prototyped. Each RFC aims to test a specific idea or assumption, and they may initially be implemented over Bitswap, but that doesn't mean the conclusions drawn are exclusively applicable to the Bitswap protocol. RFCs are divided in the different layers for file-sharing in P2P sytems identified in the [Related Work](https://docs.google.com/document/d/14AE8OJvSpkhguq2k1Gfc9h0JvorvLgOUSVrj3CnOkQk/edit#heading=h.nxkc23tlbqhl). -| RFC | Status | -|-------------------------------------------------------------------------------------------------------------|-------------| -| [RFC\|BB\|L0-09: Hashing algorithm improvements](./RFC/rfcBBL009) | `brainstorm`| -| [RFC\|BB\|L1-04: Track WANT messages for future queries](./RFC/rfcBBL104.md) | `prototype` | -| [RFC\|BB\|L1-02: TTLs for rebroadcasting WANT messages](./RFC/rfcBBL102.md) | `prototype` | -| [RFC\|BB\|L1-06: Content Anchors](https://github.com/protocol/ResNetLab/issues/6) | `brainstorm`| -| [RFC\|BB\|L1/2-05: Use of super nodes and decentralized trackers](./RFC/rfcBBL1205.md) | `brainstorm`| -| [RFC\|BB\|L12-01: Bitswap/Graphsync exchange messages extension and transmission choice](./RFC/rfcBBL1201.md) | `draft` | -| [RFC\|BB\|L2-03A: Use of compression and adjustable block size](./RFC/rfcBBL203A.md) | `prototype` | -| [RFC\|BB\|L2-03B: Use of network coding and erasure codes](./RFC/rfcBBL203B.md) | `brainstorm`| -| [RFC\|BB\|L2-07: Request minimum piece size and content protocol extension](./RFC/rfcBBL207.md) | `brainstorm`| -| [RFC\|BB\|L2-08: Delegate download to other nodes (bandwidth aggregation)](./RFC/rfcBBL208.md) | `brainstorm`| - - -If you want to familiarize with our work, we highly recommend exploring first the RFCs in `prototype` state, and then move to the ones at a `draft` or `brainstorm` state. `prototyped` RFCs are in a stage where there is working prototype you can start evaluating and playing with. The `draft` state means that the RFC is ready for implementation, while `brainstorm` RFCs require further discussions and design work. - - - -**Layer 0: Data Structure:** -* [RFC|BB|L0-09: Hashing algorithm improvements](./RFC/rfcBBL009): - -**Layer 1 RFCs: Discovery and announcement of content:** -* [RFC|BB|L1-04: Track WANT messages for future queries](./RFC/rfcBBL104.md): Evaluates how using information from a nodes surrounding can help the discovery and fetching of popular content in the network. -* [RFC|BB|L1-02: TTLs for rebroadcasting WANT messages](./RFC/rfcBBL102.md): It evaluates how broadcasting exchange requests TTL hops away, and allowing other nodes to discover and retrieve content on behalf of other peers, may help the discovery of content improving performance. -* [RFC|BB|L1/2-05: Use of super nodes and decentralized trackers](./RFC/rfcBBL1205.md): Aknowledge the fact that P2P networks are also social networks and nodes in the network have different relationships and capabilities. Explore the use of side-channel discovery mechanisms. -* [RFC|BB|L1-06: Content Anchors](https://github.com/protocol/ResNetLab/issues/6): Evaluate the use of gossipsub to perform more efficient content routing. - -**Layer 2 RFCs: Negotiation and transmission of content:** -* [RFC|BB|L12-01: Bitswap/Graphsync exchange messages extension and transmission choice](./RFC/rfcBBL1201.md): Proposes dividing the exchange of content in two phases: a negotiation phase used to discover the holders of the different chunks of a file, and a transfer file to explicitly request blocks from different chunk holders. This opens the door to additional exchange strategies and schemes to improve performance. -* [RFC|BB|L2-03A: Use of compression and adjustable block size](./RFC/rfcBBL203A.md): Evaluates the potential performance improvementes on the use of compression for the exchange of content in P2P networks. -* [RFC|BB|L2-03B: se of network coding and erasure codes](./RFC/rfcBBL203B.md): Evaluates the potential performance improvementes on the use of network coding and erasure codes to leverage the transmission of content from multiple streams. -* [RFC|BB|L2-07: Request minimum piece size and content protocol extension](./RFC/rfcBBL207.md): Evaluates how the size of the chunks that comprises content requested in a P2P network may affect performance. -* [RFC|BB|L2-08: Delegate download to other nodes (bandwidth aggregation)](./RFC/rfcBBL208.md): Leverage the resources of other peer "friends" to collaboratively discover and retrieve content, and perform faster content retrievals. - -Feel free to jump into the discussions around the project or to propose your own RFC opening an issue in the repo. - -### Code & Testbed - -* [Testbed, benchmarking, analysis scripts and related assets](https://github.com/protocol/beyond-bitswap/): All the code used for the implementation and other auxiliary testing assets. Additional documentation is provided in the repo. -* [Bitswap fork](https://github.com/adlrocha/go-bitswap): This fork of `go-bitswap` is the one being used to implement and evaluate some of the RFCs and where additional metrics that want to be tracked in the testbed are being included. RFCs are imeplemented in different branches with the name of the RFC code. - -### Talks / Videos - - -* [Progress update September 2020](https://drive.google.com/file/d/1vUWnfQMIqz9hoqWB941vbzqkP16-_ydd/view?usp=sharing): Progress update of the project explaining the RFCs implemented, the testbed and some preliminary results. -* [How rfcBBL104 was implemented](https://drive.google.com/file/d/1YS3RoNdeeG1vauJpfvHvKUQzPHr97eHF/view?usp=sharingg): Video on how the implementation of rfcBBL104 was approached. -* [A Deep Dive In Bitswap](https://drive.google.com/file/d/1jgTOFFtRL0UYeDk98NHoNlEuujBaK08b/view?usp=sharing): Workshop describing in detail the operation of Bitswap and the implementation of some of the improvement RFCs. -* [Demo of compression in libp2p](https://drive.google.com/file/d/1YcemfkS5ZNnH66-tTGmerNrgrsW-bbpD/view?usp=sharing): A demo of the exchange of files between two IPFS nodes with compression enabled in libp2p. - -### Publications -* ["Two ears, one mouth": how to leverage bitswap chatter for faster transfers](https://research.protocol.ai/blog/2020/two-ears-one-mouth-how-to-leverage-bitswap-chatter-for-faster-transfers/) -* [Honey, I shrunk our libp2p streams](https://research.protocol.ai/blog/2020/honey-i-shrunk-our-libp2p-streams/) -* [Beyond Bitswap](https://adlrocha.substack.com/p/adlrocha-beyond-bitswap-i) -* [Network Coding in P2P Networks](https://adlrocha.substack.com/p/adlrocha-network-coding-in-p2p-networks) -* [Hash Array Mapped Tries](https://adlrocha.substack.com/p/adlrocha-hash-array-mapped-tries) \ No newline at end of file diff --git a/BEYOND_BITSWAP/RFC/images/rfcbbL104-result-baseline.png b/BEYOND_BITSWAP/RFC/images/rfcbbL104-result-baseline.png deleted file mode 100644 index 52a8daf06aab22bf25c70f7c622e2b619d57c958..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34196 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 diff --git a/BEYOND_BITSWAP/RFC/images/rfcbbL104-results-rfc.png b/BEYOND_BITSWAP/RFC/images/rfcbbL104-results-rfc.png deleted file mode 100644 index f111970c5d9303a2a261a3bc4780add614e5fd4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33483 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ðqZcZ`Cdj-In!AXXUg8<~+k24ihQQz;o?xY@hJ-n*hj26XCjusu>_> zqU_cKoS+z}COq?H?H`Aj6puTnr{MV>-aTwyI1peBJqWWwAdXYl0WrXVo#^Y+AEN#; zaAFGB$Fc>6&<#NXoaOX0;p-*boFskqIpPqdSHY*!9PJ6M+4e;uHRSM-CHB5 z^ub-%mc(2t(p-P(q$GPUU)NDdK7g*S29o?E?#+5#T^H2fn@Fc`f0 z2ED<>8xpN1JzRi0T&b=Yd39M`@wv4eQg=P3@#)hXA)_!&bU+Hop+&f8tihv3*}yZl zMf>^+=ice^ilhb*)?+!N(d#CVFwPZd5ZAg7Qj}e4=K|^f;s_i}cT(hg9EvC-$V|_= zS1$cua)LdK?D~U1uP*W3Lqh^OD%Ci3>D-xq^Py3FXY_@WQsjAlrdUQv1dx9uNSJ}n zKJj!M&_~^!&*l`)(5bpK_h@|W*!0q~9Tb;jzulRMJr%EWY8{(^I+GkbGj6+h@qN>R z-5v!#(6ZJ{``(3J-9A;X%)EXDvxp`nk8FIC zGM9H?#}Nv-fiklRqfZaSVL-9up=yVk2{z_@%p4HIGx@#-yKxq{_sJ*2=d%-Xpn@X8 z<$K*J_vpQq!;JV&CFL3uN$2d^^Q%gTztC&;4=N zJ#pFX59nz;pM*wr?(yx=#qe_nKuXc27Z4RFmMd4r>A7;!!djXZW$8*QaUD)hNTW#~ z86kShP64ExgI_Lt8A~LCO5wf(9DCh)$r*r^`Yi5;82|bqLVZQ za_8q`c0nK&93LE}2w~gcA`56u=pD-?LI;3v$78cioqhvI9tB~6oYQQkIv>$H$)2xd z0s$BDp`iF+ww7_aK%&>#=tm&(1r~;><M(>ZX7zJ<+aXqUo3BPo%n&OW@6{=Pn>PO4B0r=C2=b-L!6 zRKp&+P37}pv0qGmm$%+3z#)?2bN&)j>@2JZvS>9p);UZ=Jyxd*(wMk5(BDRJ@?}F+ zZf4x8W1*fogx#a4VqcHT`hue_Z19yxjse!0L2}Kf&qd!=t_BZR1U83?w#1)t!e->a z(|iZG3HY}PXbzZdBM?jMtDhDgh7b{Pea%E7zls3E(DyoKG$s3`;q zqz(`$vNs#1Ro?I>c5Y272W=kjRTczrc4XYDhm}ltUfK%qy8Rz6-8PA01-%0=g diff --git a/BEYOND_BITSWAP/RFC/images/ttl_slow.gif b/BEYOND_BITSWAP/RFC/images/ttl_slow.gif deleted file mode 100644 index 2a64d58f4aced4f500524f92c97e0766800fb2de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124715 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 diff --git a/BEYOND_BITSWAP/RFC/rfcBBL009.md b/BEYOND_BITSWAP/RFC/rfcBBL009.md deleted file mode 100644 index 2c82025..0000000 --- a/BEYOND_BITSWAP/RFC/rfcBBL009.md +++ /dev/null @@ -1,30 +0,0 @@ -# RFC|BB|L0-09: Hashing algorithm improvements -* Status: `Brainstorm` - -## Abstract - - -Every time Bitswap receives a new block, [it generates the CID from the payload of the block](https://github.com/adlrocha/go-bitswap/blob/fad1a007cf9bc4f7e8e3f182a4645df60a88a9c6/message/message.go#L222) in order to verify that it belongs to a block it has in its wantlists. This means computing a lot of hash functions. This may involve a significant overhead. - -## Description -Exploring more efficient implementation of hash functions, or alternative hash algorithms to fit different hardware architectures could remove an important overhead for Bitswap (and other modules from the IPFS ecosystem). - -## Implementation plan -- [ ] Evaluate the overhead of hashing every block in Bitswap. This can be done by exchaching a large file and precompute the CIDs so computing the CID for every block is not needed. -- [ ] If we see that the overhead from hashing every block is significant, explore other hash functions and make a Bitswap implementation able to support other hash algorithms. Perform the same evalution from above and check the difference in the overhead. - -# Impact -- Reduction in the Bitswap protocol overhead. The protocol runs faster. - -## Evaluation Plan - -- [The IPFS File Transfer benchmarks.](https://docs.google.com/document/d/1LYs3WDCwpkrBdfrnB_LE0xsxdMCIhXdCchIkbzZc8OE/edit#heading=h.nxkc23tlbqhl) - -- Measurement of the overhead for different file exchanges for different hash algorithms. - -## Prior Work -- https://github.com/minio/blake2b-simd - -## Results - -## Future Work diff --git a/BEYOND_BITSWAP/RFC/rfcBBL102.md b/BEYOND_BITSWAP/RFC/rfcBBL102.md deleted file mode 100644 index e3f83ac..0000000 --- a/BEYOND_BITSWAP/RFC/rfcBBL102.md +++ /dev/null @@ -1,95 +0,0 @@ -# RFC|BB|L1-02: TTLs for rebroadcasting WANT messages -* Status: `Draft` -* Implementation here: https://github.com/adlrocha/go-bitswap/tree/feature/rfcBBL102 - -## Abstract - -This RFC proposes setting a TTL on Bitswap WANT messages and TTL ceiling per node, in order to increase the chance of a node finding a provider that has the content without resorting to the DHT. - - - - - -## Shortcomings - -Bitswap only sends WANT messages to its directly connected peers. This limits the potential for finding the peer with the content to the peers directly connected to or the ones that result from a DHT query, which has its cost in time and connectivity. - -## Description - -The idea is to include a TTL to WANT messages. That way instead of forwarding WANT messages to our directly connected peers, we can increase the scope to, for instance, the connected peers of our connected peers (TTL=1). With this, we increase the span of discovery of content without having to resort to the DHT. This TTL needs to be limited to a small number to avoid flooding the network with WANT requests. It also complicates the implementation of the protocol, as now nodes need to track not only sessions from their directly connected peers but also from the ones x-hops away from them. Several design decisions would have to be made in the implementation such as the following (ideally the best value for these fields will be determined in testing. Additionally, we could set them to be dynamic according to the state of the network or the developer's desire. This will be explored in the future work). - -- Max TTL allowed. [This study proves](http://conferences2.sigcomm.org/acm-icn/2015/proceedings/p9-wang.pdf) that a Max TTL = 2 achieves the best performance (for moderately popular content) without severe impact in latency, so we can consider this as the baseline value. However, The impact and performance of this will depend heavily on how many connections each node maintains. - -- Forwarder of discovered blocks: Nodes x-hops away from the source of the requests can send responses following two approaches: - - - Symmetric routing: Messages are forwarded to the requestor following the same path followed by the WANT messages. - - - Asymmetric routing: Messages do not follow the same path followed by the WANT message, and responses are directly forwarded to its original requestor. In this alternative, nodes follow a "fire-and-forget approach" where intermediate nodes only act as relays and don't track the status of sessions, the receiving node X-hops away answer the requestor node directly, and the only one tracking the state of the session is the originating peer (and maybe the directly connected peers while the session has not been canceled, so that if they see any of the requested blocks it can notify its discovery). When implementing this approach we have to also bear in mind that establishing connections is an expensive process so in order for this approach to be efficient we should evaluate when it is worth for nodes to open a dedicated connection to forward messages back to the original requestor. This does mean that the WANT messages need to have an additional field of “requester” so that the receiving node knows who to dial to deliver a block. - -Initially, the protocol will be designed using symmetric routing, and will explore other routing alternatives in the future work. When exploring symmetric routing we need to bear in mind that according to IPFS values, nodes shouldn't push content to other peers that haven't requested it. - -Again, this proposal should include schemes to avoid flooding attacks and the forgery of responses. It may be sensible to include networking information also in the request to allow easy discovery to forward responses X-hop away. - -## Implementation plan -- [X] Include TTL in WANT messages. Nodes receiving the WANT message track the session using relay sessions, reduce in one the TTL of the WANT message and forward it to its connected peers. Duplicate WANT messages with lower or equal TTL should be discarded to avoid loops (higher TTLs could represent request updates). WANT sessions should be identified at least with the following tuple: {SOURCE, WANT_ID} so nodes know to whom it needs to send discovered blocks. (See figures below for the proposed implementation of the symmetric approach). - -- [X] Test the performance and bandwidth overhead of this scheme compared to plain Bitswap for different values of TTL. - -- [ ] Evaluate the use of a symmetric and asymmetric routing approach for the forwarding of discovered blocks. - -- [ ] Consider the implementation of "smart TTLs" in WANT requests, so according to the status of the network, bandwidth available, requests alive, number of connections or any other useful value, the TTL is determined. - -## Implementation details -### Basic implementation -* An additional TTL field has been added to Bitswap WANT entries in Bitswap messages to -enable the forwarding of exchange requests to peers TTL+1 hops away. -* Bitswap is set with a defualt TTL of 1, so corresponding messages will only be forwarded -to nodes two hops away. -* Sessions now include a TTL parameter to determine how far their WANT messages can go. Sessions started within the peer (because the peer wants a block) are considered `direct`, while the ones triggered from the reception of a WANT mesages with enough TTLs are referred as `relay` (the peer is doing the work on behalf of another peer and it is not explicitly interested in the block). An `indirect` flag has also been added to sessions in case in the future a different strategy want -to be implemented for relay sessions (like the use of a degree to limit the number of WANT messages broadcasted to connected nodes to prevent flooding the network). Currently direct and relay sessions follow the exact same strategy for block discovery and transmission. - - -* All the logic around relay sessions is done in `engine.go`, `session.go`, `peerwantmanager.go`: - - Whenever a peer receives a WANT message from which it doesn't have the block and its TTL is not zero, it sends a DONT_HAVE right away, and it tells the relay session to start a discovery for those WANT messages with TTL-1. - - Whenever a new block or HAVE messages are received in an intermediate node for an active relay session, these messages are forwarded to the source (the initial requester). This action updates the DONT_HAVE status of the intermediate node so it is again included in the session. - - _We need to be careful, in the current implementation blocks from relay sessions are stored in the datastore for convenience, but they should be removed once all the interested relay sessions for the block are closed and they have been successfully forwarded to avoid peers storing content they didn't explicitly requested._ - - When receiving a HAVE the relay session will automatically send the WANT-BLOCK to the corresponding peers, we have identified the interest from every peer (including direct ones) so when a peer receives a block for an relay file it will automatically forward it to the source (there is no need to forward interest for WANT-BLOCKS because this is automatically managed withing the relay sessions). Relay sessions work in the same as direct sessions in this first implementation. - - -### Symmetric approach message flows -![](./images/ttl_slow.gif) - - -# Impact -We should expect a latency reduction in the discovery of content but it may lead to an increase in the bandwidth overhead of the protocol. We do not expect the increase in the bandwidth overhead to be substantial, given that response messages are not big in size - -## Evaluation Plan -- [ ] [The IPFS File Transfer benchmarks.](https://docs.google.com/document/d/1LYs3WDCwpkrBdfrnB_LE0xsxdMCIhXdCchIkbzZc8OE/edit#heading=h.nxkc23tlbqhl) - - To evaluate the performance of this RFC we need a network where the `MAX_CONNECTION_RATE` of nodes is small, the number of passive nodes in the network (neither seeding nor leeching content) is high, and the number of seeders providing the content small. This will force content to be several hops away from leechers. Leechers should request the content all at the same time (if done in waves leechers in a wave would become seeders in the next wave and may add noise to the measurement). - -- [ ] An additional measurement to consider is to compare the times a node needs to resort to the DHT to find the content in plain Bitswap compared to the RFC (this would determine how effective the strategy is). - -## Prior Work -This RFC was inspired by this proposal. The RFC is based on the assumption that DHT lookups are slow and therefore is better to increase our “Bitswap span” than resorting to the DHT. It would be great if we could validate this assumption before considering its implementation. - -## Results -TBA - -## Future Work -Some future work lines to consider: - -- Combine with RFC|BB|L1-04 so apart from setting a TTL to WANT messages, every peer receiving a WANT message tracks it in its peer-block registry enhancing also the discovery scope with peer-block registries tables. - -- With a very high number of connections the network is effectively flooded, which is not something we want. We could envision this technique as an efficient alternative to keeping many (questionable quality) connections. [[slides](http://conferences.sigcomm.org/acm-icn/2015/slides/01-01.pdf)] - -- If we end up using request manifests as suggested in RFC | BB | L1/2-01, max TTLs could be specified in the exchange request message or determined according to the total connection of a peer to limit the network flooding. Even more, it'd be interesting to explore this RFC with RFC | BB | L1-06 so using GossipSub overlay network as a base, and according to scores and max connections of peers, WANT TTLs are determined. - -- Evaluate techniques used in GossipSub to fine-tune or enhance the use of WANT TTLs preventing the network from being flooded. Even more, an additional line of exploration could be devised in which GossipSub is used as the messaging infrastructure leveraged by Bitswap to exchange WANT messages. - -- Two concerns not addressed in the implementation of this RFC are: - - Privacy: The fact that WANT messages are exchanged to nodes certain hops aways scatters information about the content being requested by nodes. This is not a problem for the symmetric approach compared to Bitswap's baseline implementation, because there is no way to authenticate the source of the WANT request. New privacy concerns compared to the baseline arises when WANT messages include the requester of the content in order to be able to directly forward the content to them. - - DDoS attacks: This RFC would make it fairly easy for a malicious node to launch an amplification attack and it should be considered in future iterations of the implementation. An example of the attack: - 1. Create block "Block1" of maximum size on Node A - 2. Connect Node B to as many peers as possible - 3. Send request for Block1 from Node B to all peers with maximum TTL. This will cause Block1 to be passed around between all the nodes, so the attacker can amplify the attack's bandwidth. -A simple workaraound to this attack can be to inspect WANT messages and assign a budget to connected peers to prevent them from abusing the protocol. diff --git a/BEYOND_BITSWAP/RFC/rfcBBL104.md b/BEYOND_BITSWAP/RFC/rfcBBL104.md deleted file mode 100644 index 992cbfe..0000000 --- a/BEYOND_BITSWAP/RFC/rfcBBL104.md +++ /dev/null @@ -1,67 +0,0 @@ -# RFC|BB|L1-04: Track WANT messages for future queries -* Status: `Prototype` -* Implementation here: https://github.com/adlrocha/go-bitswap/tree/feature/rfcBBL104 - -## Abstract - -This RFC proposes to leverage the knowledge acquired when receiving WANT messages sent by others in future requests issued by the peer tracking them. By keeping track of the WANT messages received, a peer will have the possibility to assert the likelihood of a peer having a block after a period of time, the rationale being: if someone asked for this in the past, they probably have it by now. With this information, a peer can issue queries to the peers that might have the block without having to enter in a discovery phase. - - - -## Shortcomings -Bitswap nodes currently send WANT messages blindly to all its connected peers. On the other hand, WANT messages include a lot of useful information about “recently accessed content” of a nodes’ connected peers. By tracking this information more directed and efficient searches of content can be performed. - -## Description -Every time a peer requests content to the network it sends WANT requests to all its connected peers. A lot of information about the content being shared in our surroundings can be extracted from the reception of these requests. This proposal is based on the assumption that if a node is requesting content it potentially will store it in the near future. - -With the implementation of this RFC, IPFS nodes will: -- Track all the WANT messages received and start building a “local view of the content”. We call this local view “peer-block registry” that is populated with information about the CIDs and the peers that have recently requested them. -- With the creation of the registry above, we then use it as a new content routing-like service, in which we first lookup on the registry to see if the CID has been previously requested in “our surroundings”. If this is the case, we send a WANT-BLOCK message directly to that peer. This WANT-BLOCK is sent along with the WANT list. - -With this simple scheme we are reducing to one the RTT required to request content previously accessed by my connected peers. Additionally, if applied to GraphSync, we can have a node fetch a file in one RTT by applying the selector in the CID - -As a second phase of this RFC, we intend to increase the “view” of content, connected peers can periodically share their peer-blocks registry to populate them with more CIDs and peers, even if they are not connected to them. For this scheme we need to come up with ways of limiting the level of spread of “inspection tables” (or we may end up having an alternative DHT) such that maybe I only accept updates to my “inspection tables” from nodes 2-hops away. We also need ways to collect feedback and “garbage collect” outdated information from these tables (or it may end up being useless for a large amount of the requests). - -Some of the known challenges to make this contribution efficient and effective are: -- Peers see potentially millions of WANT messages per day. The data structure containing this information should be compacted (e.g. using an accumulator) so that the overhead storing of it is low -- At the same time, seeking through this table must be fast as peers will need to query it for many blocks. The data structure should be both compact and fast to read. - -Initial explorations indicated that an HAMT with an accumulator like approach are good candidates for this job. - -## Implementation plan -- 🛠 Evaluate the use of HAMT and accumulators to easily access the peers from the structure that “potentially” has the CID. - - [x] Do a test with 100K files of 1MB to see the number of Wants received by a single node. - - 🛠 Show how naïve approaches may not work on the scale of decentralized. For this we will add a test in which we track the memory footprint of the two implementations of registries, the FlatRegistry and the HAMTRegistry for a large amount of files. - - [x] Use HAMTRegistry as an efficient data structure for the registry. - - ⚠ Current implementation of HAMTRegistry doesn’t include CHAMP modification. - - [ ] Evaluate the use of accumulators to access registry entries and analyze how changing the size of the prefix in the accumulator structure used affects the bandwidth, memory footprint of peers, and the chance of finding discovery. This will allow us to put a ceiling to the number of entries to be tracked in the registry and its overhead. -- [x] Implement WANT inspection and design the data structure used to track the data being exchanged in requests. -- [x] Design protocol followed by peers to leverage this data structure to include information from it in its requests (sending an optimistic WANT-BLOCK in a Bitswap session to nodes in the table who have seen the desired CID before). -- [x] Implement some basic unit tests to be used throughout the development and enhancements over the RFC. -- [x] Design a test evaluation in the testbed (Waves test case included). -- ⚠ Design the garbage collections and exchange schemes for these tables. - - FlatRegistry limits the maximum number of peers per CID allowed. For this Registry the garbage collection means cleaning the entries of outdated CIDs. - - HAMTRegisry updates the key with the new list of peers. There is a maximum number of entries allowed in each key. - - The garbage collection strategy will be defined according to the results of the memory footprint tests and the accummulator ceiling. - -![](./images/rfcbbL104.png) - -# Impact -We can expect the time to discover content in the network to be reduced. - -## Evaluation Plan -- [The IPFS File Transfer Benchmarks](https://docs.google.com/document/d/1LYs3WDCwpkrBdfrnB_LE0xsxdMCIhXdCchIkbzZc8OE/edit#heading=h.nxkc23tlbqhl) -- [x] Create a test case that simulates the interest in a dataset by a growing population of nodes (e.g Use different waves of peers interested in a file). This will create the scenario in which the next wave will benefit from having the knowledge that the first wave might already have the file. - - [ ] Include noise in the test case. Along with the regularly accessed files, nodes request random CIDs to pollute their registries. - - [ ] Clear registries between run counts to remove advantage with files with similar blocks. -- [ ] Track memory footprint of peers. - -## Results -The results for the implementation of this RFC were reported here: https://research.protocol.ai/blog/2020/two-ears-one-mouth-how-to-leverage-bitswap-chatter-for-faster-transfers/ - -## Future Work -- Protocol to share peer-block registries between nodes to increase “local views”. -- A good idea for reducing the scope of the content we keep track of is to somehow monitor the latency to the node and keep track of content that lives nearby. -- We can go further and think of budget-based forwarding schemes where nodes can forward only up to a fixed amount of requests. We’ve investigated several funky content discovery strategies in these two papers: - - [On Demand Routing for Scalable Name Based Forwarding](http://conferences.sigcomm.org/acm-icn/2018/proceedings/icn18-final53.pdf) - - [A Native Content Discovery Mechanism for Information-Centric Networks](https://www.ee.ucl.ac.uk/~ipsaras/files/efib-icn17.pdf) diff --git a/BEYOND_BITSWAP/RFC/rfcBBL1201.md b/BEYOND_BITSWAP/RFC/rfcBBL1201.md deleted file mode 100644 index b520266..0000000 --- a/BEYOND_BITSWAP/RFC/rfcBBL1201.md +++ /dev/null @@ -1,84 +0,0 @@ -# RFC|BB|L12-01: Bitswap/Graphsync exchange messages extension and transmission choice -* Status: `Draft` -* Implementation here: https://github.com/ - -## Abstract -This RFC proposes expanding Bitswap and Graphsync exchange messages with additional information. This information is used in content requests for receivers to be able to understand clearly the content requested; and in responses so responders can share his specific level of fulfillment of the request to the requestor. With this information the requestor can select the best nodes to perform the actual request to have the best performance possible in the transmission. - - - - - -## Shortcomings - -Bitswap and Graphsync’s current discovery process is blind and optimistic. An IPLD selector or a plain WANT list with the list of request CIDs are shared with connected peers hoping that someone will have the content. When a peer answers saying that it has the requested block, a subsequent request needs to be performed to get the rest of the blocks belonging to the DAG structure of the requested CID. The idea behind this RFC is to add a way for requestor and connected peers to give more directed feedback about the result of the request. - -## Description -To request content to the network, instead of sending plain WANT messages or an IPLD selector, the requests will include the following information: - -- Plain legacy request (want list or IPLD selector). This would allow this RFC to be backward compatible with existing exchange interfaces. - -- Parameters for the exchange protocol (such as "send blocks directly if you have them", or "send only leaf blocks", "send all the DAG structure for the root CIDs I send", or any other extension we may come up with). - -- Specific requirements (such as the minimum latency of the bandwidth desired for the exchange). - -- Any additional data that may be useful and that we can act upon at a protocol level. - -Nodes receiving this message will respond with the level of fulfillment of the request (number/range of blocks belonging to the request that the node stores , and if they fulfill or not the specified transmission requirements). This request can also include the list of blocks under the CID/IPLD select the request will eventually look for. No blocks are shared (except explicitly specified) in this exchange, it is only used as a way of "polling the surroundings" for the content. - -With this information, the requestor inspects the characteristics and percentage of fulfillment of all the responses and chooses the best peers to request the blocks from distributing the load depending on the nodes it is connected to, and to parallelize as much as possible the exchange. This offers peers an opportunity to try and find the optimal distribution of requests for blocks that maximizes the output. The transmission flow with the chosen peers is triggered through a TRANSFER message, where the desired blocks and the transmission parameters are specified (this opens the door to the use of compression, network coding and other schemes in the transmission phase). - -While the requester is receiving blocks through different transmission flows, it can trigger new rounds of discovery sending additional request messages to connected peers or selected peers in the DHT to increase the overall level of fulfilment or find better transmission candidates. The discovery and transmission loop will be permanently communicating. - -### Implementation - -Nodes receiving this manifest will answer with the level of fulfillment of the request. Upon reception of these responses, the node can start transmission requests to all the desired nodes. Meanwhile, we can resort to the DHT to send these exchange requests to peers we are not directly connected to. The flow of the protocol would be: - -- Send exchange requests (IPLD selector/list of blocks, network conditions, node conditions) to connected peers. - -- Receive responses: R1=50% fulfillment; R2=30% fulfillment; R3=5% fulfillment; We select the peers that lead to a larger level of fulfillment U(R1, R2)=75% fulfillment, and request the start of a transmission flow with them. Meanwhile, we resort to the DHT or perform an additional lookup to find the data pending for full fulfillment of the request. All of these phases should be in constant contact, so in case we receive better responses from peers we can act upon start new transmission or adapt to the conditions of the network. - -The above proposal may present a few shortcomings for which we would have to include schemes to prevent such as: - -- Reducing the number of RTTs when the number of blocks requested and their size is small. We need to include a way of merging the discovery and transmission phases to minimize the RTTs when appropriate. - -- For large files send only the first 2 layers in the response before the requestor triggers the transmission phase. - -- Use of accumulators in the level of fulfilment in responses to improve checks and the time between request and transmission phase. - -- Avoid response forgery. This is out of the scope of this RFC but is something worth exploring in the future work. - -## Implementation plan -- [ ] Include additional information for exchange requests in WANT messages. - -- [ ] Determine the basic structure of exchange requests, the information included in it, and how it will be leveraged by nodes. When designing these messages we need to ensure that it is compatible with existing WANT messages for backward compatibility. Thus, if an outdated Bitswap node receives an exchange request it still knows how to interpret the request. Along with this exchange request, the TRANSFER message should be designed. - - - [ ] Use of Graphsync selectors in WANT messages. - -- [ ] Design and implement the message exchange protocol for the content discovery and negotiation phases: - - - [ ] 1\. Send exchange requests and collect responses for content availability and network status. - - - [ ] 2\. Start transmission channels (TRANSFER) with peers fulfilling the request and keep the content discovery loop open in case better content servers appear (either because they are found through the exchange request broadcast, or because we chose to extend the lookup through the DHT and found better peers). - - - [ ] 3\. Fine-tune peer interaction for best performance. - -- [ ] Performance benchmark with plain Bitswap to fine-tune protocol configuration. - -- [ ] Implement more complex queries in request messages. - - - [ ] Use a utility function / score to evaluate the "best peers" for content discovery and transmission. - -# Impact -Adding these exchange request and negotiation phases opens the door to the clear differentiation of content discovery and transmission. This enables the inclusion of new schemes to optimize both levels according to the needs of an application. It will also enable the parallelization of many processes in current exchange interfaces. It also enables a way for clients to influence the operation of the protocol. - - -## Evaluation Plan -- [The IPFS File Transfer benchmarks.](https://docs.google.com/document/d/1LYs3WDCwpkrBdfrnB_LE0xsxdMCIhXdCchIkbzZc8OE/edit#heading=h.nxkc23tlbqhl) - -## Prior Work - -## Results - - -## Future Work diff --git a/BEYOND_BITSWAP/RFC/rfcBBL1205.md b/BEYOND_BITSWAP/RFC/rfcBBL1205.md deleted file mode 100644 index eb6c122..0000000 --- a/BEYOND_BITSWAP/RFC/rfcBBL1205.md +++ /dev/null @@ -1,49 +0,0 @@ -# RFC|BB|L1/2-05: Use of super nodes and decentralized trackers -* Status: `brainstorm` - -### Abstract - -This RFC proposes the classification of nodes in different types according to their capabilities, and the use of side-channel information to track and discover content in the network. We propose the use of decentralized trackers (with good knowledge of where content is stored in the network and a discovery service for "magnet links"), and supernodes (nodes with high bandwidth and low latency which can significantly improve the transmission of content). Thus, nodes can follow different strategies to speed-up the discovery and transmission by "looking-up" content in decentralized trackers and delegating the download of content to near supernodes. - -This RFC will leverage the "high-quality" infrastructure deployed by entities such as Pinata, Infura or PL. We need to acknowledge the existence of these "high-class" nodes and leverage them to improve the performance of the network. - -### Description - -Introduce in the network the concept of supernodes and decentralize trackers. - -- Supernodes are nodes with high bandwidth, low latency and a good knowledge of where to discover content in the network. Regular nodes would prioritize connection to super nodes as they will speed their file-sharing process. This could be seen as "decentralized gateways" in the network. - -- Decentralized trackers: Similar concept to the one of the "Hydra Boost". These nodes are passive nodes responsible for random walking the network for content and listening to WANT messages or any other additional announcement of metadata exchange devised for content discovery. - -Nodes would point decentralize trackers to speed their content discovery and supernodes (if one of them end up being the provider of the content) to increase the transmission. - -We could envision the use of side channel identifiers for content discovery, equivalent to "magnet links", which instead of pointing to the specific content, it points to the decentralized tracker that can serve your request better. These mangent links should be "alive" and update with the status of the network. Thus, we could have: - -- `/ipfs/` identifiers directly pointing to content. - -- `/iptrack/`: Points to the tracker that may node where to find the content. - -- Additionally, the tracker could answer with `[/p2p/Qm.., /p2p/Qm..]` with a list of supernodes that would lead to a faster download of the content. - -### Prior Work - -This is similar or can be linked to the [RFC: Side Channels aka DHT-free Content Resolution from this document.](https://docs.google.com/document/d/1QKso-VwYv9jLxTN7WP_RAArrOLCZwjqdjBKQA2wa3VY/edit#) - -This paper: [2Fast: Collaborative downloads in P2P networks](http://www.st.ewi.tudelft.nl/iosup/2fast06ieeep2p.pdf) proposes the idea of delegating the download of content to a group of nodes. We could consider the implementation of a "grouping scheme" for supernodes in which a node can request a group of supernodes to help him download content. This same grouping strategy could be considered for plain nodes as an independent RFC (combination of ideas presented in [RFCBBL207](./rfcBBL207) and [RFCBBL208](./rfcBBL208)). - -### Implementation Plan - -- [ ] Implementation of super-nodes and the download delegation protocol. - -- [ ] Implementation of decentralized trackers and magnet links protocol. - -- [ ] Evaluation of different discovery and transmission strategies using this network hierarchy. - -- [ ] Group of supernodes strategy. - -### Evaluation Plan - -- [The IPFS File Transfer benchmarks.](https://docs.google.com/document/d/1LYs3WDCwpkrBdfrnB_LE0xsxdMCIhXdCchIkbzZc8OE/edit#heading=h.nxkc23tlbqhl) - -### Impact - diff --git a/BEYOND_BITSWAP/RFC/rfcBBL203A.md b/BEYOND_BITSWAP/RFC/rfcBBL203A.md deleted file mode 100644 index 43c5953..0000000 --- a/BEYOND_BITSWAP/RFC/rfcBBL203A.md +++ /dev/null @@ -1,109 +0,0 @@ -# RFC|BB|L2-03A: Use of compression and adjustable block size -* Status: `Prototype` -* Implementation here: https://github.com/adlrocha/go-bitswap/tree/feature/rfcBBL203A -* Compression in libp2p: https://github.com/adlrocha/go-libp2p-compression-examples - -## Abstract -This RFC proposes the exploration of using compression in block transmission. These techniques go from: -Block by block standard compression (e.g. gzip) -Whole transfer compression (e.g. when responding to a graphsync query, send all the blocks compressed) -Custom coding tables for sequences of bytes that appeared often (e.g. generate an Huffman table for all the protobuf headings so that these are compressed by default, like hpack does for http) - -Additionally, to optimize the use of these schemes, a system of adjustable block sizes and coding strategies in transmission could be devised (e.g. dynamic Huffman tables). - - - - - -## Shortcomings -Blocks in IPFS are exchanged without the use of compression, this is a huge opportunity loss to minimize the bandwidth footprint and latency of transferring a file. For context, even minimal web assets are transmitted compressed through HTTP to increase website loading performance, most of them are below 256KiB, which is IPFS default block size. We expect to see several gains in transmission times. - -## Description -Current implementation of file-sharing protocols may benefit from the use of on-the-fly compression to optimize the use of bandwidth and optimize the transmission of content. -Even more, when using the “Graphsynced” approach in the discovery of content, where we request peers for the level of fulfillment of an IPLD selector, we can request all the blocks for the IPLD selector to be compressed in the same package and forwarded to the requestor. - -Some of the compression approaches to be explored in this RFC are: -* Block by block standard compression (e.g. gzip): Every block (and optionally every single Bitswap message) is compressed. Get inspiration from web compression. -* Whole transfer compression: All the blocks requested by a peer in a Wantlist or a graphsync IPLD selector are compressed in the same package. -* Custom coding tables for sequences of bytes that appeared often (e.g. generate a Huffman table for all the protobuf headings so that these are compressed by default, like hpack does for http). -* Use of “compressed caches” so that when a specific content has been identified as “regularly exchanged”, instead of having to compress it again it can be retrieved from the cache. This scheme may not be trivial. -* Use of different compression algorithms. -* Use of different block sizes before compression. - -## Implementation plan -- [x] Perform a simple test to evaluate the benefits of "on-the-fly" compression on blocks (to determine if IPFS could benefit from directly exchanging compressed messages and blocks). Evaluate different compression algorithms used in the web. - - - [x] Evaluate the compression of full Bitswap messages (`bs.compressionStrategy = "full"`): To achieve this we add a compression flag in [Bitswap messages](https://github.com/adlrocha/go-bitswap/blob/master/message/message.go) to be able to identify when messages are compressed. Afterwards, if compression is enabled we need to [compress the message](https://github.com/adlrocha/go-bitswap/blob/d151875a94048c3db59de52b9cb99d0246d74613/network/ipfs_impl.go#L240) before sending it. Compressed messages are identified in the [newMessageFromProto](https://github.com/adlrocha/go-bitswap/blob/d151875a94048c3db59de52b9cb99d0246d74613/message/message.go#L199) of receiving peers, they are uncompressed and processed seamlessly by Bitswap. In order to open the door to the use different compression algorithms and different full-message compression strategies a compressionType has been added to [message.proto](https://github.com/adlrocha/go-bitswap/blob/master/message/pb/message.proto). - - - [x] Evaluate the compression of blocks only (`bs.compressionStrategy = "blocks"`): We compress each block before adding it to the protobuf message in [ToProtoV1](https://github.com/adlrocha/go-bitswap/blob/d151875a94048c3db59de52b9cb99d0246d74613/message/message.go#L583) function of message.go, and then uncompress them in [newMessageFromProto](https://github.com/adlrocha/go-bitswap/blob/d151875a94048c3db59de52b9cb99d0246d74613/message/message.go#L199). For the compression of blocks, the only thing that is changed for the transmission of the block is the RawData, the CID is kept without change so the block is conveniently identified. - - - [x] Use [GZip](https://golang.org/pkg/compress/gzip/) as the default compression algorithm (`engine.compressor = "Gzip"`). - - - [x] Instead of compressing fields of the protobuf message, evaluate the compression of the full stream in the [bitswap network](https://github.com/adlrocha/go-bitswap/blob/d151875a94048c3db59de52b9cb99d0246d74613/network/ipfs_impl.go). - * We may choose to use a multicodec to signal that a stream is compressed and evaluate the fact that instead of using a prefix to signal the size of sent messages, in order to be able to leverage streams, use multicodec and `KeepReading` and `EndOfStream` signals in protocol streams so there is no need to know the size of the compressed message beforehand. - - - [ ] Evaluate other compression algorithms (Brotli and gzip are the best alternative, but in case we want to test with other algorithms): - - - [ ] [ZDAG](https://github.com/mikeal/zdag) Blocks - - - - - [ ] Brotli compression (No Golang implementation, [incomplete implementation](https://github.com/dsnet/compress)) - - - [ ] Compare computational footprint of above implementations - -- [ ] Design and evaluate a simple scheme to "gather" WANT requests and create fully compiled/network coded responses to the requestor. This involves several tasks - - - [ ] A way of matching several blocks with a request (graphsync, wantlist). - - - [ ] Perform the compression operation. This may be computationally expensive and would need some time, and depending on the data, when the prepared response is ready to send, the requestor may have already received all the blocks conforming his desired content. - -- [ ] Evaluate how the use of different block sizes and compression may benefit performance. - -- [ ] Include a "compression parameter" in exchange requests to signal peers that you want blocks to be transmitted using a specific compression technique. - -- [ ] From the preliminary tests performed after the above implementations, evaluate if the protocol could benefit from the use of Huffman tables and compressed caches. - -## Implementation details - -* Block compression: Files within Bitswap are exchanged in the form of blocks. Files are composed of several blocks organized in a DAG structure (with each block having a size limit of 256KB). In this compression approach, we compress blocks before including them in a message and transmitting them to the network. -* Full message compression: In this compression strategy instead of only compressing blocks we compress every single message before sending it. It is the equivalent of compressing header+body in HTTP. -* Stream compression: It uses compression at a stream level, so every byte that enters a stream from the node to other peers is compressed (i.e. using a compressed writer). - -* To drive the compression idea even further, we prototyped a `Compression` transport into libp2p (between the `Muxer` and the `Security` layer) so that every stream running over a libp2p node can potentially benefit from the use of compression. This is a non-breaking change as the `transport-upgrader` has also been updated to enable compression negotiation (so eventually anyone can come with their own compression and embed it into libp2p seamlessly). Some repos to get started with compression in libp2p: - - Compression example: https://github.com/adlrocha/go-libp2p-compression-examples - - Gzip compressor: https://github.com/adlrocha/go-libp2p-gzip - - Testbed to test compression over IPFS: https://github.com/adlrocha/beyond-bitswap/tree/feat/compression - -[See a discussion on the results here](https://github.com/protocol/ResNetLab/issues/5). - - -# Impact -A reduction of latency due to compressed transmissions. Potential increase in computational overhead. - -## Evaluation Plan -- [The IPFS File Transfer benchmarks.](https://docs.google.com/document/d/1LYs3WDCwpkrBdfrnB_LE0xsxdMCIhXdCchIkbzZc8OE/edit#heading=h.nxkc23tlbqhl) - -- See the computational footprint of different compression strategies and algorithms. - -- Compare the data sent and received using compression and with baseline Bitswap. - -## Prior Work - -This RFC takes inspiration from: -* [Dropbox’s work on compression](https://dropbox.tech/infrastructure/-broccoli--syncing-faster-by-syncing-less) -* [HPACK](https://blog.cloudflare.com/hpack-the-silent-killer-feature-of-http-2/) -* [HTTP Compression](https://developer.mozilla.org/en-US/docs/Web/HTTP/Compression) -* [Choose best compression algorithm assisted by AI](https://vks.ai/2019-12-05-shrynk-using-machine-learning-to-learn-how-to-compress) -* [Thorough benchmark of different GZip modes](https://www.rootusers.com/gzip-vs-bzip2-vs-xz-performance-comparison/) - - -## Results -The results for the implementation of this RFC were reported here: https://research.protocol.ai/blog/2020/honey-i-shrunk-our-libp2p-streams/ - -## Future Work -- If the use of exchange requests and the negotiation phase for content transmission (RFC | BB | L1/2-01) is implemented, it makes sense that once identified a specific peer (or a group of them) as the ones storing a large number of the desired blocks, to request more advanced compression and network coding techniques for their transmission. - -- Detect the type of data being exchanged in blocks and apply the most suitable compression for the data type, such as [image-specific compression ](https://developers.google.com/speed/webp/docs/compression)if images are being exchanged (for this approach, a node will need to have all the blocks for the data). diff --git a/BEYOND_BITSWAP/RFC/rfcBBL203B.md b/BEYOND_BITSWAP/RFC/rfcBBL203B.md deleted file mode 100644 index db06105..0000000 --- a/BEYOND_BITSWAP/RFC/rfcBBL203B.md +++ /dev/null @@ -1,65 +0,0 @@ -# RFC|BB|L2-03B: Use of network coding and erasure codes. -* Status: `Brainstorm` - -### Abstract - -This RFC proposes the exploration of applying network coding and erasure codes to the content exchanged by peers. These techniques go from: -- The use of erasure codes in the transmission of blocks so they can be requested from different sources, and the original content can be regenerated even without the reception of all the blocks. -- The use of rateless codes to make all blocks for a specific content equally valuable. -- The use of erasure codes for storage (such as Reed Solomon). - -These techniques could lead to additional improvements by including a negotiation phase in the exchange interface (see [RFC|BB|L1/2-01](./rfcBBL1201)). - -### Shortcomings - -In order to recover the content requested, peers need to receive every block of the content's DAG. This means that if just a single block is lost, is too rare, or it is not in the network anymore, it can lead to increased transmission times or in the worst case making the content "unretrievable". The use of erasure coding and network coding can benefit the discovery and transmission of blocks (especially if they are rare), making the content exchange more resilient to unforeseen events. These techniques also improve the transmission of content from several sources. - -This RFC becomes really interesting in networks with high churn and large files. The aim is to parallelize the transmission from different sources. - -### Description - -Several nodes may receive complementary WANT messages from different connected peers. Instead of requesting the content from just one source, or explicitly requesting it from all of them potentially producing duplicates in the network, we could benefit from the use of network coding to enhance the transmission from the multiple sources. - -We can really benefit from the fact that more than one peer may store the content exploring the use of techniques such as: - -- The use of erasure codes and network coding in the transmission of blocks so they can be requested from different sources and the original content can be regenerated even without the reception of all the blocks. Peers can send a linear combination of coded blocks so that the requestor is able to recover the content even if it doesn't receive all the original blocks. This can lead to improvements in transmission and the removal of duplicates in the network (the redundancy and linear combination used in block transmission can be related to the amount of duplicates and the split factor used by sessions). - -- The use of rateless codes to make all blocks for a specific content equally valuable. If several sources serve the content coded using rateless code, every block is equally valuable, and as long as a minimum number of them are received, the content can be recovered. - -- The use of erasure codes for storage (such as Reed Solomon). It adds a storage overhead but allows to regenerate the original content even if all the blocks are not retrieved. The proposal is to store blocks using their original CID (so their identifier doesn't change) but use Reed Solomon to code the content. This would increase the size of blocks, and poses several limitation on the codes to use to generate the Reed Solomon redundancy. - -Using the aforementioned techniques, several seeders fulfilling the request for content would be able to encode blocks and stream them so peers can receive blocks from different sources and reconstruct the original content once a minimum number of blocks have been received. This is a good way of parallelizing the transmission of blocks from different sources before [RFC|BB|L1/2-01](./rfcBBL1201). A problem to be solved to implement this RFC is how to orchestrate peer serving the request (the linear coding applied to the content needs to be deterministic). With RFC | BB | L1/2-01 more complex requests for blocks could be performed. - -### Prior Work - -This RFC takes inspiration from: - -- [This paper](https://www.mdpi.com/2076-3417/10/7/2206/htm) - -- Rateless coding. Check [this document](https://docs.google.com/document/d/1PdfuPZs5ti7u67R9p4lZl_JFBzk477CjmruiWbLQr4U/edit#heading=h.lrqjoh4tz0t6) and [Petar's paper](http://www.scs.stanford.edu/~dm/home/papers/maymounkov:rateless.pdf) for inspiration. - -- HackFS project on [Reed Solomon over IPFS](https://github.com/Wondertan/go-ipfs-recovery). - -### Implementation Plan - -- [ ] Evaluate potential improvements and overhead of using [IPFS Recovery](https://github.com/Wondertan/go-ipfs-recovery). - -- [ ] Evaluate the use of rateless coding (or alternatives not IP protected). With rateless codes we can generate check blocks from the content desired and requested from different nodes so that as long as we receive a minimum number of them we can generate the original information. This could potentially remove duplicates blocks. - -- [ ] If [RFC|BB|L1/2-01](./rfcBBL1201) ends up being implemented, more complex ideas could be evaluated at this end. Discovery and transmission would be two distinct stages, so nodes could eagerly request a compressed or networked coded transmission from a set of nodes. - -### Impact - -Improved transmission leveraging multiple streams, more reliable exchanges, and potential removal of duplicates in the network. - -### Evaluation Plan - -- [The IPFS File Transfer benchmarks.](https://docs.google.com/document/d/1LYs3WDCwpkrBdfrnB_LE0xsxdMCIhXdCchIkbzZc8OE/edit#heading=h.nxkc23tlbqhl) - -- Test case where there are several seeders with the same content and leechers are connected to several of them. - -### Future Work - -If the negotiation phase from [RFC|BB|L1/2-01](./rfcBBL1201) is implemented, additional communications between seeders and leechers could be performed to enhance the use of these techniques. Thus, if a peer receives an overlapping level of fulfilment for its request from different sources, it can trigger the use of network coding and rateless codes so that, with a minimum number of blocks from both of the sources, the requested content can be retrieved. - -Additionally, the use of "in-path" coding could be devised as future work, where intermediate nodes in a path upon the reception of several blocks for which fulfill the same request from different sources combine them to enhance the transmission (this requires further exploration). The impact of this improvement would significantly benefit [RFC|BB|L102](./rfcBBL102), where nodes can trigger relay session to request blocks on behalf of other nodes. \ No newline at end of file diff --git a/BEYOND_BITSWAP/RFC/rfcBBL207.md b/BEYOND_BITSWAP/RFC/rfcBBL207.md deleted file mode 100644 index 048dbc6..0000000 --- a/BEYOND_BITSWAP/RFC/rfcBBL207.md +++ /dev/null @@ -1,48 +0,0 @@ -# RFC|BB|L2-07: Request minimum piece size and content protocol extension -* Status: `Brainstorm` -* Implementation here: https://github.com/ - - - -## Abstract -This RFC introduces the concept of pieces as an indivisible aggregation of blocks. In order not to modify the underlying chunking and storage of blocks by IPFS, we propose the use of pieces as an aggregation of blocks. Pieces will have a unique identifier independent from those of their underlying blocks so that they can be accessed independently. Thus, if a piece is requested, only nodes having all of the blocks of the piece are allowed to perform the transmission. - - -## Shortcomings -IPFS block size of 256 KB favors deduplication but can harm the efficiency of content discovery and transmission. Evaluating different block sizes or the use of dynamic block sizes could benefit the performance of file-sharing in the network. - - -## Description - -Wanlist messages could include a "minimum piece size" parameter, specifying that only peers with enough blocks to fill a full piece should be allowed to answer with a HAVE message. Blocks are still stored using the same size, but this allows us to identify nodes that will serve us at least a certain amount of blocks. This can become really interesting once RFC | BB | L1/2-01 is implemented and in combination with RFC | BB | L2-03 so we can choose the piece size, and in accordance with this, select the best compression or network coding algorithm to be used in the transmission. - -We can introduce the concept of piece as an irreducible structure where underlying blocks for a piece are not assigned a CID so the piece is only identified by the root CID of the structure. - -- `/ipfs/`: Every block is identified by a CID. - -- `/ipfs/pc/`: Identifies a piece. Pieces can be seen as irreducible groups of blocks. Some nodes may store some of the blocks conforming the piece, and they can be requested directly through their CID. However, if a /ipfs/pc/ request we are signalling that only nodes storing the full piece should send the data. For large pieces this could lead for content to become rare in the network. Fortunately, you can always resort to finding blocks one by one through /ipfs/ identifier. Hence: - - - Add `/ipfs/pc/` content chunks data in pieces of the specific size, and chunks these pieces in different blocks. The add request sent to the network is /ipfs/pc/ for every piece, indicating that all the blocks conforming a piece should be stored in the same node. Others can store sub-blocks for the piece, but add operations for pieces are performed so that all the blocks are stored as a single data unit. - - - Requesting `/ipfs/pc/` finds full pieces before finding individual blocks pending. - - - If no one has the full piece, the node needs to increase the granularity of the request and search by blocks. This adds an additional layer of abstraction for content identification and discovery. - -This scheme would allow us to represent larger blocks of content without removing the benefits of a 256KB block. - -Linking with this idea, we could think of a multiblock system analogous to libp2p's multistream, where anyone could implement his own DAG/Block structure while the underlying structure used (CIDs, 4KB blocks) is maintained, the same way multistreams are built over TCP/UDP/QUIC or existing protocols. Hosts already know how to talk TCP, and they build protocols over it, here IPFS nodes know how to talk 4KB blocks and IPLD, but we allow the implementation of new schemes over this foundation. - -## Implementation plan -TBD - -# Impact - -## Evaluation Plan - -## Prior Work - - -## Results - - -## Future Work diff --git a/BEYOND_BITSWAP/RFC/rfcBBL208.md b/BEYOND_BITSWAP/RFC/rfcBBL208.md deleted file mode 100644 index 1ba3eee..0000000 --- a/BEYOND_BITSWAP/RFC/rfcBBL208.md +++ /dev/null @@ -1,33 +0,0 @@ -# RFC|BB|L2-08: Delegate download to other nodes (bandwidth aggregation) -* Status: `Brainstorm` - -### Abstract - -This RFC proposes the delegation of discovery and downloads to other nodes in the network with better capabilities than ours. Before triggering the download of a file, a node can send a TRANSMISSION_GRAFT message to other peers to request them to become part of its file-sharing cluster. Nodes in a file-sharing cluster search and download content in-line. - -### Shortcomings - -A node alone may have a hard time discovering and downloading all the blocks of a file, especially if it has limited network capabilities and it is trying to download large files. By inviting other nodes to be part of the transmission process, resources are aggregated and the processes can be parallelized. - -### Description - -Basic ideas to develop: - -- Nodes can ask other peers to become part of their cluster. -- Whenever someone in the cluster wants to get content, the list of blocks are distributed between peers in the cluster so each is responsible for the download of part of it. We can set a level of overlap between the blocks distributed to each peer so that even if a peer doesn't get all the blocks the original content can be recovered. -- When a peer downloads all its assigned blocks, it opens a transmission channel with the requestor and directly sends the downloaded blocks. -- Clusters may be created on-demand (a peer requests to build a cluster for a specific file), or a "default cluster" may be created by default according, for instance, to the existing GossipSub mesh a peer belongs to (following a similar approach to [RFC|BB|L1-06: Content Anchors](https://github.com/protocol/ResNetLab/issues/6)). - -## Implementation plan - -# Impact - -## Evaluation Plan - -## Prior Work -* This RFC can leverage (or even be combined with) the work done in [RFCBBL102](./rfcBBL102) where a TTL was added in Bitswap messages so nodes can discover and request content on behalf of other nodes. -* A similar idea to this one was also discussed in [this issue](https://github.com/ipfs/notes/issues/386. - -## Results - -## Future Work \ No newline at end of file diff --git a/BEYOND_BITSWAP/RFC/template.md b/BEYOND_BITSWAP/RFC/template.md deleted file mode 100644 index d391bef..0000000 --- a/BEYOND_BITSWAP/RFC/template.md +++ /dev/null @@ -1,23 +0,0 @@ -# RFC|\: \ -* Status: `Draft` -* Implementation here: https://github.com/adlrocha/ - -## Abstract - - - -## Shortcomings - -## Description - -## Implementation plan - -# Impact - -## Evaluation Plan - -## Prior Work - -## Results - -## Future Work diff --git a/README.md b/README.md index 50af7de..a7b5ad8 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ The lab's genesis comes from a need present in the IPFS and libp2p projects to a - Hydra Booster - Gossipsub v1.1 - drand -- [Beyond Bitswap](BEYOND_BITSWAP) +- [Beyond Bitswap](https://github.com/protocol/beyond-bitswap) - P2P Observatory ### RFPs From ae3464dfb1a1901925194a9a4c79f35b4422ad5d Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Tue, 19 Jan 2021 08:38:17 +0100 Subject: [PATCH 08/34] Update HETEROGENEOUS_RUNTIMES.md --- OPEN_PROBLEMS/HETEROGENEOUS_RUNTIMES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OPEN_PROBLEMS/HETEROGENEOUS_RUNTIMES.md b/OPEN_PROBLEMS/HETEROGENEOUS_RUNTIMES.md index 73ba5e9..15b4692 100644 --- a/OPEN_PROBLEMS/HETEROGENEOUS_RUNTIMES.md +++ b/OPEN_PROBLEMS/HETEROGENEOUS_RUNTIMES.md @@ -39,6 +39,8 @@ By the end of this research effort we should consider at least supporting the fo - Trusted Execution Environments - [Enarx](https://github.com/enarx/enarx/wiki/Enarx-Introduction) - [T-Rust](http://t-rust.com/#/): [TEA (Trusted Execution and Attestation)](http://t-rust.org/#/doc_list/What_is_TEA%3F%2FREADME.md) +- Risc-V architectures + - [go-ipfs on Risc-V](https://github.com/ipfs/go-ipfs/issues/7781). [Blog post](https://blog.davidburela.com/2020/11/16/ipfs-on-risc-v/) We may be able to support many of the aforementioned with the same protocol implementations (e.g. routing devices and embedded systems). This work will set a strong foundation for the rest of the projects to come. From 18b7a74e3f5b19b83d31096d3f27a2ebbc66ccf3 Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 10 Feb 2021 10:54:40 +0100 Subject: [PATCH 09/34] Create .gitkeep --- 3DM_RFC/.gitkeep | 1 + 1 file changed, 1 insertion(+) create mode 100644 3DM_RFC/.gitkeep diff --git a/3DM_RFC/.gitkeep b/3DM_RFC/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/3DM_RFC/.gitkeep @@ -0,0 +1 @@ + From 126accf67a93a0e3a7a6b364d8e856997bb68793 Mon Sep 17 00:00:00 2001 From: Yiannis Psaras <52073247+yiannisbot@users.noreply.github.com> Date: Fri, 12 Feb 2021 12:06:52 +0200 Subject: [PATCH 10/34] RIW2021_RFC_OS-level OppNet Component (#29) * Create RIW2021_RFC_OS-level OppNet Component.md * Aligning terminology Retrieval Miner -> Provider * Apply suggestions from code review Co-authored-by: David Dias --- .../RIW2021_RFC_OS-level OppNet Component.md | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 3DM_RFC/RIW2021_RFC_OS-level OppNet Component.md diff --git a/3DM_RFC/RIW2021_RFC_OS-level OppNet Component.md b/3DM_RFC/RIW2021_RFC_OS-level OppNet Component.md new file mode 100644 index 0000000..31350db --- /dev/null +++ b/3DM_RFC/RIW2021_RFC_OS-level OppNet Component.md @@ -0,0 +1,69 @@ +# RIW2021 | RFC: OS-level OppNet Component + +_Status:_ draft + +_Area of Improvement:_ Opportunistic Deployments + +_Estimated Effort Needed:_ + +_Prerequisite(s):_ + +_Priority:_ + +### Abstract + +Provide a uniform opportunistic networking interface for applications to register and use, in a way that preserves resources and guarantees benefits flow back to the user. The component would be responsible for optimising the resources allocated to connect with nearby devices in a horizontal manner across different applications. + +### Construction + +- OS-level provider (think COVID contact tracing service provided by Android and iOS) + - Avoid having multiple always-on opportunistic clients, one for each application (fragmentation & waste of resources) + - Guarantees benefit flows to the user vs. the application developer + - Sidesteps restrictions on background applications + - Applications register with OS provider +- It should be as invisible as possible, requiring little intervention/configuration by user + - But the OS could proactively prompt users for help distributing specific content given need and revenue opportunity +- Use local information (e.g. calendar events with location) to decide which information to fetch and store + - Look at upcoming locations and declared interests in said locations + - Leaks minimal data; does not require sharing of contact or location data by opportunistic Provider nodes + +**Open Questions** +- How do you predict what data will be desirable? +- How do you cross the border with this information? + - Data is not encrypted to destination (that would limit efficiency). You could encrypt in-transit or time lock but is that sensible/sufficient? +- How do you communicate said interests in a privacy-preserving way? +- How do you accommodate network needs while avoiding tracking? + +- Would the data be stale by the time it gets there? + - If based on your calendar, this can easily be prevented by having timed interests +- Could machine learning help? +- Does the OS have the concept of CID? Why do it at OS level? + - Android or iOS modules, not POSIX API + - Intended to circumvent OS restrictions on BG activity and guarantee user benefit + - Getting this into a mobile OS seems pretty hard, given complexity and resource requirements. Would require a critical mass so that they can’t ignore it, i.e. bootstrapping problem + +### Impact + +The proposed component would provide benefit to the performance of any opportunistic networking application and therefore, its impact would be significant. However, it is not an add-on software component, or application and would therefore need to be adopted (or perhaps even developed) by the OS vendor(s). + +### Pros and Cons + +Pros: +- The construction would provide performance benefits at the device level. +- The construction would be useful to many applications and could work simultaneously to serve all of them +Cons: +- It’s not an add-on software component and would therefore have to be integrated within the multiple OSes, i.e., OS vendors would have to accept it +- Not something that PL could implement, or make as a product + +### Implementation notes + +TBA + +### Evaluation + +Compare performance benefit of one OS-level component that serves horizontally several applications, against several applications with their own component. + +### Prior work + +TBA + From cb88c90e02656345280c53db121a5a0bfc2c49af Mon Sep 17 00:00:00 2001 From: Yiannis Psaras <52073247+yiannisbot@users.noreply.github.com> Date: Fri, 12 Feb 2021 12:07:04 +0200 Subject: [PATCH 11/34] RIW2021_RFC_On-Demand Opportunistic Resource Deployment (#28) * Create RIW2021_RFC_On-Demand Opportunistic Resource Deployment.md * Aligning terminology: Retrieval Miner -> Provider --- ...emand Opportunistic Resource Deployment.md | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 3DM_RFC/RIW2021_RFC_On-Demand Opportunistic Resource Deployment.md diff --git a/3DM_RFC/RIW2021_RFC_On-Demand Opportunistic Resource Deployment.md b/3DM_RFC/RIW2021_RFC_On-Demand Opportunistic Resource Deployment.md new file mode 100644 index 0000000..ac99399 --- /dev/null +++ b/3DM_RFC/RIW2021_RFC_On-Demand Opportunistic Resource Deployment.md @@ -0,0 +1,63 @@ +# RIW2021 | RFC: On-Demand Opportunistic Resource Deployment + +_Status:_ < draft > + +_Area of Improvement:_ < Opportunistic Deployments > + +_Estimated Effort Needed:_ + +_Prerequisite(s):_ + +_Priority:_ + +### Abstract + +The goal of the proposal discussed here is to match supply to demand peaks by deploying resources around specific needs, on-demand. We can think of this as a swarm of collocated users that are “called in” when demand for storage or bandwidth increases. A potential extension could be plug-n-play devices (e.g., Raspberry Pis) that run dedicated webapps to serve local demand. + +### Construction + +- Two user categories: (i) users with resources but not full Provider nodes; (ii) Provider nodes that only aim to provide short-term service driven by high/profitable demand. +- A potential third user category would be plug-n-play devices, such as Raspberry Pis that run dedicated software/webapps and can provide support for local demand, when plugged in. +- There is no mobility issue in this scenario. The main concern is how to incentivise the deployment of capacity to address specific local surges in demand (not unlike Uber surge pricing). +- Requires some infrastructure to distribute information related to real demand (not publisher requests). Could be a gossip market of deals. + +**Open Questions** + +- How do we price short-term needs? (out of scope of this RFC) +- What are the steps to advertise as a provider? +- How does someone analyse the network to determine needs? +- How does a Provider recruit, or “call-in” devices on demand? Do they listen to some channel constantly and “wake-up” when they receive some specific beacon? +- What are example applications here? + - Are floating-content applications applicable? + - Is message propagation in disaster-scenarios applicable? +- Can we listen to existing CID requests? +- Is there a way to provide advance information, pre-empt actual needs? + - This would need to be vetted +- This service has customers: clients and publishers. If publishers pay, it’s easy to call Providers to the event. + +### Impact + +It would be nice to have “pop-up” capacity on-demand. Many interesting applications can be built on top, such as floating content-like applications, message propagation in disaster scenarios, where the network is down, or even “local social networks” in large events. + +### Pros and Cons + +Pros: +- Applies to several use-cases where it can enable communication and applications that are not possible today. + +Cons: +- Tricky to implement: how would devices be “called in”? +- Difficult to integrate an economic model into this. The return for users being “called in” every once in a while will be minimal and therefore, users will likely not bother. It could apply in cases where there is a real need (e.g., disaster), or a common spirit/vision (e.g., football club/stadium) + +### Implementation + +Implementation through different wireless media (e.g., WiFi Direct vs Bluetooth) need to be investigated. There are different performance limitations by using each one of them + +### Evaluation + +Evaluate how quickly can a swarm of on-demand devices be formed and start contributing to the network. + +### Prior work + +[Composable Distributed Mobile Applications and Services in Opportunistic Networks](http://www.netlab.tkk.fi/~jo/papers/2018-06-wowmom-composable-apps.pdf) + + From d09555a6eb8ac643bf8901d08a3708a6eb4a55cd Mon Sep 17 00:00:00 2001 From: Yiannis Psaras <52073247+yiannisbot@users.noreply.github.com> Date: Fri, 12 Feb 2021 12:07:14 +0200 Subject: [PATCH 12/34] RIW2021_RFC_Hybrid CDN with Recruiter Miners (#27) * Create RIW2021_RFC_Hybrid CDN with Recruiter Miners.md * Update RIW2021_RFC_Hybrid CDN with Recruiter Miners.md * Aligning terminology Retrieval Miners -> Providers --- ...RFC_Hybrid CDN with Recruiter Providers.md | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 3DM_RFC/RIW2021_RFC_Hybrid CDN with Recruiter Providers.md diff --git a/3DM_RFC/RIW2021_RFC_Hybrid CDN with Recruiter Providers.md b/3DM_RFC/RIW2021_RFC_Hybrid CDN with Recruiter Providers.md new file mode 100644 index 0000000..daa4e4c --- /dev/null +++ b/3DM_RFC/RIW2021_RFC_Hybrid CDN with Recruiter Providers.md @@ -0,0 +1,61 @@ +# RIW2021 | RFC: Hybrid CDN with Recruiter Providers + +_Status:_ < draft > + +_Area of Improvement:_ < Opportunistic Deployments > + +_Estimated Effort Needed:_ + +_Prerequisite(s):_ + +_Priority:_ + +### Abstract + +Provider nodes recruit storage from local, ephemeral devices (laptops and desktops) to increase their storage footprint. The target is not to save on aggregate storage or bandwidth of the RM - in some cases the RM might have to use more bandwidth if they act as relays. The target is to discover local content, where available and serve it locally. The proposal also has the potential to save on concentrated bandwidth and request-handling load. + +This proposal is similar to the [“Consume Global, Serve Local”](https://github.com/protocol/ResNetLab/pull/26) RFC. + +### Construction + +We consider a Hybrid-CDN-like architecture, where Providers act as the centralized controllers orchestrating all the devices in their surroundings (or directly connected to them). When peer A is looking for some content, it sends the request to its local Provider. The Provider answers with a list of peers storing the content. These peers may be other RMs, or opportunistic deployments that RM knows are near peer A. Peer A then requests the retrieval of the chunks of content to any of these peers. A Bitswap-like protocol may be used for these retrievals. Instead of directly sending the request to a local Provider node, peer A can send in parallel requests to devices in their local area network. Additionally, in the RM response, there is always some fallback Provider with a hot copy of the content for the case when the opportunistic deployments storing the copy are not connected anymore. + +Devices can build resource reputation by testing QoS specifying different permutations of the chunks to each peer, so as to optimize expected time to completion. + +Ideally, nodes would be opportunistically trading data (and micropayments) with their spatial neighbors in a way that maximizes their EV (of reselling data and of coins) +We may need a way to do offline micropayments. + +**Open Questions** + +- We may need a way to do offline micropayments for the cases where devices are only locally connected to each other. +- Should we be concerned about privacy? +- How is the model affected by device mobility and churn? + +### Impact + +Recruiting every-day user devices to serve in the 3DM is a big win as we really achieve the goal of low-resource devices participating, contributing and being rewarded by the network. The impact can be huge. + +### Pros and Cons + +Pros: +- The idea of having everyday devices participating in the network is super impactful and interesting +- Performance and capacity of the network will increase dramatically, if users are given the right incentives + +Cons: +- Privacy may become an issue +- Limitations such as “only requested content is cached to a node’s storage” need to be lifted in order for the scheme to scale and be successful. +- The cryptoeconomic model is challenging. +- NAT traversal needs to have a solution for the scheme to be viable. A simple solution is for “recruited” devices to keep a permanent connection open with the client + +### Implementation notes + +- Privacy needs to be looked at +- NAT traversal needs to have a solution for the scheme to be viable. A simple solution is for “recruited” devices to keep a permanent connection open with the client + +### EValuation + +TBA + +### Prior Work + +TBA From 063d4560e313a12d1b5d72d72fdf8284ecab5d37 Mon Sep 17 00:00:00 2001 From: Yiannis Psaras <52073247+yiannisbot@users.noreply.github.com> Date: Fri, 12 Feb 2021 12:07:26 +0200 Subject: [PATCH 13/34] RIW2021_RFC_Consume Global, Serve Local (#26) * Create RIW2021_RFC_Consume Global, Serve Local.md * Aligning terminology: Retrieval Miner -> Provider --- ...RIW2021_RFC_Consume Global, Serve Local.md | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 3DM_RFC/RIW2021_RFC_Consume Global, Serve Local.md diff --git a/3DM_RFC/RIW2021_RFC_Consume Global, Serve Local.md b/3DM_RFC/RIW2021_RFC_Consume Global, Serve Local.md new file mode 100644 index 0000000..195b086 --- /dev/null +++ b/3DM_RFC/RIW2021_RFC_Consume Global, Serve Local.md @@ -0,0 +1,95 @@ +# RIW2021 | RFC: Consume Global, Serve Local + +_Status:_ < draft > + +_Area of Improvement:_ < Opportunistic Deployments > + +_Estimated Effort Needed:_ + +_Prerequisite(s):_ + +_Priority:_ + +### Abstract + +This RFC addresses the use case of heavy content distribution (ideally video) in local neighborhood environments, where the Provider node is connected to residential users. The content catalogue of a service (say Netflix or the national broadcaster) is split in chunks and stored in end-user home devices. The Provider is connected to a critical mass of tens of thousands of local users and redirects requests to serve content locally. + +### Setup & Assumptions + +- Picture the environment where the ISP’s DSLAM/GPON is connected to ~20k-40k houses. Now, replace the ISP’s DSLAM/GPON with the Provider node's gear +- Consider a content publisher (e.g., Netflix, or local national broadcaster) who has a video content catalogue. +- The videos are split in chunks and stored in the residential premises. This can be in user devices (laptops, desktops), wifi APs or set top boxes. +- Depending on what user devices we consider, the connections can be quite stable, but we still consider the environment opportunistic, as users might disappear, stop serving content, or unplug things from mains. +- The Provider would need to have random access to the content, content would need to be in small chunks so that it is served from several users and avoid saturating one user’s uplink. Erasure coding can help with collecting pieces from several peers. + + +### Construction + +1. Clients request content to their local Provider by CID. +2. The Provider keeps track of which users store what content (identified by CID). +3. The Provider redirects requests to the users that store the requested CID +4. Users return content to the client through the Provider. +5. Given that the Provider sees all the content flowing through itself, it can judge whether the user’s uplink is saturated and redirect to other users (if available), or apply DASH to reduce the rate. + - If the users are within WiFi proximity of each other, they can connect directly. + - The transfer can avoid going through the overlay Provider and connect directly through the ISP’s infrastructure, but in this case, the Provider will not be able to monitor, adjust rate and learn about new peers that have replicated the content. It is not clear how much faster the direct connection can be. +6. If neighbours can support the requesting user’s HD, then all good, but if not, the client connects back to the main server or higher-tier Provider. This is monitored by the Provider who can make the decision whether to continue streaming by the local peer, or go to a higher-tier Provider. +7. The local Provider can keep local copies of very popular content. + - When edge node saturation reaches “critical mass”, the Provider node no longer needs to store if kept in higher order cache (ie: Europe -> Germany -> Neighborhood/City) + - The Provider can assess rate of delivery, and then determine better options + - Ie: netflix dropping quality from 1080p to 480p for faster delivery + + + +- Both Providers and end-users serving content should be rewarded and therefore supported in the cryptoeconomic model. +- What if peers cut the Provider out of the loop? + - They will likely experience reduced quality, as the Provider is not able to monitor and adjust + - [Wi-Stitch](https://dl.acm.org/doi/10.1145/3098208.3098211) paper is related. + +### Pros and Cons + +Pros: +- Product-oriented solution that is easily implemented in a content-addressable network +- Provides huge bandwidth savings and benefits to ISPs +- Decreases load and delivery times for end-users +- Decreases storage and delivery costs for the content publisher + +Cons: +- Privacy issues not solved in current RFC +- Upload bandwidth saturation needs to be avoided and a smart algorithm plus evaluation needed for that +- Unclear where the Provider node should be located in the network topology + +### Implementation notes + +- Metering and trust model + - We can consider a model where the original content publisher (e.g., netflix) gets notified by the application itself, when the user clicks ‘play’. This helps a lot with accounting. + - How about accountability and the fact that the Provider or other content publishers/caches can send random bits? The original publisher could provide a key to decrypt the content, or check the hash of the whole content, or some random parts of it or some combination. + - QoS can be checked by the client-side media player. The above technique with “surprise checks” can also be done to check if content is delivered timely. + +- Connectivity and bandwidth + - Clients connect to a provider, who has deployed a cluster of nodes and the question is how do clients get connected to their neighbours. + - Through the Provider who is connected to everyone. + - Preconfiguration of local peers with the local Provider node. + - How can app developers control the rate? How does the switchover happen, when my neighbours’ bandwidth is not enough to serve HD video requests? + +- Privacy + - Opportunistic setups are not privacy-friendly, generally speaking. Neighbours can see what one is requesting. + - There are simple encryption techniques that are not super strong, but can make things better. + - Another idea is to hash the hash of the content, as has been discussed for IPFS denylists. + +### Evaluation + +- Upload capacity of users should not be saturated. Evaluation is needed to identify at which point QoS suffers +- Assess erasure coding based approaches and their benefits to avoid saturation of uplink +- Time to First Byte compared to a traditional CDN setup + + +### Prior work + +- Suh, K., Diot, C., Kurose, J., Massoulie, L., Neumann, C., Towsley, D., Varvello, M., [Push-to-peervideo-on-demand system: Design and evaluation](https://ieeexplore.ieee.org/abstract/document/4395129?casa_token=QVwdZGNLekoAAAAA:WIbAVHxdIRvKRj1AY6AsamLcdvJwNSTP6oglwYLb1iRjg_QxxlivFdmUFjHQ7PjLEar9hUahFQ), IEEE Journal on Selected Areas in Communica-tions, 25(9), 2007. +- [WiStich](https://dl.acm.org/doi/10.1145/3098208.3098211) +- Amiri, M.M., Gündüz, D., [Fundamental limits of coded caching: Improved delivery rate-cache capacitytradeoff](https://ieeexplore.ieee.org/abstract/document/7782423?casa_token=nq0PcmikCKAAAAAA:kAgWYU8gjIm2wiIRgrbOHquPzsfcCGBuX4pgqzZ97rWYq0aSwjSlFYNzyOnFyVxPchj134lcGQ), IEEE Transactions on Communications, 65(2):806–815, 2017. +- Anjum, N., Karamshuk, D., Shikh-Bahaei, M., Sastry, N., [Survey on peer-assisted content delivery networks](https://www.sciencedirect.com/science/article/pii/S1389128617300464), Computer Networks, 116:79–95, 2017. +- Shanmugam, K., Golrezaei, N., Dimakis, A.G., Molisch, A.F., Caire, G., [Femtocaching: Wireless content delivery through distributed caching helpers](https://ieeexplore.ieee.org/abstract/document/6600983?casa_token=kLqwrjL-QDAAAAAA:kBs_OkhEFTMoByEoCKXqUM_EKojv_GgV27VC2hdwz7YlLl3T6ggjDAR-G-D1Zx3MYREzIIFdpg), IEEE Transactions on Information Theory,59(12):8402–8413, 2013 + + + From 028f58bdec2943c95433a230fed477768575a88d Mon Sep 17 00:00:00 2001 From: Yiannis Psaras <52073247+yiannisbot@users.noreply.github.com> Date: Fri, 12 Feb 2021 12:07:45 +0200 Subject: [PATCH 14/34] RIW2021_RFC_Name-based Request Forwarding for Nearest Replica Routing (#25) * Create RIW2021_RFC_Name-based Request Forwarding for Nearest Replica Routing.md * Update 3DM_RFC/RIW2021_RFC_Name-based Request Forwarding for Nearest Replica Routing.md Co-authored-by: Jacob Heun * Update 3DM_RFC/RIW2021_RFC_Name-based Request Forwarding for Nearest Replica Routing.md Co-authored-by: Jacob Heun * Aligning terminology Retrieval Miner -> Provider Co-authored-by: Jacob Heun --- ... Forwarding for Nearest Replica Routing.md | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 3DM_RFC/RIW2021_RFC_Name-based Request Forwarding for Nearest Replica Routing.md diff --git a/3DM_RFC/RIW2021_RFC_Name-based Request Forwarding for Nearest Replica Routing.md b/3DM_RFC/RIW2021_RFC_Name-based Request Forwarding for Nearest Replica Routing.md new file mode 100644 index 0000000..2a0064d --- /dev/null +++ b/3DM_RFC/RIW2021_RFC_Name-based Request Forwarding for Nearest Replica Routing.md @@ -0,0 +1,76 @@ +# RIW2021 | RFC: Name-based Request Forwarding for Nearest Replica Routing + +_Status:_ < draft > + +_Area of Improvement:_ < Distribution Graph Forming > + +_Estimated Effort Needed:_ + +_Prerequisite(s):_ + +_Priority:_ + + +### Abstract + + +This RFC assumes that Provider nodes (i.e., those that store hot copies of content in the network) act as routers for requests. It also assumes that every client is connected to one or more Provider nodes to which they forward their requests. Content is explicitly named by CID. Every Provider declares and serves some network prefix. Progressively, these prefixes form the topology. Content items are initially pegged to the network location of their publisher, e.g., /de/berlin/my-cid, but nothing prevents other Providers from serving content with any name, achieving nearest-replica routing. + +### Proposal/Construction + +- A Provider is seen as an entity that covers some geographic area, somewhat similar to a DNS server. It is the entry point of the clients to the Filecoin network. + - More than one Provider can serve some geographic area, either split between the Providers, or in some hierarchical manner, where the initial Provider is a higher-tier Provider node for the rest of the Providers. + - Example: the first Provider node deployed in Germany declares the prefix “/de” as their service area. Other Providers joining the system can then start serving “/de/berlin/”, “/de/munich/” etc. +- A client should ideally be connected to more than one Provider node. +- Every Provider keeps a record of: i) all the content they store locally, ii) the content items they have heard about in terms of their CID, as well as iii) “where did they hear the content from” (defined similarly to a forwarding network interface of a router, binding the full name of a content to the IP address of the Provider on that direction). + - Example: the Provider serving the network area /de/berlin/ sees request /de/munich/cid1. It forwards the request towards /de/munich/ and populates its routing table with: cid1 -> /de/munich/ | . +- Provider nodes are interconnected with each other in a mesh structure. Every provider node should be connected to at least one other provider node. The degree of connectivity is to be defined. +- When content publishers publish their content, they have to link it to the Provider in the geographic area where the content is stored. + - Example: content item with cid2 is published by a content publisher or a hosting company connected to the Provider node that serves the area /us/nyc/. The full network name of this CID is /us/nyc/cid2. + - The Provider itself can also store the content if the content publisher has a deal with the Provider directly. This does not change the model. + - The model does not prevent another Provider, say, /us/boston/ from storing and serving the content. The cryptoeconomic model needs to work out when and at which cost for the new Provider this should happen. +- If the Provider receives a request for a content item which it does not know, it forwards the request according to the prefixes it sees. + - Example: if the Provider for /de/berlin/ receives a request for /us/nyc/cid2, which it has never heard about, it does longest prefix matching on the request and forwards it accordingly. If it knows the IP address of the Provider in /us/nyc/ it directs the request there. If not, then it forwards to a Provider “listening”/serving the prefix /us/. If it doesn’t know any Provider serving prefix /us/, it will have to forward to its neighbours, the mechanism of which is to be determined. + - To avoid the above situation where a Provider does not know anyone serving some prefix, we can have a prerequisite that there is basic connectivity between all Providers serving top-level prefixes. Populating routing tables can be done in advance by a routing protocol. +- When routers see repeated requests for the same CID, they do not need to forward all of them towards the source. Instead, they can keep the request and, when they receive the content, they can forward it to satisfy all received requests. This way, the system can support a time-shifted multicast model, which can increase performance significantly, especially for heavy and popular content, e.g., popular HD video. + - The downside of this approach is that bandwidth requirements increase significantly if all traffic needs to travel through all Provider nodes where the request has been forwarded through. This will be the case for non-popular content and we expect to have a tradeoff, where after the tipping point the overall bandwidth spent by this approach is lower. + - An alternative is to follow the above approach (called symmetric routing) only after the request count for an object surpasses a threshold. Below that threshold, the request is forwarded through the graph of overlay Providers, but the actual data is transferred through a direct connection from the Provider to the client. +- A Provider that sees repeated requests for some particular CID can fetch, cache and serve the content. This behaviour should be encouraged by the cryptoeconomic model, as it will improve the performance of the network for popular content. + - Assuming the geo-localised connectivity of clients to Providers, we can assume that a client is always connected to a Provider that is less than $k$ms away (say $k=50ms$). + - Every content item is linked with a record that specifies: i) the price they have set in order to serve the item, and ii) the latency under which they can deliver it to the client (assuming a maximum of $k$ms one-way latency). + +### Impact + +If designed and implemented correctly, this scheme can provide significant performance benefits, especially for popular and heavy content. + +### Pros and Cons + +Pros: + +- Clean and relatively simple routing and forwarding model +- Can achieve nearest-replica routing, which will be very beneficial for popular content +- Can achieve time-shifted multicast, which can save a lot of bandwidth for heavy content + + +Cons: +- It’s a new design with little deployment and testing to date in real systems +- Security properties need to be seen carefully, as there haven’t been lots of studies, or experiences from previous deployments. +- It is not clear how accounting can work on top of this setup. + +### Implementation notes + +TBA + +### Evaluation + +- Evaluate the extra bandwidth requirement that symmetric routing is imposing into the system. +- Define the point where a switch between symmetric and asymmetric routing is the best option in terms of bandwidth consumption and delivery delay. +- Approximate the scalability of the system as the content catalogue of the entire network gets bigger. Routing tables might become too big, which will become non-viable for Providers. Can big routing tables be served from fast memory? +- Based on a content catalogue size, network size and a request distribution pattern, what is the probability of routers to receive requests where they have no information about any of the prefixes in the content name. +- Routing protocol for route setup and updates: how long does it take to propagate route prefixes. + +### Prior Work + +- The work is inspired in large parts from the [Named-Data Networking Architecture](https://dl.acm.org/doi/pdf/10.1145/2656877.2656887). +- Further optimisations for content delivery have been proposed at the [iCDN approach](https://dl.acm.org/doi/pdf/10.1145/3405656.3418716). +- The vast literature on the NDN architecture and supporting protocols can be very useful to find solutions to the challenges of the approach. From db8015c2969e49da9c95e989364a7a32dbf8bb36 Mon Sep 17 00:00:00 2001 From: Yiannis Psaras <52073247+yiannisbot@users.noreply.github.com> Date: Fri, 12 Feb 2021 12:07:58 +0200 Subject: [PATCH 15/34] RIW2021_RFC_Omniscient Routers (#24) * Create RIW2021_RFC_Omniscient Routers.md * Aligning Terminology: Retrieval Miners -> Providers --- 3DM_RFC/RIW2021_RFC_Omniscient Routers.md | 79 +++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 3DM_RFC/RIW2021_RFC_Omniscient Routers.md diff --git a/3DM_RFC/RIW2021_RFC_Omniscient Routers.md b/3DM_RFC/RIW2021_RFC_Omniscient Routers.md new file mode 100644 index 0000000..adc49d4 --- /dev/null +++ b/3DM_RFC/RIW2021_RFC_Omniscient Routers.md @@ -0,0 +1,79 @@ +# RIW2021 | RFC: Omniscient Routers + +_Status:_ draft + +_Area of Improvement:_ Distribution Graph Forming + +_Estimated Effort Needed:_ + +_Prerequisite(s):_ + +_Priority:_ + +### Abstract + +The core goal of this design is to give clients knowledge about where the hot copies of the content they are looking for are stored. The RFC builds on the premise that the entire content catalogue of provider records of the 3DM ecosystem will be in the order of TBs, hence, routers will be capable of storing it in its entirety. Given this assumption, the RFC explores mechanisms to support and optimise the distribution of record updates, as well as how the network forms. + +### Proposal/Construction + +We consider an architecture where clients connect to one of their local (or known) routers or Provider nodes. Routers are peers in the network with content routing information, who act as request forwarders. Provider nodes on the other hand are nodes that act as routers, but also store hot copies of content. In the context of this RFC, Providers are a subset of routers, although the role of routers has not been crystalised from the cryptoeconomic point of view, so eventually the role of a router might have to collapse into that of a Provider. In this RFC, we use the terms Provider and router interchangeably. + +Provider nodes and routers will always be looking to gather as much information as possible about content records, ideally storing information about all content records in the network in their local database. + +We assume that the required size to store the amount of records (i.e. hot copies of individual objects stored in the retrieval network) will be in the order TBs, so it is not unreasonable to think of a router keeping information about every single content record (in slow memory). Routers will look to have as much updated information about client records as possible, as in this way they would contribute to serving retrieval requests. In turn, being able to serve more retrieval requests means that the router will gather more information about popular content, which it could utilise to fetch and serve popular content from its own cache (hence, receive rewards). Routers will want to be in “the best path” for the content in order to have access to the reward. That said, the underlying retrieval economic model will be enough to incentivize routers to act honestly and keep their routing tables up to date. + +In order to minimize the required size of routing information, we propose using probabilistic set structures (such as bloom filters, cuckoo filters, or interactive protocols) to compress routing data and exchange it with other peers. For instance, peer A would build a bloom filter with a low probability of false positives representing all the content records he knows about, or knows how to reach. Peer A shares this with other peers, such as peer B. When peer B receives a request for CID1, it starts checking it against its own bloom filter, and the bloom filter of all the other peers from which it has received information. Routers will try to have as much information in their routing tables as possible, so finding a router with the routing information for a record should be straightforward. + +Alternative ways to spread provider records could include: +1. Routers share records with their x-hop neighbours, where x is a value that guarantees traffic remains manageable. +2. Routers keep a record for requests they serve only and progressively build as big a table as possible. +3. If names have hierarchical structure, then routers can only keep prefixes that point towards “network directions”, rather than keeping a separate full name entry per content. This enables name aggregation, hence, routing table scalability. + +Routers can update the freshness of their routing information in several ways: +- Through an “updates” pub-sub channel where routers exchange deltas over their routing structures to update the view of others. +- Inspecting the requests being forwarded to them by other peers. +- Using “keep-alive” messages to see if the content has expired. + +The flow of a client request with this scheme in place would be as follows: +1. The client sends the request to its local Provider node, which acts as the gateway to the retrieval network. +2. If this local content service has a hot copy for the content it directly serves it to the client. If on the other hand it has knowledge about who has a hot copy for the content in its routing table, it replies with the peer (or group of peers) with the copy (similar to what traditional CDN’s DNS systems currently do). +3. If the local content service doesn’t know where a peer is storing the content, it points to a bigger content service (other router with more information about content records). In this way, we try to recursively find the hot copies. +4. Once the client receives a response with a dialable peer storing a hot copy of the content, the retrieval starts, and the client metering comes into action. +5. Retrieval itself does not follow symmetric routing, i.e., the content does not flow through the Provider node/router that pointed to the hot copy. Optimisations here could include symmetric routing when a router/Provider receives multiple requests for the same content (i.e., time-shifted multicast). + +A name-based routing approach, based on hierarchical names could be an improvement here. + +### Impact + +This is an impactful proposal for two reasons: +1. It provides an easy (to conceptualise and implement) way to kickstart the 3DM network (i.e., all Provider nodes/routers know everything about every content object), which will be viable in the beginning. +2. It gives us a nice way to experiment with request forwarding through the network of Providers. There is a lot of optimisation that can be carried out afterwards, but having a working playground will be very valuable. + +### Pros and Cons + +Pros +1. Fast retrieval of content +2. Easy to implement +3. The network of Provider nodes becomes the 3DM graph itself, which makes performance optimisation easier, e.g., multicast can be easily implemented on top. + +Cons +1. Having symmetric routing on by default would increase bandwidth consumption of routers/Providers. +2. A lot of memory needed to keep provider records. +3. There is no backup solution for the case when the local Provider/router does not have the content and does not know anyone who has the provider record. The proposal mentions some hierarchical structure so that the request is forwarded to a parent cache, but this has to be better defined. + +### Implementation notes + +TBA + +### Evaluation + +- Size of routing table relative to the content catalogue size +- Bloom/Cuckoo filter efficiency evaluation +- Symmetric vs Asymmetric retrieval routing - what is the right point to switch between the two and what is the bandwidth overhead +- Pubsub protocol evaluation for content record propagation relative to the network size and the content catalogue +- Is the speed at which a record is served an issue? Given the size of the routing table, entries will have to be stored in slow memory. + +### Prior work + +N/A + From 1fe9f583570e4171fad3422be0caf5b45b4933ab Mon Sep 17 00:00:00 2001 From: Yiannis Psaras <52073247+yiannisbot@users.noreply.github.com> Date: Fri, 12 Feb 2021 12:08:03 +0200 Subject: [PATCH 16/34] RIW2021_RFC_Incentive alignment for collaborative routing (#23) * Create RIW2021|RFC: Incentive alignment for collaborative routing.md * Rename RIW2021|RFC: Incentive alignment for collaborative routing.md to 3DM_RFC/RIW2021_RFC_Incentive alignment for collaborative routing.md * Aligning Terminology: Retrieval Miners -> Providers --- ...ive alignment for collaborative routing.md | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 3DM_RFC/RIW2021_RFC_Incentive alignment for collaborative routing.md diff --git a/3DM_RFC/RIW2021_RFC_Incentive alignment for collaborative routing.md b/3DM_RFC/RIW2021_RFC_Incentive alignment for collaborative routing.md new file mode 100644 index 0000000..eae1a9b --- /dev/null +++ b/3DM_RFC/RIW2021_RFC_Incentive alignment for collaborative routing.md @@ -0,0 +1,84 @@ +# RIW2021 | RFC: Incentive alignment for collaborative routing + +_Status:_ draft + +_Area of Improvement:_ Distribution Graph Forming + +_Estimated Effort Needed:_ + +_Prerequisite(s):_ + +_Priority:_ + +### Abstract + +This proposal assumes that Provider nodes participate in the routing of requests in the network by creating paths from client to provider (or cache). The proposal builds (or rather suggests) an economic model to enable and incentivize Provider nodes to autonomously (but cooperatively) find solutions to improve network routing performance. For instance, all routers that forward a request to its destination get a portion of the reward back. + +### Proposal/Construction + +The core tenet of this proposal is that “if we have aligned incentives, good routing will follow naturally”. The ultimate target is to build a trustless mechanism to reach consensus on some appropriate global metric for network performance, and then everyone gets a “dividend” (from a block reward subsidy pool, for example, or out of a tax on transaction fees/value) proportional to that metric. + +A brief description of the construction goes as follows: + +- Routers keep routing information about how to route content. This is not defined in this proposal. +- Every client wanting to retrieve content from the Filecoin network is connected to a Provider nodes or router (terms used interchangeably here). +- When a router receives a request it is in their best interest to forward it to the right place as they get a reward if the content transfer is successful. + - This also incentivises them to learn and keep as much routing information as possible. + - How routing information propagates in the network and populates the routers’ routing tables is not discussed here. +- The routing and forwarding of requests should not include any cryptographic operations (or include only minimal) in order to be as fast as regular data transfers. +- When the content transfer completes, the path of routers that have participated in the request routing and the content fetching gets a part of the reward. +- The economic model should be such that routers are not incentivised to collude or cheat. Ideally, two colluding routers should not be able to get more than the aggregate of the reward they would get if they behaved honestly. +- The return per router could be the same for all routers along the path, or it could have different weights depending on several factors, such as: + - degree centrality of nodes, with higher-degree nodes getting more reward, because likely the correct path to the content was found because this node had the most contacts/routing info. This incentivises routers to build as large routing tables as possible and keep many connections open, so eventually the network might become a full mesh with all nodes having roughly similar reward weight. + - the latest nodes on the path get more reward and then the reward declines linearly as we get closer to the client. This incentivises routers to cache and serve the content locally. + + +### Open Questions + +- How can you trustlessly evaluate global network performance? + - Hard problem, but not necessarily harder than trustlessly evaluating performance pairwise between peers +- Will spam be a problem? + - Possibly, in the same way as committed capacity in the Filecoin storage network. But it does not yield outside benefit to the spammer and spamming would come with traffic cost. +- How do you punish those misbehaving? + - Misbehaving is self-punishing; should be irrational to misbehave because there’s no individual advantage to gaming the metrics + - At least assuming an honest majority. Might not work if everyone cheats. + - Not unlike a traditional consensus problem with minimum security threshold + - Maybe some analogue/lessons from EIP1559? The more the providers that join the collusion, the better it is to be outside. + - Could this work under an optional trust model? + - Network voting on good vs bad list; people on the good list could skip proofs. The whole network benefits from people being in the good list, so there is no incentive to “badlist” people unnecessarily. Self-destruct switch: if someone in the good list misbehaves, no one makes money. + - Or perhaps staking on good votes + slashing if they turn out to be bad +- Do downloaders also get rewarded? + - Part of the fair exchange + +- Can we get cache benefits out of symmetric routing? + - If data is encrypted to the end-user (requester), this isn’t possible. We’d need an encryption scheme that allowed intermediary access. + - One solution would be for intermediaries to pose as clients, forge a deal for the data, and then offer a deal to the requester (basically MITM the transaction). + +### Impact + +The impact of this proposal can be quite significant because it can solve two problems at once: the best routing protocol will be built naturally due to incentives and the router reward is also allocated according to the contribution of a router to the network’s routing. + +### Pros and Cons + +Pros +- It can solve two problems at once +- Given that routers participate in the resolution of content (i.e., name-based routing), the scheme can provide very fast resolution and delivery times. +- The scheme enables on-path caching, which can both reduce delivery time and save bandwidth for popular content. + +Cons +- The approach is really interesting, but there are still lots to be figured out wrt both the economic constructions and the routing protocols. +- Might be a little complicated. + +### Implementation notes + +TBA + +### Evaluation + +Verify that colluding routers on a path cannot get more reward than the aggregate of the reward they would receive if they behaved honestly. +Define the best reward split algorithm across the path of routers: what makes more sense: evenly split, or based on some weight function? Should popularity of content play a role here? +Confirm that the routing protocol coming out of this construction is as fast as traditional shortest path routing and achieves nearest replica routing (i.e., find the closest copy of the content). + +### Prior work + +The [“Proof of Prestige”](https://www.ee.ucl.ac.uk/~ipsaras/files/Proof_of_Prestige-icbc19.pdf) approach can be very helpful here. It proves that colluding is avoided and the “progressive mining” operation proposed is very close to building the path from source to destination. From 29fe60c5809e537b9846de317a7535d7ba6a629d Mon Sep 17 00:00:00 2001 From: Yiannis Psaras <52073247+yiannisbot@users.noreply.github.com> Date: Fri, 12 Feb 2021 12:08:07 +0200 Subject: [PATCH 17/34] RIW2021_RFC_Broker-based Content Discovery for Closed Content Ecosystems (#22) * Create RIW2021_RFC_Broker-based Content Discovery for Closed Content Ecosystems.md * Rename RIW2021_RFC_Broker-based Content Discovery for Closed Content Ecosystems.md to 3DM_RFC/RIW2021_RFC_Broker-based Content Discovery for Closed Content Ecosystems.md * Aligning Terminology: Retrieval Miner -> Provider --- ...Discovery for Closed Content Ecosystems.md | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 3DM_RFC/RIW2021_RFC_Broker-based Content Discovery for Closed Content Ecosystems.md diff --git a/3DM_RFC/RIW2021_RFC_Broker-based Content Discovery for Closed Content Ecosystems.md b/3DM_RFC/RIW2021_RFC_Broker-based Content Discovery for Closed Content Ecosystems.md new file mode 100644 index 0000000..260f858 --- /dev/null +++ b/3DM_RFC/RIW2021_RFC_Broker-based Content Discovery for Closed Content Ecosystems.md @@ -0,0 +1,96 @@ +# RIW2021 | RFC: Broker-based Content Discovery for Closed Content Ecosystems + +_Status:_ < draft > + +_Area of Improvement:_ Distribution Graph Forming + +_Estimated Effort Needed:_ + +_Prerequisite(s):_ + +_Priority:_ + +### Abstract + +This RFC targets content discovery, resolution and delivery (for closed content ecosystems, e.g., Spotify), where content cannot be consumed outside the application. The proposal is based on the fact that in the majority of cases content is linked to some “context”. This can be, for example, a video linked from a webpage. Metadata attached to the aforementioned video link point to the broker that either has a copy of the content, or knows where to find it. + + +### Proposal/Construction + +Assumptions of the proposal include: +- Users find CIDs through links in websites or apps. +- Content publishers play the role of the tracker. They know the Provider node with which they have a deal with. They tell their users to go find the content there. +- Content publishers can outsource this operation to independent brokers. For instance, the broker for my website is the hosting company. We call content publishers brokers in the following, for simplicity. +- The links resemble bittorrent-like magnet-links, which include the CID, the content publisher, or broker, as well as metadata. Metadata is a very central point in this proposal. What is included in the metadata is something to be defined, but could be the map of brokers storing the content, or a semantically meaningful name. Metadata should help with discovery. Metadata generally help finding seeders. + +The architecture consists of: +1. end-users requesting content, +2. Provider nodes that store content +3. Brokers that know which Provider stores which content/CID +4. Websites that link to content, through a CID and metadata that help with content discovery (e.g., provide a map of brokers that know about this CID) +5. A DHT, where Providers publish provider records. The DHT is consulted by the brokers in regular time-intervals to get updated information. + +The main content retrieval operation is as follows (see also figure): +1. Client finds “magnet link” from website (clicks) +2. Link returns the broker’s address +3. Client requests CID from broker +4. Broker returns Provider's address (alternative: broker forwards request to Provider directly) +5. Client requests CID from Provider (alternative: Provider delivers content to client) +6. Provider delivers content to client + + + +Things that happen in the background to support the above sequence are: +1. There is a DHT where Providers publish provider records for the content they store +2. Brokers ask the DHT for the providers of the CIDs they’re keeping an index of in regular time intervals, but off band (i.e., not in real-time when they receive the request from clients). This ensures that they have up-to-date information and the request does not have to wait for the slow DHT walk in order to complete. +3. In case content becomes popular at some other network/geographic area, the local Provider in that area should fetch the content and let the broker know, so that he promotes them too. It is not clear how the Provider that wants to replicate content will know which broker to update. A potential solution is for this information to be included in the metadata of the magnet link so that a new Provider can get it from there. In this case, there is an issue when the publisher decides to change broker. +4. The fetching of content by the new Provider discussed above should be supported by the economic model: the original Provider will want to satisfy all requests themselves in order to get all the profit. However, we should incentivise replication of content in order to achieve lower delivery latency. + +### Impact + +This is a stable and simple design for closed content ecosystems, which applies to a large proportion of applications we use today (e.g., spotify, netflix), where content is consumed from within an application (or perhaps website) and the content publisher has complete control over the content (what is published, where it is stored etc.). + +### Pros and Cons + +Pros +- Brokers always have up-to-date information. The fact that clients get links/CIDs through websites or applications means that a broker is never (under normal circumstances) going to be asked for a link/CID they don’t know. +- It is a clever way to cover a large number of use-cases in a safe manner, i.e., without content discovery failures. +- It can be as fast as DNS. +- Simple design + +Cons +- The system seems to break if the content publisher decides to move their content to a different broker, since it is very difficult/impossible to update all websites, forums, or even browser bookmarks that include the magnet link. This will result in content discovery failure. A potential solution is for the user to go the slow path and ask the DHT. However, the above will not be an issue in “closed content ecosystems”, such as Spotify where you can’t consume content outside the application and the publisher has complete control over the content through the app. +- It is not clear how the Provider that wants to replicate content will know which broker to update. A potential solution is for this information to be included in the metadata of the magnet link so that a new Provider can get it from there. In this case, there is an issue when the publisher decides to change broker. +- An issue that arises is how can we update the magnet link with the list of brokers. Ex.: I don’t want to always be asking a broker very far away to let me know of Providers near me to fetch the content. How can the system assign a new broker near me to keep track of Providers near me that store the content? To my understanding this cannot happen automatically and the only way to do it is by the content publisher doing it manually. + +Other notes: +- Is the scheme giving too much power to the brokers? +- How can we avoid giant broker monopolies and centralisation? +- Who is paying the broker? +- There could be a “finder’s fee” for the broker +- How do you make sure that a broker is not giving you wrong content. +- It seems that by having the broker as a very central entity that is responsible for the content discovery, the system loses the benefits of content addressing. Ex.: the system does not seem to be able to track a user near me that has the content and route my request to them instead of going to the content provider that is far away. + +### Implementation notes + +The design can step on existing protocols within the IPFS ecosystem. For example: + +- The DHT structure -> libp2p DHT +- When connecting the client to the list of Provider nodes, the broker can use bitswap +- Provider updates (i.e., when a new Provider node stores a hot copy of a content) can propagate to brokers through libp2p’s pubsub/gossipsub. + +### Evaluation + +**Qualitative** +- We should make sure the scheme does not result in content discovery failure. It does not seem to be the case for closed content ecosystems, but need to double-check. +- For more general content consumption we should have a backup solution. This could be that when a content publisher changes broker and therefore the metadata of CIDs in websites do not point to the right broker anymore, the request ends up going through the DHT. This can become the default way in the long run when content has moved between several different brokers. +- We should find a solution for the case where new brokers are added to the list by the content provider. What is the impact on the system? How can we update the list of brokers? + +**Quantitative** +- Taking into account connection establishment, how long does it take to resolve content and start the delivery? +- How efficient is the proposal in finding the nearest replica in Providers closest to the client that has decided to keep a hot copy? +- Can we integrate “Transient Provider nodes” (i.e., normal end-user peers) in the scheme? + + +### Prior work +Related work where the proposal takes inspiration from. From 0c7aabee66686ec7ba8fa43e6566b520348cb545 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Fri, 12 Feb 2021 11:08:20 +0100 Subject: [PATCH 18/34] RIW2021_RFC_ZK-friendly IPLD data model (#21) --- .../RIW2021_RFC_ZK-friendly IPLD data model | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 3DM_RFC/RIW2021_RFC_ZK-friendly IPLD data model diff --git a/3DM_RFC/RIW2021_RFC_ZK-friendly IPLD data model b/3DM_RFC/RIW2021_RFC_ZK-friendly IPLD data model new file mode 100644 index 0000000..16f7e80 --- /dev/null +++ b/3DM_RFC/RIW2021_RFC_ZK-friendly IPLD data model @@ -0,0 +1,66 @@ + + +# RIW2021|RFC: ZK-friendly IPLD data model + +_Status:_ <**draft**; **~~ready for review~~**; **~~ready to publish~~**> + +_Area of Improvement:_ < Data Delivery Metering | Distribution Graph Forming | Opportunistic Deployments | Cryptoeconomics > + +_Estimated Effort Needed:_ <?> + +_Prerequisite(s):_ <?> + +_Priority:_ <? P0, P1, P2> + + +### Abstract + +Verifying a CID for a full IPLD data model can be complex and computationally extensive. Building an ZK-compatible IPLD data model, would allow the inclusion of a ZK proof of the CID avoiding the verification computation. Using ZK-compatible hot copies for 3DMs would increase the ability of generating proofs, benefiting the design of the client metering protocol. + + +### **Proposal/Construction** + +In order to verify data structures inside a SNARK, the computations that have been done to calculate the hash has to be redone inside the SNARK. Currently IPLD does not use SNARK friendly hash functions, nor repeatable data structures in many places. For instance, any change in the structure of building the Merkle Tree or how the hash of a file is constructed means writing a new SNARK circuit, increasing complexity and cost. A large part of decisions on data structures for hashing and hash functions in Filecoin have been designed to work well with SNARKs. + +This RFC proposes the design of ZK-compatible IPLD structures so proofs can be embedded on IPLD structures. This is a complementary proposal that may benefit the design of other constructions and protocols of 3DMs. + +IPLD -> Raw bytes -> Encrypt data -> Merklize with Poseidon Hash -> ZKCP protocol proof -> Decrypt -> Generate IPLD -> Verify + +**Impact** + +It makes hot copies in 3DMs ZK-ready, opening the door to the design of proof-based protocols. + + +### Pros and Cons + +**Pros** + + + +* Creates a data model in which generating proofs is easier than in the current IPLD model. +* Eases the construction of protocols that require proof over the data in the retrieval network. +* It has been done successfully in Filecoin. + +**Cons** + + + +* Requires changes over the current IPLD structure. +* It may be hard to impose all the data served through the retrieval network to follow this structure. Additional encoding may be required to serve the data in this format into the network. + + +### **Implementation **n**otes** + +<If possible, some pointers on how to implement the proposal> + + +### **Evaluation** + +Generating proofs and validating data in IPLD structures can be done in an efficient way. + + +### Prior work + + + +* [Filecoin Merkle Proofs](https://spec.filecoin.io/#section-algorithms.sdr.merkle-proofs) From 99f35cbecee6d69422d3268beb31e7fa2459c0ec Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Fri, 12 Feb 2021 11:08:27 +0100 Subject: [PATCH 19/34] RIW2021_RFC_QFIL Closed Retrieval Economy (#20) --- RIW2021_RFC_QFIL Closed Retrieval Economy | 135 ++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 RIW2021_RFC_QFIL Closed Retrieval Economy diff --git a/RIW2021_RFC_QFIL Closed Retrieval Economy b/RIW2021_RFC_QFIL Closed Retrieval Economy new file mode 100644 index 0000000..05a0eb9 --- /dev/null +++ b/RIW2021_RFC_QFIL Closed Retrieval Economy @@ -0,0 +1,135 @@ + + +# RIW2021|RFC: QFIL Closed Retrieval Economy + +_Status:_ **draft**; **~~ready for review~~**; **~~ready to publish~~ ** + +_Area of Improvement:_ Cryptoeconomics + +_Estimated Effort Needed:_ <?> + +_Prerequisite(s):_ <?> + +_Priority:_ <? P0, P1, P2> + + +### Abstract + +This RFC models the economic model of the retrieval network as a closed economy backed by the Filecoin economy. It divides the model into two parts: an auction market between content publishers and retrieval miners to agree on the minimum deposit the publisher needs to stake to pay for the retrievals; and the closed retrieval economic orchestrated by the QFIL currency that rewards the parties involved in the retrievals and is backed by the publisher’s deposit. + + +### **Proposal/Construction** + +This RFC assumes content publishers (CPs) as the ones paying for retrievals, i.e. the entity willing to serve a specific CID through the retrieval network is the one paying for the retrievals. The content to be served through the retrieval network may be stored sealed in Filecoin, or in a hot (unsealed) state in IPFS. + +To put content into the network, content publishers run a “take-it-or-leave-it” auction with retrieval miners. CPs offer a price and a desired QoS for retrievals. Retrieval miners accept offers from the pool according to their reserve price. Retrieval miners will only choose offers from the auction pool for which the offer price is over the miner’s reserve price (minimum price it is willing to accept for an offer). Miner’s compute their reserve price according to their expected costs of: + + + +* Query execution (e.g.. Unsealing data, cloud bandwidth costs, amortized storage costs for a cache, solving NP problems for metering --if the construction requires it--, searching data structure, etc.). +* Cost of bandwidth +* Collaboration costs: costs incurred to mint rewards for other miners helping on retrievals. + +When a retrieval miner accepts an offer, the CP needs to stake the payment deposit according to the base price and the specification of the deal, and from there on the accepting retrieval miner becomes the “deal owner”. This “take-it-or-leave-it” auction may be replaced by a simple negotiation phase between a miner and a content publisher. The result of the setup phase would be the same: a deposit to cover retrieval payments and back the rewards being minted in the closed retrieval economy, and a retrieval miner as “deal owner” of this stake. + +The closed retrieval economy is governed by a retrieval currency (QFIL). QFIL is a volatile token that can be in two forms: + + + +* Transient (TQFIL): Is the form it takes when it is minted. Commiting a valid voucher for a full (or partial) file exchange triggers the minting of new TQFIL by the deal owner to reward the parties involved in the exchange. TQFIL is associated with the deal owner, and it can’t be transferred, it can only be transformed into stable QFIL or FIL from the deal stake. TQFIL has a larger decay than stable QFIL to prompt a transformation decision on holders (preventing an entity from having a lot of power over a deal stake). In order for a deal owner to mint new TQFIL it needs to burn FIL or QFIL. +* Stable (QFIL): Base stable currency of the closed economy. It has a lower decay than TQFIL, and it is burned to mint new TQFIL. Retrieval miners will be willing to help other miners in the system in order to be rewarded with QFIL, and avoid having to burn their FIL to pay for the retrievals of deals they own. + +Instead of having a global system orchestrating all stakes and deals in the network, the role of the deal owner enables a local orchestration of deal funds, with QFIL as the glue of the full retrieval economy. As an analogy, TQFIL is the local currency, while QFIL is the global currency in the economy. + +This RFC requires a reliable signal to trigger reward minting. This can be in the form of an on-chain commitment of a payment voucher, a transaction, etc. There is no specific requirement imposed in this sense. Ideally, if the construction of these signals allows the inclusion of the different parties involved in the retrieval (and not just the miner serving the file) more complex rewarding systems may be devised. + +Finally, retrieval deals may include an additional “reward for QoS”. Content publishers may provision an additional stake in their deposit to unlock a reward if a retrieval was performed with the minimum QoS required by him in the deal. + +Retrievals under this model would look as follows: + + + +* Clients send their requests to their local retrieval miner for a specific CID. If this miner is not able to fulfill the retrieval himself will pay QFIL to all the collaborators committing resources to help him with the deal. This collaboration may be in the form of hot copy sharing, forwarding services, or whatever other scheme we want to incentivize in the graph forming architecture. +* The successful retrieval of the client generates a signal (as mentioned above in the form of a voucher or transaction) and triggers the minting of the rewards for the retrieval in the form of the deal owner’s TQFIL. This same signal triggers the unlock of the QoS additional reward if applicable. +* The reward is distributed almost entirely to the retrieval miner that performed the retrieval, except for a small amount reserved for the deal owner (that way incentivizing retrieval miners to accept deals even if they won’t be completely involved in the retrieval). + * An alternative reward mechanism may be devised where instead of minting rewards for the retrieval miner and the deal owner exclusively, and enable cross-payments between retrieval miners for collaboration, the rewards are directly minted for all the parties involved in the exchange. This may impose additional requirements to the system. +* The deal owner needs to hold enough QFIL or a FIL stake to mint the TQFIL for the reward. +* Finally, all the rewarded parties choose what to do with their TQFIL, if to cash out into FIL (leave the closed economy), or keep QFIL to back future retrievals of the deals they own. + +_Sidenote: We called QFIL as Quantum FIL because it can be in two forms, but it ends up decaying to a stable form._ + +**Impact** + +This RFC proposes an economic framework backed by the Filecoin economy. The model presents all the elements required to design any incentive system required in the rest of the part of the system: client metering, content payment, and graph forming. By building this economic model as a closed economy we require no changes on the Filecoin economy or impose additional requirements to it. With this, the retrieval economy will be able to evolve independently of the Filecoin economy. + + +### Pros and Cons + +**Pros** + + + +* Economic model decoupled from the Filecoin economy and with all the elements for the design of the incentive systems required in the network. +* The only requirement for the model to work is a reliable signal of successful retrieval to trigger the rewards and payments. +* The design of QFIL fosters the collaboration between entities in the system. +* The fact that every reward minted in the system requires some currency to be burnt prevents sybil attacks (and potentially even collusion attacks). Even more, the minting of every reward is backed by its equivalent in FIL. + +**Cons** + + + +* Fine-tuning all the parameters of the model may be hard. There are a lot of moving parts: design of the rewards, QFIL and TQFIL decay speeds, etc. +* A more thorough analysis of the Nash equilibrium of the system is required to ensure that the design of QFIL indeed fosters collaboration and achieves our goals. +* How to reward collaboration between miners is really tied to the graph forming design, so nothing can be specified in that sense until the design of the graph forming, and the interaction between retrieval miners is fleshed out. +* This model doesn’t prevent an entity from trying to bankrupt a specific content publisher. Someone may want to indiscriminately retrieve a file from a content provider to dry its stake. The fact that content is cached, and the resources required may lead to economies of scale that make the impact of this attack negligible. + + +### **Implementation **n**otes** + + + +* All the logic behind the minting of rewards and deposits should be implemented in a smart contract (or Filecoin actor). This smart contract receives signals from successful retrievals, and when new stakes for a deal have been set up. +* The logic for the auction (or negotiation phase) will be independent from the aforementioned actor. + + +### **Evaluation** + +**Qualitative** + + + +* The RFC increases the size of the retrieval market (demand for content retrieval) in the Filecoin network. +* The RFC ensures the profitability of retrieval miners for their cost model and committed resources. + * How does miners' reserve price be computed? +* The UX of clients with this RFC is not penalized in any way (latency, QoS, etc.) +* The model prevents sybil and collusion attacks, and fosters collaboration between entities. + +**Quantitative** + + + +* Simulation analysis of the full economic model to understand the Nash Equilibrium. + * How should the decay of QFIL be designed? + * Does the use of a stable QFIL make sense for miners? Would they be willing to transform TQFIL into QFIL instead of FIL, or an additional reward should be considered making 1TQFIL = alphaQFIL with alpha > 1? +* Functional testing of implementation: + * QFIL mechanism and rewards. + * Auction / Negotiation. + * Payments / Collaboration between miners +* Overhead that the RFC imposes over a file retrieval. +* Testnet to validate all the assumptions. + + +### Prior work + + + +* [ObservableHQ modelling a preliminary proposal of this RFC](https://observablehq.com/@protocol/3dms-cryptoecon-proposal) + +This RFC takes inspiration from the following papers: + + + +* [Edge-MAP: Auction Markets for Edge Resource Provisioning:](https://drive.google.com/file/d/1g-kbaPUosWnY1a9098T9nh6TDx9ekQeJ/view?usp=sharing) Inspiration for the use of local auctions. +* [An economic mechanism for request routing and resource allocation in hybrid CDN–P2P networks](https://drive.google.com/file/d/19_OPhuR4qkbH55SkG8ucgMYn-js445Q0/view?usp=sharing): Cost prediction in hybrid CDNs. +* [Proof-of-Prestige: A Useful Work Reward System for Unverifiable Tasks](https://drive.google.com/file/d/13gcJP0DZnCCpcIy5BFbe7uLaxxGpL7JW/view?usp=sharing): Use of a volatile token. +* [A Market Protocol for Decentralized Task Allocation](https://drive.google.com/file/d/1GC3DU0I_-6NSMtfoTl55t6fKPptIkCL5/view?usp=sharing): Use of a reserve price to achieve Nash equilibrium in a decentralized auction system. From c6af3db4afd0a3704a05b1face547a987b870115 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Fri, 12 Feb 2021 11:09:37 +0100 Subject: [PATCH 20/34] RIW2021_RFC_Credit-based Retrieval Network (#19) * RIW2021|RFC: Credit-based Retrieval Network * Rename RIW2021|RFC: Credit-based Retrieval Network.md to RIW2021_RFC_Credit-based Retrieval Network * Update RIW2021_RFC_Credit-based Retrieval Network --- ...RIW2021_RFC_Credit-based Retrieval Network | 248 ++++++++++++++++++ 1 file changed, 248 insertions(+) create mode 100644 3DM_RFC/RIW2021_RFC_Credit-based Retrieval Network diff --git a/3DM_RFC/RIW2021_RFC_Credit-based Retrieval Network b/3DM_RFC/RIW2021_RFC_Credit-based Retrieval Network new file mode 100644 index 0000000..34a0a47 --- /dev/null +++ b/3DM_RFC/RIW2021_RFC_Credit-based Retrieval Network @@ -0,0 +1,248 @@ + + +# RIW2021|RFC: Credit-based Retrieval Network + +_Status:_ **draft**; **~~ready for review~~**; **~~ready to publish~~ ** + +_Area of Improvement:_ Cryptoeconomics + +_Estimated Effort Needed:_ <?> + +_Prerequisite(s):_ <?> + +_Priority:_ <? P0, P1, P2> + + +### Abstract + +This RFC proposes an economic model for retrieval networks based on a trustless credit network. Clients and content publishers exchange credits backed by an escrow deposit. These credits are used to pay retrieval providers for their services. For providers to mint their reward they need to commit the received credits on-chain. The total reward is proportional to the number of credits they hold. + + +### **Proposal/Construction** + +This RFC consider the following participants in the system: + + + +* Clients that retrieve content by CID from retrieval service. They may be charged with a monthly fee, or not charged at all for the services they use. +* Publishers store content on the Filecoin (or IPFS) network, and register it with the retrieval market for a per-CID fee. +* Storage miners (alternatively, the publishers) keep cold copies of the content. +* Profit maximizing (retrieval) providers who are paid in proportion to their services and represent the basic infrastructure of the retrieval network. + +The RFC proposes the design of a credit network for fast content trade between retrieval providers. The network uses an on-chain smart contract to keep track of participants' escrows and for settlement purposes. + +The retrieval service is organized in consecutive global sessions of fixed duration. E.g., each calendar day is one session. (Each session is a smart contract, which is itself subordinate to a “master” contract which manages the succession of sessions.) + +Retrievals in this RFC are organized in three stages: + + + +* **Session setup:** Specifies the content to be served through the retrieval network and performs all on-chain and off-chain setups required to make the session content available for retrieval (i.e. “hot and ready”). + * To serve content through the network, publishers need to store this content in Filecoin (or IPFS) or be willing to provide cold copies (with the right encoding) themselves. + * In order to join a session, the publisher pays a fee to the session’s contract; pays the retrieval fee in the contract; and advertises the CID and the location of the cold copy (e.g. miner and sector or address of publisher). + * Providers create escrows of desired sizes (which depend on their expected traffic imbalance). These escrows back an independent credit system for payments between providers, and are entirely independent of the session contracts. Escrows can be refreshed at any time as needed. + * Once the session has been established, providers download the list of authorized clients, as well as the cold storage locations of the participating content CIDs. +* **Content delivery: **Providers deliver content to clients and to other providers, upon request. Clients pay providers (for content) using client-credits (which represent shares of session fees), whereas providers pay providers using provider-credits (which represent hard currency, e.g. FIL, stored in the provider escrows). + * Clients request content from a chosen provider by CID. + * The provider authenticates the client (needed only if clients are required to pay for service). + * The provider looks queries the retrieval network for cached copies of the CID (leveraging the graph forming infrastructure in place, i.e. DHT, gossipsub, NDN, etc.). + * If the content is cached by other providers, the provider may pick the closest one and buy content, paying with provider-credits. Otherwise, if there is no hot copy of the content in the retrieval network, the content must be bought from cold storage (using FIL) for its subsequent caching (or downloaded from the publisher themselves). After a hot copy of the content is retrieved, the content is forward to the client. The client pays for the content using client-credits. +* **Settlement: **As a result of delivering content, providers accumulate client-credits and provider-credits. Both of these are redeemed for value (e.g. a hard currency, like FIL) during settlement after the end of a session. + * Provider-credits are redeemed for the value they correspond to, based on the escrows they are backed by. Note that provider credits correspond to value one-for-one, as they are entirely based on a conventional credit system (as described in the relevant papers). + * Client-credits are different. A client-credit corresponds to a share from the “session revenue”, which is the sum of all fees paid by all clients and all publishers (this does not include the escrows paid by providers!). + * Revenue distribution is computed after the end of the session period as follows: + * Revenue = client fees + publisher fees. + * + * Provider revenue share = number of client-credits collected by provider / total number of client-credits + * Provider revenue = total revenue * provider revenue share + + + + + + +![alt_text](images/image1.png "image_tooltip") + + + +### Settlement speed optimization + +Every chain-based system that settles off-chain tokens (in our case client-credits and provider-credits) for on-chain value requires that the tokens be uploaded to the chain. In our application, the number of tokens is extremely large (it roughly equals the number of requests in a day) making it impractical to upload all of them to the chain. To solve this problem we utilize a “lottery” technique (described in the [MicroCash paper](https://arxiv.org/abs/1911.08520)). + +This technique is generic: It is independent of how value is assigned to a token. Thus, in our case, it can be used for both client-credits and provider-credits, separately. + +Here is how the lottery algorithm works in short. + +Suppose T is an off-chain token, held by party P, that must be redeemed for on-chain value. + +Denote by V(T) the value assigned to ticket T by the application logic. + +The protocol for redeeming T is as follows: + + + +1. Determine if T is a “winning” token. Each token is “winning” independently with probability W, say 5%, based on a common public randomness source. +2. If T is winning, P uploads T to the chain and receives value V(T)/P for it, +3. If T is not winning, nothing transpires. + +What is notable about this protocol: + + + +* Only a fraction W, in our example 5%, of the tokens are uploaded to the chain +* The expected value of each token is V(T). + +When a large number of tokens is redeemed, the actual value received by a participant is almost exactly equal to the expected value. (This is a simple consequence of the [Chernoff bound](https://en.wikipedia.org/wiki/Chernoff_bound), and is proved in the MicroCash paper.) + + +### Design discussion + +This RFC is designed to showcase two different payment models for content: + + + +* Clients pay fixed per-session fees, +* Providers pay per-CID fees. + +These two models are implemented, respectively, by: + + + +* Client-credits, which represent share from the revenue from fees, and +* Provider-credits, which are tethered to value (e.g. a hard currency) through escrows. + +A simplified version of this design can be obtained by removing the client role (and the client-credit logic). This results in a retrieval market where all participants assume the “provider” role and pay per CID. Note that being a “provider” does not obligate you to cache and sell content, thus real-world clients can use the “provider” role as well. + +The upshot of the simplified design is that it is a stepping stone towards the complete design, which adds time-based subscription models. **We advise that a first implementation attempt targets the simplified design.** + + +### Technical details + + +#### Credit systems and double spending + +Our design is agnostic to the type of credit lines used. + +There are two types of credit systems in the literature, which differ in the type of the credit constraint: + + + +* In a _bilateral_ credit system a credit line pertains to one borrower and one lender +* In a _multilateral_ credit system a credit line pertains to (one or) multiple borrowers and (one or) multiple lenders + +For instance, the traditional credit card system implements a multilateral credit system, where the credit of one borrower (the customer) pertains to all lenders (the merchants of goods). + +For instance, in this RFC, in the provider-credit system, providers are both borrowers and lenders. + + + +* If provider-credit is bilateral, each provider will need an individual credit line (and therefore escrow) for each other provider they intend to do business with. +* If provider-credit is multilateral, each provider will need a single credit line (backed by a single escrow) for all trades regardless of counterparty. + +Multilateral credit is strictly more flexible than bilateral credit. However, there is a trade off. Decentralized implementations of bilateral credit can prevent double-spending (in real time), whereas multilateral implementations detect double-spending at settlement time. + +In summary: + + + + + + + + + + + + + + + + + + +
+ Bilateral + Multilateral +
Double-spending in decentralized setting + Prevented + Detected at settlement +
User friendliness + Participants can trade directly with a small set of chosen counterparties + Any pair of participants can trade +
+ + +**Our recommendation** is to use a multilateral credit system and address detected double-spending by “freezing” the account of the offender for a duration of time, proportional to the overspent amount. (The approach taken by the US Bankruptcy system.) Since penalties are assigned to on-chain accounts, for the former to be effective, accounts must be Sybil-resistant. This is addressed in the next section. + + +#### Sybil-resistant accounts for penalty attribution + +Each participant in the retrieval market is an “account” on-chain, identified by a public key. Account identities are used to authenticate parties in a trade, as well as to assign penalties when double spending is detected. The state of an account (e.g. outstanding penalties) is stored on-chain for everyone to see. + +Users may be tempted to create new accounts, when old ones are penalized, thereby performing a Sybil attack. To counter this, we utilize a mechanism that provides higher quality of service to accounts that have successfully completed a larger number of trades in the past, thereby introducing a significant cost to abandoning an existing account (e.g. to avoid penalties). This is accomplished with the following protocol: + + + +* The chain stores the total volume of successfully settled past transactions for every account, and +* Providers prioritize requests, based on the historical volume of the requesting account. + + +#### Collusion attacks + +Collusion opportunities depend on the payment model. Thus per-CID and per-session fees are analyzed separately. Both are collusion-resistant: + + + +* Per-CID payments are collusion-resistant because content is directly exchanged for value, so everyone’s wealth is preserved after each trade. +* Per-session payments (where client-credits correspond to a share of the deposited fee) are collusion-resistant, because (by design) all credits issued by a single client represent shares only of that client’s deposited fees. + +**Impact** + +The RFC proposes a reward model that can be embedded to any of the design proposals designed for the rest of the components of the system. In particular, it does not address fair-exchange, and instead assumes that a fair-exchange protocol (for exchanging credits for content) is given. + +It can be easily pluggable into any design and imposes no requirements to the rest of the components. It enables for the coexistence of several economic models over the RFC’s infrastructure. + + +### Pros and Cons + +**Pros** + + + +* Provides high-bandwidth payments, using a low-bandwidth chain. (The credit network is a “layer 2” infrastructure.) +* Supports multiple payment models. + +**Cons** + + + +* Assumes a fair-exchange protocol. + + +### **Evaluation** + +**Qualitative** + + + +* The RFC increases the size of the retrieval market (demand for content retrieval) in the Filecoin network. +* The RFC provides high-liquidity: Given a fixed supply and demand, the market maximizes the number of matches. + +**Quantitative** + + + +* End-user latency and bandwidth are sufficient for good UI experience (e.g. snappy browsing). +* Simulation analysis of the full economic model to understand the Nash Equilibrium. + * Is there an equilibrium? + * Is the equilibrium fair? +* End-user overhead of retrieval. + + +### Prior work + + + +* [MicroCash: Practical Concurrent Processing of Micropayments](https://arxiv.org/abs/1911.08520) +* [Liquidity in Credit Networks: A Little Trust Goes a Long Way](https://arxiv.org/abs/1007.0515) +* [Liquidity in Credit Networks with Constrained Agents](https://arxiv.org/abs/1910.02194) From 5f9d5e49e689fc391b83315ac2bd432231f3af8a Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Fri, 12 Feb 2021 11:09:56 +0100 Subject: [PATCH 21/34] RIW2021_RFC_NoMarkets3DM (#18) * Create RIW2021_RFC_NoMarkets3DM.md * Update RIW2021_RFC_NoMarkets3DM.md --- 3DM_RFC/RIW2021_RFC_NoMarkets3DM.md | 97 +++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 3DM_RFC/RIW2021_RFC_NoMarkets3DM.md diff --git a/3DM_RFC/RIW2021_RFC_NoMarkets3DM.md b/3DM_RFC/RIW2021_RFC_NoMarkets3DM.md new file mode 100644 index 0000000..98ea9e3 --- /dev/null +++ b/3DM_RFC/RIW2021_RFC_NoMarkets3DM.md @@ -0,0 +1,97 @@ + +# RIW2021|RFC: No market 3DMs + +_Status:_ **draft**; **~~ready for review~~**; **~~ready to publish~~ ** + +_Area of Improvement:_ Cryptoeconomics + +_Estimated Effort Needed:_ <?> + +_Prerequisite(s):_ <?> + +_Priority:_ <? P0, P1, P2> + + +### Abstract + +This RFC proposes an economic model for the retrieval network based on CID bounties instead of an actual market. Content publishers offer a bounty to a CID to reward for all the retrievals successfully performed for that CID for a period of time. All miners able to show proofs-of-storage of hot copies of the CID, and proofs-of-retrieval at the end of the specified period of time are rewarded with a split of the bounty. + + +### **Proposal/Construction** + +Anyone looking to serve content through the retrieval network can offer a bounty for the CID that wants to be served. Ideally, a cold copy of this CID object will be stored in Filecoin storage, or a hot copy in the IPFS network. The bounty is determined for a specific period of time (mins, hours, or days). Miners have access to the pool of bounties available and can freely choose the CIDs they want to store and serve. This approach is similar to those of transaction fees in traditional Bitcoins, where according to the transaction fees, miners choose the transactions to include in the next block. + +Miners can choose their own strategy to profit from retrievals: they may choose CIDs with large bounties because the probability of being rewarded is larger; or go for CIDs with small bounties as despite these being low, the competition to split the rewards is lower. + +In order to be eligible for the reward, miners targeting the bounty for a CID must generate periodic proofs-of-storage for the hot copy of the CID. Proofs-of-storage only unlock a percentage of the bounty, in order to unlock the full bounty a minimum number of retrievals for the content need to be performed. Thus, by the end of the lifetime of the bounty, miners receive a split of the unlocked bounty proportional to the number of proof-of-storage they successfully committed. + +This RFC doesn’t reward retrieval but storage of hot copies and evenly splits the unlocked bounty for a CID between all the miners committed to serve the content. This favors the decentralization of the system and spreading hot copies throughout the network. The higher the bounty, the higher the probability of miners storing and serving a CID. Proofs-of-retrieval, i.e. the number of times the CID has been successfully retrieved, only determines the percentage of the bounty that is unlocked. + +This RFC allows several alternative implementation: + + + +* The settlement and reward distribution is done only at the end of the lifetime of the bounty. This means that the content publisher stakes from scratch the amount of the bounty which is not distributed until the end. Throughout the lifetime of the bounty, a publisher is allowed to increase the bounty as an attempt to increase the perceived QoS of the CID’s retrieval. However, the distribution to miners is not done until the end. +* And additional implementation may be devised where a set of periodic checkpoints are determined throughout the lifetime of the bounty to unlock part of the bounty as rewards. + +A more thorough analysis will need to be done in order to determine what implementation is better. + +**Impact** + +Simplifies the implementation of the economic model for the retrieval network. This RFC delegates the responsibility of its operation on reliable proof-of-storage and proof-of-retrieval constructions. Its simplicity makes it applicable as a supplement to other RFCs. + + +### Pros and Cons + +**Pros** + + + +* Simple and elegant design. +* Limited overhead over the rest of the system components. + +**Cons** + + + +* It requires the construction of reliable proofs-of-storage and proofs-of-retrieval. +* It doesn’t prevent sybil and collusion attacks. Miners may run clients retrieving the content they are providing in order to unlock all of the available bounty. There needs to be a way to prevent these attacks. + + +### **Implementation **n**otes** + +Once the proof-of-storage and proof-of-retrieval constructions have been figured out, the implementation of this RFC is limited to a smart contract (or a spec actor) to set new CID bounties, track its lifetime, accept the committing of proofs by miners, and distributes the bounty at the end of its lifetime. + + +### **Evaluation** + +**Qualitative** + + + +* The RFC increases the size of the retrieval market (demand for content retrieval) in the Filecoin network. +* The RFC ensures the profitability of retrieval miners for their cost model and committed resources. +* The UX of clients with this RFC is not penalized in any way (latency, QoS, etc.) +* The model prevents sybil and collusion attacks, and fosters collaboration between entities. + +**Quantitative** + + + +* Simulation analysis of the full economic model to understand the Nash Equilibrium. + * How does the size of the bounty affect the perceived QoS of CID retrieval? + * What takes for miners to keep a copy of a CID? +* Functional testing of implementation: + * Generation of proofs and commitment. + * Create and top-up bounties. + * Bounty distribution and settlement. +* Overhead that the RFC imposes over a file retrieval. +* Testnet to validate all the assumptions. + + +### Prior work + + + +* [Filecoin’s Proof-of-Storage](https://spec.filecoin.io/#section-algorithms.pos) +* [Filecoin’s economic model](https://spec.filecoin.io/#section-algorithms.cryptoecon) From d4d64aeebfaef2bc795c16f13d91b13bd95a1c7e Mon Sep 17 00:00:00 2001 From: David Dias Date: Fri, 12 Feb 2021 11:10:17 +0100 Subject: [PATCH 22/34] Create RIW2021_RFC_ZKCP with Fair Exchanges of 1 bit.md (#17) --- ...1_RFC_ZKCP with Fair Exchanges of 1 bit.md | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 3DM_RFC/RIW2021_RFC_ZKCP with Fair Exchanges of 1 bit.md diff --git a/3DM_RFC/RIW2021_RFC_ZKCP with Fair Exchanges of 1 bit.md b/3DM_RFC/RIW2021_RFC_ZKCP with Fair Exchanges of 1 bit.md new file mode 100644 index 0000000..ac5442e --- /dev/null +++ b/3DM_RFC/RIW2021_RFC_ZKCP with Fair Exchanges of 1 bit.md @@ -0,0 +1,57 @@ +# RIW2021 | RFC: ZKCP with Fair Exchanges of 1 bit + +_Status:_ **draft**; **~~ready for review~~**; **ready to publish** + +_Area of Improvement:_ Data Delivery Metering + +_Estimated Effort Needed:_ <?> + +_Prerequisite(s):_ <?> + +_Priority:_ <? P0, P1, P2> + +### Abstract + +In a ZKCP and ZKCSP, there are (at least) two events might happen that will lead to value loss, these are: + +* The client doesn’t deliver the payment to get access to the key, creating a grieving attack on the provider of the data and/or service +* The provider vanishes before it sells the key to the client, leaving the client with unusable cyphertext + +In order to solve this, we propose a continuously running Fair Exchanges of \ +1 bit of the key throughout the delivery of the file. Giving the provider some assurance of the payment and giving the client an option to only have to brute force a few bits (O(2^k)) of the key in case the provider disappears (simpler than brute forcing the whole key) + +### **Proposal/Construction** + +In a ZKCP for a file, it is agreed that at each n blocks out of m total blocks, a Fair Exchange for 1 bit of the key happens. The flow goes as follows: + +* Incremental fair exchanges +* Exchange 1 bit of the file decryption key for 1 bit of a redeemable payment ticket/signature of the same size. +* For both of these, all bits are necessary to make any use +* However, if k bits are missing, the remaining bits can be brute-forced in O(2^k) +* If either party aborts, at any round, they only have one more bit than the other party. +* That means the malicious party only gains an advantage of 2x the compute needed to get the resource they wanted (the decryption key or the payment) + +**Impact** + +Saves RTT at the end for selling the key, gives assurance to both parties. Somewhat similar to pay-per-packet + +### Pros and Cons + +Pros +* Reduce an additional RTT at the end, piggybacking the fair exchange on the File Transfer itself +* Enables the client to signal satisfaction to the provider in case the provider is not delivering on the right bandwidth (e.g. not meeting the SLA, client stops paying for more bits) + +Cons +* Added complexity and overhead and proving each 1 bit for each key + +### **Implementation **notes** + +TBWRITTEN + +### **Evaluation** + +TBWRITTEN + +### Prior work + +ZKCP From 47e8713a06ac0798db0bb9e767058bf6ee470871 Mon Sep 17 00:00:00 2001 From: David Dias Date: Fri, 12 Feb 2021 11:10:30 +0100 Subject: [PATCH 23/34] Create RIW2021_RFC_ZKCP Optimizations.md (#16) --- 3DM_RFC/RIW2021_RFC_ZKCP Optimizations.md | 57 +++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 3DM_RFC/RIW2021_RFC_ZKCP Optimizations.md diff --git a/3DM_RFC/RIW2021_RFC_ZKCP Optimizations.md b/3DM_RFC/RIW2021_RFC_ZKCP Optimizations.md new file mode 100644 index 0000000..83b90a4 --- /dev/null +++ b/3DM_RFC/RIW2021_RFC_ZKCP Optimizations.md @@ -0,0 +1,57 @@ +# RIW2021 | RFC: ZKCP Optimizations + +_Status:_ **draft**; **~~ready for review~~**; **~~ready to publish~~** + +_Area of Improvement:_ Data Delivery Metering + +_Estimated Effort Needed:_ <?> + +_Prerequisite(s):_ <?> + +_Priority:_ <? P0, P1, P2> + + +### Abstract + +TBWRITTEN + +### **Proposal/Construction** + +* Assumption + * We assume that encrypting a file and issuing a Proof-of-Retrievability is an expensive operation +* Optimization I + * encrypted the data once, then encrypt the encryption key to the client to do the fair exchange + * Pros + * Only issue s Proof-of-Retrievability once + * A group of providers can collaborate over a set of pre-encrypted files and issue the keys to the clients as they request + * Cons + * Opens the potential for a grieving attack, where multiple clients ask the provider to get the file, but then only one client pays for the decryption key + * Open Problem: Need to find a way for individual parties to be unable to share the keys to decrypt the same cyphertext. + * Perhaps the client specific key does one last, non expensive scramble? +* Optimization II + * Only prove a small n of chunks out of N + * Getting n random chunks in an initial interaction for free might be fine as it would take O(n^3) time to collect the whole file that way + * Question for Steven: how do you prove random pieces belong to file that you want? + * Merkle-tree, share the merkle path + * If an IPLD dag is used, we could leak data on proving a path + * Attacker wouldn’t necessarily want to pull different pieces from multiple endpoints (expensive) + +**Impact** + +TBWRITTEN + +### Pros and Cons + +TBWRITTEN + +### **Implementation **n**otes** + +TBRITTEN + +### **Evaluation** + +TBRITTEN + +### Prior work + +TBRITTEN From 003017e082ad91a3317c47082a057e75a820ab71 Mon Sep 17 00:00:00 2001 From: David Dias Date: Fri, 12 Feb 2021 11:21:20 +0100 Subject: [PATCH 24/34] move RFC to the right folder --- .../RIW2021_RFC_QFIL Closed Retrieval Economy.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename RIW2021_RFC_QFIL Closed Retrieval Economy => 3DM_RFC/RIW2021_RFC_QFIL Closed Retrieval Economy.md (100%) diff --git a/RIW2021_RFC_QFIL Closed Retrieval Economy b/3DM_RFC/RIW2021_RFC_QFIL Closed Retrieval Economy.md similarity index 100% rename from RIW2021_RFC_QFIL Closed Retrieval Economy rename to 3DM_RFC/RIW2021_RFC_QFIL Closed Retrieval Economy.md From 955a0653c50f99c88392a781be266f4b3f13f8ce Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Fri, 12 Feb 2021 11:53:06 +0100 Subject: [PATCH 25/34] Rename RIW2021_RFC_Credit-based Retrieval Network to RIW2021_RFC_Credit-based Retrieval Network.md --- ...eval Network => RIW2021_RFC_Credit-based Retrieval Network.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 3DM_RFC/{RIW2021_RFC_Credit-based Retrieval Network => RIW2021_RFC_Credit-based Retrieval Network.md} (100%) diff --git a/3DM_RFC/RIW2021_RFC_Credit-based Retrieval Network b/3DM_RFC/RIW2021_RFC_Credit-based Retrieval Network.md similarity index 100% rename from 3DM_RFC/RIW2021_RFC_Credit-based Retrieval Network rename to 3DM_RFC/RIW2021_RFC_Credit-based Retrieval Network.md From 3ff78627e6b164f1cc929c2e7458427b86e52ade Mon Sep 17 00:00:00 2001 From: David Dias Date: Fri, 12 Feb 2021 12:01:14 +0100 Subject: [PATCH 26/34] DECENTRALIZED_DATA_DELIVERY_MARKETS.md Open Problem Statement (#14) * Create DECENTRALIZED_DATA_DELIVERY_MARKETS.md * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Metering section links to papers Adds links to all papers referenced in the metering and fair exchange section. * Graph Forming links to papers added * Cryptoeconomics section links to papers added Cryptoeconomics section links to papers added * Replaced term Retrieval Miner and RM to Provider * Apply suggestions from code review Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update DECENTRALIZED_DATA_DELIVERY_MARKETS.md * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update DECENTRALIZED_DATA_DELIVERY_MARKETS.md * add dottoc * add Open problem to the table * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md Co-authored-by: Yiannis Psaras <52073247+yiannisbot@users.noreply.github.com> * Update OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md * Added cryptoecon RFCs * Added RFCs Graph Forming * Added RFC Opportunistic Deployments Co-authored-by: Jorge Soares <547492+jsoares@users.noreply.github.com> Co-authored-by: Yiannis Psaras <52073247+yiannisbot@users.noreply.github.com> Co-authored-by: Alfonso de la Rocha --- .../DECENTRALIZED_DATA_DELIVERY_MARKETS.md | 562 ++++++++++++++++++ README.md | 44 +- 2 files changed, 587 insertions(+), 19 deletions(-) create mode 100644 OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md diff --git a/OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md b/OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md new file mode 100644 index 0000000..579c8a4 --- /dev/null +++ b/OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md @@ -0,0 +1,562 @@ +# Decentralized Data Delivery Markets (3DMs) - Open Problem Statement + + + + +- [Overall](#overall) + - [Short description](#short-description) + - [Long description](#long-description) + - [Definition of the actors](#definition-of-the-actors) + - [Expected requirements](#expected-requirements) +- [Areas of Work](#areas-of-work) + - [Data Delivery Metering & Fair Exchange](#data-delivery-metering--fair-exchange) + - [How it is done traditionally](#how-it-is-done-traditionally) + - [Properties desired](#properties-desired) + - [How is Data Delivery Metering different from Fair Exchange](#how-is-data-delivery-metering-different-from-fair-exchange) + - [Known challenges](#known-challenges) + - [State-of-the-art](#state-of-the-art) + - [Pay-per-packet](#pay-per-packet) + - [Lock/Unlock access to the resource](#lockunlock-access-to-the-resource) + - [Optimistic Fair Exchange](#optimistic-fair-exchange) + - [Reputation based](#reputation-based) + - [Privacy focused](#privacy-focused) + - [Traditional approaches (close to Web 2.0 world)](#traditional-approaches-close-to-web-20-world) + - [Known attacks to be mitigated](#known-attacks-to-be-mitigated) + - [New ideas being explored](#new-ideas-being-explored) + - [Distribution Graph Forming](#distribution-graph-forming) + - [State-of-the-art](#state-of-the-art-1) + - [DHT-based:](#dht-based) + - [Name-based routing:](#name-based-routing) + - [DNS-style, object-level indexing service:](#dns-style-object-level-indexing-service) + - [PubSub-style:](#pubsub-style) + - [Known attacks to be mitigated](#known-attacks-to-be-mitigated-1) + - [New ideas being explored](#new-ideas-being-explored-1) + - [CryptoEconomic model for Data Delivery](#cryptoeconomic-model-for-data-delivery) + - [How it is done traditionally](#how-it-is-done-traditionally-1) + - [Properties desired](#properties-desired-1) + - [State-of-the-art](#state-of-the-art-2) + - [Economics of Hybrid CDNs and P2P networks](#economics-of-hybrid-cdns-and-p2p-networks) + - [Game theoretical models and reward/reputation systems in P2P networks](#game-theoretical-models-and-rewardreputation-systems-in-p2p-networks) + - [Credit networks and Token Designs](#credit-networks-and-token-designs) + - [Auctions, decentralized markets, and efficient resource allocation](#auctions-decentralized-markets-and-efficient-resource-allocation) + - [Known attacks to be mitigated](#known-attacks-to-be-mitigated-2) + - [New ideas being explored](#new-ideas-being-explored-2) + - [Additional: Opportunistic deployment](#additional-opportunistic-deployment) + - [State-of-the-art](#state-of-the-art-3) + - [Transient Providers](#transient-providers) + - [Known shortcomings](#known-shortcomings) + - [New ideas being explored](#new-ideas-being-explored-3) + + + +# Overall + +## Short description + +With the emergence of Decentralized Storage Networks and the rapid decrease in the price of storage services and hardware, there is a rapidly growing need to leverage the additional storage capacity contributed to Decentralized Storage Networks by new players, including end-users, and use it to deliver reliable and high-quality storage and delivery services. Similarly to Content Delivery Networks (CDNs) for the traditional Cloud Storage market, we now have the opportunity to build **Decentralised CDNs** for Decentralised Storage Networks. The Decentralized Data Delivery Markets (3DMs) Open Problem covers all the essential areas of work that need to be studied in order to create **a fully permissionless free market for data delivery that supports fair data exchange** on the service provided. + +## Long description + +Serving content globally at scale is a hard technical problem, as evidenced by the multiple decades of innovation and improvements in the Content Delivery Networks field. This challenge becomes even more interesting once we move away from centralized cloud infrastructure, which is typically managed and monitored by a single party, to a decentralized network that is permissionless, possibly anonymous, constantly changing (i.e. with high node churn) and lacking access to the convenience of a third party mediator system that facilitates the fair exchange of goods (e.g. credit providers). The benefits of moving to a decentralised setting are significant, however: cheaper storage and delivery, resilience against business failures (i.e., the network and all its components are not dependent on business decisions made by a single entity), independence from the personal data-driven business models, as well as a significantly lower barrier to entry for new players who want to contribute. + +At the same time, problems already addressed in the past for traditional CDNs reappear, albeit in a different dimension, as we move to a decentralized network design space. These problems include the global orchestration of the system, the efficient allocation and use of the resources, and clear visibility of the content being retrieved from the network. + +We introduce Decentralized Data Delivery Markets (3DMs) as a new field of research and innovation and one with rapidly increasing relevance. Decentralised storage networks, such as Filecoin, have reached unprecedented storage capacity commitments (of over 2.5EB of cold storage in Jan 2021) and continue to grow rapidly. There is an urgent need to complement decentralised storage with decentralised data delivery as these storage networks seek a solution to deliver the data stored in their network to end-users while meeting the expectations users have of the centralised services of today. + +We envision a 3DM as being: + +* A permissionless and open data delivery market, composed of one or more crypto-economic models +* A fair exchange relationship between service providers and users +* A cost efficient way for publishers to distribute their content +* A unique set of business opportunities including: + * Delivering data to end users + * Carrying data between multiple disconnected locations or with high latency between them (Data Muling and/or Package Switching) + * Creating ephemeral distribution networks for large gatherings + * Powering the next generation of Web 3.0 applications + +This new field is ripe with unique business opportunities given the growing demand from users for access to large datasets, videos, and other data-heavy content, the panoply of powerful mobile devices that users carry, and the limitations imposed by physics in ultimately moving increasingly large data at high speeds. + +In this Open Problem definition, we introduce the multiple areas of research (or subOpenProblems), what we know so far for each one of them and link to some new ideas being explored. + +### Definition of the actors + +For convenience and shared understanding, we first define the agents within a 3DM network. These are: + +* **Clients** - Agents that fetch data from Providers. +* **Providers** - Agents that offer data delivery services to Clients. +* **Content Publishers** - Agents that create content and want to have it distributed (or intermediaries thereof). + +### Expected requirements + +We present this list as a guide to protocol designers of what we expect a 3DM implementation to meet. This list is non-exhaustive and presents some flexibility between MUST and SHOULD. The requirements identified are: + +* **_MUST be Decentralized and not just federated_** + * Anyone should be able to join and leave at any time, without requiring permission +* **_The exchanges of value_** **_MUST be verifiable_** + * The payment for bandwidth/latency in token should match what has been agreed and fulfilled + * The payment should be fulfilled if the SLA is fulfilled + * Parties should be able to verify that the service provided was correct (e.g. that they received the right file) +* **_SHOULD be Trustless_** + * Ideally, the network can perform the operations without having to leverage trust in third parties and/or the participants of the exchange + * Nevertheless, designs might benefit from an element of trust to increase the quality of service (e.g. reputation mechanisms may allow for relaxed constraints) +* **_The network SHOULD do resource allocation in an efficient way_** (or as efficiently as possible) + * Should not be an afterthought +* **_Providers SHOULD coordinate and accept pre-fetching of content (warm up the caches)_** + * This is in contrast to IPFS’s core principle of replicating only after explicit request by a peer + * This is done in order to make the network more efficient. However it is not mandatory with the setting being left up to the Provider. + +Additional expectations (i.e. bonus points): + +* Data retrieval SHOULD be anonymous and privacy-preserving. + +Other considerations: + +* It is expected that content will always be identified and retrieved by CIDs +* The provider network will likely not provide random access to files, i.e., items will be named at the object level. +* In case there is an auction market, it should always be available and have a fast way to match offers to bids + +# Areas of Work + +Throughout the exploration of the design space, we identified 3 areas of work that need to be explored in order to make 3DMs Fair, Decentralized and Efficient, as well as a bonus opportunity. The areas are listed below. + +## Data Delivery Metering & Fair Exchange + +We believe that this area of work is the main crux for Decentralized Data Delivery Markets. Without it, it will be impossible to have a fully permissionless, decentralized, and open market for data delivery. + +#### How it is done traditionally + +In traditional or Web 2.0 setups (e.g. CDNs, Mirrors, Static Servers and so on), the correct metering happens on the server and is handled by the provider, which the clients trust to perform correct measurements. This measurement translates into a statement of how much the service was, ultimately resulting in an invoice and request for payment. This payment is facilitated by a trusted third party (e.g. credit card company) and a legal contract that can be used to resolve disputes in case the client fails to pay to the provider and/or the provider fails to deliver the service promised to the client. + +In a decentralized environment that strives to be permissionless, we can’t expect to rely on such legal agreements and third parties and, therefore, need a way to prove fair exchange. That is, we need to be able to prove that the service was delivered correctly and the metering of the provided service was done correctly. This will, in turn, verify the exchange between the two parties and issue the correct payment (i.e. fair exchange). + +This trustless property is really important as we know that markets with no mediators, escrows, and other assurance services (e.g. underground markets) are prone to scams, as the users have to trust that the provider will execute on the agreement. In a trustless environment, once the transfer is completed, there is no way to dispute it. + +#### Properties desired + +* The exchanges of value MUST be verifiable and fair + * Fairness: + * The payment MUST be fulfilled if the SLA is fulfilled + * The payment for bandwidth/latency SHOULD match what was agreed and provided + * Verifiability: + * Both parties MUST be capable of verifying that the exchange was performed correctly + * Bonus: Third parties SHOULD be able to verify that the exchange was performed correctly +* SHOULD be Trustless + * Ideally, the network can perform the operations without having to leverage Trust + * Nevertheless in many designs it might be needed to leverage reputation as a trust vehicle to guarantee high quality of service and/or reliability. + +#### How is Data Delivery Metering different from Fair Exchange + +The field of Fair Exchange overlaps in part with Service Metering. Some notable differences are: + +* Fair Exchange can be used for non-digital goods also +* Fair Exchange is traditionally between 2 parties +* Metering should be available to properly measure the service quality and service provided by one or more parties (e.g. streaming from multiple endpoints) + +In review, the Metering & Fair Exchange fields end up contributing to each other and it is likely that the intersection of both is needed for a sound solution. + +#### Known challenges + +* Fairness + * Making it Trustless + * How to verify that the provider has the ability to delivery the file (e.g. has a local copy or is able to pull it from the network) + * How to verify that the file being transferred is the one requested, before a large amount of resources has been invested (i.e. before the entirety of the file has been transmitted) + * How to verify that the client has received the file + * How to verify and reward that SLA were met? + * How to avoid collusion when adding a third-party (e.g. Referee)? + * How to avoid griefing attacks (make one party pay for fees)? + * How to avoid a malicious actor causing un-rewarded work, hence wasting others’ resources? +* Experience + * How to make the transfers start instantaneously? + * How to support others (e.g. Content Publishers) paying for the usage? + * How to make it private (i.e. so that others don’t know which users are requesting what content)? +* Performance + * How to overcome send-and-halt in order to maximize bandwidth throughput + * How to support multipath (i.e. fetching from multiple sources) + +### State-of-the-art + +When it comes to the state of the art, we found that the existing solutions fall within one of the following categories: + +#### Pay-per-packet + +Pay-per-packet solutions offer granular control over what gets paid, enabling the option to verify if the SLA is being fulfilled. However, their setup cost and latency overhead put them at a disadvantage in terms of maximizing utilization of the underlying resources. + +These type of solutions have been found/highlighted: + +- [Filecoin Retrieval Market](https://spec.filecoin.io/#section-systems.filecoin_markets.retrieval_market) +- [Theta Whitepaper](https://s3.us-east-2.amazonaws.com/assets.thetatoken.org/Theta-white-paper-latest.pdf?v=1612955013.791) + +**Known shortcomings of these approaches:** +* send-and-halt - Because the next packet (unit of service) will only be issued after payment for the previous is received, these solutions often fail to max out the bandwidth available in the connection, increasing the latency of delivery. + + +#### Lock/Unlock access to the resource + +Solutions of this type enable the client and the provider to verify the actual service before unlocking the payment. One of the main tools used is locking the access to the service by encrypting it with a key and then performing an exchange of the key that gives access to the service. + +These solutions can be found in several forms: +- [Solving the Buyer and Seller’s Dilemma: A Dual-Deposit Escrow Smart Contract for Provably Cheat-Proof Delivery and Payment for a Digital Good without a Trusted Mediator](http://anrg.usc.edu/www/papers/Dual_Deposit_ICBC_2019.pdf) +- [FairSwap: How to fairly exchange digital goods](https://eprint.iacr.org/2018/740.pdf) +- [Zero-Knowledge Contingent Payments Revisited: Attacks and Payments for Services](https://acmccs.github.io/papers/p229-campanelliA.pdf) + +**Known shortcomings of these approaches:** +* Vulnerable to griefing attacks. +* Generally, these solutions focus on the fulfilment of the delivery, more so than measuring the speed and rate of the transfer. + +#### Optimistic Fair Exchange + +These solutions build on top of the Fair Exchange ones and adopt an Optimistic approach where some sort of Reputation or Stake is used to give both parties trust that the exchange will occur correctly. If one misbehaves, they can still rely on a dispute system. + +- [OptiSwap: Fast Optimistic Fair Exchange](https://dl.acm.org/doi/10.1145/3320269.3384749) +- [Asynchronous Protocols for Optimistic Fair Exchange](https://ieeexplore.ieee.org/abstract/document/674826?casa_token=K7FXNFUKD7AAAAAA:cAcsxIQvxTqvUpRZ73PYBtG2lGtyrA0qMAEuBa46q4Zas4d3aD7yATmZhxYrhem0RxKGwlqn4g) +- [Optimistic Fair Exchange with Multiple Arbiters](https://eprint.iacr.org/2009/069.pdf) + +**Known shortcomings of these approaches:** +* Setup + Dispute resolution is non-trivial and takes significant time + +#### Reputation based + +Reputation-based solutions give the possibility to speed up the transfer and improve the quality of the service by leveraging the trust built over time between clients & providers. + +- [Proof of Delivery in a Trustless Network](https://ieeexplore.ieee.org/document/8751417) +- [Proof-of-Prestige: A Useful Work Reward System for Unverifiable Tasks](https://www.ee.ucl.ac.uk/~ipsaras/files/Proof_of_Prestige-icbc19.pdf) +- [Mechanisms for Outsourcing Computation via a Decentralized Market](https://scopelab.ai/files/eisele2020mechanisms.pdf) +- Other Gradual Fair Exchange Class of constructions + +**Known shortcomings of these approaches:** +* Not a direct shortcoming, but a challenge is that each participant my have different levels of sensitivity with regards to how much they are willing to rely on trust vs. strict verifiability. + +#### Privacy focused + +There are multiple solutions with the goal of delivering reader privacy and writer privacy. These incur an additional cost in setup and/or latency. Disclaimer: At the time of writing, we haven't dived deep into this set of solutions. + +- [Blockchain based Privacy-Preserving Software Updates with Proof-of-Delivery for Internet of Things](https://www.sciencedirect.com/science/article/abs/pii/S074373151930098X) +- [SilentDelivery: Practical Timed-delivery of Private Information using Smart Contracts](https://arxiv.org/abs/1912.07824) +- [Bulletproofs+: Shorter Proofs for Privacy-Enhanced Distributed Ledger](https://eprint.iacr.org/2020/735.pdf) + +#### Traditional approaches (close to Web 2.0 world) + + +These approaches suggest novel ways to add integrity checks to data transferred or to promote new ways for content distribution, but they don’t depart from the Web 2.0 world of assumptions such as trusted third parties and central points of control. + +- [The multimedia blockchain: a distributed and tamper-proof media transaction framework](http://www.cs.stir.ac.uk/~dbh/downloads/Multimedia-Blockchain-DSP17.pdf) +- [Reliable Client Accounting for P2P-Infrastructure Hybrids](https://www.cis.upenn.edu/~ahae/papers/accounting-nsdi2012.pdf) + +**Known shortcomings of these approaches:** +* Not fully aware of the challenges of building a decentralized network + +### Known attacks to be mitigated + +Here we list the attacks to consider when designing a solution. These are: + +* Malicious actor forces provider to spend bandwidth without issuing payment (also known as Griefing Attack) + * Type: client fraud + * Consequence: bandwidth is spent +* Malicious actor forces provider to pay to retrieve the file from storage point (e.g. Filecoin, Cloud Storage, etc) without the provider itself ever getting paid + * Type: client fraud + * Consequence: currency is spent +* Provider claims it has sent the file, but actually never did + * Type: Provider fraud + * Consequence: Client gets penalized without receiving the service +* Metering Inflation + * Providers report to have used more resources to serve content to clients than what they have actually done. +* Sybil / Throttle attacks + * Description: A set of nodes collude against a content-provider to try and make him go bankrupt (loss of all its “SLA stake”). They all try to download content from that content provider at the same time, so that Providers start consuming the stake from the content providers. If clients are not paying for the service we take the risk of enabling this attack. + +### New ideas being explored + +ResNetLab organized a Research Intensive Workshop on 3DMs, out of which, the following ideas, structured as RFCs emerged: + +* [RFC: ZKCP with Fair Exchanges of 1 bit](https://github.com/protocol/ResNetLab/blob/master/3DM_RFC/RIW2021_RFC_ZKCP%20with%20Fair%20Exchanges%20of%201%20bit.md) +* [RFC: ZKCP Optimizations](https://github.com/protocol/ResNetLab/blob/master/3DM_RFC/RIW2021_RFC_ZKCP%20Optimizations.md) +* [RFC_Optimistic ZKC(S)P](https://github.com/protocol/ResNetLab/pull/15) + +## Distribution Graph Forming + +The area of graph forming for Decentralised Data Delivery Markets revolves around three main areas, which together compose the different goals of the Graph Forming problem: + +* **Content discovery & routing:** the system can forward requests to find content +* **Content placement:** the system should have ways to proactively distribute/replicate copies of data across different Providers in different geographic regions in order to be able to serve content fast. +* **Content copy selection:** the system can choose the optimal copy of the content to serve if multiple copies exist in several Providers, where potentially: + * every copy has a different “asking” price (defined by the cryptoeconomic model) and delivery latency, and + * every miner achieves different performance and has a different reputation profile. + +In order to achieve the above goals, we need to answer certain architectural questions: where do end-users connect (e.g., to a Provider, or to a separate content resolution system), which entity in the architecture makes content resolution and request forwarding decisions and finally, which entity(ies) has(ve) the required knowledge to forward requests to the closest (to the requesting user) copy, _aka_ nearest replica routing. + +We generally consider that Providers are relatively powerful devices with local storage dedicated to storing hot copies of the content, high uptime (close to zero churn) and, ideally, a public IP address (reachable from anywhere). The architecture should be able to take advantage of storage in less powerful and intermittently-connected end-user devices, such as laptops and mobile phones - this is discussed as a different area further down. Although not a strict requirement, this is what will make the decentralised storage network take full benefit of planetary-scale unused storage. + +It is worth highlighting that the system should be able to serve different use-cases and therefore different setups and architectures could apply depending on the use-case. For instance, the content resolution system can be different between the cases where: i) the application operates based on a closed-content ecosystem (e.g., subscriber-based music or video streaming, where control of the content is solely with the content publisher) and ii) the application operates on a totally open content space, e.g., web. + +Last but not least, the system of overlay Provider nodes has to be permissionless and decentralised. No entity has full control of the network of nodes, as is the case with traditional CDNs, where a single entity is in charge of the network setup and the content served by the system. + +How it is done traditionally (CDNs, P2P CDNs) + +Traditionally, content is stored, hosted, replicated and delivered by centralised CDNs. In those setups, **the CDN entity has full control over: i) the formation of their network of servers**, e.g., in which geographic areas to place servers and how to interconnect them, both in terms of topology and in terms of bandwidth deployed between servers, **ii) the placement and replication of content**, i.e., where to put hot copies of content, as well as **iii) the network elements that are responsible for content resolution**. + +In a centralized setup it is much easier to optimise performance and provide guarantees, compared to the case where **every network node is operated by a separate (legal) entity that operates rationally in a profit-maximizing way**. + +Closer to our setup are P2P CDNs, where end-user equipment is “employed” to contribute to the storage and dissemination of content. Node churn, unreliable connectivity and low bandwidth speeds become a reality in P2P CDNs, but **the operation of a P2P CDN is still largely controlled and monitored by a single entity**. This makes decisions with regard to content placement and replication easier. The most important advantage of a single entity taking care of the P2P CDN setup is **monitoring**, that is, being able to observe the performance of peers and make decisions on where and when to replicate content or assign content distribution decisions. + +Properties + +* The system MUST always be able to discover content and satisfy content requests + * There should never be a “404 Content not Found” error for content available anywhere on the network +* The system MUST replicate content to different storage points in order to reduce delivery times and maximize performance. +* Providers MUST follow the crypto-economic model and the system MUST make sure that Providers do not misbehave. +* The network MUST be content-addressable and operate based on content identifiers. +* The system MUST be permissionless and trustless + * Anyone should be free to join and set up a Provider node to contribute to the network. + + +### State-of-the-art + +The target area and expected outcome of this topic is to form the network, the interactions between different network entities, as well as the basic protocols through which network entities will communicate. Given this target, we split our investigation in the following three main areas: + +**P2P CDNs:** the network architecture setup in these systems is similar in some ways to that of a 3DM + +* [LiveSky: Enhancing CDN with P2P](https://dl.acm.org/doi/pdf/10.1145/1823746.1823750) +* [P2P as a CDN: A new service model for file sharing](https://www.sciencedirect.com/science/article/pii/S1389128612002290?casa_token=uNw-gpbx5sIAAAAA:VYBa5QErOCS7DcduOwf1lsl3C174YlOIMmQii9NhKippX_Hm7I3QYnfeZ53LTVcp7Uj8y1JX4DI) +* [OblivP2P: An Oblivious Peer-to-Peer Content Sharing System](https://www.usenix.org/system/files/conference/usenixsecurity16/sec16_paper_jia.pdf) + +**P2P VoD:** video delivery is an ideal target use-case, with very strict requirements; therefore, the mechanisms proposed in this field and used for P2P VoD can be inspiring + +* [Challenges, Design and Analysis of a Large-scale P2P-VoD System](https://dl.acm.org/doi/pdf/10.1145/1402946.1403001) +* [A Framework for Lazy Replication in P2P VoD](https://dl.acm.org/doi/pdf/10.1145/1496046.1496068) +* [InstantLeap: Fast Neighbor Discovery in P2P VoD Streaming](https://dl.acm.org/doi/pdf/10.1145/1542245.1542251) +* [Proactive Video Push for Optimizing Bandwidth Consumption in Hybrid CDN-P2P VoD Systems](https://ieeexplore.ieee.org/abstract/document/8485962?casa_token=41CKY7irz4kAAAAA:V2cwdpnSCny5GB2GGn0Zj1-3-BefgmpJTs0qTPZiAdzMINYIJryr7tU2L5ue8S3kVcRRdyfOtg) + +**Content-Centric Networking:** there are several network architectures and protocols proposed for content-/information-centric networks which can be great inspiration for a permissionless, content-addressable P2P network. + +* [Named Data Networking (NDN)](https://dl.acm.org/doi/pdf/10.1145/2656877.2656887) +* [iCDN - An NDN based CDN](https://dl.acm.org/doi/pdf/10.1145/3405656.3418716) +* [Analysis and Improvement of Name-based Packet Forwarding over Flat ID Network Architectures](https://dl.acm.org/doi/pdf/10.1145/3267955.3267960) +* [High Throughput Forwarding for ICN with Descriptors and Locators](https://dl.acm.org/doi/pdf/10.1145/2881025.2881032) + +Our initial, but thorough investigation resulted in the following potential groups of designs for content discovery and resolution: + +#### DHT-based: + +DHTs are very popular constructions in P2P networks. The DHT system is used as a content resolution mechanism, as well as a content and peer routing system. The routing table is split between peers that participate in the DHT, providing higher resilience and scalability. In a DHT-based system, clients “walk” the DHT (iteratively, or recursively) to find the provider record and then directly connect to the peer included in the provider record. + +* **Pros:** tested in the past, engineers have lots of experience with these structures, can become faster and less expensive than the IPFS DHT setup, if: i) re-publishing is done at coarser granularities, which is reasonable if we assume stable connectivity, i.e., low peer churn (reasonable to assume for Providers), and ii) some payment is associated with publishing. It is also reasonable to assume public IP connectivity for Providers. +* **Cons:** slow, several round-trips needed to resolve content (especially in case of iterative DHT lookup). The solution will not scale in the longer term. + +#### Name-based routing: + +In Name-based routing systems, routing hints are integrated as part of the content name; routing tables are filled with routing hints at network setup time by a routing protocol. Routers make hop-by-hop forwarding decisions based on content names seen in requests and routing hints in their routing tables. Matching between hints and names depend on the structure of the names, e.g., hierarchical vs flat. + +* **Pros:** very fast, enables multicast-like opportunities and on-path caching, which can result in significant savings in case of popular and heavy content (e.g., HD VoD). Also makes routing from browser/limited connectivity clients more feasible. +* **Cons:** design can be(come) complex, security properties not fully studied in the literature. + +#### DNS-style, object-level indexing service: + +The Domain Name System (DNS) uses index tables to resolve names (URLs) to IP addresses of hosts that store the requested name. It is considered by many to be a decentralised system, in the sense that DNS servers can be deployed by anyone running an ISP. At the top-level, however, it is administered by [ICANN](https://www.icann.org/) which is in charge of assigning names and therefore, does not comply with the permissionless nature of 3DMs. We could envision a similar, index-based naming system, which is governed by the [Ethereum Name Service](https://docs.ens.domains/) (ENS) to bypass centralization concerns. Cloudflare has recently introduced a [Name Resolver for the Distributed Web](https://blog.cloudflare.com/cloudflare-distributed-web-resolver/), where IPFS content can be accessed through ENS. + +* **Pros:** can be very fast +* **Cons:** need to rely on ENS (which is fine given the ENS system is deployed and tested in the wild, albeit in smaller scales), or build a similar service + +#### PubSub-style: + +In pubsub systems information propagates in the network based on topics that nodes subscribe to. Notifications about new content being published in the system can propagate through a dedicated channel, or more realistically, applications can have their own topics to disseminate information about content published within the remit of their application. + +* **Pros:** simple approach, lots of literature and testing in dozens of systems, engineers have lots of experience with similar protocols +* **Cons:** too slow for real-time content delivery, can take seconds to find content, can’t scale in the longer term + +### Known attacks to be mitigated + +* Providers provide false content discovery and routing information +* Providers serve bogus content +* Providers provide false provider records (i.e., they claim that they have and can serve content that they actually do not have) +* Cache poisoning +* Privacy attacks: there are a number of privacy considerations and threat vectors to be taken into account + +### New ideas being explored + +ResNetLab organized a Research Intensive Workshop on 3DMs, from which the following ideas emerged and were structured as RFCs: + +* [RFC: Incentive alignment for collaborative routing](https://github.com/protocol/ResNetLab/blob/master/3DM_RFC/RIW2021_RFC_Incentive%20alignment%20for%20collaborative%20routing.md) +* [RFC: Name-based Request Forwarding for Nearest Replica Routing](https://github.com/protocol/ResNetLab/blob/master/3DM_RFC/RIW2021_RFC_Name-based%20Request%20Forwarding%20for%20Nearest%20Replica%20Routing.md) +* [RFC: Omniscient Routers](https://github.com/protocol/ResNetLab/blob/master/3DM_RFC/RIW2021_RFC_Omniscient%20Routers.md) + +## CryptoEconomic model for Data Delivery + +The aim of the cryptoeconomic model is to build an incentive system to ensure that all actors in the network are aligned towards the same goal: to deliver data efficiently. The cryptoeconomic model is tightly coupled to all of the areas presented above, offering a way to incentivize desired behaviors in the network. Ideally, the economic model should offer the substrate to build a decentralized and trustless infrastructure for data delivery able to compete against traditional CDN infrastructures in terms of cost, scalability, and price. + +#### How it is done traditionally + +In traditional and centralized setups, a set of legal agreements is used to govern the relationships between entities, align the incentives of all participants, and discourage disruptive behaviour. These agreements offer a basic level of trust to ensure good behavior by all entities in the system (clearly stating the SLA, and punishments for misbehaving or not fulfilling the contract). We currently see this setup in the multilateral agreements between CDNs, ISPs, and Cloud Providers to share resources from their infrastructures for a certain price in order to build a network of relationships that allow them to provide their content delivery services efficiently. + +In decentralized setups, it is not possible to use legal agreements to orchestrate the relationship between entities in the system. In recent deployments of hybrid CDNs, traditional, centralised CDNs leverage the resources of end users to deliver data with enhanced QoS reducing the load on their infrastructure and as a result the cost of upgrading/extending their infrastructure. End users are incentivized to contribute to the system with their upload bandwidth by making them eligible for better service. This additional reward is used to incentivize a behavior in the system (in this case users contributing with bandwidth in hybrid CDNs). However, the fact that there is still a centralized infrastructure managed by an entity with greater power over the rest of actors is enough to prevent misbehavior. This removes the need to design stronger reputation or reward systems. This does not represent a trustless setup. + +For decentralized and trustless setups, two main schemes have been traditionally used to align the incentive of the system’s participants and prevent misbehaviors: + +* Trustless networks governed by a common consensus, like public blockchains, use economic models based on token rewards and clear punishments built upon a secure consensus algorithm. The consensus algorithm gives a basic layer of trust where all participants “keep an eye on one another” preventing misbehaviors, and upon which the economic model is built to align all their goals. A good example of this model is Bitcoin, where the Proof of Work consensus algorithm prevents attacks, while the mining rewards incentivize miners to keep serving the network. + +* For trustless P2P networks where there is no common protocol run by all the participants of the network, other schemes such as reputation systems, or credit networks need to be implemented to orchestrate the relationships and good behaviors of all entities in the system. + +In the same way public blockchains leverage the schemes and security properties in place to design their economic model, 3DMs will have to leverage the metering and graph forming designs in place to design the right economic model. + +Finally, auction markets and game theoretical models have been traditionally used to study and achieve efficient resource allocation in P2P networks and decentralized systems. + +#### Properties desired + +* The model MUST foster fair competition and avoid the creation of monopolies. + * We should prevent superlinear advantages from winning/completing a high percentage of retrieval deals in the system. +* The model SHOULD discourage, prevent, and punish misbehaviors. + * Or the other way around, good behaving entities should be rewarded by the model. + * In its different layers, the system will include schemes to prevent attacks in the network (client metering, sybil attacks, data-ransoming, etc.). However, this economic model should disincentivize these kinds of misbehavior in advance (from a game theoretical approach, the system should target a Nash Equilibrium in the system where misbehaviors are disincentivized). + * It should also avoid “malicious economic attacks” such as a content provider trying to bankrupt its competition by draining the stake of his retrieval deal. +* The model SHOULD foster collaboration between entities to benefit users perceived QoS / QoE. + * The model should reward entities that collaborate to serve content efficiently and with high QoS to users. + * This will also result in an efficient allocation of resources in the network. +* If any part of the economics of the system ends up being orchestrated by an auction market, this market MUST be always available. + * And should match offers to bids in a fast and efficient way. + +### State-of-the-art + +As described above, the outcome of this topic should be to design an economic model that aligns the goals of all profit-maximizing entities in the system while preventing misbehaviors. Given this target, we split our investigation in the following areas: + +##### Economics of Hybrid CDNs and P2P networks + +The economics of current Hybrid CDN deployments give a good understanding of the system and cost models involved in the delivery of content at scale. This, added to the different analysis and design proposals of economic models for content delivery in P2P networks represent a good foundation to understand the complexity of the problem and potential ways to tackle it. + +**_Related Papers:_** + +* [An economic mechanism for request routing and resource allocation in hybrid CDN–P2P networks](http://www.cloudbus.org/papers/CDN-P2P-NetMan.pdf) +* [An economic replica placement mechanism for streaming content distribution in Hybrid CDN-P2P networks](https://www.sciencedirect.com/science/article/pii/S014036641400228X?casa_token=99HEhHX4Qx4AAAAA:HGUBKkgzqtRn-AwdIpjQmxFMmUd6YIwuWH4ESn3MC1Wv1xYjI5JemUOtJlPDpI20CqFwwlYbVqM) +* [How Neutral is a CDN? An Economic Approach](https://files.ifi.uzh.ch/stiller/CNSM%202014/pdf/54.pdf) +* [Value Networks and Two-Sided Markets of Internet Content Delivery](http://www.leva.fi/wp-content/uploads/ICN_2SM_TelecomPolicy_accepted_manuscript.pdf) +* [Bilateral and Multilateral Exchanges for Peer-Assisted Content Distribution](https://www.cs.princeton.edu/~mfreed/docs/bilateral-tr10.pdf) + +**_Learnings: _** + +* Protocols and systems involved in the cost model of a Hybrid-CDN. +* Models of P2P content delivery networks. + +##### Game theoretical models and reward/reputation systems in P2P networks + +How to design the right incentive and reputation models to incentivize certain behaviors in P2P networks has been a widely studied problem for some time now. From reputation systems where nodes track the level of good behavior of their peers and cooperate with them according to their grade; to incentive systems where good behavior is explicitly rewarded. Game-theoretical models are a way to evaluate the strength of these schemes and to understand if the proposals can achieve Nash Equilibrium. + +**Related Papers:** + +* [Scrivener: Providing Incentives in Cooperative Content Distribution Systems](http://cs.brown.edu/courses/csci2950-g/papers/scrivener.pdf) +* [Proof-of-Prestige: A Useful Work Reward System for Unverifiable Tasks](https://www.ee.ucl.ac.uk/~ipsaras/files/Proof_of_Prestige-icbc19.pdf) +* [Incentivizing Peer-Assisted Services: A Fluid Shapley Value Approach](https://dl.acm.org/doi/pdf/10.1145/1811099.1811064) +* [Incentive and Service Differentiation in P2P Networks: A Game Theoretic Approach](http://www.cse.cuhk.edu.hk/~cslui/PUBLICATION/incentive_tons.pdf) +* [On Incentivizing Caching for P2P-VoD Systems](http://www.cse.cuhk.edu.hk/~cslui/PUBLICATION/netecon12.pdf) +* [Bar Gossip](https://static.usenix.org/event/osdi06/tech/full_papers/li/li.pdf) + +**_Learnings: _** + +* Use different metrics to evaluate the level of good behavior of peers. +* Examples of game theoretic models to approach the evaluation of these protocols. +* Schemes to avoid attacks to which these systems can be vulnerable (such as sybil attacks). + +##### Credit networks and Token Designs + +Credit networks provide liquidity in markets where transaction volumes are close to balanced in both directions. They offer a way of performing payments and rewarding behaviors without the need of a common consensus or dedicated agreements between all the entities in the systems. Credit networks require no “a priori” trust relationships when they are backed by on-chain escrows, so they represent an interesting approach to tackle the economics of 3DMs. + +**_Related Papers:_** + +* [Collusion-resilient Credit-based Reputations for Peer-to-peer Content Distribution](https://dl.acm.org/doi/pdf/10.1145/1879082.1879085) +* [Liquidity in Credit Networks: A Little Trust Goes a Long Way](https://dl.acm.org/doi/pdf/10.1145/1993574.1993597) +* [Liquidity in Credit Networks with Constrained Agents](https://dl.acm.org/doi/pdf/10.1145/3366423.3380276) +* [CAPnet: A Defense Against Cache Accounting Attacks on Content Distribution Networks](https://arxiv.org/abs/1906.10272) +* [MicroCash: Practical Concurrent Processing of Micropayments](https://arxiv.org/pdf/1911.08520.pdf) +* [Proof-of-Prestige: A Useful Work Reward System for Unverifiable Tasks](https://www.ee.ucl.ac.uk/~ipsaras/files/Proof_of_Prestige-icbc19.pdf) + +**_Learnings: _** + +* Economics of credit networks. +* Using credit networks for fast payments and reputation systems. +* Credit networks for content distribution in P2P networks. + +##### Auctions, decentralized markets, and efficient resource allocation + +Auctions and decentralized markets have traditionally been a good way of allocating resources efficiently in a decentralized manner. These papers analyze different proposals of auction systems and decentralized markets that can aid the design of efficient resource allocation in 3DMs. + +**_Related Papers:_** + +* [Edge-MAP: Auction Markets for Edge Resource Provisioning](https://www.ee.ucl.ac.uk/~ipsaras/files/edgeMap-wowmom18.pdf) +* [A Market Protocol for Decentralized Task Allocation](https://www.computer.org/csdl/proceedings-article/icmas/1998/85000325/12OmNwlZu42) +* [On the Efficiency of Sharing Economy Networks](https://ieeexplore.ieee.org/document/8665937) +* [Resource Allocation in Market-based Grids Using a History-based Pricing Mechanism](http://ce-publications.et.tudelft.nl/publications/646_resource_allocation_in_marketbased_grids_using_a_historyba.pdf) +* [Content Pricing in Peer-to-Peer Networks](https://www.usenix.org/legacy/event/netecon10/tech/full_papers/Park.pdf) + +**_Learnings: _** + +* Use of auctions as an efficient way to allocate resources in a decentralized system. +* Local auction protocols. to drive the offer and demand of resources. +* Decentralized market protocols for efficient pricing and distribution of resources. + +### Known attacks to be mitigated + +* **Sybil attacks:** Actors trying to game the system by indiscriminately generating a large amount of entities and gaining large influence over the system (forging client retrievals, overestimating the use of resources of a provider, preventing access from some resource in the network, making actors in the system dedicate resources to useless work, etc.). +* **Collusion attacks:** Several independent actors in the system colluding to perform attacks in order to gain large influence in the network. The type of attacks that can be performed with a collusion attack are similar to the ones performed in a sybil attack, but without having to generate “pseudonymous identities”. +* **Data ransoming:** This attack takes place when a provider agrees to serve some data from a publisher, but ends up preventing its retrieval from clients until a ransom is paid. An alternative form of this attack occurs when a provider is serving chunks of content to a client, and doesn’t deliver the last couple of chunks until it pays a ransom. +* **Malicious economic attacks:** Attacks aimed at economically harming actors in the systems. For instance, clients trying to get a provider or content publisher bankrupt, providers offering abusive prices to content publishers, providers and clients colluding to avoid the economic rewards of target entities, etc. + +### New ideas being explored + +ResNetLab organized a Research Intensive Workshop on 3DMs, out of it, the following ideas, structured as RFCs emerged: + +* [RFC: QFIL Closed Retrieval Economy](https://github.com/protocol/ResNetLab/blob/master/3DM_RFC/RIW2021_RFC_QFIL%20Closed%20Retrieval%20Economy.md) +* [RFC: No market 3DMs](https://github.com/protocol/ResNetLab/blob/master/3DM_RFC/RIW2021_RFC_NoMarkets3DM.md) +* [RFC: Credit-based Retrieval Network](https://github.com/protocol/ResNetLab/blob/master/3DM_RFC/RIW2021_RFC_Credit-based%20Retrieval%20Network) + +## Additional: Opportunistic deployment + +An area adjacent to the Distribution Graph Forming one is that of extending the network beyond Providers, as defined earlier, to also include more ephemerally-connected, end-user devices. Such devices can include laptops, desktops, (futuristic) storage-equipped WiFi Access Points, or even mobile smartphone and tablet devices. + +We call these environments “opportunistic deployments” to reflect their unpredictability in terms of availability, uptime, resource quality and quantity. In contrast to Providers, as defined earlier that are expected to have stable, public and high-bandwidth connectivity, 3DM opportunistic deployments can utilise everyday user devices to extend the storage footprint of Provider nodes and create a wealth of new network connectivity and business opportunities. + +Although this area seems to sit on the periphery of 3DMs, it is actually a highly impactful area, as it realises the vision of Decentralised Storage Networks in general and Filecoin, in particular, of regular end-users sharing their own resources to contribute to the network. That said, we place high value in capturing this opportunity and offering to end-users the opportunity of being rewarded for their contribution to the network. + +### State-of-the-art + +The literature in the field of Opportunistic and Delay-Tolerant Networks is vast. We have narrowed down the scope of the literature that we reviewed and identified the following most-promising 3DM applicability areas. + +#### Transient Providers + +We consider end-users that store content in their ephemerally connected devices (laptops, or mobile phones) and provide them to the network through (one or more) Providers, as defined in the “Distribution Graph Forming” area. These service providers are called Transient Providers (TPs) to depict their ephemeral nature in resource availability and time. TPs can have some economic relationship with one or more Providers, e.g., Providers can “recruit” TPs to expand their storage capacity and footprint. In this case, Provider nodes have to maintain their own monitoring mechanisms and do resource allocation to ensure that they are getting desirable levels of service from their group of TPs. + +Opportunistic D2D + +This area of research and deployment is closer to traditional Delay-Tolerant Networks (DTNs). We envision applications where mobile devices contribute to the distribution of content in the mobile domain. These can be akin to previously proposed [User-Operated Mobile Content Distribution Networks](https://drive.google.com/file/d/1vvtQ7MJb4YFRXxeo2GewGh8EVYEqV-iJ/view?usp=sharing), or applications to realise concepts such as “[Floating Content](https://drive.google.com/file/d/1yOniHbAjLYv3q09pff7gnulOwT_NYCYG/view?usp=sharing)”. + +### Known shortcomings + +**User Mobility** + +When a user is “registered” under one address/network location to serve content (at least as far as its Provider is concerned) and then moves to another network location, the content is not discoverable/retrievable anymore. + +* Brings up content mobility issues and “content churn” +* Similar to node churn, this is a very tricky problem: how can you find content that was linked to some network address, when this address is not valid anymore. You can, of course, update the record if you know where the record lives, but if the record is “allowed” to be provided by anyone, then it’s difficult to even find it. +* Simple solution: route through “home” gateway, similar to Mobile IP. Increases delay, is not ideal, but can work +* There is a lot of work on “producer mobility” in the literature that we should look at. + +**Privacy - Efficiency Tradeoff** + +In mobile opportunistic communications, the two are often conflicting. On one extreme, you have efficient (low-replication) solutions that make use of a lot of node data (geolocation history/patterns, contact history/patterns, current geographic destination, current velocity vector). On the other extreme, you have naive epidemic dissemination solutions that require no node profiling but introduce data redundancy. There is a continuum in between, as well as a third variable, which is QoS: in the extreme, if willing to wait forever for delivery, you can blindly pass a message around without replication. + +Keeping with the ethos of our projects, we believe that the most suitable solutions are those that don’t require sensitive data, including data related to location or contact history, from which identity and behaviour can be easily extracted. Aggregate transitive metrics (e.g. total expected time to destination measures) can provide a measure of delivery likelihood without disclosing the full contact vector or the nature of the contact (direct vs. indirect), and may be a useful compromise. Other data, including interests/subscriptions, is akin to what is already used e.g. in pubsub protocols and not considered to be any more privacy-invading. + +**Security** + +Like with any other distributed routing/forwarding approach, malicious nodes can interfere with message propagation and delivery. Because of the disconnected nature of the network, such attacks are harder (or at least slower) to detect and counteract. Secure-by-design approaches are likely to suffer from additional overhead (either in data or complexity) and _may_ be precocious when compared to the security model of other, more critical, parts of the network. + +**Energy Efficiency and Battery Consumption** + +Opportunistic communications that rely heavily (or exclusively) on user devices always come with the challenge of usability from the energy/battery perspective. Of course, incentives through FIL will alleviate some of it, but even then the incentive would have to be such that it overcomes the “running out of battery” shock. Techniques to overcome this can be as simple as disabling user participation when the battery level is below X%. + +**Incentives** + +The incentive to participate and the cryptoeconomic model behind the opportunistic part of the network is quite likely going to be incompatible with the one in the main Distribution Graph Forming area that applies to large/stable Providers. Nevertheless, incentives is a core part of this area and has traditionally been a stumbling block for the deployment of opportunistic networks. + +### New ideas being explored + +ResNetLab organized a Research Intensive Workshop on 3DMs, out of which, the following ideas, structured as RFCs emerged: + +* [RFC: Hybrid CDN with Recruiter Providers](https://github.com/protocol/ResNetLab/blob/master/3DM_RFC/RIW2021_RFC_Hybrid%20CDN%20with%20Recruiter%20Providers.md) +* [RFC: OS-level OppNet Component](https://github.com/protocol/ResNetLab/blob/master/3DM_RFC/RIW2021_RFC_OS-level%20OppNet%20Component.md) +* [RFC: On-Demand Opportunistic Resource Deployment](https://github.com/protocol/ResNetLab/blob/master/3DM_RFC/RIW2021_RFC_On-Demand%20Opportunistic%20Resource%20Deployment.md) diff --git a/README.md b/README.md index a7b5ad8..d5a77c3 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,8 @@ - [Motivation & Description](#motivation--description) - [Research](#research) - [Areas](#research) - - [Projects](#research) - - [Collaborations](#collaborations) + - [Projects](#research) + - [Collaborations](#collaborations) - [Collab projects tracking threads](#collab-projects-tracking-threads) - [Publications, Talks & Trainings](#publications-talks--trainings) - [Team](#team) @@ -48,31 +48,37 @@ The lab's genesis comes from a need present in the IPFS and libp2p projects to a Open Problem(s) Short Description - + - Networks Observability + Resilliency in Adversarial Networks NEEDs OPEN PROBLEM - + - Resilliency in Adversarial Networks + Networks Observability NEEDs OPEN PROBLEM - + + + + Decentralized Data Delivery Markets + General open problem + + Heterogeneous Runtimes General open problem Making libp2p / IPFS modules and protocols the de-facto distributed substrate for connected devices in the near-future Internet. Enable the execution of libp2p nodes and its underlying protocols anywhere (any device and any runtime). Allow global connectivity between devices. Enable “offline-first” applications. - + Content Addressing Routing at Scale (1M, 10M, 100M, 1B.. nodes) Content-addressable networks face the challenge of routing scalability, as the amount of addressable elements in the network rises by several orders of magnitude compared to the host-addressable Internet of today. - + @@ -84,37 +90,37 @@ The lab's genesis comes from a need present in the IPFS and libp2p projects to a Mutability Mutable Data (Naming, Real-Time, Guarantees) Enabling a multitude of different patterns of interactions between users, machines and both. In other words, what are the essential primitives that must be provided for dynamic applications to exist, what are the guarantees they require (consistency, availability, persistancy, authenticity, etc) from the underlying layer in order create powerful and complete applications in the Distributed Web. - - + + Human Readable Naming You can only have two of three properties for a name: Human-meaningful, Secure and/or Decentralized. This is Zooko's Trilemma. Can we have all 3, or even more? Can context related to some data help solve this problem? - + PubSub at Scale (1M, 10M, 100M, 1B.. nodes) As the IPFS system is evolving and growing, communicating new entries to the IPNS is becoming an issue due to the increased network and node load requirements. The expected growth of the system to multiple millions of nodes is going to create significant performance issues, which might render the system unusable. Despite the significant amount of related literature on the topic of pub/sub, very few systems have been tested to that level of scalability, while those that have been are mostly cloud-based, managed and structured infrastructures. - + Data Exchange Enhanced Bitswap/GraphSync with more Network Smarts Bitswap is a simple protocol and it generally works. However, we feel that its performance can be substantially improved. One of the main factors that hold performance back is the fact that a node cannot request a subgraph of the DAG and results in many round-trips in order to “walk down” the DAG. The current operation of bitswap is also very often linked to duplicate transmission and receipt of content which overloads both the end nodes and the network. - - + + - Distributed Type Systems + Distributed Type Systems Improved layouts to represent data in hash-linked graphs (using IPLD) Future™ ⚙️ - + ### Projects - Hydra Booster -- Gossipsub v1.1 +- Gossipsub v1.1 - drand - [Beyond Bitswap](https://github.com/protocol/beyond-bitswap) - P2P Observatory @@ -151,4 +157,4 @@ The lab's genesis comes from a need present in the IPFS and libp2p projects to a ### Contact -You can reach out to us anytime with your question and interest in these projects by emailing [resnetlab@protocol.ai](mailto:resnetlab@protocol.ai) \ No newline at end of file +You can reach out to us anytime with your question and interest in these projects by emailing [resnetlab@protocol.ai](mailto:resnetlab@protocol.ai) From b78c1ecb5998d5ffcfe6b5c7bfbd6c0d21f80e89 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Fri, 12 Feb 2021 12:05:12 +0100 Subject: [PATCH 27/34] Fixed minor typo --- OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md b/OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md index 579c8a4..5780d23 100644 --- a/OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md +++ b/OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md @@ -428,7 +428,7 @@ The economics of current Hybrid CDN deployments give a good understanding of the * [Value Networks and Two-Sided Markets of Internet Content Delivery](http://www.leva.fi/wp-content/uploads/ICN_2SM_TelecomPolicy_accepted_manuscript.pdf) * [Bilateral and Multilateral Exchanges for Peer-Assisted Content Distribution](https://www.cs.princeton.edu/~mfreed/docs/bilateral-tr10.pdf) -**_Learnings: _** +**_Learnings:_** * Protocols and systems involved in the cost model of a Hybrid-CDN. * Models of P2P content delivery networks. @@ -446,7 +446,7 @@ How to design the right incentive and reputation models to incentivize certain b * [On Incentivizing Caching for P2P-VoD Systems](http://www.cse.cuhk.edu.hk/~cslui/PUBLICATION/netecon12.pdf) * [Bar Gossip](https://static.usenix.org/event/osdi06/tech/full_papers/li/li.pdf) -**_Learnings: _** +**_Learnings:_** * Use different metrics to evaluate the level of good behavior of peers. * Examples of game theoretic models to approach the evaluation of these protocols. @@ -465,7 +465,7 @@ Credit networks provide liquidity in markets where transaction volumes are close * [MicroCash: Practical Concurrent Processing of Micropayments](https://arxiv.org/pdf/1911.08520.pdf) * [Proof-of-Prestige: A Useful Work Reward System for Unverifiable Tasks](https://www.ee.ucl.ac.uk/~ipsaras/files/Proof_of_Prestige-icbc19.pdf) -**_Learnings: _** +**_Learnings:_** * Economics of credit networks. * Using credit networks for fast payments and reputation systems. @@ -483,7 +483,7 @@ Auctions and decentralized markets have traditionally been a good way of allocat * [Resource Allocation in Market-based Grids Using a History-based Pricing Mechanism](http://ce-publications.et.tudelft.nl/publications/646_resource_allocation_in_marketbased_grids_using_a_historyba.pdf) * [Content Pricing in Peer-to-Peer Networks](https://www.usenix.org/legacy/event/netecon10/tech/full_papers/Park.pdf) -**_Learnings: _** +**_Learnings:_** * Use of auctions as an efficient way to allocate resources in a decentralized system. * Local auction protocols. to drive the offer and demand of resources. From e0589d5f1ba776588515dbbb55945983a826038e Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Fri, 12 Feb 2021 12:06:45 +0100 Subject: [PATCH 28/34] Fixed file extension --- ...IPLD data model => RIW2021_RFC_ZK-friendly IPLD data model.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 3DM_RFC/{RIW2021_RFC_ZK-friendly IPLD data model => RIW2021_RFC_ZK-friendly IPLD data model.md} (100%) diff --git a/3DM_RFC/RIW2021_RFC_ZK-friendly IPLD data model b/3DM_RFC/RIW2021_RFC_ZK-friendly IPLD data model.md similarity index 100% rename from 3DM_RFC/RIW2021_RFC_ZK-friendly IPLD data model rename to 3DM_RFC/RIW2021_RFC_ZK-friendly IPLD data model.md From 3915abeaeadcdfcaae4f4ed41ae382427c704285 Mon Sep 17 00:00:00 2001 From: David Dias Date: Fri, 12 Feb 2021 15:21:23 +0100 Subject: [PATCH 29/34] Delete .gitkeep --- 3DM_RFC/.gitkeep | 1 - 1 file changed, 1 deletion(-) delete mode 100644 3DM_RFC/.gitkeep diff --git a/3DM_RFC/.gitkeep b/3DM_RFC/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/3DM_RFC/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - From fb1cde3f52fcbfcc8c154e0782063e54a0dfd74d Mon Sep 17 00:00:00 2001 From: David Dias Date: Mon, 15 Feb 2021 09:15:54 +0100 Subject: [PATCH 30/34] Update DECENTRALIZED_DATA_DELIVERY_MARKETS.md --- OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md b/OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md index 5780d23..e44f347 100644 --- a/OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md +++ b/OPEN_PROBLEMS/DECENTRALIZED_DATA_DELIVERY_MARKETS.md @@ -179,7 +179,7 @@ When it comes to the state of the art, we found that the existing solutions fall #### Pay-per-packet -Pay-per-packet solutions offer granular control over what gets paid, enabling the option to verify if the SLA is being fulfilled. However, their setup cost and latency overhead put them at a disadvantage in terms of maximizing utilization of the underlying resources. +Pay-per-packet solutions offer granular control over what gets paid, enabling the option to verify if the SLA is being fulfilled. These type of solutions have been found/highlighted: @@ -187,7 +187,7 @@ These type of solutions have been found/highlighted: - [Theta Whitepaper](https://s3.us-east-2.amazonaws.com/assets.thetatoken.org/Theta-white-paper-latest.pdf?v=1612955013.791) **Known shortcomings of these approaches:** -* send-and-halt - Because the next packet (unit of service) will only be issued after payment for the previous is received, these solutions often fail to max out the bandwidth available in the connection, increasing the latency of delivery. + * send-and-halt - Because the next packet (unit of service) will only be issued after payment for the previous is received, these solutions often fail to max out the bandwidth available in the connection, if the service provider defaults to being conservative, hence increasing the latency of delivery. #### Lock/Unlock access to the resource From 1cafd348fcf1a523fbc21b01d263249a9e800832 Mon Sep 17 00:00:00 2001 From: Yiannis Psaras <52073247+yiannisbot@users.noreply.github.com> Date: Mon, 31 May 2021 13:34:32 +0100 Subject: [PATCH 31/34] Update ResNetLab README.md (#30) * Update README.md * Update README.md * Update README.md * adding content routing project --- README.md | 73 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 58 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index d5a77c3..ff67a98 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ The lab's genesis comes from a need present in the IPFS and libp2p projects to a Decentralized Data Delivery Markets General open problem - + Content storage and delivery services have traditionally been under the ownership, control and management of centralised entities. Decentralised storage platforms are emerging and are in operation today. However, without actual delivery of content to users, these networks can be of little value, limited to serve as cold storage solutions only. With this Open Problem, we introduce the field of decentralised delivery, or decentralised CDNs to complement decentralised storage systems and come one step closer to the whole set of solutions that traditional CDNs offer today. @@ -119,11 +119,25 @@ The lab's genesis comes from a need present in the IPFS and libp2p projects to a ### Projects -- Hydra Booster -- Gossipsub v1.1 -- drand -- [Beyond Bitswap](https://github.com/protocol/beyond-bitswap) -- P2P Observatory +- ONGOING + - 3DMs: Decentralised Data Delivery Markets + - Content Routing Scale Up + - P2P Observatory + - ResNetLab on (Virtual) Tour: +We have built a half-day tutorial to introduce the DWeb, the IPFS ecosystem, the IPFS architecture and its supporting protocols, and the high-level design decisions of the Filecoin network. In 2020, we have participated in multiple conferences and other academic events to discuss the exciting projects we're working on and invite great researchers to collaborate with us. +The tutorial is primarily composed of lecture material, and many of our tutorials have been very interactive. In 2021, we are enhancing the tutorial with hands-on sessions, so it will be even more exciting for students and researchers with a passion to tinker as they learn. You can find summaries of our talks in the "Publications and Talks" section further down. + +- COMPLETED + - **Hydra Booster:** The Hydra booster is a new type of DHT node designed to accelerate the Content Resolution & Content Providing on the IPFS Network. This new type of peer exists to augment the network by creating multiple distributed identities across the DHT address space, enabling it to contribute to the storage and discovery of content provider records. All of these identities are linked by the same backend datastore, which from the other peers’ perspective, creates the effect of multiple peers being present and holding a vast collection of the provider records in the network. The Hydra Booster has been instrumental for the stability and fast content resolution of the IPFS network. + Hydra boosters have been designed, implemented and are in operation today in the public IPFS network as of [release go-ipfs 0.5](https://blog.ipfs.io/2020-04-28-go-ipfs-0-5-0/). The Hydra booster is open source, lives in [this repository](https://github.com/libp2p/hydra-booster) and can be deployed by anyone. + + - **Gossipsub v1.1:** Gossipsub is one of the many libp2p PubSub routers used to disseminate IPNS records in the IPFS network, enable real-time distributed applications, and much more. GossipSub was adopted as a messaging layer by Filecoin and ETH2.0, due to its functionality and fast performance on permissionless networks. This has led us to invest additional effort to protect it against sybil attacks and malicious behavior. +Together with the libp2p team, we embarked on a mission to harden the protocol’s behavior. The outcome is a hardened version of the Gossipsub protocol that integrates several mitigation strategies at the protocol level. +You can learn more about this project in this [blogpost](https://research.protocol.ai/blog/2020/gossipsub-an-attack-resilient-messaging-layer-protocol-for-public-blockchains), this [paper](https://research.protocol.ai/publications/gossipsub-attack-resilient-message-propagation-in-the-filecoin-and-eth2.0-networks/) and this [talk](https://www.youtube.com/watch?v=APVp-20ATLk&feature=youtu.be&t=3612) at the Matrix.org “Open Tech will save us all” event. Our extensive performance evaluation can be found in this [report](https://research.protocol.ai/publications/gossipsub-v1.1-evaluation-report/). The specification of the protocol can be found [here](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md). + - **[drand](https://drand.love/):** drand is an unbiasable source of randomness which other platforms and applications can publicly verify. Randomness is at the core of many of the security-critical operations we perform online every day, and until 2020, there wasn’t a single reliable and trustworthy source. That changed in 2020 with the drand project. + drand is hosted by more than 15 independent members of the League of Entropy, and is available for any project that needs randomness to use. You can find more details in the platform's [launch blog post](https://drand.love/blog/2020/08/10/drand-launches-v1-0/). We organised a whole-day summit to talk about the technical details of drand and distributed randomness. You can watch all the recordings at [randomness2020.com](https://randomness2020.com/). + - **[Beyond Bitswap](https://github.com/protocol/beyond-bitswap):** File-transfer is at the core of IPFS and every subsystem inside IPFS is built to enable it in a fast and secure way, while maintaining certain guarantees (e.g. discoverability, data integrity and so on). The aim of the project was two-fold: to drive speed-ups in file-sharing for IPFS and other P2P networks; and to enable a framework for anyone to join the quest of designing, implementing and evaluating brand new file-sharing strategies in P2P networks. The outcomes of the project are impressive: we produced [10 improvement proposals](https://github.com/protocol/beyond-bitswap#enhancement-rfcs), many of them prototyped, a complete [testbed](https://github.com/protocol/beyond-bitswap/tree/master/testbed) to benchmark and debug file sharing in IPFS, a [paper](https://research.protocol.ai/publications/accelerating-content-routing-with-bitswap-a-multi-path-file-transfer-protocol-in-ipfs-and-filecoin/) that provides further details about our design proposals and [several blogposts](https://research.protocol.ai/blog/) to summarise our results. + ### RFPs @@ -135,25 +149,54 @@ The lab's genesis comes from a need present in the IPFS and libp2p projects to a ### Collaborations -- PulsarCast -- DClaims +- PRESENT + - [Prof. George Polyzos](https://www.aueb.gr/en/faculty_page/polyzos-george), [Dr. Spyros Voulgaris](https://acropolis.aueb.gr/~spyros/www/) and their team at the [Athens University of Economics and Business (AUEB)](https://mm.aueb.gr/), Greece. Our project focuses on the design and implementation of a Multi-Layer DHT for IPFS. + - [Dr. Hidehiro Kanemitsu](https://www.teu.ac.jp/grad/english/teacher/cs\_spc/index.html?id=45) and [Prof. Hidenori Nakazato](https://waseda.pure.elsevier.com/en/persons/hidenori-nakazato) and their teams at the [Tokyo University of Technology](https://www.teu.ac.jp/english/index.html) and [Waseda University](https://www.waseda.jp/top/en/), respectively. Our project focuses on optimisation of DHT lookup times. + - [Dr. Sreeram Kannan](https://people.ece.uw.edu/kannan_sreeram/) and [Dr. Shaileshh Bojja Venkatakrishnan](https://cse.osu.edu/people/bojjavenkatakrishnan.2) at the [University of Washington](https://www.ece.uw.edu/) and [Ohio State University](https://engineering.osu.edu/), respectively. Our project focuses on the optimisation of GossipSub protocol in terms of speed and scalability. + - [Dr Joao Leitao](https://asc.di.fct.unl.pt/~jleitao/) and his team at [NOVA University of Lisbon](https://www.fct.unl.pt/en/research/nova-laboratory-computer-science-and-informatics). + +You can read more about these projects in this [blogpost](https://research.protocol.ai/blog/2020/meet-the-latest-protocol-labs-research-grant-recipients/). + +- PAST + - [PulsarCast](https://github.com/JGAntunes/pulsarcast) + - [DClaims](https://research.protocol.ai/publications/dclaims-a-censorship-resistant-web-annotations-system-using-ipfs-and-ethereum/) ### Publications, Talks & Trainings -- 2019, Jul - [`Workshop` A Brief History of Information-Centric Networks](https://github.com/protocol/research/issues/14#issuecomment-517048457) -- 2019, Sep - [`Workshop` ACM ICN Tutorial: The InterPlanetary File System (IPFS)](https://conferences.sigcomm.org/acm-icn/2019/tutorial-IPFS.php) -- 2019, Dec - [`Paper` DClaims: A Censorship Resistant Web Annotations System using IPFS and Ethereum](https://arxiv.org/pdf/1912.03388.pdf) +#### Talks + +- February 2021: `Talk` FOSDEM (blogpost coming soon) +- December 2020: [`Tutorial` IEEE Globecom](https://research.protocol.ai/blog/2021/ieee-globecom-2020-the-interplanetary-file-system-and-the-filecoin-network/) +- November 2020: [`Tutorial` CNSM](https://research.protocol.ai/blog/2020/ieee/ifip-cnsm-2020-the-interplanetary-file-system-and-the-filecoin-network/) +- July 2020: [`Tutorial` IFIP/IEEE DSN](https://research.protocol.ai/blog/2020/ieee/ifip-dsn-2020-the-interplanetary-file-system-and-the-filecoin-network/) +- May 2020: [`Talk` NGN Group](https://research.protocol.ai/blog/2020/next-generation-networks-ngn-group-talk-a-high-level-overview-of-the-interplanetary-file-system/) +- May 2020: [`Tutorial` IEEE ICBC](https://research.protocol.ai/blog/2020/ieee-icbc-2020-the-interplanetary-file-system-and-the-filecoin-network/) +- April 2020: [`Talk` IRTF DINRG](https://research.protocol.ai/blog/2020/ipfs-talk-at-the-irtf-decentralised-internet-infrastructure-research-group-meeting) +- March 2020: [`Talk` NDN Project Consortium](https://research.protocol.ai/blog/2020/ndn-seminar-a-high-level-overview-of-the-interplanetary-file-system/) +- Spet 2019 - [`Tutorial` ACM ICN Tutorial: The InterPlanetary File System (IPFS)](https://conferences.sigcomm.org/acm-icn/2019/tutorial-IPFS.php) +- July 2019 - [`Talk` A Brief History of Information-Centric Networks](https://github.com/protocol/research/issues/14#issuecomment-517048457) + + +#### Papers + +- Dec 2020 - [`Paper` Accelerating Content Routing with Bitswap: A multi-path file transfer protocol in IPFS and Filecoin](https://research.protocol.ai/publications/accelerating-content-routing-with-bitswap-a-multi-path-file-transfer-protocol-in-ipfs-and-filecoin/) +- July 2020 - [`Paper` Gossipsub: Attack-resilient message propagation in the Filecoin and ETH2.0 networks](https://research.protocol.ai/publications/gossipsub-attack-resilient-message-propagation-in-the-filecoin-and-eth2.0-networks/) +- July 2020 - [`Paper` - PulsarCast](https://github.com/JGAntunes/pulsarcast/blob/master/paper/paper.pdf) +- Dec 2019 - [`Paper` DClaims: A Censorship Resistant Web Annotations System using IPFS and Ethereum](https://arxiv.org/pdf/1912.03388.pdf) - [zkcapital - paper of the week](https://zkcapital.substack.com/p/this-week-in-blockchain-research-4de) - This paper will be presented http://www.sigapp.org/sac/sac2020/ + +#### Training & Seminars - 2020, Feb - [The effective Distributed Systems developer curriculum, with Golang](https://github.com/protocol/ResNetLab-private/issues/51) - [Curriculum](https://docs.google.com/document/d/1nPcEWymKFAsGJJQiQb5PSiF_2EiAw7GCuLfZMV5r6Y8/edit#heading=h.l73q2rxlx59z) ### Team -- David Dias - Research Engineer & ResNetLab Lead (PI) -- Yiannis Psaras - Research Scientist -- Alfonso de la Rocha - Research Engineer -- Vasilis Giotsas - Research Engineer +- [David Dias](https://research.protocol.ai/authors/david-dias/) - Research Engineer & ResNetLab Lead (PI) +- [Yiannis Psaras](https://research.protocol.ai/authors/yiannis-psaras/) - Research Scientist +- [Alfonso de la Rocha](https://research.protocol.ai/authors/alfonso-delarocha/) - Research Engineer +- [Petar Maymounkov](https://research.protocol.ai/authors/petar-maymounkov/) - Research Scientist +- Adrian Lanzafame - Research Engineer ### Contact From 589628ceffc1771ebdbf70e2de7e041d754bd47e Mon Sep 17 00:00:00 2001 From: Hack666r Date: Tue, 7 Jan 2025 18:18:36 +0100 Subject: [PATCH 32/34] Fix typo Update RIW2021_RFC_QFIL Closed Retrieval Economy.md (#39) --- 3DM_RFC/RIW2021_RFC_QFIL Closed Retrieval Economy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3DM_RFC/RIW2021_RFC_QFIL Closed Retrieval Economy.md b/3DM_RFC/RIW2021_RFC_QFIL Closed Retrieval Economy.md index 05a0eb9..1996884 100644 --- a/3DM_RFC/RIW2021_RFC_QFIL Closed Retrieval Economy.md +++ b/3DM_RFC/RIW2021_RFC_QFIL Closed Retrieval Economy.md @@ -36,7 +36,7 @@ The closed retrieval economy is governed by a retrieval currency (QFIL). QFIL is -* Transient (TQFIL): Is the form it takes when it is minted. Commiting a valid voucher for a full (or partial) file exchange triggers the minting of new TQFIL by the deal owner to reward the parties involved in the exchange. TQFIL is associated with the deal owner, and it can’t be transferred, it can only be transformed into stable QFIL or FIL from the deal stake. TQFIL has a larger decay than stable QFIL to prompt a transformation decision on holders (preventing an entity from having a lot of power over a deal stake). In order for a deal owner to mint new TQFIL it needs to burn FIL or QFIL. +* Transient (TQFIL): Is the form it takes when it is minted. Committing a valid voucher for a full (or partial) file exchange triggers the minting of new TQFIL by the deal owner to reward the parties involved in the exchange. TQFIL is associated with the deal owner, and it can’t be transferred, it can only be transformed into stable QFIL or FIL from the deal stake. TQFIL has a larger decay than stable QFIL to prompt a transformation decision on holders (preventing an entity from having a lot of power over a deal stake). In order for a deal owner to mint new TQFIL it needs to burn FIL or QFIL. * Stable (QFIL): Base stable currency of the closed economy. It has a lower decay than TQFIL, and it is burned to mint new TQFIL. Retrieval miners will be willing to help other miners in the system in order to be rewarded with QFIL, and avoid having to burn their FIL to pay for the retrievals of deals they own. Instead of having a global system orchestrating all stakes and deals in the network, the role of the deal owner enables a local orchestration of deal funds, with QFIL as the glue of the full retrieval economy. As an analogy, TQFIL is the local currency, while QFIL is the global currency in the economy. From 8a11cf48fb5e0b18faf0329d0bec9a2227a3accd Mon Sep 17 00:00:00 2001 From: King Date: Tue, 7 Jan 2025 18:25:33 +0100 Subject: [PATCH 33/34] Fix typo Update RIW2021_RFC_ZKCP Optimizations.md (#40) --- 3DM_RFC/RIW2021_RFC_ZKCP Optimizations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3DM_RFC/RIW2021_RFC_ZKCP Optimizations.md b/3DM_RFC/RIW2021_RFC_ZKCP Optimizations.md index 83b90a4..bea87c2 100644 --- a/3DM_RFC/RIW2021_RFC_ZKCP Optimizations.md +++ b/3DM_RFC/RIW2021_RFC_ZKCP Optimizations.md @@ -26,7 +26,7 @@ TBWRITTEN * A group of providers can collaborate over a set of pre-encrypted files and issue the keys to the clients as they request * Cons * Opens the potential for a grieving attack, where multiple clients ask the provider to get the file, but then only one client pays for the decryption key - * Open Problem: Need to find a way for individual parties to be unable to share the keys to decrypt the same cyphertext. + * Open Problem: Need to find a way for individual parties to be unable to share the keys to decrypt the same ciphertext. * Perhaps the client specific key does one last, non expensive scramble? * Optimization II * Only prove a small n of chunks out of N From 7747ce699373f26382d254f192a39bfb1b59dd57 Mon Sep 17 00:00:00 2001 From: Vini murafa <06.poems_races@icloud.com> Date: Tue, 7 Jan 2025 18:26:30 +0100 Subject: [PATCH 34/34] Fix typo Update README.md (#38) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ff67a98..ae60f4c 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ The lab's genesis comes from a need present in the IPFS and libp2p projects to a - Preseve full users' privacy when providing and fetching Content + Preserve full users' privacy when providing and fetching Content How to ensure that the user's of the IPFS network can collect and provide information while mainting their full anonymity.

>>>>> gd2md-html alert: inline image link here (to images/image1.png). Store image on your image server and adjust path/filename/extension if necessary.
(
Back to top)(Next alert)
>>>>>