diff --git a/src/cryptonote_core/blockchain.h b/src/cryptonote_core/blockchain.h index f5950291..1524693b 100644 --- a/src/cryptonote_core/blockchain.h +++ b/src/cryptonote_core/blockchain.h @@ -666,6 +666,13 @@ namespace cryptonote */ uint8_t get_ideal_hard_fork_version() const { return m_hardfork->get_ideal_version(); } + /** + * @brief returns the next hardfork version + * + * @return the version + */ + uint8_t get_next_hard_fork_version() const { return m_hardfork->get_next_version(); } + /** * @brief returns the newest hardfork version voted to be enabled * as of a certain height diff --git a/src/cryptonote_core/hardfork.cpp b/src/cryptonote_core/hardfork.cpp index 39c026b0..c63ca36e 100644 --- a/src/cryptonote_core/hardfork.cpp +++ b/src/cryptonote_core/hardfork.cpp @@ -369,6 +369,18 @@ uint64_t HardFork::get_earliest_ideal_height_for_version(uint8_t version) const return 0; } +uint8_t HardFork::get_next_version() const +{ + CRITICAL_REGION_LOCAL(lock); + uint64_t height = db.height(); + for (unsigned int n = heights.size() - 1; n > 0; --n) { + if (height >= heights[n].height) { + return heights[n < heights.size() - 1 ? n + 1 : n].version; + } + } + return original_version; +} + bool HardFork::get_voting_info(uint8_t version, uint32_t &window, uint32_t &votes, uint32_t &threshold, uint64_t &earliest_height, uint8_t &voting) const { CRITICAL_REGION_LOCAL(lock); diff --git a/src/cryptonote_core/hardfork.h b/src/cryptonote_core/hardfork.h index b3d48587..33b958f9 100644 --- a/src/cryptonote_core/hardfork.h +++ b/src/cryptonote_core/hardfork.h @@ -168,6 +168,13 @@ namespace cryptonote */ uint8_t get_ideal_version(uint64_t height) const; + /** + * @brief returns the next version + * + * This is the version which will we fork to next + */ + uint8_t get_next_version() const; + /** * @brief returns the current version * diff --git a/src/daemon/rpc_command_executor.cpp b/src/daemon/rpc_command_executor.cpp index 0a0fc793..fba3e539 100644 --- a/src/daemon/rpc_command_executor.cpp +++ b/src/daemon/rpc_command_executor.cpp @@ -274,6 +274,27 @@ static std::string get_mining_speed(uint64_t hr) return (boost::format("%.0f H/s") % hr).str(); } +static std::string get_fork_extra_info(uint64_t t, uint64_t now, uint64_t block_time) +{ + uint64_t blocks_per_day = 86400 / block_time; + + if (t == now) + return " (forking now)"; + + if (t > now) + { + uint64_t dblocks = t - now; + if (dblocks <= 30) + return (boost::format(" (next fork in %u blocks)") % (unsigned)dblocks).str(); + if (dblocks <= blocks_per_day / 2) + return (boost::format(" (next fork in %.1f hours)") % (dblocks / (float)(blocks_per_day / 24))).str(); + if (dblocks <= blocks_per_day * 30) + return (boost::format(" (next fork in %.1f days)") % (dblocks / (float)blocks_per_day)).str(); + return ""; + } + return ""; +} + bool t_rpc_command_executor::show_status() { cryptonote::COMMAND_RPC_GET_INFO::request ireq; cryptonote::COMMAND_RPC_GET_INFO::response ires; @@ -331,7 +352,7 @@ bool t_rpc_command_executor::show_status() { } } - tools::success_msg_writer() << boost::format("Height: %llu/%llu (%.1f%%) on %s, %s, net hash %s, v%u, %s, %u+%u connections") + tools::success_msg_writer() << boost::format("Height: %llu/%llu (%.1f%%) on %s, %s, net hash %s, v%u%s, %s, %u+%u connections") % (unsigned long long)ires.height % (unsigned long long)(ires.target_height >= ires.height ? ires.target_height : ires.height) % (100.0f * ires.height / (ires.target_height ? ires.target_height < ires.height ? ires.height : ires.target_height : ires.height)) @@ -339,6 +360,7 @@ bool t_rpc_command_executor::show_status() { % (mining_busy ? "syncing" : mres.active ? "mining at " + get_mining_speed(mres.speed) : "not mining") % get_mining_speed(ires.difficulty / ires.target) % (unsigned)hfres.version + % get_fork_extra_info(hfres.earliest_height, ires.height, ires.target) % (hfres.state == cryptonote::HardFork::Ready ? "up to date" : hfres.state == cryptonote::HardFork::UpdateNeeded ? "update needed" : "out of date, likely forked") % (unsigned)ires.outgoing_connections_count % (unsigned)ires.incoming_connections_count ; diff --git a/src/rpc/core_rpc_server.cpp b/src/rpc/core_rpc_server.cpp index 9cd1893c..e6fc1106 100644 --- a/src/rpc/core_rpc_server.cpp +++ b/src/rpc/core_rpc_server.cpp @@ -1025,7 +1025,7 @@ namespace cryptonote #if BLOCKCHAIN_DB == DB_LMDB const Blockchain &blockchain = m_core.get_blockchain_storage(); - uint8_t version = req.version > 0 ? req.version : blockchain.get_ideal_hard_fork_version(); + uint8_t version = req.version > 0 ? req.version : blockchain.get_next_hard_fork_version(); res.version = blockchain.get_current_hard_fork_version(); res.enabled = blockchain.get_hard_fork_voting_info(version, res.window, res.votes, res.threshold, res.earliest_height, res.voting); res.state = blockchain.get_hard_fork_state();