 |
Ethereum
PoC-8
The C++ Implementation of Ethereum
|
Go to the documentation of this file.
14 #include <libp2p/Capability.h>
15 #include <libp2p/CapabilityHost.h>
16 #include <libp2p/Common.h>
21 #include <unordered_map>
22 #include <unordered_set>
34 class TransactionQueue;
52 NodeID const& _peerID, std::vector<std::pair<h256, u256>>
const& _hashes) = 0;
69 RLP const& _blockId,
unsigned _maxHeaders,
u256 _skip,
bool _reverse)
const = 0;
71 virtual std::pair<bytes, unsigned>
blockBodies(
RLP const& _blockHashes)
const = 0;
75 virtual std::pair<bytes, unsigned>
receipts(
RLP const& _blockHashes)
const = 0;
91 std::string
name()
const override {
return "eth"; }
136 static char const*
const c_stateNames[
static_cast<int>(
SyncState::Size)];
137 static constexpr std::chrono::milliseconds c_backgroundWorkInterval{1000};
139 std::vector<NodeID> selectPeers(
140 std::function<
bool(EthereumPeer
const&)>
const& _predicate)
const;
142 std::pair<std::vector<NodeID>, std::vector<NodeID>> randomPartitionPeers(
143 std::vector<NodeID>
const& _peers, std::size_t _number)
const;
146 void maintainTransactions();
147 void maintainBlocks(
h256 const& _currentBlock);
151 bool ensureInitialised();
153 void setIdle(
NodeID const& _peerID);
157 bool isCriticalSyncing(
NodeID const& _peerID)
const;
160 bool needsSyncing(
NodeID const& _peerID)
const;
162 std::shared_ptr<p2p::CapabilityHostFace> m_host;
164 BlockChain
const& m_chain;
166 TransactionQueue& m_tq;
171 h256 m_latestBlockSent;
174 std::atomic<bool> m_newTransactions = {
false};
175 std::atomic<bool> m_newBlocks = {
false};
177 std::shared_ptr<BlockChainSync> m_sync;
178 std::atomic<time_t> m_lastTick = { 0 };
180 std::unique_ptr<EthereumHostDataFace> m_hostData;
181 std::unique_ptr<EthereumPeerObserverFace> m_peerObserver;
183 std::unordered_map<NodeID, EthereumPeer> m_peers;
185 mutable std::mt19937_64 m_urng;
A queue of blocks. Sits between network or other I/O and the BlockChain. Sorts them ready for blockch...
void completeSync()
Don't sync further - used only in test mode.
p2p::CapDesc descriptor() const override
virtual void onPeerBlockHeaders(NodeID const &_peerID, RLP const &_headers)=0
virtual strings nodeData(RLP const &_dataHashes) const =0
std::chrono::milliseconds backgroundWorkInterval() const override
virtual void onPeerNodeData(NodeID const &_peerID, RLP const &_r)=0
const unsigned c_protocolVersion
Current protocol version.
void doBackgroundWork() override
bool interpretCapabilityPacket(NodeID const &_peerID, unsigned _id, RLP const &_r) override
virtual void onPeerBlockBodies(NodeID const &_peerID, RLP const &_r)=0
EthereumPeer const & peer(NodeID const &_peerID) const
virtual void onPeerReceipts(NodeID const &_peerID, RLP const &_r)=0
void onDisconnect(NodeID const &_nodeID) override
BlockChain const & chain() const
virtual std::pair< bytes, unsigned > blockHeaders(RLP const &_blockId, unsigned _maxHeaders, u256 _skip, bool _reverse) const =0
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.
virtual std::pair< bytes, unsigned > blockBodies(RLP const &_blockHashes) const =0
OverlayDB const & db() const
SyncStatus status() const
std::unordered_set< h256 > h256Hash
boost::log::sources::severity_channel_logger<> Logger
virtual void onPeerAborting()=0
virtual ~EthereumHostDataFace()=default
virtual void onPeerNewHashes(NodeID const &_peerID, std::vector< std::pair< h256, u256 >> const &_hashes)=0
void noteNewTransactions()
std::string name() const override
Logger createLogger(int _severity, std::string const &_channel)
virtual std::pair< bytes, unsigned > receipts(RLP const &_blockHashes) const =0
Implements the blockchain database. All data this gives is disk-backed. @threadsafe.
virtual void onPeerTransactions(NodeID const &_peerID, RLP const &_r)=0
A queue of Transactions, each stored as RLP. Maintains a transaction queue sorted by nonce diff and g...
void disablePeer(NodeID const &_peerID, std::string const &_problem)
std::vector< std::string > strings
static unsigned const c_oldProtocolVersion
unsigned version() const override
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u256
The EthereumCapability class.
void onConnect(NodeID const &_nodeID, u256 const &_peerCapabilityVersion) override
virtual void onPeerNewBlock(NodeID const &_peerID, RLP const &_r)=0
static char const * stateName(SyncState _s)
unsigned messageCount() const override
unsigned protocolVersion() const
void onBlockImported(BlockHeader const &_info)
BlockQueue const & bq() const
virtual ~EthereumPeerObserverFace()=default
p2p::CapabilityHostFace & capabilityHost()
void setNetworkId(u256 _n)
virtual void onPeerStatus(EthereumPeer const &_peer)=0