diff --git a/llarp/link/link_manager.cpp b/llarp/link/link_manager.cpp index 5f5518206..51024722c 100644 --- a/llarp/link/link_manager.cpp +++ b/llarp/link/link_manager.cpp @@ -792,14 +792,17 @@ namespace llarp assert(_router.is_service_node()); log::critical(logcat, "Handling fetch bootstrap fetch request..."); - RemoteRC remote; + std::optional remote; size_t quantity; try { oxenc::bt_dict_consumer btdc{m.body()}; - btdc.required("local"); - remote = RemoteRC{btdc.consume_dict_data()}; + if (btdc.skip_until("local")) + remote.emplace(btdc.consume_dict_data()); + + // btdc.required("local"); + // remote = RemoteRC{btdc.consume_dict_data()}; quantity = btdc.require("quantity"); } catch (const std::exception& e) @@ -808,27 +811,30 @@ namespace llarp m.respond(messages::ERROR_RESPONSE, true); return; } - - auto is_seed = _router.is_bootstrap_seed(); - auto& rid = remote.router_id(); - - // TODO: if we are not the seed, how do we check the requester - if (is_seed) + + if (remote) { - // we already insert the - auto& registered = node_db->registered_routers(); + auto is_snode = _router.is_service_node(); + auto& rid = remote->router_id(); - if (auto itr = registered.find(rid); itr != registered.end()) + if (is_snode) { - log::critical( - logcat, - "Bootstrap seed confirmed RID:{} is registered; approving fetch request and " - "saving RC!", - rid); - node_db->verify_gossip_bfetch_rc(remote); + // we already insert the + auto& registered = node_db->registered_routers(); + + if (auto itr = registered.find(rid); itr != registered.end()) + { + log::critical( + logcat, + "Bootstrap node confirmed RID:{} is registered; approving fetch request and " + "saving RC!", + rid); + node_db->verify_gossip_bfetch_rc(*remote); + } } } + auto& src = node_db->get_known_rcs(); auto count = src.size(); diff --git a/llarp/messages/fetch.hpp b/llarp/messages/fetch.hpp index 95a6018aa..d80839f4a 100644 --- a/llarp/messages/fetch.hpp +++ b/llarp/messages/fetch.hpp @@ -62,12 +62,16 @@ namespace llarp { // the LocalRC is converted to a RemoteRC type to send to the bootstrap seed inline static std::string - serialize(const LocalRC& local_rc, size_t quantity) + serialize(std::optional local_rc, size_t quantity) { oxenc::bt_dict_producer btdp; - btdp.append_encoded("local", oxen::quic::to_sv(local_rc.view())); - log::critical(logcat, "Serializing localRC: {}", oxenc::to_hex(local_rc.view())); + + if (local_rc) + btdp.append_encoded("local", oxen::quic::to_sv(local_rc->view())); + + log::critical(logcat, "Serializing localRC: {}", oxenc::to_hex(local_rc->view())); btdp.append("quantity", quantity); + return std::move(btdp).str(); } diff --git a/llarp/nodedb.cpp b/llarp/nodedb.cpp index 12ea089eb..81c51211d 100644 --- a/llarp/nodedb.cpp +++ b/llarp/nodedb.cpp @@ -653,12 +653,18 @@ namespace llarp log::critical(logcat, "Dispatching BootstrapRC fetch request to {}", fetch_source); - auto num_needed = _router.is_service_node() ? SERVICE_NODE_BOOTSTRAP_SOURCE_COUNT + auto is_snode = _router.is_service_node(); + + auto num_needed = is_snode ? SERVICE_NODE_BOOTSTRAP_SOURCE_COUNT : CLIENT_BOOTSTRAP_SOURCE_COUNT; _router.link_manager().fetch_bootstrap_rcs( rc, - BootstrapFetchMessage::serialize(_router.router_contact, num_needed), + BootstrapFetchMessage::serialize( + is_snode ? + std::make_optional(_router.router_contact) : + std::nullopt, + num_needed), [this, is_snode = _router.is_service_node()](oxen::quic::message m) mutable { log::critical(logcat, "Received response to BootstrapRC fetch request...");