What is Libp2p?
Tags: p2p, web3, ethereum, blockchain
Published: 2020-09-05 11:31:12

We depend on the Internet for everything, right ? A cliche line. 
While that is true, in literal meaning  we are using networks which are centralized and unsecured.
So we need to move to more resilient and secure networks.

Peer to Peer Networks ( P2P)  and networking is the way that we can create such secure and resilient networks. Many libraries and tools are being and have been developed to help this ecosystem. One of these libraries is Libp2p.

####What is Libp2p?

Libp2p is an open source library that was developed while building [IPFS](https://ipfs.io/). 
Contributors of this project took care to build the solution in a modular and composable way. Now Libp2p has grown out of [IPFS](https://ipfs.io/), it does not require or depend on IPFS, and today many projects use Libp2p as their network transport layer. 

Libp2p is implemented in many popular languages, at the time of writing this article it is being implemented in Javascript, Node Js, Rust and Go.

According to official documentation:

>" Libp2p is a modular system of protocols, specifications and libraries that enable the development of peer-to-peer network applications."


Let’s see what we understand from this definition and what we achieve with this library.

Modularity is a key feature of Libp2p, meaning every module is designed to do a specific task and we can use only what we need.

For example:

####[Transport](https://www.blogger.com/blog/post/edit/7491733402634136650/8065616143919457163#):
This module is responsible for sending and receiving data from peers through a node. It supports most of the available protocols and also provides simple interfaces to use and run different environments and networks. 

####[Ping](https://www.blogger.com/blog/post/edit/7491733402634136650/8065616143919457163#)
This module is used to ping any peer in the network by knowing the Identity of that peer. It can return RTT(Return Response Time) or Error that either peer is not found or is offline.


####[Circuit](https://www.blogger.com/blog/post/edit/7491733402634136650/8065616143919457163#)
Circuit modules provide a way to create connections between peers.  It uses a public IP address as a middleware. This middleware transports data to each other. 

There are many other modules available, you can find them on [official documentation](https://pkg.go.dev/search?q=libp2p).

Libp2p handles Authentication, Transports, Stream Multiplexing, Peer Discovery, Peer Routing, Content Routing, NAT Traversal, and Relay, you can study more about these protocols on Docs.

Specifications are set of standards defined and used during building of Libp2p irrespective of  language or implementation. They are categorized into two main classes :


*Core Specifications
*Protocols Specifications. 

**Core Specifications** contain detailed description of Libp2p core functionality.How connection is established between two peers, and What is the Protocol Negotiation. Libp2p uses a process of streams for communication of data, either peer can open the stream after connection is established. Also defines the state of any connection stored and peer metadata stored in a memory for future use. It also defines the available cryptographic algorithm for the generation of peer id and encryption of data.You can check more details from this [repository](https://docs.libp2p.io/).

**Protocol Specifications** define wire protocols that are used for multiplexing, security, peer discovery and many others. You can check more details from this repository.

What we can do with this Library,  Libp2p has a generalized toolkit so that developers can plug and play with their networking stack while building distributed applications. 

If you are following Ethereum 2.0, Filecoin and Polkadot then you know that they are already using Libp2p for networking stack.
####Conclusion
Libp2p is an open source network transport layer that can make our network more secure and resilient, with its modular structure it is easy to incorporate in our project with only need based use of its elements.