# Tutorial 1: Creating and Starting a libp2p Node This tutorial will guide you through the basics of creating, configuring, starting, and stopping a libp2p node using the Logos libp2p module. ## What is libp2p? [libp2p](https://libp2p.io/) is a modular networking stack for building peer-to-peer applications. It provides transport-agnostic connectivity, peer identity, stream multiplexing, secure channels, and content routing — everything you need to build a decentralized network. The `logos-libp2p-module` wraps nim-libp2p's C bindings into a C++ class called `Libp2pModuleImpl` that you can embed directly into your application. ----------- ## Step 1: Include the module header and instantiate a node Every program starts by including the module's single public header - `"plugin.h"`: ```cpp #include #include #include "plugin.h" int main() { printf("=== Tutorial 1: Creating and Starting a libp2p Node ===\n\n"); setLogLevel("fatal"); ``` The main class we work with is `Libp2pModuleImpl`. Let's create one with default options: ```cpp // Create a libp2p node with default configuration. // By default it listens on 127.0.0.1 with a random port (tcp/0). Libp2pModuleImpl node; printf("Node object created (not yet started)\n"); ``` ## Step 2: Start the node Calling `start()` creates the libp2p context, binds the configured address, and begins accepting connections. ```cpp StdLogosResult startRes = node.start(); if (!startRes.success) { fprintf(stderr, "Failed to start node: %s\n", startRes.error.c_str()); return 1; } printf("Node started successfully!\n"); ``` ## Step 3: Query node information Once the node is running, we can inspect its identity and network addresses using `peerInfo()`. ```cpp StdLogosResult info = node.peerInfo(); if (!info.success) { fprintf(stderr, "Failed to get peer info: %s\n", info.error.c_str()); return 1; } // Extract the peer ID — a unique cryptographic identifier std::string peerId = info.value["peerId"].get(); printf("Peer ID: %s\n", peerId.c_str()); // List all multiaddresses the node is listening on printf("Listening addresses:\n"); for (const auto& addr : info.value["addrs"]) { printf(" %s\n", addr.get().c_str()); } ``` We can also query specific fields using `getNodeInfo()`: ```cpp StdLogosResult version = node.getNodeInfo("Version"); if (!version.success) { fprintf(stderr, "Failed to get module version: %s\n", version.error.c_str()); return 1; } printf("Module version: %s\n", version.value.get().c_str()); StdLogosResult peerIdResult = node.getNodeInfo("PeerId"); if (!peerIdResult.success) { fprintf(stderr, "Failed to get peer ID: %s\n", peerIdResult.error.c_str()); return 1; } printf("Peer ID (via getNodeInfo): %s\n", peerIdResult.value.get().c_str()); ``` ## Step 4: Stop the node Always clean up by stopping the node when you're done. ```cpp node.stop(); printf("Node stopped\n"); printf("\n=== Tutorial 1 Complete ===\n"); return 0; } ``` ## Summary In this tutorial you learned how to: - Create a `Libp2pModuleImpl` instance - Start and stop a libp2p node - Query peer identity and listening addresses - Retrieve module metadata ## Run tutorial ```bash ./build/tutorial/tutorial_1_node_lifecycle ``` ---

← Introduction and Common Patterns  |  Custom Node Configuration →