TARAXA
Loading...
Searching...
No Matches
taraxa_capability.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <libp2p/Capability.h>
4#include <libp2p/Common.h>
5#include <libp2p/Host.h>
6#include <libp2p/Session.h>
7
8#include <memory>
9
11#include "config/config.hpp"
16#include "pbft/pbft_chain.hpp"
18
19namespace taraxa {
20class DbStorage;
21class PbftManager;
22class PbftChain;
23class VoteManager;
24class DagManager;
25class TransactionManager;
26class SlashingManager;
27enum class TransactionStatus;
28
29namespace pillar_chain {
30class PillarChainManager;
31}
32
33namespace final_chain {
34class FinalChain;
35}
36
37} // namespace taraxa
38
40
41class ISyncPacketHandler;
42class IVotePacketHandler;
43class IPillarVotePacketHandler;
44class IGetPillarVotesBundlePacketHandler;
45class ITransactionPacketHandler;
46class IDagBlockPacketHandler;
47
48class PbftSyncingState;
49class TaraxaPeer;
50
52 public:
56 using InitPacketsHandlers = std::function<std::shared_ptr<PacketsHandler>(
57 const std::string &logs_prefix, const FullNodeConfig &config, const h256 &genesis_hash,
58 const std::shared_ptr<PeersState> &peers_state, const std::shared_ptr<PbftSyncingState> &pbft_syncing_state,
59
60 const std::shared_ptr<tarcap::TimePeriodPacketsStats> &packets_stats, const std::shared_ptr<DbStorage> &db,
61 const std::shared_ptr<PbftManager> &pbft_mgr, const std::shared_ptr<PbftChain> &pbft_chain,
62 const std::shared_ptr<VoteManager> &vote_mgr, const std::shared_ptr<DagManager> &dag_mgr,
63 const std::shared_ptr<TransactionManager> &trx_mgr, const std::shared_ptr<SlashingManager> &slashing_manager,
64 const std::shared_ptr<pillar_chain::PillarChainManager> &pillar_chain_mgr,
65 const std::shared_ptr<final_chain::FinalChain> &final_chain, TarcapVersion version)>;
66
72
73 public:
74 TaraxaCapability(TarcapVersion version, const FullNodeConfig &conf, const h256 &genesis_hash,
75 std::weak_ptr<dev::p2p::Host> host,
76 std::shared_ptr<network::threadpool::PacketsThreadPool> threadpool,
77 std::shared_ptr<TimePeriodPacketsStats> packets_stats,
78 std::shared_ptr<PbftSyncingState> syncing_state, std::shared_ptr<DbStorage> db,
79 std::shared_ptr<PbftManager> pbft_mgr, std::shared_ptr<PbftChain> pbft_chain,
80 std::shared_ptr<VoteManager> vote_mgr, std::shared_ptr<DagManager> dag_mgr,
81 std::shared_ptr<TransactionManager> trx_mgr, std::shared_ptr<SlashingManager> slashing_manager,
82 std::shared_ptr<pillar_chain::PillarChainManager> pillar_chain_mgr,
83 std::shared_ptr<final_chain::FinalChain> final_chain,
84 InitPacketsHandlers init_packets_handlers = kInitLatestVersionHandlers);
85
86 virtual ~TaraxaCapability() = default;
91
92 // CapabilityFace implemented interface
93 std::string name() const override;
94 TarcapVersion version() const override;
95 unsigned messageCount() const override;
96 void onConnect(std::weak_ptr<dev::p2p::Session> session, u256 const &) override;
97 void onDisconnect(dev::p2p::NodeID const &_nodeID) override;
98 void interpretCapabilityPacket(std::weak_ptr<dev::p2p::Session> session, unsigned _id, dev::RLP const &_r) override;
99 std::string packetTypeToString(unsigned _packetType) const override;
100
101 const std::shared_ptr<PeersState> &getPeersState();
102
110 template <typename PacketHandlerType>
111 std::shared_ptr<PacketHandlerType> getSpecificHandler(SubprotocolPacketType packet_type) const;
112
113 private:
115 void handlePacketQueueOverLimit(std::shared_ptr<dev::p2p::Host> host, dev::p2p::NodeID node_id, size_t tp_queue_size);
116
117 private:
118 // Capability version
120
121 // Packets stats per time period
122 std::shared_ptr<TimePeriodPacketsStats> all_packets_stats_;
123
124 // Node config
126
127 // Peers state
128 std::shared_ptr<PeersState> peers_state_;
129
130 // Syncing state + syncing handler
131 std::shared_ptr<PbftSyncingState> pbft_syncing_state_;
132
133 // Packets handlers
134 std::shared_ptr<PacketsHandler> packets_handlers_;
135
136 // Main Threadpool for processing packets
137 std::shared_ptr<threadpool::PacketsThreadPool> thread_pool_;
138
139 // Last disconnect time and number of peers
140 std::chrono::system_clock::time_point last_ddos_disconnect_time_ = {};
141 std::chrono::system_clock::time_point queue_over_limit_start_time_ = {};
142 bool queue_over_limit_ = false;
144
146};
147
148template <typename PacketHandlerType>
149std::shared_ptr<PacketHandlerType> TaraxaCapability::getSpecificHandler(SubprotocolPacketType packet_type) const {
150 // Note: Allow to manually cast only to known base classes types.
151 // We support multiple taraxa capabilities, which can contain different versions of packet handlers and casting
152 // directly to final classes types breaks the functionality...
153 switch (packet_type) {
156 if (!std::is_same<ISyncPacketHandler, PacketHandlerType>::value) {
157 assert(false);
158 }
159 break;
160
162 if (!std::is_same<ITransactionPacketHandler, PacketHandlerType>::value) {
163 assert(false);
164 }
165 break;
166
169 if (!std::is_same<IVotePacketHandler, PacketHandlerType>::value) {
170 assert(false);
171 }
172 break;
173
175 if (!std::is_same<IPillarVotePacketHandler, PacketHandlerType>::value) {
176 assert(false);
177 }
178 break;
179
181 if (!std::is_same<IGetPillarVotesBundlePacketHandler, PacketHandlerType>::value) {
182 assert(false);
183 }
184 break;
185
187 if (!std::is_same<IDagBlockPacketHandler, PacketHandlerType>::value) {
188 assert(false);
189 }
190 break;
191
192 default:
193 assert(false);
194 return nullptr;
195 }
196
197 auto handler = packets_handlers_->getSpecificHandler(packet_type);
198 return std::dynamic_pointer_cast<PacketHandlerType>(handler);
199}
200
201} // namespace taraxa::network::tarcap
Definition RLP.h:56
The Capability interface. This interface has to be implemented to support any devp2p subprotocol.
Definition Capability.h:16
Definition taraxa_capability.hpp:51
std::function< std::shared_ptr< PacketsHandler >(const std::string &logs_prefix, const FullNodeConfig &config, const h256 &genesis_hash, const std::shared_ptr< PeersState > &peers_state, const std::shared_ptr< PbftSyncingState > &pbft_syncing_state, const std::shared_ptr< tarcap::TimePeriodPacketsStats > &packets_stats, const std::shared_ptr< DbStorage > &db, const std::shared_ptr< PbftManager > &pbft_mgr, const std::shared_ptr< PbftChain > &pbft_chain, const std::shared_ptr< VoteManager > &vote_mgr, const std::shared_ptr< DagManager > &dag_mgr, const std::shared_ptr< TransactionManager > &trx_mgr, const std::shared_ptr< SlashingManager > &slashing_manager, const std::shared_ptr< pillar_chain::PillarChainManager > &pillar_chain_mgr, const std::shared_ptr< final_chain::FinalChain > &final_chain, TarcapVersion version)> InitPacketsHandlers
Function signature for creating taraxa capability packets handlers.
Definition taraxa_capability.hpp:65
std::string packetTypeToString(unsigned _packetType) const override
Convert supplied packet type to string - used for logging purposes.
Definition taraxa_capability.cpp:124
TarcapVersion version_
Definition taraxa_capability.hpp:119
std::string name() const override
Subprotocol name, used in negotiating common capabilities with the peers.
Definition taraxa_capability.cpp:61
void onDisconnect(dev::p2p::NodeID const &_nodeID) override
Definition taraxa_capability.cpp:105
void handlePacketQueueOverLimit(std::shared_ptr< dev::p2p::Host > host, dev::p2p::NodeID node_id, size_t tp_queue_size)
Definition taraxa_capability.cpp:206
const FullNodeConfig & kConf
Definition taraxa_capability.hpp:125
TaraxaCapability & operator=(const TaraxaCapability &ro)=delete
uint32_t last_disconnect_number_of_peers_
Definition taraxa_capability.hpp:143
std::shared_ptr< PbftSyncingState > pbft_syncing_state_
Definition taraxa_capability.hpp:131
std::shared_ptr< PacketHandlerType > getSpecificHandler(SubprotocolPacketType packet_type) const
templated getSpecificHandler method for getting specific packet handler based on packet_type
Definition taraxa_capability.hpp:149
static const InitPacketsHandlers kInitLatestVersionHandlers
Default InitPacketsHandlers function definition with the latest version of packets handlers.
Definition taraxa_capability.hpp:70
std::chrono::system_clock::time_point queue_over_limit_start_time_
Definition taraxa_capability.hpp:141
static const InitPacketsHandlers kInitV5VersionHandlers
Definition taraxa_capability.hpp:71
TaraxaCapability(TaraxaCapability &&ro)=delete
TarcapVersion version() const override
Definition taraxa_capability.cpp:63
void onConnect(std::weak_ptr< dev::p2p::Session > session, u256 const &) override
Definition taraxa_capability.cpp:67
std::shared_ptr< PacketsHandler > packets_handlers_
Definition taraxa_capability.hpp:134
void interpretCapabilityPacket(std::weak_ptr< dev::p2p::Session > session, unsigned _id, dev::RLP const &_r) override
Definition taraxa_capability.cpp:128
std::shared_ptr< TimePeriodPacketsStats > all_packets_stats_
Definition taraxa_capability.hpp:122
const std::shared_ptr< PeersState > & getPeersState()
Definition taraxa_capability.cpp:257
TaraxaCapability(const TaraxaCapability &ro)=delete
logger::Logger logger_
Definition taraxa_capability.hpp:145
std::shared_ptr< threadpool::PacketsThreadPool > thread_pool_
Definition taraxa_capability.hpp:137
TaraxaCapability & operator=(TaraxaCapability &&ro)=delete
bool queue_over_limit_
Definition taraxa_capability.hpp:142
std::shared_ptr< PeersState > peers_state_
Definition taraxa_capability.hpp:128
unsigned messageCount() const override
Number of messages supported by the subprotocol version.
Definition taraxa_capability.cpp:65
bool filterSyncIrrelevantPackets(SubprotocolPacketType packet_type) const
Definition taraxa_capability.cpp:246
std::chrono::system_clock::time_point last_ddos_disconnect_time_
Definition taraxa_capability.hpp:140
TransactionStatus
TransactionStatus enum class defines current transaction status.
Definition transaction_manager.hpp:23
std::shared_ptr< spdlog::logger > Logger
Definition logging.hpp:12
Definition vote_manager.hpp:24
unsigned TarcapVersion
Definition tarcap_version.hpp:4
SubprotocolPacketType
SubprotocolPacketType is used in networking layer to differentiate packet types.
Definition packet_types.hpp:12
@ kGetPillarVotesBundlePacket
Definition packet_types.hpp:33
@ kStatusPacket
Definition packet_types.hpp:28
@ kDagBlockPacket
Definition packet_types.hpp:21
@ kVotePacket
Definition packet_types.hpp:15
@ kPbftSyncPacket
Definition packet_types.hpp:30
@ kVotesBundlePacket
Definition packet_types.hpp:17
@ kTransactionPacket
Definition packet_types.hpp:24
@ kPillarVotePacket
Definition packet_types.hpp:32
Definition app.hpp:16
Definition config.hpp:41