diff --git a/src/avalanche/test/CMakeLists.txt b/src/avalanche/test/CMakeLists.txt --- a/src/avalanche/test/CMakeLists.txt +++ b/src/avalanche/test/CMakeLists.txt @@ -14,6 +14,7 @@ TESTS delegation_tests.cpp + init_tests.cpp peermanager_tests.cpp processor_tests.cpp proof_tests.cpp diff --git a/src/avalanche/test/init_tests.cpp b/src/avalanche/test/init_tests.cpp new file mode 100644 --- /dev/null +++ b/src/avalanche/test/init_tests.cpp @@ -0,0 +1,99 @@ +// Copyright (c) 2022 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include + +BOOST_FIXTURE_TEST_SUITE(init_tests, BasicTestingSetup) + +BOOST_AUTO_TEST_CASE(avalanche_flag_tests) { + gArgs.ForceSetArg("-ecash", "1"); + const Amount tenBillion = 10'000'000'000 * Currency::get().baseunit; + + auto getAvaMinQuorumStakeAmount = [](const ArgsManager &args, + const Amount defaultAmount) { + Amount avaminquorumstake; + BOOST_CHECK(ParseMoney( + args.GetArg("-avaminquorumstake", FormatMoney(defaultAmount)), + avaminquorumstake)); + return avaminquorumstake; + }; + + { + // Check the feature flags when avalanche is set + ArgsManager args; + args.ForceSetArg("-avalanche", "1"); + InitParameterInteraction(args); + + BOOST_CHECK_EQUAL(args.GetBoolArg("-enableavalanche", false), true); + BOOST_CHECK_EQUAL(args.GetBoolArg("-legacyavaproof", true), false); + BOOST_CHECK_EQUAL( + args.GetBoolArg("-enableavalanchepeerdiscovery", false), true); + BOOST_CHECK_EQUAL( + args.GetBoolArg("-enableavalancheproofreplacement", false), true); + BOOST_CHECK_EQUAL(args.GetBoolArg("-automaticunparking", true), false); + BOOST_CHECK_EQUAL(getAvaMinQuorumStakeAmount(args, 42 * COIN), + tenBillion); + BOOST_CHECK_EQUAL( + args.GetArg("-avaminquorumconnectedstakeratio", "0.42"), "0.8"); + } + + { + // Check the feature flags when avalanche is reset + ArgsManager args; + args.ForceSetArg("-avalanche", "0"); + InitParameterInteraction(args); + + BOOST_CHECK_EQUAL(args.GetBoolArg("-enableavalanche", true), false); + BOOST_CHECK_EQUAL(args.GetBoolArg("-legacyavaproof", false), + AVALANCHE_DEFAULT_LEGACY_PROOF); + BOOST_CHECK_EQUAL( + args.GetBoolArg("-enableavalanchepeerdiscovery", true), false); + BOOST_CHECK_EQUAL( + args.GetBoolArg("-enableavalancheproofreplacement", true), false); + BOOST_CHECK_EQUAL(args.GetBoolArg("-automaticunparking", false), true); + BOOST_CHECK_EQUAL(getAvaMinQuorumStakeAmount(args, tenBillion), + AVALANCHE_DEFAULT_MIN_QUORUM_STAKE); + BOOST_CHECK_EQUAL( + args.GetArg("-avaminquorumconnectedstakeratio", "0.8"), + ToString(AVALANCHE_DEFAULT_MIN_QUORUM_CONNECTED_STAKE_RATIO)); + } + + { + // Check the feature flags can always be overridden + ArgsManager args; + args.ForceSetArg("-avalanche", "1"); + args.ForceSetArg("-legacyavaproof", "1"); + args.ForceSetArg("-enableavalancheproofreplacement", "0"); + args.ForceSetArg("-automaticunparking", "1"); + args.ForceSetArg("-avaminquorumstake", FormatMoney(123 * COIN)); + InitParameterInteraction(args); + + BOOST_CHECK_EQUAL(args.GetBoolArg("-enableavalanche", false), true); + BOOST_CHECK_EQUAL(args.GetBoolArg("-legacyavaproof", false), true); + BOOST_CHECK_EQUAL( + args.GetBoolArg("-enableavalanchepeerdiscovery", false), true); + BOOST_CHECK_EQUAL( + args.GetBoolArg("-enableavalancheproofreplacement", true), false); + BOOST_CHECK_EQUAL(args.GetBoolArg("-automaticunparking", false), true); + BOOST_CHECK_EQUAL(getAvaMinQuorumStakeAmount(args, tenBillion), + 123 * COIN); + BOOST_CHECK_EQUAL( + args.GetArg("-avaminquorumconnectedstakeratio", "0.42"), "0.8"); + } + + gArgs.ClearForcedArg("-ecash"); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/init.cpp b/src/init.cpp --- a/src/init.cpp +++ b/src/init.cpp @@ -1296,10 +1296,16 @@ #endif // Avalanche options. - argsman.AddArg( - "-enableavalanche", - strprintf("Enable avalanche (default: %u)", AVALANCHE_DEFAULT_ENABLED), - ArgsManager::ALLOW_ANY, OptionsCategory::AVALANCHE); + argsman.AddArg("-avalanche", + strprintf("Enable all the avalanche features (default: %u)", + AVALANCHE_DEFAULT_ENABLED), + ArgsManager::ALLOW_ANY, OptionsCategory::AVALANCHE); + argsman.AddArg("-enableavalanche", + strprintf("Enable the core avalanche features only. You " + "need to manually configure the individual " + "features with dedicated flags (default: %u)", + AVALANCHE_DEFAULT_ENABLED), + ArgsManager::ALLOW_ANY, OptionsCategory::AVALANCHE); argsman.AddArg("-enableavalanchepeerdiscovery", strprintf("Enable avalanche peer discovery (default: %u)", AVALANCHE_DEFAULT_PEER_DISCOVERY_ENABLED), @@ -1735,6 +1741,28 @@ __func__); } } + + // If avalanche is set, soft set all the feature flags accordingly. + if (args.IsArgSet("-avalanche")) { + const bool fAvalanche = + args.GetBoolArg("-avalanche", AVALANCHE_DEFAULT_ENABLED); + args.SoftSetBoolArg("-enableavalanche", fAvalanche); + args.SoftSetBoolArg("-legacyavaproof", + fAvalanche ? false + : AVALANCHE_DEFAULT_LEGACY_PROOF); + args.SoftSetBoolArg("-enableavalanchepeerdiscovery", fAvalanche); + args.SoftSetBoolArg("-enableavalancheproofreplacement", fAvalanche); + args.SoftSetBoolArg("-automaticunparking", !fAvalanche); + args.SoftSetArg( + "-avaminquorumstake", + fAvalanche ? FormatMoney(1'000'000'000'000 * SATOSHI) // 10B XEC + : FormatMoney(AVALANCHE_DEFAULT_MIN_QUORUM_STAKE)); + args.SoftSetArg( + "-avaminquorumconnectedstakeratio", + fAvalanche + ? "0.8" + : ToString(AVALANCHE_DEFAULT_MIN_QUORUM_CONNECTED_STAKE_RATIO)); + } } /**