Skip to content

discv4/packet_factory.hpp

Namespaces

Name
discv4

Classes

Name
class discv4::PacketFactory

Types

Name
enum class PacketError
using outcome::result< void, PacketError > PacketResult
using std::function< void(const std::vector< uint8_t > &, const udp::endpoint &)> SendCallback

Types Documentation

enum PacketError

Enumerator Value Description
kNullPacket
kSignFailure

using PacketResult

using discv4::PacketResult = outcome::result<void, PacketError>;

using SendCallback

using discv4::SendCallback = std::function<void(const std::vector<uint8_t>&, const udp::endpoint&)>;

Source code

// packet_factory.h
#ifndef RLP_PEERDISCOVERY_PACKET_FACTORY_HPP
#define RLP_PEERDISCOVERY_PACKET_FACTORY_HPP

#include <memory>
#include <vector>
#include <functional>

#include <boost/outcome/result.hpp>

#include <boost/asio.hpp>

// Boost.Asio
namespace asio = boost::asio;
using udp = asio::ip::udp;

// RLP
#include <rlp/rlp_decoder.hpp>

// nil::crypto3
#include <nil/crypto3/hash/sha2.hpp>
#include <nil/crypto3/hash/keccak.hpp>

namespace discv4 {

// Forward declarations
class discv4_packet;

namespace outcome = BOOST_OUTCOME_V2_NAMESPACE;

enum class PacketError {
    kNullPacket,
    kSignFailure,
};

using PacketResult = outcome::result<void, PacketError>;

using SendCallback = std::function<void(const std::vector<uint8_t>&, const udp::endpoint&)>;

class PacketFactory
{
public:
    // Send Ping and await Pong asynchronously
    static PacketResult SendPingAndWait(
        asio::io_context& io,
        const std::string& fromIp, uint16_t fUdp, uint16_t fTcp,
        const std::string& toIp, uint16_t tUdp, uint16_t tTcp,
        const std::vector<uint8_t>& privKeyHex,
        SendCallback callback,
        uint16_t* boundPort = nullptr );

private:
    static PacketResult SignAndBuildPacket(
        discv4_packet* packet,
        const std::vector<uint8_t>& privKeyHex,
        std::vector<uint8_t>& out );

    static void SendPacket(
        asio::ip::udp::socket& socket,
        const std::vector<uint8_t>& msg,
        const udp::endpoint& target );
};

} // namespace discv4

#endif // RLP_PEERDISCOVERY_PACKET_FACTORY_HPP

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