libp2p implementation in Nim https://status-im.github.io/nim-libp2p/docs/
Go to file
Giovanni Petrantoni b99d2039a8
Gossip one one (#240)
* allow multiple codecs per protocol (without breaking things)

* add 1.1 protocol to gossip

* explicit peering part 1

* explicit peering part 2

* explicit peering part 3

* PeerInfo and ControlPrune protocols

* fix encodePrune

* validated always, even explicit peers

* prune by score (score is stub still)

* add a way to pass parameters to gossip

* standard setup fixes

* take into account explicit direct peers in publish

* add floodPublish logic

* small fixes, publish still half broken

* make sure to waitsub in sparse test

* use var semantics to optimize table access

* wip... lvalues don't work properly sadly...

* big publish refactor, replenish and balance

* fix internal tests

* use g.peers for fanout (todo: don't include flood peers)

* exclude non gossip from fanout

* internal test fixes

* fix flood tests

* fix test's trypublish

* test interop fixes

* make sure to not remove peers from gossip table

* restore old replenishFanout

* cleanups

* restore utility module import

* restore trace vs debug in gossip

* improve fanout replenish behavior further

* triage publish nil peers (issue is on master too but just hidden behind a if/in)

* getGossipPeers fixes

* remove topics from pubsubpeer (was unused)

* simplify rebalanceMesh (following spec) and make it finally reach D_high

* better diagnostics

* merge new pubsubpeer, copy 1.1 to new module

* fix up merge

* conditional enable gossip11 module

* add back topics in peers, re-enable flood publish

* add more heartbeat locking to prevent races

* actually lock the heartbeat

* minor fixes

* with sugar

* merge 1.0

* remove assertion in publish

* fix multistream 1.1 multi proto

* Fix merge oops

* wip

* fix gossip 11 upstream

* gossipsub11 -> gossipsub

* support interop testing

* tests fixing

* fix directchat build

* control prune updates (pb)

* wip parameters

* gossip internal tests fixes

* parameters wip

* finishup with params

* cleanups/wip

* small sugar

* grafted and pruned procs

* wip updateScores

* wip

* fix logging issue

* pubsubpeer, chronicles explicit override

* fix internal gossip tests

* wip

* tables troubleshooting

* score wip

* score wip

* fixes

* fix test utils generateNodes

* don't delete while iterating in score update

* fix grafted defect

* add a handleConnect in subscribeTopic

* pruning improvements

* wip

* score fixes

* post merge - builds gossip tests

* further merge fixes

* rebalance improvements and opportunistic grafting

* fix test for now

* restore explicit peering

* implement peer exchange graft message

* add an hard cap to PX

* backoff time management

* IWANT cap/budget

* Adaptive gossip dissemination

* outbound mesh quota, internal tests fixing

* oversub prune score based, finish outbound quota

* finishup with score and ihave budget

* use go daemon 0.3.0

* import fixes

* byScore cleanup score sorting

* remove pointless scaling in `/` Duration operator

* revert using libp2p org for daemon

* interop fixes

* fixes and cleanup

* remove heartbeat assertion, minor debug fixes

* logging improvements and cleaning up

* (to revert) add some traces

* add explicit topic to gossip rpcs

* pubsub merge fixes and type fix in switch

* Revert "(to revert) add some traces"

This reverts commit 4663eaab6c.

* cleanup some now irrelevant todo

* shuffle peers anyway as score might be disabled

* add missing shuffle

* old merge fix

* more merge fixes

* debug improvements

* re-enable gossip internal tests

* add gossip10 fallback (dormant but tested)

* split gossipsub internal tests into 1.0 and 1.1

Co-authored-by: Dmitriy Ryajov <dryajov@gmail.com>
2020-09-21 11:16:29 +02:00
.github/workflows Automatic NBC bump PRs (#304) 2020-08-03 12:49:58 +09:00
docs mplex fixes (#362) 2020-09-14 10:19:54 +02:00
examples Gossip one one (#240) 2020-09-21 11:16:29 +02:00
libp2p Gossip one one (#240) 2020-09-21 11:16:29 +02:00
scripts Gossip one one (#240) 2020-09-21 11:16:29 +02:00
tests Gossip one one (#240) 2020-09-21 11:16:29 +02:00
tools Add `libp2p_dump` and `libp2p_dump_dir` compiler time options. (#359) 2020-09-15 11:16:43 +02:00
.appveyor.yml Gossip one one (#240) 2020-09-21 11:16:29 +02:00
.gitignore Gossip one one (#240) 2020-09-21 11:16:29 +02:00
.travis.yml Gossip one one (#240) 2020-09-21 11:16:29 +02:00
LICENSE Initial commit 2018-11-19 03:58:31 +02:00
LICENSE-APACHEv2 Initialize travis and licenses. 2018-11-19 04:04:47 +02:00
LICENSE-MIT Initialize travis and licenses. 2018-11-19 04:04:47 +02:00
README.md put expensive metrics under a Nim define (#310) 2020-08-04 17:27:59 -06:00
azure-pipelines.yml Gossip one one (#240) 2020-09-21 11:16:29 +02:00
libp2p.nim Fixes and tweaks related to the beacon node integration 2019-12-08 23:58:43 +02:00
libp2p.nimble Gossip one one (#240) 2020-09-21 11:16:29 +02:00

README.md

libp2p hex logo

The Nim implementation of the libp2p Networking Stack.

Introduction

An implementation of libp2p in Nim. Also provides a Nim wrapper of the Libp2p Go daemon.

Project Status

The current native Nim libp2p implementation support is experimental and shouldn't be relied on for production use. It is under active development and contributions are highly welcomed. :)

Check our examples folder to get started!

Table of Contents

Background

libp2p is a networking stack and library modularized out of The IPFS Project, and bundled separately for other tools to use.

libp2p is the product of a long and arduous quest of understanding; a deep dive into the internet's network stack and the peer-to-peer protocols from the past. Building large scale peer-to-peer systems has been complex and difficult in the last 15 years and libp2p is a way to fix that. It is a "network stack", a suite of networking protocols that cleanly separates concerns and enables sophisticated applications to only use the protocols they absolutely need, without giving up interoperability and upgradeability.

libp2p grew out of IPFS, but it is built so that lots of people can use it, for lots of different projects.

  • Learn more about libp2p at libp2p.io and follow our evolving documentation efforts at docs.libp2p.io.
  • Here is an overview of libp2p and its implementations in other programming languages.

Install

nimble install libp2p

Prerequisite

Usage

API

The specification is available in the docs/api folder.

Getting Started

Please read the GETTING_STARTED.md guide.

Tutorials and Examples

Example code can be found in the examples folder.

Direct Chat Tutorial

  • Part I: Set up the main function and use multi-thread for processing IO.
  • Part II: Dial remote peer and allow customized user input commands.
  • Part III: Configure and establish a libp2p node.

Using the Go Daemon

Please find the installation and usage intructions in daemonapi.md.

Examples can be found in the examples/go-daemon folder;

Development

Clone and Install dependencies:

git clone https://github.com/status-im/nim-libp2p
cd nim-libp2p
nimble install

Tests

Prerequisite

Run unit tests

# run all the unit tests
nimble test

Packages

List of packages currently in existence for nim-libp2p:

Libp2p

Transports

Secure Channels

Stream Multiplexers

Utilities

Data Types

Pubsub

Packages that exist in the original libp2p specs and are under active development:

  • libp2p-daemon
  • libp2p-webrtc-direct
  • libp2p-webrtc-star
  • libp2p-websockets
  • libp2p-spdy
  • libp2p-bootstrap
  • libp2p-kad-dht
  • libp2p-mdns
  • libp2p-webrtc-star
  • libp2p-delegated-content-routing
  • libp2p-delegated-peer-routing
  • libp2p-nat-mgnr
  • libp2p-utils

** Note that the current stack reflects the minimal requirements for the upcoming Eth2 implementation.

Tips and tricks

  • enable expensive metrics:
nim c -d:libp2p_expensive_metrics some_file.nim

Contribute

The libp2p implementation in Nim is a work in progress. We welcome contributors to help out! Specifically, you can:

  • Go through the modules and check out existing issues. This would be especially useful for modules in active development. Some knowledge of IPFS/libp2p may be required, as well as the infrastructure behind it.
  • Perform code reviews. Feel free to let us know if you found anything that can a) speed up the project development b) ensure better quality and c) reduce possible future bugs.
  • Add tests. Help nim-libp2p to be more robust by adding more tests to the tests folder.

Core Developers

@cheatfate, Dmitriy Ryajov, Giovanni Petrantoni, Zahary Karadjov

License

Licensed and distributed under either of

or

at your option. These files may not be copied, modified, or distributed except according to those terms.