From 6be0a58c268cae6b519cf46e0c2e01373655a4ea Mon Sep 17 00:00:00 2001 From: dan_s Date: Sun, 12 Apr 2026 13:22:22 -0500 Subject: [PATCH] feat: use DragonX DNS seed nodes, pass -maxconnections to daemon, show sync speed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace hardcoded IP addnodes with node.dragonx.is, node1–4.dragonx.is in both daemon launch params and auto-generated DRAGONX.conf - Add max_connections setting (persisted, default 0 = daemon default); passed as -maxconnections= flag to dragonxd on startup - Show blocks/sec in status bar during sync with exponential smoothing (e.g. "Syncing 45.2% (12340 left, 85 blk/s)") --- res/ObsidianDragon.manifest | 2 +- src/app.cpp | 32 ++++++++++++++++++++++++++++++-- src/config/settings.cpp | 2 ++ src/config/settings.h | 5 +++++ src/daemon/embedded_daemon.cpp | 11 ++++++++++- src/daemon/embedded_daemon.h | 6 ++++++ src/rpc/connection.cpp | 7 +++++-- 7 files changed, 59 insertions(+), 6 deletions(-) diff --git a/res/ObsidianDragon.manifest b/res/ObsidianDragon.manifest index 2952366..4571d1f 100644 --- a/res/ObsidianDragon.manifest +++ b/res/ObsidianDragon.manifest @@ -5,7 +5,7 @@ diff --git a/src/app.cpp b/src/app.cpp index d5d3a8b..a8b695b 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -1461,8 +1461,35 @@ void App::renderStatusBar() int chainTip = state_.longestchain > 0 ? state_.longestchain : state_.sync.headers; int blocksLeft = chainTip - state_.sync.blocks; if (blocksLeft < 0) blocksLeft = 0; - ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.0f, 1.0f), "Syncing %.1f%% (%d left)", - state_.sync.verification_progress * 100.0, blocksLeft); + + // Calculate sync speed (blocks/sec) using a smoothed rolling average + static int s_prev_blocks = 0; + static double s_prev_time = 0.0; + static double s_blocks_per_sec = 0.0; + double now = ImGui::GetTime(); + if (s_prev_time > 0.0 && state_.sync.blocks > s_prev_blocks) { + double dt = now - s_prev_time; + if (dt > 0.5) { + double raw = (state_.sync.blocks - s_prev_blocks) / dt; + // Exponential smoothing (alpha ~0.3 per update) + s_blocks_per_sec = s_blocks_per_sec > 0.0 + ? s_blocks_per_sec * 0.7 + raw * 0.3 + : raw; + s_prev_blocks = state_.sync.blocks; + s_prev_time = now; + } + } else { + s_prev_blocks = state_.sync.blocks; + s_prev_time = now; + } + + if (s_blocks_per_sec > 0.1) { + ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.0f, 1.0f), "Syncing %.1f%% (%d left, %.0f blk/s)", + state_.sync.verification_progress * 100.0, blocksLeft, s_blocks_per_sec); + } else { + ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.0f, 1.0f), "Syncing %.1f%% (%d left)", + state_.sync.verification_progress * 100.0, blocksLeft); + } } else if (state_.connected) { ImGui::Text("Peers: %zu", state_.peers.size()); } @@ -2113,6 +2140,7 @@ bool App::startEmbeddedDaemon() // Sync debug logging categories from user settings if (settings_) { embedded_daemon_->setDebugCategories(settings_->getDebugCategories()); + embedded_daemon_->setMaxConnections(settings_->getMaxConnections()); } return embedded_daemon_->start(); diff --git a/src/config/settings.cpp b/src/config/settings.cpp index bf733d7..f6f1254 100644 --- a/src/config/settings.cpp +++ b/src/config/settings.cpp @@ -132,6 +132,7 @@ bool Settings::load(const std::string& path) if (j.contains("pin_enabled")) pin_enabled_ = j["pin_enabled"].get(); if (j.contains("keep_daemon_running")) keep_daemon_running_ = j["keep_daemon_running"].get(); if (j.contains("stop_external_daemon")) stop_external_daemon_ = j["stop_external_daemon"].get(); + if (j.contains("max_connections")) max_connections_ = j["max_connections"].get(); if (j.contains("verbose_logging")) verbose_logging_ = j["verbose_logging"].get(); if (j.contains("debug_categories") && j["debug_categories"].is_array()) { debug_categories_.clear(); @@ -235,6 +236,7 @@ bool Settings::save(const std::string& path) j["pin_enabled"] = pin_enabled_; j["keep_daemon_running"] = keep_daemon_running_; j["stop_external_daemon"] = stop_external_daemon_; + j["max_connections"] = max_connections_; j["verbose_logging"] = verbose_logging_; j["debug_categories"] = json::array(); for (const auto& cat : debug_categories_) diff --git a/src/config/settings.h b/src/config/settings.h index 392be39..b778ae2 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -165,6 +165,10 @@ public: bool getStopExternalDaemon() const { return stop_external_daemon_; } void setStopExternalDaemon(bool v) { stop_external_daemon_ = v; } + // Daemon — maximum peer connections (0 = daemon default) + int getMaxConnections() const { return max_connections_; } + void setMaxConnections(int v) { max_connections_ = std::max(0, v); } + // Verbose diagnostic logging (connection attempts, daemon state, port owner, etc.) bool getVerboseLogging() const { return verbose_logging_; } void setVerboseLogging(bool v) { verbose_logging_ = v; } @@ -303,6 +307,7 @@ private: bool pin_enabled_ = false; bool keep_daemon_running_ = false; bool stop_external_daemon_ = false; + int max_connections_ = 0; // 0 = daemon default bool verbose_logging_ = false; std::set debug_categories_; bool theme_effects_enabled_ = true; diff --git a/src/daemon/embedded_daemon.cpp b/src/daemon/embedded_daemon.cpp index db3831a..b2d08d3 100644 --- a/src/daemon/embedded_daemon.cpp +++ b/src/daemon/embedded_daemon.cpp @@ -205,7 +205,11 @@ std::vector EmbeddedDaemon::getChainParams() "-ac_reward=300000000", "-ac_blocktime=36", "-ac_private=1", - "-addnode=176.126.87.241", + "-addnode=node.dragonx.is", + "-addnode=node1.dragonx.is", + "-addnode=node2.dragonx.is", + "-addnode=node3.dragonx.is", + "-addnode=node4.dragonx.is", "-experimentalfeatures", "-developerencryptwallet", dbcache_arg @@ -473,6 +477,11 @@ bool EmbeddedDaemon::start(const std::string& binary_path) args.push_back("-debug=" + cat); } + // Append max connections if configured (0 = daemon default) + if (max_connections_ > 0) { + args.push_back("-maxconnections=" + std::to_string(max_connections_)); + } + // Add -rescan flag if requested (one-shot) if (rescan_on_next_start_.exchange(false)) { DEBUG_LOGF("[INFO] Adding -rescan flag for blockchain rescan\n"); diff --git a/src/daemon/embedded_daemon.h b/src/daemon/embedded_daemon.h index c993ba4..ce9d157 100644 --- a/src/daemon/embedded_daemon.h +++ b/src/daemon/embedded_daemon.h @@ -152,6 +152,11 @@ public: void setDebugCategories(const std::set& cats) { debug_categories_ = cats; } const std::set& getDebugCategories() const { return debug_categories_; } + /** + * @brief Set maximum peer connections (0 = use daemon default) + */ + void setMaxConnections(int v) { max_connections_ = v; } + /** * @brief Request a blockchain rescan on the next daemon start */ @@ -194,6 +199,7 @@ private: std::thread monitor_thread_; std::atomic should_stop_{false}; std::set debug_categories_; + int max_connections_ = 0; // 0 = daemon default std::atomic crash_count_{0}; // consecutive crash counter std::atomic rescan_on_next_start_{false}; // -rescan flag for next start }; diff --git a/src/rpc/connection.cpp b/src/rpc/connection.cpp index 2204f08..c652bc8 100644 --- a/src/rpc/connection.cpp +++ b/src/rpc/connection.cpp @@ -234,8 +234,11 @@ bool Connection::createDefaultConfig(const std::string& path) file << "exportdir=" << dataDir << "\n"; file << "experimentalfeatures=1\n"; file << "developerencryptwallet=1\n"; - file << "addnode=195.201.20.230\n"; - file << "addnode=195.201.137.219\n"; + file << "addnode=node.dragonx.is\n"; + file << "addnode=node1.dragonx.is\n"; + file << "addnode=node2.dragonx.is\n"; + file << "addnode=node3.dragonx.is\n"; + file << "addnode=node4.dragonx.is\n"; file.close();