Skip to content

ipfs_client/ipfs_dht.cpp

Namespaces

Name
sgns

Source code

#include "ipfs_dht.hpp"
#include <iostream>

#include <libp2p/multi/content_identifier_codec.hpp>

namespace sgns
{
IpfsDHT::IpfsDHT(
    std::shared_ptr<libp2p::protocol::kademlia::Kademlia> kademlia,
    std::vector<std::string> bootstrapAddresses)
    : kademlia_(std::move(kademlia))
    , bootstrapAddresses_(bootstrapAddresses)
{
}

void IpfsDHT::Start()
{
    auto&& bootstrapNodes = GetBootstrapNodes();
    for (auto& bootstrap_node : bootstrapNodes) {
        std::cout << "node" << std::endl;
        kademlia_->addPeer(bootstrap_node, true);
    }

    kademlia_->start();
}

void IpfsDHT::FindProviders(
    const libp2p::multi::ContentIdentifier& cid,
    std::function<void(libp2p::outcome::result<std::vector<libp2p::peer::PeerInfo>> onProvidersFound)> onProvidersFound)
{
    auto kadCID = libp2p::protocol::kademlia::ContentId(
        libp2p::multi::ContentIdentifierCodec::encode(cid).value());

    [[maybe_unused]] auto res = kademlia_->findProviders(kadCID, 0, std::move(onProvidersFound));
}

std::vector<libp2p::peer::PeerInfo> IpfsDHT::GetBootstrapNodes() const
{
    std::unordered_map<libp2p::peer::PeerId,
        std::vector<libp2p::multi::Multiaddress>>
        addresses_by_peer_id;

    for (auto& address : bootstrapAddresses_) {
        auto ma = libp2p::multi::Multiaddress::create(address).value();
        auto peer_id_base58 = ma.getPeerId().value();
        auto peer_id = libp2p::peer::PeerId::fromBase58(peer_id_base58).value();

        addresses_by_peer_id[std::move(peer_id)].emplace_back(std::move(ma));
    }

    std::vector<libp2p::peer::PeerInfo> v;
    v.reserve(addresses_by_peer_id.size());
    for (auto& i : addresses_by_peer_id) {
        v.emplace_back(libp2p::peer::PeerInfo{
            /*.id =*/ i.first, /*.addresses =*/ {std::move(i.second)} });
    }

    return v;
}

void IpfsDHT::FindPeer(
    const libp2p::peer::PeerId& peerId,
    std::function<void(libp2p::outcome::result<libp2p::peer::PeerInfo>)> onPeerFound)
{
    [[maybe_unused]] auto res = kademlia_->findPeer(peerId, onPeerFound);
}

}

Updated on 2026-04-13 at 23:22:46 -0700