27 #include <libp2p/Capability.h> 28 #include <libp2p/CapabilityHost.h> 29 #include <libp2p/Common.h> 34 #include <unordered_map> 35 #include <unordered_set> 47 class TransactionQueue;
65 NodeID const& _peerID, std::vector<std::pair<h256, u256>>
const& _hashes) = 0;
82 RLP const& _blockId,
unsigned _maxHeaders,
u256 _skip,
bool _reverse)
const = 0;
84 virtual std::pair<bytes, unsigned>
blockBodies(
RLP const& _blockHashes)
const = 0;
88 virtual std::pair<bytes, unsigned>
receipts(
RLP const& _blockHashes)
const = 0;
104 std::string
name()
const override {
return "eth"; }
146 static char const*
const s_stateNames[
static_cast<int>(
SyncState::Size)];
148 std::vector<NodeID> selectPeers(
149 std::function<
bool(
EthereumPeer const&)>
const& _predicate)
const;
151 std::pair<std::vector<NodeID>, std::vector<NodeID>> randomPartitionPeers(
152 std::vector<NodeID>
const& _peers, std::size_t _number)
const;
154 void doBackgroundWork();
156 void maintainTransactions();
157 void maintainBlocks(
h256 const& _currentBlock);
161 bool ensureInitialised();
163 void setIdle(
NodeID const& _peerID);
167 bool isCriticalSyncing(
NodeID const& _peerID)
const;
170 bool needsSyncing(
NodeID const& _peerID)
const;
172 std::shared_ptr<p2p::CapabilityHostFace> m_host;
181 h256 m_latestBlockSent;
184 std::atomic<bool> m_newTransactions = {
false};
185 std::atomic<bool> m_newBlocks = {
false};
187 std::shared_ptr<BlockChainSync> m_sync;
188 std::atomic<time_t> m_lastTick = { 0 };
190 std::unique_ptr<EthereumHostDataFace> m_hostData;
191 std::unique_ptr<EthereumPeerObserverFace> m_peerObserver;
193 std::unordered_map<NodeID, EthereumPeer> m_peers;
195 std::atomic<bool> m_backgroundWorkEnabled = {
false};
197 mutable std::mt19937_64 m_urng;
static unsigned const c_oldProtocolVersion
virtual void onPeerBlockBodies(NodeID const &_peerID, RLP const &_r)=0
void onStopping() override
virtual strings nodeData(RLP const &_dataHashes) const =0
const unsigned c_protocolVersion
Current protocol version.
EthereumCapability(std::shared_ptr< p2p::CapabilityHostFace > _host, BlockChain const &_ch, OverlayDB const &_db, TransactionQueue &_tq, BlockQueue &_bq, u256 _networkId)
Start server, but don't listen.
A queue of Transactions, each stored as RLP. Maintains a transaction queue sorted by nonce diff and g...
virtual ~EthereumPeerObserverFace()=default
void onDisconnect(NodeID const &_nodeID) override
virtual void onPeerStatus(EthereumPeer const &_peer)=0
Implements the blockchain database. All data this gives is disk-backed. .
void onBlockImported(BlockHeader const &_info)
void completeSync()
Don't sync further - used only in test mode.
bool interpretCapabilityPacket(NodeID const &_peerID, unsigned _id, RLP const &_r) override
The EthereumCapability class.
std::vector< std::string > strings
virtual void onPeerNodeData(NodeID const &_peerID, RLP const &_r)=0
void onStarting() override
EthereumPeer const & peer(NodeID const &_peerID) const
virtual std::pair< bytes, unsigned > blockBodies(RLP const &_blockHashes) const =0
void disablePeer(NodeID const &_peerID, std::string const &_problem)
OverlayDB const & db() const
virtual void onPeerBlockHeaders(NodeID const &_peerID, RLP const &_headers)=0
virtual void onPeerReceipts(NodeID const &_peerID, RLP const &_r)=0
virtual void onPeerAborting()=0
void noteNewTransactions()
Logger createLogger(int _severity, std::string const &_channel)
void onConnect(NodeID const &_nodeID, u256 const &_peerCapabilityVersion) override
BlockQueue const & bq() const
A queue of blocks. Sits between network or other I/O and the BlockChain. Sorts them ready for blockch...
u256 version() const override
virtual void onPeerNewHashes(NodeID const &_peerID, std::vector< std::pair< h256, u256 >> const &_hashes)=0
virtual void onPeerNewBlock(NodeID const &_peerID, RLP const &_r)=0
virtual void onPeerTransactions(NodeID const &_peerID, RLP const &_r)=0
virtual std::pair< bytes, unsigned > blockHeaders(RLP const &_blockId, unsigned _maxHeaders, u256 _skip, bool _reverse) const =0
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u256
SyncStatus status() const
virtual ~EthereumHostDataFace()=default
std::string name() const override
virtual std::pair< bytes, unsigned > receipts(RLP const &_blockHashes) const =0
unsigned messageCount() const override
std::unordered_set< h256 > h256Hash
unsigned protocolVersion() const
void setNetworkId(u256 _n)
static char const * stateName(SyncState _s)
boost::log::sources::severity_channel_logger<> Logger
p2p::CapabilityHostFace & capabilityHost()
BlockChain const & chain() const