Ethereum  PoC-8
The C++ Implementation of Ethereum
WarpCapability.h
Go to the documentation of this file.
1 // Aleth: Ethereum C++ client, tools and libraries.
2 // Copyright 2019 Aleth Authors.
3 // Licensed under the GNU General Public License, Version 3.
4 
5 #pragma once
6 
7 #include "CommonNet.h"
8 #include <libp2p/Capability.h>
9 #include <libp2p/CapabilityHost.h>
10 
11 namespace dev
12 {
13 namespace eth
14 {
15 class SnapshotStorageFace;
16 
17 unsigned const c_WarpProtocolVersion = 1;
18 
20 {
25  SnapshotData = 0x14,
26 
28 };
29 
31 {
33  unsigned m_protocolVersion = 0;
34 
37 
41  time_t m_lastAsk;
42 
49 };
50 
51 
53 {
54 public:
55  virtual ~WarpPeerObserverFace() {}
56 
57  virtual void onPeerStatus(NodeID const& _peerID) = 0;
58 
59  virtual void onPeerManifest(NodeID const& _peerID, RLP const& _r) = 0;
60 
61  virtual void onPeerBlockHeaders(NodeID const& _peerID, RLP const& _r) = 0;
62 
63  virtual void onPeerData(NodeID const& _peerID, RLP const& _r) = 0;
64 
65  virtual void onPeerDisconnect(NodeID const& _peerID, Asking _asking) = 0;
66 };
67 
68 
69 class WarpCapability : public p2p::CapabilityFace
70 {
71 public:
72  WarpCapability(std::shared_ptr<p2p::CapabilityHostFace> _host, BlockChain const& _blockChain,
73  u256 const& _networkId, boost::filesystem::path const& _snapshotDownloadPath,
74  std::shared_ptr<SnapshotStorageFace> _snapshotStorage);
75 
76  std::string name() const override { return "par"; }
77  unsigned version() const override { return c_WarpProtocolVersion; }
78  p2p::CapDesc descriptor() const override { return {name(), version()}; }
79  unsigned messageCount() const override { return WarpSubprotocolPacketCount; }
80  std::chrono::milliseconds backgroundWorkInterval() const override;
81 
82  u256 networkId() const { return m_networkId; }
83 
84  void onConnect(NodeID const& _peerID, u256 const& _peerCapabilityVersion) override;
85  bool interpretCapabilityPacket(NodeID const& _peerID, unsigned _id, RLP const&) override;
86  void onDisconnect(NodeID const& _peerID) override;
87 
88  void doBackgroundWork() override;
89 
90  p2p::CapabilityHostFace& capabilityHost() { return *m_host; }
91 
92  void requestStatus(NodeID const& _peerID, unsigned _hostProtocolVersion,
93  u256 const& _hostNetworkId, u256 const& _chainTotalDifficulty,
94  h256 const& _chainCurrentHash, h256 const& _chainGenesisHash,
95  h256 const& _snapshotBlockHash, u256 const& _snapshotBlockNumber);
96  void requestBlockHeaders(NodeID const& _peerID, unsigned _startNumber, unsigned _count,
97  unsigned _skip, bool _reverse);
98  void requestManifest(NodeID const& _peerID);
99  bool requestData(NodeID const& _peerID, h256 const& _chunkHash);
100 
102  bool validateStatus(NodeID const& _peerID, h256 const& _genesisHash,
103  std::vector<unsigned> const& _protocolVersions, u256 const& _networkId);
104 
105  void disablePeer(NodeID const& _peerID, std::string const& _problem);
106 
107 private:
108  static constexpr std::chrono::milliseconds c_backgroundWorkInterval{1000};
109 
110  std::shared_ptr<WarpPeerObserverFace> createPeerObserver(
111  boost::filesystem::path const& _snapshotDownloadPath);
112 
113  void setAsking(NodeID const& _peerID, Asking _a);
114 
115  void setIdle(NodeID const& _peerID) { setAsking(_peerID, Asking::Nothing); }
116 
117  std::shared_ptr<p2p::CapabilityHostFace> m_host;
118 
119  BlockChain const& m_blockChain;
120  u256 const m_networkId;
121 
122  std::shared_ptr<SnapshotStorageFace> m_snapshot;
123  std::shared_ptr<WarpPeerObserverFace> m_peerObserver;
124 
125  std::unordered_map<NodeID, WarpPeerStatus> m_peers;
126 };
127 
128 } // namespace eth
129 } // namespace dev
dev::eth::WarpPeerObserverFace::onPeerBlockHeaders
virtual void onPeerBlockHeaders(NodeID const &_peerID, RLP const &_r)=0
dev::eth::WarpPeerStatus::m_networkId
u256 m_networkId
Peer's network id.
Definition: WarpCapability.h:36
dev::eth::WarpPeerStatus::m_lastAsk
time_t m_lastAsk
When we asked for it. Allows a time out.
Definition: WarpCapability.h:41
dev::eth::WarpPeerStatus::m_latestHash
h256 m_latestHash
These are determined through either a Status message.
Definition: WarpCapability.h:44
dev::eth::WarpPeerStatus::m_genesisHash
h256 m_genesisHash
Peer's genesis hash.
Definition: WarpCapability.h:46
dev::eth::WarpCapability::requestData
bool requestData(NodeID const &_peerID, h256 const &_chunkHash)
Definition: WarpCapability.cpp:510
dev::eth::WarpPeerObserverFace::onPeerData
virtual void onPeerData(NodeID const &_peerID, RLP const &_r)=0
dev::eth::WarpCapability::version
unsigned version() const override
Definition: WarpCapability.h:77
dev::eth::WarpCapability::requestManifest
void requestManifest(NodeID const &_peerID)
Definition: WarpCapability.cpp:497
dev::eth::WarpCapability::interpretCapabilityPacket
bool interpretCapabilityPacket(NodeID const &_peerID, unsigned _id, RLP const &) override
Definition: WarpCapability.cpp:347
dev::eth::WarpSubprotocolPacketType
WarpSubprotocolPacketType
Definition: WarpCapability.h:20
dev::eth::WarpPeerObserverFace::onPeerStatus
virtual void onPeerStatus(NodeID const &_peerID)=0
dev::eth::WarpCapability::requestStatus
void requestStatus(NodeID const &_peerID, unsigned _hostProtocolVersion, u256 const &_hostNetworkId, u256 const &_chainTotalDifficulty, h256 const &_chainCurrentHash, h256 const &_chainGenesisHash, h256 const &_snapshotBlockHash, u256 const &_snapshotBlockNumber)
Definition: WarpCapability.cpp:470
dev::eth::WarpCapability::capabilityHost
p2p::CapabilityHostFace & capabilityHost()
Definition: WarpCapability.h:90
dev::eth::WarpCapability::WarpCapability
WarpCapability(std::shared_ptr< p2p::CapabilityHostFace > _host, BlockChain const &_blockChain, u256 const &_networkId, boost::filesystem::path const &_snapshotDownloadPath, std::shared_ptr< SnapshotStorageFace > _snapshotStorage)
Definition: WarpCapability.cpp:301
dev::FixedHash< 32 >
dev::eth::WarpCapability
Definition: WarpCapability.h:70
dev::eth::WarpPeerStatus::m_snapshotNumber
u256 m_snapshotNumber
Definition: WarpCapability.h:48
dev::eth::GetSnapshotManifest
@ GetSnapshotManifest
Definition: WarpCapability.h:22
dev::eth::WarpCapability::onConnect
void onConnect(NodeID const &_peerID, u256 const &_peerCapabilityVersion) override
Definition: WarpCapability.cpp:326
dev::eth::WarpCapability::doBackgroundWork
void doBackgroundWork() override
Definition: WarpCapability.cpp:456
dev::eth::WarpCapability::backgroundWorkInterval
std::chrono::milliseconds backgroundWorkInterval() const override
Definition: WarpCapability.cpp:315
dev::eth::WarpStatusPacket
@ WarpStatusPacket
Definition: WarpCapability.h:21
dev::eth::WarpPeerStatus::m_totalDifficulty
u256 m_totalDifficulty
Peer's latest block's total difficulty.
Definition: WarpCapability.h:45
dev::eth::WarpCapability::name
std::string name() const override
Definition: WarpCapability.h:76
dev::eth::Asking
Asking
Definition: CommonNet.h:73
dev::eth::WarpSubprotocolPacketCount
@ WarpSubprotocolPacketCount
Definition: WarpCapability.h:27
dev::eth::WarpPeerObserverFace::~WarpPeerObserverFace
virtual ~WarpPeerObserverFace()
Definition: WarpCapability.h:55
dev::eth::NodeID
p2p::NodeID NodeID
Definition: CommonNet.h:105
dev::eth::c_WarpProtocolVersion
unsigned const c_WarpProtocolVersion
Definition: WarpCapability.h:17
dev::eth::BlockChain
Implements the blockchain database. All data this gives is disk-backed. @threadsafe.
Definition: BlockChain.h:105
dev::eth::WarpCapability::requestBlockHeaders
void requestBlockHeaders(NodeID const &_peerID, unsigned _startNumber, unsigned _count, unsigned _skip, bool _reverse)
Definition: WarpCapability.cpp:482
dev::eth::WarpPeerObserverFace::onPeerManifest
virtual void onPeerManifest(NodeID const &_peerID, RLP const &_r)=0
dev::eth::WarpCapability::networkId
u256 networkId() const
Definition: WarpCapability.h:82
dev::eth::WarpPeerStatus::m_protocolVersion
unsigned m_protocolVersion
Peer's protocol version.
Definition: WarpCapability.h:33
dev::eth::WarpCapability::onDisconnect
void onDisconnect(NodeID const &_peerID) override
Definition: WarpCapability.cpp:450
dev::eth::WarpPeerObserverFace::onPeerDisconnect
virtual void onPeerDisconnect(NodeID const &_peerID, Asking _asking)=0
dev::eth::WarpPeerStatus
Definition: WarpCapability.h:31
dev::eth::WarpPeerStatus::m_snapshotHash
h256 m_snapshotHash
Definition: WarpCapability.h:47
dev::eth::GetSnapshotData
@ GetSnapshotData
Definition: WarpCapability.h:24
dev::eth::WarpCapability::validateStatus
bool validateStatus(NodeID const &_peerID, h256 const &_genesisHash, std::vector< unsigned > const &_protocolVersions, u256 const &_networkId)
Validates whether peer is able to communicate with the host, disables peer if not.
Definition: WarpCapability.cpp:538
dev::eth::WarpCapability::descriptor
p2p::CapDesc descriptor() const override
Definition: WarpCapability.h:78
dev::u256
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u256
Definition: Common.h:121
dev
Definition: Address.cpp:21
dev::eth::SnapshotData
@ SnapshotData
Definition: WarpCapability.h:25
dev::eth::WarpCapability::messageCount
unsigned messageCount() const override
Definition: WarpCapability.h:79
dev::eth::WarpPeerStatus::m_asking
Asking m_asking
What, if anything, we last asked the other peer for.
Definition: WarpCapability.h:39
CommonNet.h
dev::eth::WarpPeerObserverFace
Definition: WarpCapability.h:53
dev::eth::SnapshotManifest
@ SnapshotManifest
Definition: WarpCapability.h:23
dev::eth::WarpCapability::disablePeer
void disablePeer(NodeID const &_peerID, std::string const &_problem)
Definition: WarpCapability.cpp:572
dev::RLP
Definition: RLP.h:48
dev::eth::Asking::Nothing
@ Nothing