2020-03-16 07:43:08 +00:00
< h1 align = "center" >
2022-07-01 18:19:57 +00:00
< a href = "https://libp2p.io" > < img width = "250" src = "./.assets/full-logo.svg?raw=true" alt = "nim-libp2p logo" / > < / a >
2020-03-16 07:43:08 +00:00
< / h1 >
2018-11-19 02:07:53 +00:00
2022-11-10 12:47:41 +00:00
< h3 align = "center" > The < a href = "https://nim-lang.org/" > Nim< / a > implementation of the < a href = "https://libp2p.io/" > libp2p< / a > Networking Stack.< / h3 >
2020-02-06 15:07:50 +00:00
2020-03-16 07:43:08 +00:00
< p align = "center" >
2021-12-15 14:01:28 +00:00
< a href = "https://github.com/status-im/nim-libp2p/actions" > < img src = "https://github.com/status-im/nim-libp2p/actions/workflows/ci.yml/badge.svg" / > < / a >
< a href = "https://codecov.io/gh/status-im/nim-libp2p" > < img src = "https://codecov.io/gh/status-im/nim-libp2p/branch/master/graph/badge.svg?token=UR5JRQ249W" / > < / a >
2022-07-26 10:44:26 +00:00
2020-03-16 07:43:08 +00:00
< / p >
< p align = "center" >
< a href = "https://opensource.org/licenses/Apache-2.0" > < img src = "https://img.shields.io/badge/License-Apache%202.0-blue.svg" / > < / a >
< a href = "https://opensource.org/licenses/MIT" > < img src = "https://img.shields.io/badge/License-MIT-blue.svg" / > < / a >
2020-12-19 14:43:54 +00:00
< img src = "https://img.shields.io/badge/nim-%3E%3D1.2.0-orange.svg?style=flat-square" / >
2020-03-16 07:43:08 +00:00
< / p >
2018-11-19 02:07:53 +00:00
2020-03-16 07:43:08 +00:00
# Table of Contents
- [Background ](#background )
- [Install ](#install )
2022-07-01 18:19:57 +00:00
- [Getting Started ](#getting-started )
2024-02-15 15:14:26 +00:00
- [Go-libp2p-daemon ](#go-libp2p-daemon )
2022-07-01 18:19:57 +00:00
- [Modules ](#modules )
- [Users ](#users )
2022-11-10 12:47:41 +00:00
- [Stability ](#stability )
2020-03-16 07:43:08 +00:00
- [Development ](#development )
2022-07-01 18:19:57 +00:00
- [Contribute ](#contribute )
2022-11-10 12:47:41 +00:00
- [Contributors ](#contributors )
- [Core Maintainers ](#core-maintainers )
2020-03-16 07:43:08 +00:00
- [License ](#license )
2019-09-30 15:58:20 +00:00
2020-08-04 23:27:59 +00:00
## Background
2022-11-10 12:47:41 +00:00
libp2p is a [Peer-to-Peer ](https://en.wikipedia.org/wiki/Peer-to-peer ) networking stack, with [implementations ](https://github.com/libp2p/libp2p#implementations ) in multiple languages derived from the same [specifications. ](https://github.com/libp2p/specs )
2019-09-30 15:58:20 +00:00
2022-11-10 12:47:41 +00:00
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's striving to be a modular stack, with sane and secure defaults, useful protocols, while remain open and extensible.
This implementation in native Nim, relying on [chronos ](https://github.com/status-im/nim-chronos ) for async. It's used in production by a few [projects ](#users )
2019-09-30 15:58:20 +00:00
2022-11-10 12:47:41 +00:00
Learn more about libp2p at [**libp2p.io** ](https://libp2p.io ) and follow libp2p's documentation [**docs.libp2p.io** ](https://docs.libp2p.io ).
2019-09-30 15:58:20 +00:00
2020-03-16 07:43:08 +00:00
## Install
2022-07-01 18:19:57 +00:00
**Prerequisite**
- [Nim ](https://nim-lang.org/install.html )
2024-02-15 15:14:26 +00:00
> The currently supported Nim version is 1.6.18.
2019-09-30 15:58:20 +00:00
```
2020-03-16 07:43:08 +00:00
nimble install libp2p
```
2020-04-30 06:57:49 +00:00
2022-07-01 18:19:57 +00:00
## Getting Started
2022-11-10 12:47:41 +00:00
You'll find the nim-libp2p documentation [here ](https://status-im.github.io/nim-libp2p/docs/ ).
2022-07-01 18:19:57 +00:00
2024-02-15 15:14:26 +00:00
### Testing
Remember you'll need to build the `go-libp2p-daemon` binary to run the `nim-libp2p` tests.
To do so, please follow the installation instructions in [daemonapi.md ](examples/go-daemon/daemonapi.md ).
2022-07-01 18:19:57 +00:00
## Modules
List of packages modules implemented in nim-libp2p:
| Name | Description |
| ---------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| **Libp2p** | |
| [libp2p ](libp2p/switch.nim ) | The core of the project |
| [connmanager ](libp2p/connmanager.nim ) | Connection manager |
2022-11-10 12:47:41 +00:00
| [identify / push identify ](libp2p/protocols/identify.nim ) | [Identify ](https://docs.libp2p.io/concepts/fundamentals/protocols/#identify ) protocol |
| [ping ](libp2p/protocols/ping.nim ) | [Ping ](https://docs.libp2p.io/concepts/fundamentals/protocols/#ping ) protocol |
2022-07-01 18:19:57 +00:00
| [libp2p-daemon-client ](libp2p/daemon/daemonapi.nim ) | [go-daemon ](https://github.com/libp2p/go-libp2p-daemon ) nim wrapper |
| [interop-libp2p ](tests/testinterop.nim ) | Interop tests |
| **Transports** | |
| [libp2p-tcp ](libp2p/transports/tcptransport.nim ) | TCP transport |
| [libp2p-ws ](libp2p/transports/wstransport.nim ) | WebSocket & WebSocket Secure transport |
2022-11-10 12:47:41 +00:00
| [libp2p-tor ](libp2p/transports/tortransport.nim ) | Tor Transport |
2022-07-01 18:19:57 +00:00
| **Secure Channels** | |
2022-11-10 12:47:41 +00:00
| [libp2p-secio ](libp2p/protocols/secure/secio.nim ) | Secio secure channel |
| [libp2p-noise ](libp2p/protocols/secure/noise.nim ) | [Noise ](https://docs.libp2p.io/concepts/secure-comm/noise/ ) secure channel |
| [libp2p-plaintext ](libp2p/protocols/secure/plaintext.nim ) | Plain Text for development purposes |
2022-07-01 18:19:57 +00:00
| **Stream Multiplexers** | |
| [libp2p-mplex ](libp2p/muxers/mplex/mplex.nim ) | [MPlex ](https://github.com/libp2p/specs/tree/master/mplex ) multiplexer |
2022-11-10 12:47:41 +00:00
| [libp2p-yamux ](libp2p/muxers/yamux/yamux.nim ) | [Yamux ](https://docs.libp2p.io/concepts/multiplex/yamux/ ) multiplexer |
2022-07-01 18:19:57 +00:00
| **Data Types** | |
2022-11-10 12:47:41 +00:00
| [peer-id ](libp2p/peerid.nim ) | [Cryptographic identifiers ](https://docs.libp2p.io/concepts/fundamentals/peers/#peer-id ) |
| [peer-store ](libp2p/peerstore.nim ) | ["Address book" of known peers ](https://docs.libp2p.io/concepts/fundamentals/peers/#peer-store ) |
2022-07-01 18:19:57 +00:00
| [multiaddress ](libp2p/multiaddress.nim ) | [Composable network addresses ](https://github.com/multiformats/multiaddr ) |
| [signed envelope ](libp2p/signed_envelope.nim ) | [Signed generic data container ](https://github.com/libp2p/specs/blob/master/RFC/0002-signed-envelopes.md ) |
| [routing record ](libp2p/routing_record.nim ) | [Signed peer dialing informations ](https://github.com/libp2p/specs/blob/master/RFC/0003-routing-records.md ) |
2022-11-10 12:47:41 +00:00
| [discovery manager ](libp2p/discovery/discoverymngr.nim ) | Discovery Manager |
2022-07-01 18:19:57 +00:00
| **Utilities** | |
| [libp2p-crypto ](libp2p/crypto ) | Cryptographic backend |
| [libp2p-crypto-secp256k1 ](libp2p/crypto/secp.nim ) | |
| **Pubsub** | |
| [libp2p-pubsub ](libp2p/protocols/pubsub/pubsub.nim ) | Pub-Sub generic interface |
| [libp2p-floodsub ](libp2p/protocols/pubsub/floodsub.nim ) | FloodSub implementation |
| [libp2p-gossipsub ](libp2p/protocols/pubsub/gossipsub.nim ) | [GossipSub ](https://docs.libp2p.io/concepts/publish-subscribe/ ) implementation |
## Users
nim-libp2p is used by:
- [Nimbus ](https://github.com/status-im/nimbus-eth2 ), an Ethereum client
- [nwaku ](https://github.com/status-im/nwaku ), a decentralized messaging application
- [nim-codex ](https://github.com/status-im/nim-codex ), a decentralized storage application
- (open a pull request if you want to be included here)
2019-09-30 15:46:57 +00:00
2022-10-30 12:18:04 +00:00
## Stability
nim-libp2p has been used in production for over a year in high-stake scenarios, so its core is considered stable.
Some modules are more recent and less stable.
The versioning follows [semver ](https://semver.org/ ), with some additions:
- Some of libp2p procedures are marked as `.public.` , they will remain compatible during each `MAJOR` version
- The rest of the procedures are considered internal, and can change at any `MINOR` version (but remain compatible for each new `PATCH` )
2019-09-30 15:46:57 +00:00
2023-06-07 11:12:49 +00:00
We aim to be compatible at all time with at least 2 Nim `MINOR` versions, currently `1.6 & 2.0`
2022-10-30 12:18:04 +00:00
## Development
Clone and Install dependencies:
2020-03-16 07:43:08 +00:00
```sh
git clone https://github.com/status-im/nim-libp2p
cd nim-libp2p
2022-11-10 12:47:41 +00:00
# to use dependencies computed by nimble
2022-10-30 12:18:04 +00:00
nimble install -dy
2022-11-10 12:47:41 +00:00
# OR to install the dependencies versions used in CI
nimble install_pinned
2020-03-16 07:43:08 +00:00
```
2022-07-01 18:19:57 +00:00
2022-10-30 12:18:04 +00:00
Run unit tests:
2020-03-16 07:43:08 +00:00
```sh
# run all the unit tests
nimble test
```
2022-10-30 12:18:04 +00:00
This requires the go daemon to be available. To only run native tests, use `nimble testnative` .
Or use `nimble tasks` to show all available tasks.
2019-09-30 15:46:57 +00:00
2022-07-01 18:19:57 +00:00
### Contribute
2019-09-30 15:46:57 +00:00
2022-07-01 18:19:57 +00:00
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 ](tests/ ).
2019-09-30 15:46:57 +00:00
2022-07-01 18:19:57 +00:00
The code follows the [Status Nim Style Guide ](https://status-im.github.io/nim-style-guide/ ).
2019-09-30 15:46:57 +00:00
2022-11-10 12:47:41 +00:00
### Contributors
< a href = "https://github.com/status-im/nim-libp2p/graphs/contributors" > < img src = "https://contrib.rocks/image?repo=status-im/nim-libp2p" alt = "nim-libp2p contributors" > < / a >
### Core Maintainers
< table >
< tbody >
< tr >
< td align = "center" > < a href = "https://github.com/Menduist" > < img src = "https://avatars.githubusercontent.com/u/13471753?v=4?s=100" width = "100px;" alt = "Tanguy" / > < br / > < sub > < b > Tanguy (Menduist)< / b > < / sub > < / a > < / td >
< td align = "center" > < a href = "https://github.com/lchenut" > < img src = "https://avatars.githubusercontent.com/u/11214565?v=4?s=100" width = "100px;" alt = "Ludovic" / > < br / > < sub > < b > Ludovic< / b > < / sub > < / a > < / td >
< td align = "center" > < a href = "https://github.com/diegomrsantos" > < img src = "https://avatars.githubusercontent.com/u/7316595?v=4?s=100" width = "100px;" alt = "Diego" / > < br / > < sub > < b > Diego< / b > < / sub > < / a > < / td >
< / tr >
< / tbody >
< / table >
2020-08-04 23:27:59 +00:00
2022-10-30 12:18:04 +00:00
### Compile time flags
2020-08-04 23:27:59 +00:00
2022-10-30 12:18:04 +00:00
Enable expensive metrics (ie, metrics with per-peer cardinality):
2020-08-04 23:27:59 +00:00
```bash
nim c -d:libp2p_expensive_metrics some_file.nim
```
2019-09-30 15:46:57 +00:00
2022-10-30 12:18:04 +00:00
Set list of known libp2p agents for metrics:
2021-01-08 05:21:24 +00:00
```bash
2022-09-26 09:48:03 +00:00
nim c -d:libp2p_agents_metrics -d:KnownLibP2PAgents=nimbus,lighthouse,lodestar,prysm,teku some_file.nim
2021-01-08 05:21:24 +00:00
```
2022-10-30 12:18:04 +00:00
Specify gossipsub specific topics to measure in the metrics:
2021-01-08 05:21:24 +00:00
```bash
nim c -d:KnownLibP2PTopics=topic1,topic2,topic3 some_file.nim
```
2018-11-19 02:04:47 +00:00
## License
Licensed and distributed under either of
* MIT license: [LICENSE-MIT ](LICENSE-MIT ) or http://opensource.org/licenses/MIT
2019-01-02 14:05:50 +00:00
or
* Apache License, Version 2.0, ([LICENSE-APACHEv2](LICENSE-APACHEv2) or http://www.apache.org/licenses/LICENSE-2.0)
2018-11-19 02:04:47 +00:00
2020-08-04 23:27:59 +00:00
at your option. These files may not be copied, modified, or distributed except according to those terms.