Request block after addr recv, print subver on bad services
[dnsseed-rust] / src / main.rs
index 7f9409055c6102fca15108528acf8db37ab5c660..5fd0c1a267cd04fbc9ca9f49c3032ed938c1c36d 100644 (file)
@@ -101,8 +101,8 @@ pub fn scan_node(scan_time: Instant, node: SocketAddr) {
                                                state_lock.fail_reason = AddressState::LowVersion;
                                                return future::err(());
                                        }
-                                       if ver.services & 1 != 1 {
-                                               printer.add_line(format!("Updating {} to NotFullNode (services {:x})", node, ver.services), true);
+                                       if ver.services & (1 | (1 << 10)) == 0 {
+                                               printer.add_line(format!("Updating {} to NotFullNode ({}: services {:x})", node, ver.user_agent, ver.services), true);
                                                state_lock.fail_reason = AddressState::NotFullNode;
                                                return future::err(());
                                        }
@@ -122,12 +122,6 @@ pub fn scan_node(scan_time: Instant, node: SocketAddr) {
                                        if let Err(_) = write.try_send(NetworkMessage::GetAddr) {
                                                return future::err(());
                                        }
-                                       if let Err(_) = write.try_send(NetworkMessage::GetData(vec![Inventory {
-                                               inv_type: InvType::WitnessBlock,
-                                               hash: state_lock.request.1,
-                                       }])) {
-                                               return future::err(());
-                                       }
                                },
                                NetworkMessage::Ping(v) => {
                                        if let Err(_) = write.try_send(NetworkMessage::Pong(v)) {
@@ -135,6 +129,18 @@ pub fn scan_node(scan_time: Instant, node: SocketAddr) {
                                        }
                                },
                                NetworkMessage::Addr(addrs) => {
+                                       if addrs.len() > 1000 {
+                                               state_lock.fail_reason = AddressState::ProtocolViolation;
+                                               printer.add_line(format!("Updating {} to ProtocolViolation due to oversized addr: {}", node, addrs.len()), true);
+                                               state_lock.recvd_addrs = false;
+                                               return future::err(());
+                                       }
+                                       if let Err(_) = write.try_send(NetworkMessage::GetData(vec![Inventory {
+                                               inv_type: InvType::WitnessBlock,
+                                               hash: state_lock.request.1,
+                                       }])) {
+                                               return future::err(());
+                                       }
                                        state_lock.recvd_addrs = true;
                                        unsafe { DATA_STORE.as_ref().unwrap() }.add_fresh_nodes(&addrs);
                                },