You can now estimate future blocktimes of Arrakis Chains with: ./contrib/block_time.pl 5555555 DRAGONX
This commit is contained in:
@@ -7,14 +7,18 @@ use strict;
|
||||
|
||||
# Given a block time, estimate when it will happen
|
||||
my $block = shift || die "Usage: $0 123";
|
||||
my $coin = shift;
|
||||
my $hush = "./src/hush-cli";
|
||||
unless (-e $hush) {
|
||||
die "$hush does not exist, aborting";
|
||||
}
|
||||
if ($coin) {
|
||||
$hush .= " -ac_name=$coin";
|
||||
}
|
||||
my $blockcount = qx{$hush getblockcount};
|
||||
|
||||
unless ($blockcount = int($blockcount)) {
|
||||
print "Invalid response from hush-cli\n";
|
||||
print "Invalid response from $hush\n";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
@@ -22,13 +26,24 @@ if ($block <= $blockcount) {
|
||||
die "That block has already happened!";
|
||||
} else {
|
||||
my $diff = $block - $blockcount;
|
||||
my $minutes = $diff*1.25; # 75s in minutes
|
||||
my $minpb = 1.25; # 75s in minutes for HUSH3
|
||||
if ($coin eq 'DRAGONX') {
|
||||
$minpb = 0.6; # minutes per block
|
||||
} elsif ($coin) {
|
||||
# TODO: support custom bloctimes
|
||||
$minpb = 1; # assumes default blocktime of 60s
|
||||
}
|
||||
my $minutes = $diff*$minpb;
|
||||
my $seconds = $minutes*60;
|
||||
my $now = time;
|
||||
my $then = $now + $seconds;
|
||||
my $ldate = localtime($then);
|
||||
my $gmdate = gmtime($then);
|
||||
print "Hush Block $block will happen at roughly:\n";
|
||||
if ($coin) {
|
||||
print "$coin Block $block will happen at roughly:\n";
|
||||
} else {
|
||||
print "Hush Block $block will happen at roughly:\n";
|
||||
}
|
||||
print "$ldate Eastern # $then\n";
|
||||
print "$gmdate GMT # $then\n";
|
||||
}
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
// Copyright (c) 2017 The Zcash developers
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
#include "deprecation.h"
|
||||
#include "clientversion.h"
|
||||
#include "init.h"
|
||||
#include "ui_interface.h"
|
||||
#include "util.h"
|
||||
#include "chainparams.h"
|
||||
|
||||
static const std::string CLIENT_VERSION_STR = FormatVersion(CLIENT_VERSION);
|
||||
extern char SMART_CHAIN_SYMBOL[HUSH_SMART_CHAIN_MAXLEN];
|
||||
|
||||
void EnforceNodeDeprecation(int nHeight, bool forceLogging, bool fThread) {
|
||||
|
||||
// Do not enforce deprecation in regtest or on testnet
|
||||
std::string networkID = Params().NetworkIDString();
|
||||
std::string msg;
|
||||
|
||||
if (networkID != "main" || SMART_CHAIN_SYMBOL[0] != 0 ) return;
|
||||
|
||||
int blocksToDeprecation = DEPRECATION_HEIGHT - nHeight;
|
||||
if (blocksToDeprecation <= 0) {
|
||||
// In order to ensure we only log once per process when deprecation is
|
||||
// disabled (to avoid log spam), we only need to log in two cases:
|
||||
// - The deprecating block just arrived
|
||||
// - This can be triggered more than once if a block chain reorg
|
||||
// occurs, but that's an irregular event that won't cause spam.
|
||||
// - The node is starting
|
||||
if (blocksToDeprecation == 0 || forceLogging) {
|
||||
msg = strprintf(_("This version has been deprecated as of block height %d."),
|
||||
DEPRECATION_HEIGHT) + " " +
|
||||
_("You should upgrade to the latest version of Hush.");
|
||||
LogPrintf("*** %s\n", msg);
|
||||
uiInterface.ThreadSafeMessageBox(msg, "", CClientUIInterface::MSG_ERROR);
|
||||
}
|
||||
StartShutdown();
|
||||
} else if (blocksToDeprecation == DEPRECATION_WARN_LIMIT || (blocksToDeprecation < DEPRECATION_WARN_LIMIT && forceLogging)) {
|
||||
msg = strprintf(_("This version will be deprecated at block height %d, and will automatically shut down."),
|
||||
DEPRECATION_HEIGHT) + " " +
|
||||
_("You should upgrade to the latest version of Hush.");
|
||||
LogPrintf("*** %s\n", msg);
|
||||
uiInterface.ThreadSafeMessageBox(msg, "", CClientUIInterface::MSG_WARNING);
|
||||
}
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
// Copyright (c) 2017 The Zcash developers
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
||||
* the top-level directory of this distribution for the individual copyright *
|
||||
* holder information and the developer policies on copyright and licensing. *
|
||||
* *
|
||||
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
||||
* SuperNET software, including this file may be copied, modified, propagated *
|
||||
* or distributed except according to the terms contained in the LICENSE file *
|
||||
* *
|
||||
* Removal or modification of this copyright notice is prohibited. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef ZCASH_DEPRECATION_H
|
||||
#define ZCASH_DEPRECATION_H
|
||||
|
||||
// Deprecation policy:
|
||||
// * Shut down WEEKS_UNTIL_DEPRECATION weeks' worth of blocks after the estimated release block height.
|
||||
// * A warning is shown during the DEPRECATION_WARN_LIMIT worth of blocks prior to shut down.
|
||||
static const int WEEKS_UNTIL_DEPRECATION = 52;
|
||||
static const int DEPRECATION_HEIGHT = 5555555;
|
||||
static const int APPROX_RELEASE_HEIGHT = DEPRECATION_HEIGHT - (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 60);
|
||||
|
||||
// Number of blocks before deprecation to warn users
|
||||
static const int DEPRECATION_WARN_LIMIT = 60 * 24 * 60; // 2 months
|
||||
|
||||
/**
|
||||
* Checks whether the node is deprecated based on the current block height, and
|
||||
* shuts down the node with an error if so (and deprecation is not disabled for
|
||||
* the current client version).
|
||||
*/
|
||||
void EnforceNodeDeprecation(int nHeight, bool forceLogging=false, bool fThread=true);
|
||||
|
||||
#endif // ZCASH_DEPRECATION_H
|
||||
@@ -1,153 +0,0 @@
|
||||
// Copyright (c) 2016-2023 The Hush developers
|
||||
// Distributed under the GPLv3 software license, see the accompanying
|
||||
// Released under the GPLv3
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "chainparams.h"
|
||||
#include "clientversion.h"
|
||||
#include "deprecation.h"
|
||||
#include "init.h"
|
||||
#include "ui_interface.h"
|
||||
#include "util.h"
|
||||
#include "util/strencodings.h"
|
||||
|
||||
#include <boost/filesystem/operations.hpp>
|
||||
#include <fstream>
|
||||
|
||||
using ::testing::StrictMock;
|
||||
|
||||
static const std::string CLIENT_VERSION_STR = FormatVersion(CLIENT_VERSION);
|
||||
extern std::atomic<bool> fRequestShutdown;
|
||||
|
||||
class MockUIInterface {
|
||||
public:
|
||||
MOCK_METHOD3(ThreadSafeMessageBox, bool(const std::string& message,
|
||||
const std::string& caption,
|
||||
unsigned int style));
|
||||
};
|
||||
|
||||
static bool ThreadSafeMessageBox(MockUIInterface *mock,
|
||||
const std::string& message,
|
||||
const std::string& caption,
|
||||
unsigned int style)
|
||||
{
|
||||
return mock->ThreadSafeMessageBox(message, caption, style);
|
||||
}
|
||||
|
||||
class DeprecationTest : public ::testing::Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
uiInterface.ThreadSafeMessageBox.disconnect_all_slots();
|
||||
uiInterface.ThreadSafeMessageBox.connect(boost::bind(ThreadSafeMessageBox, &mock_, _1, _2, _3));
|
||||
SelectParams(CBaseChainParams::MAIN);
|
||||
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
fRequestShutdown = false;
|
||||
mapArgs.clear();
|
||||
}
|
||||
|
||||
StrictMock<MockUIInterface> mock_;
|
||||
|
||||
static std::vector<std::string> read_lines(boost::filesystem::path filepath) {
|
||||
std::vector<std::string> result;
|
||||
|
||||
std::ifstream f(filepath.string().c_str());
|
||||
std::string line;
|
||||
while (std::getline(f,line)) {
|
||||
result.push_back(line);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(DeprecationTest, NonDeprecatedNodeKeepsRunning) {
|
||||
EXPECT_FALSE(ShutdownRequested());
|
||||
EnforceNodeDeprecation(DEPRECATION_HEIGHT - DEPRECATION_WARN_LIMIT - 1);
|
||||
EXPECT_FALSE(ShutdownRequested());
|
||||
}
|
||||
|
||||
TEST_F(DeprecationTest, NodeNearDeprecationIsWarned) {
|
||||
EXPECT_FALSE(ShutdownRequested());
|
||||
EXPECT_CALL(mock_, ThreadSafeMessageBox(::testing::_, "", CClientUIInterface::MSG_WARNING));
|
||||
EnforceNodeDeprecation(DEPRECATION_HEIGHT - DEPRECATION_WARN_LIMIT);
|
||||
EXPECT_FALSE(ShutdownRequested());
|
||||
}
|
||||
|
||||
TEST_F(DeprecationTest, NodeNearDeprecationWarningIsNotDuplicated) {
|
||||
EXPECT_FALSE(ShutdownRequested());
|
||||
EnforceNodeDeprecation(DEPRECATION_HEIGHT - DEPRECATION_WARN_LIMIT + 1);
|
||||
EXPECT_FALSE(ShutdownRequested());
|
||||
}
|
||||
|
||||
TEST_F(DeprecationTest, NodeNearDeprecationWarningIsRepeatedOnStartup) {
|
||||
EXPECT_FALSE(ShutdownRequested());
|
||||
EXPECT_CALL(mock_, ThreadSafeMessageBox(::testing::_, "", CClientUIInterface::MSG_WARNING));
|
||||
EnforceNodeDeprecation(DEPRECATION_HEIGHT - DEPRECATION_WARN_LIMIT + 1, true);
|
||||
EXPECT_FALSE(ShutdownRequested());
|
||||
}
|
||||
|
||||
TEST_F(DeprecationTest, DeprecatedNodeShutsDown) {
|
||||
EXPECT_FALSE(ShutdownRequested());
|
||||
EXPECT_CALL(mock_, ThreadSafeMessageBox(::testing::_, "", CClientUIInterface::MSG_ERROR));
|
||||
EnforceNodeDeprecation(DEPRECATION_HEIGHT);
|
||||
EXPECT_TRUE(ShutdownRequested());
|
||||
}
|
||||
|
||||
TEST_F(DeprecationTest, DeprecatedNodeErrorIsNotDuplicated) {
|
||||
EXPECT_FALSE(ShutdownRequested());
|
||||
EnforceNodeDeprecation(DEPRECATION_HEIGHT + 1);
|
||||
EXPECT_TRUE(ShutdownRequested());
|
||||
}
|
||||
|
||||
TEST_F(DeprecationTest, DeprecatedNodeErrorIsRepeatedOnStartup) {
|
||||
EXPECT_FALSE(ShutdownRequested());
|
||||
EXPECT_CALL(mock_, ThreadSafeMessageBox(::testing::_, "", CClientUIInterface::MSG_ERROR));
|
||||
EnforceNodeDeprecation(DEPRECATION_HEIGHT + 1, true);
|
||||
EXPECT_TRUE(ShutdownRequested());
|
||||
}
|
||||
|
||||
TEST_F(DeprecationTest, DeprecatedNodeIgnoredOnRegtest) {
|
||||
SelectParams(CBaseChainParams::REGTEST);
|
||||
EXPECT_FALSE(ShutdownRequested());
|
||||
EnforceNodeDeprecation(DEPRECATION_HEIGHT+1);
|
||||
EXPECT_FALSE(ShutdownRequested());
|
||||
}
|
||||
|
||||
TEST_F(DeprecationTest, DeprecatedNodeIgnoredOnTestnet) {
|
||||
SelectParams(CBaseChainParams::TESTNET);
|
||||
EXPECT_FALSE(ShutdownRequested());
|
||||
EnforceNodeDeprecation(DEPRECATION_HEIGHT+1);
|
||||
EXPECT_FALSE(ShutdownRequested());
|
||||
}
|
||||
|
||||
TEST_F(DeprecationTest, AlertNotify) {
|
||||
boost::filesystem::path temp = GetTempPath() /
|
||||
boost::filesystem::unique_path("alertnotify-%%%%.txt");
|
||||
|
||||
mapArgs["-alertnotify"] = std::string("echo %s >> ") + temp.string();
|
||||
|
||||
EXPECT_CALL(mock_, ThreadSafeMessageBox(::testing::_, "", CClientUIInterface::MSG_WARNING));
|
||||
EnforceNodeDeprecation(DEPRECATION_HEIGHT - DEPRECATION_WARN_LIMIT, false, false);
|
||||
|
||||
std::vector<std::string> r = read_lines(temp);
|
||||
EXPECT_EQ(r.size(), 1u);
|
||||
|
||||
// -alertnotify restricts the message to safe characters.
|
||||
auto expectedMsg = strprintf(
|
||||
"This version will be deprecated at block height %d, and will automatically shut down. You should upgrade to the latest version of Hush.",
|
||||
DEPRECATION_HEIGHT);
|
||||
|
||||
// Windows built-in echo semantics are different than posixy shells. Quotes and
|
||||
// whitespace are printed literally.
|
||||
#ifndef WIN32
|
||||
EXPECT_EQ(r[0], expectedMsg);
|
||||
#else
|
||||
EXPECT_EQ(r[0], strprintf("'%s' ", expectedMsg));
|
||||
#endif
|
||||
boost::filesystem::remove(temp);
|
||||
}
|
||||
Reference in New Issue
Block a user