Create a libp2p Node
Background
In this tutorial, you will use a boilerplate Go project to set up two libp2p nodes and connect them, so you can begin to explore the capabilities of libp2p, such as data transmission, peer identification, routing, messaging, content discovery, and more.
By the end of the exercise, you should be able to:
- Create a new libp2p node
- Print the node’s ID and multiaddresses
- Configure the node at a basic level
- Connect to another node

Prerequisites
- You must have Go installed. In this exercise, version 1.18 is used.
- You can also install multiple versions of Go.
- Clone or fork the
https://github.com/protocol/launchpad-tutorialsGit repository, which contains all the sample applications used in the Launchpad program.
Instructions
- Open the
/libp2p-go-simple-codefolder of thelaunchpad-tutorialsrepository in an IDE of your preference. Theappsubfolder contains the template that you will complete.
Video
This video will demonstrate how you can create simple libp2p node in a Go application.
Review the “main” Function
In the main.go file, review the code, at about line 40.
There are several functions that are called which you will implement in this tutorial.
The main() function manages the flow of the program by calling different helper functions.
Create the Source Node
- In the
createSourceNodefunction, create a libp2p node by using thelibp2p.New()function. This method returns a host.Host interface, which you can use to manage the node.
func createSourceNode() host.Host {
node, err := libp2p.New()
if err != nil {
panic(err)
}
return node
}
By default, the node gets an ID and listens at a random TCP port.
Create the Target Node
- Now, in the
createTargetNodefunction, create a new node that listens at the8007TCP port. You can configure a node by passing several Option structs to theNew(...)method.
func createTargetNode() host.Host {
node, err := libp2p.New(
libp2p.ListenAddrStrings(
"/ip4/0.0.0.0/tcp/8007",
),
)
if err != nil {
panic(err)
}
return node
}
Connect the Nodes
- So far, you have created two nodes; now, let’s connect
sourceNodetotargetNode. Thehost.Hostinterface contains aConnectmethod that you can use. TheConnectmethod expects apeer.AddrInfostruct, which is an abstraction that represents the location of a peer. To create apeer.AddrInfostruct with the data of the node, you can use the host.InfoFromHost function.
func connectToTargetNode(sourceNode host.Host, targetNode host.Host) {
targetNodeAddressInfo := host.InfoFromHost(targetNode)
err := sourceNode.Connect(context.Background(), *targetNodeAddressInfo)
if err != nil {
panic(err)
}
}
Count the Number of Peers of the Source Node
- To verify that the connection works, you can list the peers connected to the node. In this example, you will simply count the number of peers and return that number to verify that your libp2p node is connected to peers.
func countSourceNodePeers(sourceNode host.Host) int {
return len(sourceNode.Network().Peers())
}
Run the Program
- Now, test that the two nodes are connected by running the application. In your terminal,
cdto the/libp2p-go-simple-node/appdirectory and rungo run .
You should see the following output, with the number of source node peers:
> go run .
-- SOURCE NODE INFORMATION --
ID: 12D3KooWCGcgrrrfDwzLmNeZ25543kYcewKxXzgDkGJGNXw1ZUf3
Multiaddresses: /ip4/192.168.0.10/tcp/63678, /ip4/127.0.0.1/tcp/63678, /ip6/::1/tcp/63681
-- TARGET NODE INFORMATION --
ID: 12D3KooWLkzhtJxcSnasfzkXGQzgKGqxGtUDpACZSXt3HM4Rn3op
Multiaddresses: /ip4/192.168.0.10/tcp/8007, /ip4/127.0.0.1/tcp/8007
Source node peers: 1
You can see an example of the completed code here
Now that you have two nodes connected and communicating, you can start to implement the many features available with libp2p. In a later tutorial, you will learn how to start a libp2p stream.