Bitcoin Dev

ISMOS

Programming Bitcoin's P2P Network: Build Your Own Node

About the course

In this course you will learn how a Bitcoin node joins the P2P network by building one from scratch in the language of your choice. You will learn to encode and decode P2P protocol messages, discover peers from Bitcoin Core’s DNS seeds, and establish connections (handshakes) with other nodes on the network. You will also implement the logic to accept incoming connections, and inspect P2P traffic to understand what happens inside the Bitcoin network.

What is included

lessons
5
live session
1
assignments
5
quiz
1
resources
11
certificate
Yes

Syllabus

5 lessons · 1 live session

  1. 01Conclusión
  2. 02Clase 1 – Introducción al curso y Peer discovery

    Objetivos de aprendizaje
    Al terminar esta clase, los estudiantes podrán:

    Explicar cómo un nodo se conecta a la red sin conocer las direcciones de los demás participantes

    Obtener una lista de direcciones IP de nodos candidatos a partir de semillas DNS

    Entender por qué no se puede confiar ciegamente en la información proporcionada por las semillas DNS

    Temas a cubrir
    Bloque 1: Presentación del curso

    Lo que vamos a programar: un nodo que se conecta a la red de Bitcoin y observa y entiende sus mensajes

    Lo que NO construiremos: bloques, mempool, validación ni consenso

    Objetivo del curso: comprender cómo funciona la capa P2P de Bitcoin

    Metodología: seminario y demostración en clase, implementación independiente, con lenguaje libre

    Forma de entrega y evaluación

    Bloque 2: El problema del arranque y las semillas DNS

    Cómo localizas al primer participante en la red

    Es necesario contar con una dirección antes de solicitar otra

    Qué otras alternativas hay y por qué DNS es el mecanismo predeterminado

    Qué información proporciona la consulta, y qué te asegura esa respuesta y qué no

    Las direcciones embebidas en el código cuando las semillas no responden

    Bloque 3: Los límites de las semillas

    Un punto centralizado en un sistema diseñado para evitar la centralización

    Qué puede y qué no puede hacer una semilla maliciosa

    Por qué se acepta de igual manera

    Actividades

    Demo: consultar las semillas con dig y leer la respuesta

    Demo: recorrer el código de Bitcoin Core donde se declaran las semillas y las direcciones embebidas

    Demo: programa que consulta las semillas y loguea las direcciones obtenidas

  3. 03Clase 2 – Gestión de direcciones: Addrman

    Objetivos de aprendizaje

    Conectar por TCP a las direcciones obtenidas a partir de las semillas y registrar cuáles no responden

    Implementar un gestor de direcciones básico: guardar, clasificar el resultado de cada intento y persistirlo

    Explicar cómo Bitcoin Core almacena las direcciones que conoce

    Temas a cubrir
    Bloque 1: Vamos a conectarnos a un candidato vía TCP

    Repaso de cómo funciona TCP

    Por qué conectarse es la única forma de saber qué direcciones sirven

    Qué ocurre cuando una dirección está muerta

    Qué registrar en cada intento: cuándo se probó, si respondió y cuántas veces falló

    Bloque 2: Qué recuerda un nodo

    Direcciones que te pasaron y direcciones que ya probaste

    Por qué conviene guardarlas en disco y no solo en memoria

    Cómo lo resuelve Bitcoin Core: AddrMan y peers.dat

    Por qué Core las guarda separadas y qué gana un atacante que llena tu almacén

    Actividades

    Demo: programa que conecta a las direcciones de la clase anterior y registra cuáles responden

    Demo: peers.dat en un nodo de Bitcoin Core

  4. 04Clase 3 – Mensajes

    Objetivos de aprendizaje

    Serializar y deserializar los primitivos del protocolo

    Armar el header de un mensaje y calcular su checksum

    Construir un version y un verack listos para enviar

    Temas a cubrir
    Bloque 1: Primitivos

    CompactSize

    Arrays y strings

    IPv4/IPv6

    Bloque 2: Header y payload

    Magic

    Comando

    Longitud del payload

    Checksum

    Bloque 3: Armando el par version y verack

    Campos del payload de version

    Bits de servicio

    verack sin payload

    Actividades

    Demo: armar un version desde cero

  5. 05Clase 4 – Conectando con un peer

    Objetivos de aprendizaje

    Hacer un handshake con un nodo real de la red

    Leer lo que el otro nodo declara sobre sí mismo en su mensaje version

    Mantener conexiones abiertas mientras se procesan los mensajes entrantes

    Temas a cubrir
    Bloque 1: Completar el handshake

    Secuencia completa del intercambio

    Negociación de la versión en común

    Uso del nonce

    Mensajes de negociación entre version y verack

    Leer el mensaje version del peer

    Bloque 2: Mantener la conexión

    Bucle de recepción

    Reconstruir mensajes P2P

    Manejo de mensajes desconocidos

    ping / pong

    Bloque 3: Varias conexiones a la vez

    Qué mantener de cada peer

    Slots de conexión

    Qué hacer cuando una conexión se cae

    Actividades

    Demo: handshake, tráfico entrante y un intercambio ping/pong contra un nodo de mainnet

  6. 06Clase 5 – Conexiones entrantes y addr relay

    Objetivos de aprendizaje

    Escuchar en un puerto y aceptar conexiones entrantes de otros peers de la red

    Pedir, recibir y anunciar direcciones

    Alimentar su gestor de direcciones con lo que llega de la red

    Temas a cubrir
    Bloque 1: Aceptar conexiones

    Exponer tu nodo en un puerto

    Responder a solicitudes de handshake entrantes

    Diferencia entre conexiones inbound y outbound

    Bloque 2: Addr relay

    getaddr y addr

    Estructura del payload de addr

    addrv2 y su negociación con sendaddrv2

    Pueden llegar direcciones sin que las pidas

    Anunciar tu propia dirección para que otros te encuentren

    Alimentar el gestor de direcciones

    Actividades

    Demo: tu nodo expuesto en mainnet y los peers inbound que ya se le conectaron

    Demo: getaddr a un peer y las direcciones que devuelve

Starts Sep 7, 2026

I'm interested