mirror of
				https://git.wownero.com/wowlet/wowlet.git
				synced 2024-08-15 01:03:14 +00:00 
			
		
		
		
	Merge pull request 'Nodes: don't connect to out of sync nodes in wsmode' (#148) from tobtoht/feather:node_height_mode into master
Reviewed-on: https://git.wownero.com/feather/feather/pulls/148
This commit is contained in:
		
						commit
						519df3f5a1
					
				
					 3 changed files with 47 additions and 12 deletions
				
			
		| 
						 | 
					@ -124,7 +124,7 @@ void Nodes::connectToNode(FeatherNode node) {
 | 
				
			||||||
    qInfo() << msg;
 | 
					    qInfo() << msg;
 | 
				
			||||||
    activityLog.append(msg);
 | 
					    activityLog.append(msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(!node.username.isEmpty() && !node.password.isEmpty())
 | 
					    if (!node.username.isEmpty() && !node.password.isEmpty())
 | 
				
			||||||
        m_ctx->currentWallet->setDaemonLogin(node.username, node.password);
 | 
					        m_ctx->currentWallet->setDaemonLogin(node.username, node.password);
 | 
				
			||||||
    m_ctx->currentWallet->initAsync(node.address, true, 0, false, false, 0);
 | 
					    m_ctx->currentWallet->initAsync(node.address, true, 0, false, false, 0);
 | 
				
			||||||
    m_connectionAttemptTime = std::time(nullptr);
 | 
					    m_connectionAttemptTime = std::time(nullptr);
 | 
				
			||||||
| 
						 | 
					@ -149,10 +149,10 @@ void Nodes::onConnectionTimer() {
 | 
				
			||||||
    QString msg;
 | 
					    QString msg;
 | 
				
			||||||
    Wallet::ConnectionStatus status = m_ctx->currentWallet->connected(true);
 | 
					    Wallet::ConnectionStatus status = m_ctx->currentWallet->connected(true);
 | 
				
			||||||
    NodeSource nodeSource = this->source();
 | 
					    NodeSource nodeSource = this->source();
 | 
				
			||||||
    auto wsMode = nodeSource == NodeSource::websocket;
 | 
					    auto wsMode = (nodeSource == NodeSource::websocket);
 | 
				
			||||||
    auto nodes = wsMode ? m_customNodes : m_websocketNodes;
 | 
					    auto nodes = wsMode ? m_customNodes : m_websocketNodes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(wsMode && !m_wsNodesReceived && m_websocketNodes.count() == 0) {
 | 
					    if (wsMode && !m_wsNodesReceived && m_websocketNodes.count() == 0) {
 | 
				
			||||||
        // this situation should rarely occur due to the usage of the websocket node cache on startup.
 | 
					        // this situation should rarely occur due to the usage of the websocket node cache on startup.
 | 
				
			||||||
        msg = QString("Feather is in websocket connection mode but was not able to receive any nodes (yet).");
 | 
					        msg = QString("Feather is in websocket connection mode but was not able to receive any nodes (yet).");
 | 
				
			||||||
        qInfo() << msg;
 | 
					        qInfo() << msg;
 | 
				
			||||||
| 
						 | 
					@ -160,13 +160,13 @@ void Nodes::onConnectionTimer() {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(status == Wallet::ConnectionStatus::ConnectionStatus_Disconnected) {
 | 
					    if (status == Wallet::ConnectionStatus::ConnectionStatus_Disconnected) {
 | 
				
			||||||
        // try a connect
 | 
					        // try a connect
 | 
				
			||||||
        auto node = this->pickEligibleNode();
 | 
					        auto node = this->pickEligibleNode();
 | 
				
			||||||
        this->connectToNode(node);
 | 
					        this->connectToNode(node);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    } else if(status == Wallet::ConnectionStatus::ConnectionStatus_Connecting){
 | 
					    } else if (status == Wallet::ConnectionStatus::ConnectionStatus_Connecting){
 | 
				
			||||||
        if(!m_connection.isConnecting) {
 | 
					        if (!m_connection.isConnecting) {
 | 
				
			||||||
            // Weirdly enough, status == connecting directly after a wallet is opened.
 | 
					            // Weirdly enough, status == connecting directly after a wallet is opened.
 | 
				
			||||||
            auto node = this->pickEligibleNode();
 | 
					            auto node = this->pickEligibleNode();
 | 
				
			||||||
            this->connectToNode(node);
 | 
					            this->connectToNode(node);
 | 
				
			||||||
| 
						 | 
					@ -219,14 +219,44 @@ FeatherNode Nodes::pickEligibleNode() {
 | 
				
			||||||
    auto wsMode = nodeSource == NodeSource::websocket;
 | 
					    auto wsMode = nodeSource == NodeSource::websocket;
 | 
				
			||||||
    auto nodes = wsMode ? m_websocketNodes : m_customNodes;
 | 
					    auto nodes = wsMode ? m_websocketNodes : m_customNodes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(nodes.count() == 0) {
 | 
					    if (nodes.count() == 0) {
 | 
				
			||||||
        this->exhausted();
 | 
					        this->exhausted();
 | 
				
			||||||
        return rtn;
 | 
					        return rtn;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QVector<int> heights;
 | 
				
			||||||
 | 
					    for (const auto &node: nodes) {
 | 
				
			||||||
 | 
					        heights.push_back(node.height);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    std::sort(heights.begin(), heights.end());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Calculate mode of node heights
 | 
				
			||||||
 | 
					    int max_count = 1, mode_height = heights[0], count = 1;
 | 
				
			||||||
 | 
					    for (int i = 1; i < heights.count(); i++) {
 | 
				
			||||||
 | 
					        if (heights[i] == 0) { // Don't consider 0 height nodes
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (heights[i] == heights[i - 1])
 | 
				
			||||||
 | 
					            count++;
 | 
				
			||||||
 | 
					        else {
 | 
				
			||||||
 | 
					            if (count > max_count) {
 | 
				
			||||||
 | 
					                max_count = count;
 | 
				
			||||||
 | 
					                mode_height = heights[i - 1];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            count = 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (count > max_count)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        max_count = count;
 | 
				
			||||||
 | 
					        mode_height = heights[heights.count() - 1];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while(true) {
 | 
					    while(true) {
 | 
				
			||||||
        // keep track of nodes we have previously tried to connect to
 | 
					        // keep track of nodes we have previously tried to connect to
 | 
				
			||||||
        if(m_connectionAttempts.count() == nodes.count()) {
 | 
					        if (m_connectionAttempts.count() == nodes.count()) {
 | 
				
			||||||
            this->exhausted();
 | 
					            this->exhausted();
 | 
				
			||||||
            m_connectionTimer->stop();
 | 
					            m_connectionTimer->stop();
 | 
				
			||||||
            return rtn;
 | 
					            return rtn;
 | 
				
			||||||
| 
						 | 
					@ -234,12 +264,17 @@ FeatherNode Nodes::pickEligibleNode() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        int random = QRandomGenerator::global()->bounded(nodes.count());
 | 
					        int random = QRandomGenerator::global()->bounded(nodes.count());
 | 
				
			||||||
        FeatherNode node = nodes.at(random);
 | 
					        FeatherNode node = nodes.at(random);
 | 
				
			||||||
        if(m_connectionAttempts.contains(node.full))
 | 
					        if (m_connectionAttempts.contains(node.full))
 | 
				
			||||||
            continue;
 | 
					            continue;
 | 
				
			||||||
        m_connectionAttempts.append(node.full);
 | 
					        m_connectionAttempts.append(node.full);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(wsMode && !node.online)
 | 
					        if (wsMode && !node.online)
 | 
				
			||||||
            continue;
 | 
					            continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Ignore nodes that are more than 25 blocks behind mode
 | 
				
			||||||
 | 
					        if (wsMode && node.height < (mode_height - 25))
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return node;
 | 
					        return node;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,7 +41,7 @@ struct FeatherNode {
 | 
				
			||||||
            _address = spl.at(1);
 | 
					            _address = spl.at(1);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if(!_address.contains(":"))
 | 
					        if(!_address.contains(":"))
 | 
				
			||||||
            _address += ":18089";
 | 
					            _address += ":18081";
 | 
				
			||||||
        this->address = _address;
 | 
					        this->address = _address;
 | 
				
			||||||
        if(this->address.contains(".onion"))
 | 
					        if(this->address.contains(".onion"))
 | 
				
			||||||
            tor = true;
 | 
					            tor = true;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue