8 #include <unordered_map>
13 #include <libp2p/Common.h>
23 class EthereumCapability;
81 EthereumCapability
const& host()
const {
return m_host; }
84 void syncPeer(
NodeID const& _peerID,
bool _force);
85 void requestBlocks(
NodeID const& _peerID);
86 void clearPeerDownload(
NodeID const& _peerID);
87 void clearPeerDownload();
89 bool requestDaoForkBlockHeader(
NodeID const& _peerID);
90 bool verifyDaoChallengeResponse(RLP
const& _r);
91 void logImported(
unsigned _success,
unsigned _future,
unsigned _got,
unsigned _unknown);
104 h256 transactionsRoot;
107 bool operator==(HeaderId
const& _other)
const
109 return transactionsRoot == _other.transactionsRoot && uncles == _other.uncles;
115 std::size_t operator()(
const HeaderId& _k)
const
119 boost::hash_combine(seed, hasher(_k.transactionsRoot));
120 boost::hash_combine(seed, hasher(_k.uncles));
125 EthereumCapability& m_host;
126 Handler<> m_bqRoomAvailable;
129 std::set<NodeID> m_daoChallengedPeers;
132 unsigned m_chainStartBlock = 0;
133 unsigned m_startingBlock = 0;
134 unsigned m_highestBlock = 0;
135 std::unordered_set<unsigned> m_downloadingHeaders;
136 std::unordered_set<unsigned> m_downloadingBodies;
137 std::map<unsigned, std::vector<Header>> m_headers;
138 std::map<unsigned, std::vector<bytes>> m_bodies;
139 std::map<NodeID, std::vector<unsigned>> m_headerSyncPeers;
142 std::map<NodeID, std::vector<unsigned>> m_bodySyncPeers;
143 std::unordered_map<HeaderId, unsigned, HeaderIdHash> m_headerIdToNumber;
144 bool m_haveCommonHeader =
false;
145 unsigned m_lastImportedBlock = 0;
146 h256 m_lastImportedBlockHash;
147 u256 m_syncingTotalDifficulty;
154 static char const*
const s_stateNames[
static_cast<int>(
SyncState::Size)];
155 bool invariants()
const override;
156 void logNewBlock(
h256 const& _h);
159 std::ostream&
operator<<(std::ostream& _out, SyncStatus
const& _sync);