From 489b9923860e2f10b21de633f16806a3eaf68f81 Mon Sep 17 00:00:00 2001 From: uink45 <79078981+uink45@users.noreply.github.com> Date: Mon, 16 Feb 2026 21:17:22 +1000 Subject: [PATCH 1/2] Update c-libp2p submodule and adapt Lantern networking APIs --- external/c-libp2p | 2 +- include/lantern/networking/libp2p.h | 2 +- src/core/client_network.c | 77 ++++++++++++++++++----------- src/core/client_network_internal.h | 2 +- src/core/client_reqresp_blocks.c | 6 +-- src/core/client_reqresp_stream.c | 17 +++++-- src/core/client_sync.c | 9 +++- src/genesis/genesis_parse.c | 33 ++++++++++--- src/networking/gossipsub_service.c | 10 +++- src/networking/libp2p.c | 43 +++++++++++----- src/networking/reqresp_service.c | 49 +++++++++--------- 11 files changed, 168 insertions(+), 82 deletions(-) diff --git a/external/c-libp2p b/external/c-libp2p index b5346bc..7f3060e 160000 --- a/external/c-libp2p +++ b/external/c-libp2p @@ -1 +1 @@ -Subproject commit b5346bcf2ed1279563a517ffa224cafbb15bcebd +Subproject commit 7f3060eb9a0e5c36398b937f3494d9d4d8aa572b diff --git a/include/lantern/networking/libp2p.h b/include/lantern/networking/libp2p.h index 05efea9..5a814b7 100644 --- a/include/lantern/networking/libp2p.h +++ b/include/lantern/networking/libp2p.h @@ -38,7 +38,7 @@ int lantern_libp2p_enr_to_multiaddr( const struct lantern_enr_record *record, char *buffer, size_t buffer_len, - peer_id_t *peer_id); + peer_id_t **peer_id); int lantern_libp2p_encode_secp256k1_private_key_proto( const uint8_t *secret, size_t secret_len, diff --git a/src/core/client_network.c b/src/core/client_network.c index 4b3be05..02674f2 100644 --- a/src/core/client_network.c +++ b/src/core/client_network.c @@ -56,6 +56,27 @@ static const uint32_t LANTERN_PING_FAILURES_BEFORE_DISCONNECT = 1u; * * @note Thread safety: This function is thread-safe */ +static int write_legacy_peer_id_text(const peer_id_t *peer, char *out, size_t out_len) +{ + if (!peer || !out || out_len == 0) + { + return -1; + } + size_t written = 0; + peer_id_error_t rc = peer_id_text_write( + peer, + PEER_ID_TEXT_LEGACY_BASE58, + out, + out_len, + &written); + if (rc != PEER_ID_OK) + { + out[0] = '\0'; + return -1; + } + return (int)written; +} + static void format_peer_id_text(const peer_id_t *peer, char *out, size_t out_len) { if (!out || out_len == 0) @@ -69,7 +90,7 @@ static void format_peer_id_text(const peer_id_t *peer, char *out, size_t out_len return; } - if (peer_id_to_string(peer, PEER_ID_FMT_BASE58_LEGACY, out, out_len) < 0) + if (write_legacy_peer_id_text(peer, out, out_len) < 0) { out[0] = '\0'; } @@ -652,7 +673,7 @@ void redial_peer_on_timeout(struct lantern_client *client, const peer_id_t *peer } char multiaddr[256]; - peer_id_t enr_peer_id = {0}; + peer_id_t *enr_peer_id = NULL; if (lantern_libp2p_enr_to_multiaddr( record, multiaddr, @@ -662,8 +683,8 @@ void redial_peer_on_timeout(struct lantern_client *client, const peer_id_t *peer continue; } - int eq = peer_id_equals(peer, &enr_peer_id); - peer_id_destroy(&enr_peer_id); + int eq = peer_id_equal(peer, enr_peer_id); + peer_id_free(enr_peer_id); if (eq == 1) { @@ -784,7 +805,7 @@ static size_t compute_peer_dial_target( } size_t target = enrs->count; - if (local_peer && local_peer->bytes && local_peer->size && target > 0) + if (local_peer && target > 0) { target -= 1; } @@ -815,25 +836,24 @@ static void peer_dialer_handle_record( } char multiaddr[256]; - peer_id_t peer_id = {0}; + peer_id_t *peer_id = NULL; if (lantern_libp2p_enr_to_multiaddr(record, multiaddr, sizeof(multiaddr), &peer_id) != 0) { - peer_id_destroy(&peer_id); return; } - if (local_peer && peer_id_equals(local_peer, &peer_id) == 1) + if (local_peer && peer_id_equal(local_peer, peer_id) == 1) { - peer_id_destroy(&peer_id); + peer_id_free(peer_id); return; } char peer_text[128]; - format_peer_id_text(&peer_id, peer_text, sizeof(peer_text)); + format_peer_id_text(peer_id, peer_text, sizeof(peer_text)); if (peer_text[0] && connected_snapshot && string_list_contains(connected_snapshot, peer_text)) { - peer_id_destroy(&peer_id); + peer_id_free(peer_id); return; } @@ -857,7 +877,7 @@ static void peer_dialer_handle_record( { libp2p_err_t perr = libp2p_gossipsub_peering_add( client->gossip.gossipsub, - &peer_id); + peer_id); if (perr == LIBP2P_ERR_OK) { if (peer_text[0]) @@ -875,7 +895,7 @@ static void peer_dialer_handle_record( } } - peer_id_destroy(&peer_id); + peer_id_free(peer_id); } @@ -927,8 +947,7 @@ void peer_dialer_attempt(struct lantern_client *client) cleanup: if (local_peer) { - peer_id_destroy(local_peer); - free(local_peer); + peer_id_free(local_peer); } lantern_string_list_reset(&connected_snapshot); @@ -1140,11 +1159,11 @@ static void ping_on_stream_open(libp2p_stream_t *s, void *user_data, int err) uint32_t failures = record_peer_ping_failure(client, peer_text); if (failures >= LANTERN_PING_FAILURES_BEFORE_DISCONNECT) { - peer_id_t peer_id = {0}; - if (peer_id_create_from_string(peer_text, &peer_id) == 0) + peer_id_t *peer_id = NULL; + if (peer_id_new_from_text(peer_text, &peer_id) == PEER_ID_OK && peer_id) { - connection_counter_update(client, -1, &peer_id, false, reason); - peer_id_destroy(&peer_id); + connection_counter_update(client, -1, peer_id, false, reason); + peer_id_free(peer_id); } clear_peer_ping_failures(client, peer_text); } @@ -1191,11 +1210,11 @@ static void ping_on_stream_open(libp2p_stream_t *s, void *user_data, int err) uint32_t failures = record_peer_ping_failure(client, peer_text); if (failures >= LANTERN_PING_FAILURES_BEFORE_DISCONNECT) { - peer_id_t peer_id = {0}; - if (peer_id_create_from_string(peer_text, &peer_id) == 0) + peer_id_t *peer_id = NULL; + if (peer_id_new_from_text(peer_text, &peer_id) == PEER_ID_OK && peer_id) { - connection_counter_update(client, -1, &peer_id, false, reason); - peer_id_destroy(&peer_id); + connection_counter_update(client, -1, peer_id, false, reason); + peer_id_free(peer_id); } clear_peer_ping_failures(client, peer_text); } @@ -1279,19 +1298,19 @@ static void ping_all_peers(struct lantern_client *client) { continue; } - peer_id_t peer = {0}; - if (peer_id_create_from_string(peer_str, &peer) != 0) + peer_id_t *peer = NULL; + if (peer_id_new_from_text(peer_str, &peer) != PEER_ID_OK || !peer) { continue; } if (peer_status_needs_refresh(client, peer_str, now_ms)) { - request_status_now(client, &peer, peer_str); + request_status_now(client, peer, peer_str); } struct ping_dial_ctx *ctx = (struct ping_dial_ctx *)calloc(1, sizeof(*ctx)); if (!ctx) { - peer_id_destroy(&peer); + peer_id_free(peer); continue; } ctx->client = client; @@ -1299,7 +1318,7 @@ static void ping_all_peers(struct lantern_client *client) ctx->peer_text[sizeof(ctx->peer_text) - 1] = '\0'; int rc = libp2p_host_open_stream_async( client->network.host, - &peer, + peer, LIBP2P_PING_PROTO_ID, ping_on_stream_open, ctx); @@ -1315,7 +1334,7 @@ static void ping_all_peers(struct lantern_client *client) rc); free(ctx); } - peer_id_destroy(&peer); + peer_id_free(peer); } lantern_string_list_reset(&peers); } diff --git a/src/core/client_network_internal.h b/src/core/client_network_internal.h index 0640dee..9cc0be4 100644 --- a/src/core/client_network_internal.h +++ b/src/core/client_network_internal.h @@ -101,7 +101,7 @@ struct block_request_ctx { struct lantern_client *client; /**< Client instance */ uint64_t request_id; /**< Internal request tracking ID */ - peer_id_t peer_id; /**< Peer ID structure */ + peer_id_t *peer_id; /**< Peer ID structure */ char peer_text[128]; /**< Peer ID as text */ LanternRoot *roots; /**< Roots being requested */ uint32_t *depths; /**< Backfill depth per root */ diff --git a/src/core/client_reqresp_blocks.c b/src/core/client_reqresp_blocks.c index 466bb8f..07c7af6 100644 --- a/src/core/client_reqresp_blocks.c +++ b/src/core/client_reqresp_blocks.c @@ -86,7 +86,7 @@ static void block_request_ctx_free(struct block_request_ctx *ctx) { return; } - peer_id_destroy(&ctx->peer_id); + peer_id_free(ctx->peer_id); free(ctx->roots); free(ctx->depths); free(ctx); @@ -844,7 +844,7 @@ static int schedule_blocks_request_batch( } } - if (peer_id_create_from_string(peer_id_text, &ctx->peer_id) != PEER_ID_SUCCESS) + if (peer_id_new_from_text(peer_id_text, &ctx->peer_id) != PEER_ID_OK || !ctx->peer_id) { lantern_log_warn( "reqresp", @@ -870,7 +870,7 @@ static int schedule_blocks_request_batch( int rc = libp2p_host_open_stream_async( client->network.host, - &ctx->peer_id, + ctx->peer_id, ctx->protocol_id, block_request_on_open, ctx); diff --git a/src/core/client_reqresp_stream.c b/src/core/client_reqresp_stream.c index f9879de..430d481 100644 --- a/src/core/client_reqresp_stream.c +++ b/src/core/client_reqresp_stream.c @@ -267,10 +267,19 @@ static void init_peer_log_metadata( if (stream) { const peer_id_t *peer = libp2p_stream_remote_peer(stream); - if (peer - && peer_id_to_string(peer, PEER_ID_FMT_BASE58_LEGACY, peer_text, peer_text_len) < 0) - { - peer_text[0] = '\0'; + if (peer) + { + size_t written = 0; + peer_id_error_t rc = peer_id_text_write( + peer, + PEER_ID_TEXT_LEGACY_BASE58, + peer_text, + peer_text_len, + &written); + if (rc != PEER_ID_OK) + { + peer_text[0] = '\0'; + } } } diff --git a/src/core/client_sync.c b/src/core/client_sync.c index 1e53b2c..1665883 100644 --- a/src/core/client_sync.c +++ b/src/core/client_sync.c @@ -160,7 +160,14 @@ static const char *peer_id_to_text(const peer_id_t *from, char *out, size_t out_ return NULL; } - if (peer_id_to_string(from, PEER_ID_FMT_BASE58_LEGACY, out, out_len) < 0) + size_t written = 0; + peer_id_error_t rc = peer_id_text_write( + from, + PEER_ID_TEXT_LEGACY_BASE58, + out, + out_len, + &written); + if (rc != PEER_ID_OK) { out[0] = '\0'; return NULL; diff --git a/src/genesis/genesis_parse.c b/src/genesis/genesis_parse.c index 014c6fe..5ea97d8 100644 --- a/src/genesis/genesis_parse.c +++ b/src/genesis/genesis_parse.c @@ -63,6 +63,27 @@ static int parse_validator_config_entry( struct lantern_validator_config_entry *entry); static void free_validator_config_entry(struct lantern_validator_config_entry *entry); +static int write_legacy_peer_id_text(const peer_id_t *peer_id, char *buffer, size_t buffer_len) +{ + if (!peer_id || !buffer || buffer_len == 0) + { + return -1; + } + size_t written = 0; + peer_id_error_t rc = peer_id_text_write( + peer_id, + PEER_ID_TEXT_LEGACY_BASE58, + buffer, + buffer_len, + &written); + if (rc != PEER_ID_OK) + { + buffer[0] = '\0'; + return -1; + } + return (int)written; +} + /** * Parse an unsigned 64-bit integer from a string, allowing a trailing comment. @@ -365,26 +386,26 @@ static int derive_peer_id_from_privkey_hex(const char *hex, char **out_peer_id) } lantern_secure_zero(secret, sizeof(secret)); - peer_id_t peer_id = {0}; - peer_id_error_t perr = peer_id_create_from_private_key(encoded, encoded_len, &peer_id); + peer_id_t *peer_id = NULL; + peer_id_error_t perr = peer_id_new_from_private_key_pb(encoded, encoded_len, &peer_id); if (encoded) { lantern_secure_zero(encoded, encoded_len); } free(encoded); - if (perr != PEER_ID_SUCCESS) + if (perr != PEER_ID_OK || !peer_id) { return LANTERN_GENESIS_ERR_PARSE; } char buffer[GENESIS_PEER_ID_BUFFER_LEN]; - if (peer_id_to_string(&peer_id, PEER_ID_FMT_BASE58_LEGACY, buffer, sizeof(buffer)) < 0) + if (write_legacy_peer_id_text(peer_id, buffer, sizeof(buffer)) < 0) { - peer_id_destroy(&peer_id); + peer_id_free(peer_id); return LANTERN_GENESIS_ERR_PARSE; } - peer_id_destroy(&peer_id); + peer_id_free(peer_id); char *dup = lantern_string_duplicate(buffer); if (!dup) diff --git a/src/networking/gossipsub_service.c b/src/networking/gossipsub_service.c index 46cb0a4..0a25b9c 100644 --- a/src/networking/gossipsub_service.c +++ b/src/networking/gossipsub_service.c @@ -159,8 +159,14 @@ static void describe_peer_id(const peer_id_t *peer, char *buffer, size_t length) buffer[0] = '\0'; return; } - int written = peer_id_to_string(peer, PEER_ID_FMT_BASE58_LEGACY, buffer, length); - if (written < 0) { + size_t written = 0; + peer_id_error_t rc = peer_id_text_write( + peer, + PEER_ID_TEXT_LEGACY_BASE58, + buffer, + length, + &written); + if (rc != PEER_ID_OK) { buffer[0] = '\0'; } } diff --git a/src/networking/libp2p.c b/src/networking/libp2p.c index f154e04..7892b9c 100644 --- a/src/networking/libp2p.c +++ b/src/networking/libp2p.c @@ -187,6 +187,24 @@ static int multiaddr_is_quic(const multiaddr_t *ma) { return multiaddr_has_protocol(ma, MULTICODEC_QUIC_V1) || multiaddr_has_protocol(ma, MULTICODEC_QUIC); } +static int peer_id_write_legacy_base58(const peer_id_t *peer_id, char *buffer, size_t buffer_len) { + if (!peer_id || !buffer || buffer_len == 0) { + return -1; + } + size_t written = 0; + peer_id_error_t rc = peer_id_text_write( + peer_id, + PEER_ID_TEXT_LEGACY_BASE58, + buffer, + buffer_len, + &written); + if (rc != PEER_ID_OK) { + buffer[0] = '\0'; + return -1; + } + return (int)written; +} + void lantern_libp2p_host_init(struct lantern_libp2p_host *state) { if (!state) { return; @@ -446,10 +464,11 @@ int lantern_libp2p_enr_to_multiaddr( const struct lantern_enr_record *record, char *buffer, size_t buffer_len, - peer_id_t *peer_id) { + peer_id_t **peer_id) { if (!record || !buffer || !peer_id) { return -1; } + *peer_id = NULL; const struct lantern_enr_key_value *pubkey = lantern_enr_record_find(record, "secp256k1"); if (!pubkey || !pubkey->value || pubkey->value_len == 0) { return -1; @@ -463,35 +482,37 @@ int lantern_libp2p_enr_to_multiaddr( pubkey->value_len, &pubkey_pb, &pubkey_pb_len); - if (perr != PEER_ID_SUCCESS) { + if (perr != PEER_ID_OK) { return -1; } - perr = peer_id_create_from_public_key(pubkey_pb, pubkey_pb_len, peer_id); + peer_id_t *derived_peer_id = NULL; + perr = peer_id_new_from_public_key_pb(pubkey_pb, pubkey_pb_len, &derived_peer_id); free(pubkey_pb); - if (perr != PEER_ID_SUCCESS) { + if (perr != PEER_ID_OK || !derived_peer_id) { return -1; } char base_addr[128]; if (extract_ipv4_multiaddr(record, base_addr, sizeof(base_addr), NULL) != 0) { if (extract_ipv6_multiaddr(record, base_addr, sizeof(base_addr), NULL) != 0) { - peer_id_destroy(peer_id); + peer_id_free(derived_peer_id); return -1; } } char peer_text[128]; - int pid_written = peer_id_to_string(peer_id, PEER_ID_FMT_BASE58_LEGACY, peer_text, sizeof(peer_text)); + int pid_written = peer_id_write_legacy_base58(derived_peer_id, peer_text, sizeof(peer_text)); if (pid_written < 0) { - peer_id_destroy(peer_id); + peer_id_free(derived_peer_id); return -1; } int written = snprintf(buffer, buffer_len, "%s/p2p/%s", base_addr, peer_text); if (written < 0 || (size_t)written >= buffer_len) { - peer_id_destroy(peer_id); + peer_id_free(derived_peer_id); return -1; } + *peer_id = derived_peer_id; return 0; } @@ -502,14 +523,14 @@ int lantern_libp2p_host_add_enr_peer( if (!state || !state->host || !record) { return -1; } - peer_id_t peer_id = {0}; + peer_id_t *peer_id = NULL; char multiaddr[256]; if (lantern_libp2p_enr_to_multiaddr(record, multiaddr, sizeof(multiaddr), &peer_id) != 0) { return -1; } int ttl = ttl_ms > 0 ? ttl_ms : LANTERN_LIBP2P_DEFAULT_PEER_TTL_MS; - int rc = libp2p_host_add_peer_addr_str(state->host, &peer_id, multiaddr, ttl); - peer_id_destroy(&peer_id); + int rc = libp2p_host_add_peer_addr_str(state->host, peer_id, multiaddr, ttl); + peer_id_free(peer_id); return rc; } diff --git a/src/networking/reqresp_service.c b/src/networking/reqresp_service.c index 854df5e..68db783 100644 --- a/src/networking/reqresp_service.c +++ b/src/networking/reqresp_service.c @@ -75,7 +75,7 @@ struct blocks_stream_ctx { struct status_request_ctx { struct lantern_reqresp_service *service; - peer_id_t peer_id; + peer_id_t *peer_id; char peer_text[128]; const char *protocol_id; uint64_t debug_trace_id; @@ -111,6 +111,24 @@ static void lantern_reqresp_service_clear(struct lantern_reqresp_service *servic service->event_subscription = NULL; } +static int write_legacy_peer_id_text(const peer_id_t *peer, char *buffer, size_t length) { + if (!peer || !buffer || length == 0) { + return -1; + } + size_t written = 0; + peer_id_error_t rc = peer_id_text_write( + peer, + PEER_ID_TEXT_LEGACY_BASE58, + buffer, + length, + &written); + if (rc != PEER_ID_OK) { + buffer[0] = '\0'; + return -1; + } + return (int)written; +} + void lantern_reqresp_service_init(struct lantern_reqresp_service *service) { if (!service) { return; @@ -146,8 +164,7 @@ static void describe_peer(const peer_id_t *peer, char *buffer, size_t length) { buffer[0] = '\0'; return; } - int written = peer_id_to_string(peer, PEER_ID_FMT_BASE58_LEGACY, buffer, length); - if (written < 0) { + if (write_legacy_peer_id_text(peer, buffer, length) < 0) { buffer[0] = '\0'; } } @@ -156,7 +173,7 @@ static void status_request_ctx_free(struct status_request_ctx *ctx) { if (!ctx) { return; } - peer_id_destroy(&ctx->peer_id); + peer_id_free(ctx->peer_id); free(ctx); } @@ -1139,7 +1156,7 @@ static int write_stream_all( peer_text[0] = '\0'; if (!peer_hint || peer_hint[0] == '\0') { const peer_id_t *peer = libp2p_stream_remote_peer(stream); - if (peer && peer_id_to_string(peer, PEER_ID_FMT_BASE58_LEGACY, peer_text, sizeof(peer_text)) < 0) { + if (peer && write_legacy_peer_id_text(peer, peer_text, sizeof(peer_text)) < 0) { peer_text[0] = '\0'; } } @@ -2096,26 +2113,12 @@ static void status_request_on_open(libp2p_stream_t *stream, void *user_data, int pthread_detach(thread); } -static int clone_peer_id(peer_id_t *dest, const peer_id_t *src) { - if (!dest || !src || !src->bytes || src->size == 0) { - return -1; - } - dest->bytes = (uint8_t *)malloc(src->size); - if (!dest->bytes) { - dest->size = 0; - return -1; - } - memcpy(dest->bytes, src->bytes, src->size); - dest->size = src->size; - return 0; -} - static int status_request_launch( struct lantern_reqresp_service *service, const peer_id_t *peer_id, const char *peer_id_text, bool notify_on_failure) { - if (!service || !service->host || !peer_id || !peer_id->bytes || peer_id->size == 0) { + if (!service || !service->host || !peer_id) { return -1; } @@ -2134,7 +2137,7 @@ static int status_request_launch( strncpy(ctx->peer_text, peer_id_text, sizeof(ctx->peer_text) - 1); ctx->peer_text[sizeof(ctx->peer_text) - 1] = '\0'; } else { - if (peer_id_to_string(peer_id, PEER_ID_FMT_BASE58_LEGACY, ctx->peer_text, sizeof(ctx->peer_text)) < 0) { + if (write_legacy_peer_id_text(peer_id, ctx->peer_text, sizeof(ctx->peer_text)) < 0) { ctx->peer_text[0] = '\0'; } } @@ -2147,7 +2150,7 @@ static int status_request_launch( "status[%" PRIu64 "] scheduling request", ctx->debug_trace_id); - if (clone_peer_id(&ctx->peer_id, peer_id) != 0) { + if (peer_id_clone(peer_id, &ctx->peer_id) != PEER_ID_OK || !ctx->peer_id) { lantern_log_warn( "reqresp", &meta, @@ -2162,7 +2165,7 @@ static int status_request_launch( ctx->protocol_id = LANTERN_STATUS_PROTOCOL_ID; int rc = libp2p_host_open_stream_async( service->host, - &ctx->peer_id, + ctx->peer_id, ctx->protocol_id, status_request_on_open, ctx); From 1d207a4fa75d6a77a373dfc4166a466746d1d3e7 Mon Sep 17 00:00:00 2001 From: uink45 <79078981+uink45@users.noreply.github.com> Date: Mon, 16 Feb 2026 23:23:13 +1000 Subject: [PATCH 2/2] Update c-libp2p --- external/c-libp2p | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/c-libp2p b/external/c-libp2p index 7f3060e..bdee0f9 160000 --- a/external/c-libp2p +++ b/external/c-libp2p @@ -1 +1 @@ -Subproject commit 7f3060eb9a0e5c36398b937f3494d9d4d8aa572b +Subproject commit bdee0f9e6b7188aa202661f8ae71c248f14e967c