| 136 | } |
| 137 | |
| 138 | void P2PProtocolBasic::msg_handshake(p2p::Handshake::Request &&req) { |
| 139 | if (!is_incoming()) { |
| 140 | disconnect("p2p::Handshake from outgoing node"); |
| 141 | return; |
| 142 | } |
| 143 | if (req.node_data.network_id != config.network_id) { |
| 144 | if (!config.allow_empty_network_id || req.node_data.network_id != UUID{}) { |
| 145 | disconnect("202 wrong network"); |
| 146 | return; |
| 147 | } |
| 148 | } |
| 149 | if (req.node_data.version < config.p2p_minimum_version) { |
| 150 | disconnect("202 old version"); |
| 151 | return; |
| 152 | } |
| 153 | // on self-connect, incoming side replies so that outgoing side can add to ban |
| 154 | p2p::Handshake::Response msg; |
| 155 | msg.payload_data = get_my_sync_data(); |
| 156 | msg.node_data = get_my_node_data(); |
| 157 | msg.local_peerlist = get_legacy_peers_to_share(); |
| 158 | if (msg.local_peerlist.size() > p2p::Handshake::Response::MAX_SEND_PEER_COUNT) |
| 159 | msg.local_peerlist.resize(p2p::Handshake::Response::MAX_SEND_PEER_COUNT); |
| 160 | msg.peerlist = get_peers_to_share(); |
| 161 | if (msg.peerlist.size() > p2p::Handshake::Response::MAX_SEND_PEER_COUNT) |
| 162 | msg.peerlist.resize(p2p::Handshake::Response::MAX_SEND_PEER_COUNT); |
| 163 | |
| 164 | BinaryArray raw_msg = LevinProtocol::send(msg); |
| 165 | send(std::move(raw_msg)); |
| 166 | peer_version = req.node_data.version; |
| 167 | set_peer_sync_data(req.payload_data); |
| 168 | peer_unique_number = req.node_data.peer_id; |
| 169 | update_my_port(req.node_data.my_port); // We set port to unknown on accept |
| 170 | |
| 171 | std::cout << "P2p p2p::Handshake request version=" << int(req.node_data.version) |
| 172 | << " unique_number=" << req.node_data.peer_id << " current_height=" << req.payload_data.current_height |
| 173 | << " from " << get_address() << std::endl; |
| 174 | on_msg_handshake(std::move(req)); |
| 175 | } |
| 176 | void P2PProtocolBasic::msg_handshake(p2p::Handshake::Response &&req) { |
| 177 | if (is_incoming()) |
| 178 | return disconnect("p2p::Handshake response from incoming node"); |