20 #include <libp2p/CapabilityHost.h>
27 static std::string
const c_ethCapability =
"eth";
35 case Asking::BlockHeaders:
36 return "BlockHeaders";
37 case Asking::BlockBodies:
39 case Asking::NodeData:
41 case Asking::Receipts:
47 case Asking::WarpManifest:
48 return "WarpManifest";
49 case Asking::WarpData:
56 void EthereumPeer::setStatus(
unsigned _protocolVersion,
u256 const& _networkId,
57 u256 const& _totalDifficulty,
h256 const& _latestHash,
h256 const& _genesisHash)
59 m_protocolVersion = _protocolVersion;
60 m_networkId = _networkId;
61 m_totalDifficulty = _totalDifficulty;
62 m_latestHash = _latestHash;
63 m_genesisHash = _genesisHash;
67 std::string EthereumPeer::validate(
68 h256 const& _hostGenesisHash,
unsigned _hostProtocolVersion,
u256 const& _hostNetworkId)
const
71 if (m_genesisHash != _hostGenesisHash)
72 error =
"Invalid genesis hash.";
73 else if (m_protocolVersion != _hostProtocolVersion)
74 error =
"Invalid protocol version.";
75 else if (m_networkId != _hostNetworkId)
76 error =
"Invalid network identifier.";
77 else if (m_asking != Asking::State && m_asking != Asking::Nothing)
78 error =
"Peer banned for unexpected status message.";
83 void EthereumPeer::requestStatus(
84 u256 _hostNetworkId,
u256 _chainTotalDifficulty,
h256 _chainCurrentHash,
h256 _chainGenesisHash)
86 assert(m_asking == Asking::Nothing);
87 setAsking(Asking::State);
88 m_requireTransactions =
true;
91 <<
c_protocolVersion << _hostNetworkId << _chainTotalDifficulty << _chainCurrentHash
93 m_host->sealAndSend(m_id, s);
96 void EthereumPeer::requestBlockHeaders(
97 unsigned _startNumber,
unsigned _count,
unsigned _skip,
bool _reverse)
99 if (m_asking != Asking::Nothing)
101 LOG(m_logger) <<
"Asking headers while requesting " <<
::toString(m_asking);
103 setAsking(Asking::BlockHeaders);
106 << _startNumber << _count << _skip << (_reverse ? 1 : 0);
107 LOG(m_logger) <<
"Requesting " << _count <<
" block headers starting from " << _startNumber
108 << (_reverse ?
" in reverse" :
"");
109 m_lastAskedHeaders = _count;
110 m_host->sealAndSend(m_id, s);
113 void EthereumPeer::requestBlockHeaders(
114 h256 const& _startHash,
unsigned _count,
unsigned _skip,
bool _reverse)
116 if (m_asking != Asking::Nothing)
118 LOG(m_logger) <<
"Asking headers while requesting " <<
::toString(m_asking);
120 setAsking(Asking::BlockHeaders);
123 << _startHash << _count << _skip << (_reverse ? 1 : 0);
124 LOG(m_logger) <<
"Requesting " << _count <<
" block headers starting from " << _startHash
125 << (_reverse ?
" in reverse" :
"");
126 m_lastAskedHeaders = _count;
127 m_host->sealAndSend(m_id, s);
131 void EthereumPeer::requestBlockBodies(
h256s const& _blocks)
136 void EthereumPeer::requestNodeData(
h256s const& _hashes)
141 void EthereumPeer::requestReceipts(
h256s const& _blocks)
146 void EthereumPeer::requestByHashes(
149 if (m_asking != Asking::Nothing)
151 LOG(m_logger) <<
"Asking " <<
::toString(_asking) <<
" while requesting "
158 m_host->prep(m_id, c_ethCapability, s, _packetType, _hashes.size());
159 for (
auto const& i : _hashes)
161 m_host->sealAndSend(m_id, s);
164 setAsking(Asking::Nothing);