From e9df51121f7b6c81d70df190ad2123786a476dfe Mon Sep 17 00:00:00 2001 From: Pablo Greco Date: Thu, 8 Sep 2022 18:23:42 +0000 Subject: [PATCH 1/8] Add text version of the fixed seeds for liquidv1 and liquidtestnet --- contrib/seeds/liquid/nodes_main.txt | 10 ++++++++++ contrib/seeds/liquid/nodes_test.txt | 4 ++++ 2 files changed, 14 insertions(+) create mode 100644 contrib/seeds/liquid/nodes_main.txt create mode 100644 contrib/seeds/liquid/nodes_test.txt diff --git a/contrib/seeds/liquid/nodes_main.txt b/contrib/seeds/liquid/nodes_main.txt new file mode 100644 index 0000000000..395b88e63e --- /dev/null +++ b/contrib/seeds/liquid/nodes_main.txt @@ -0,0 +1,10 @@ +# List of fixed seed nodes for liquidv1 + +35.196.16.254:7042 +35.237.176.63:7042 +35.237.81.14:7042 +35.237.147.21:7042 +35.227.95.109:7042 +35.231.141.173:7042 +104.196.48.184:7042 +35.231.10.147:7042 diff --git a/contrib/seeds/liquid/nodes_test.txt b/contrib/seeds/liquid/nodes_test.txt new file mode 100644 index 0000000000..fab453aaed --- /dev/null +++ b/contrib/seeds/liquid/nodes_test.txt @@ -0,0 +1,4 @@ +# List of fixed seed nodes for liquidtestnet + +34.68.67.175:18891 +79.98.30.13:18891 From 0fa20d006d1f7ab9d8b372993fc27c9cfb44d6b3 Mon Sep 17 00:00:00 2001 From: Pablo Greco Date: Sun, 28 Nov 2021 13:15:35 +0000 Subject: [PATCH 2/8] CCustomParams: Move some defaults away from UpdateFromArgs --- src/chainparams.cpp | 65 +++++++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index c5b4c2bdb1..66373a0787 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -735,6 +735,9 @@ void CRegTestParams::UpdateActivationParametersFromArgs(const ArgsManager& args) * Custom params for testing. */ class CCustomParams : public CRegTestParams { +protected: + std::string default_magic_str = "5319F20E"; + std::string default_signblockscript = "51"; void UpdateFromArgs(const ArgsManager& args) { UpdateActivationParametersFromArgs(args); @@ -757,7 +760,7 @@ class CCustomParams : public CRegTestParams { consensus.nMinimumChainWork = uint256S(args.GetArg("-con_nminimumchainwork", "0x0")); consensus.defaultAssumeValid = uint256S(args.GetArg("-con_defaultassumevalid", "0x00")); // TODO: Embed in genesis block in nTime field with new genesis block type - consensus.dynamic_epoch_length = args.GetArg("-dynamic_epoch_length", 10); + consensus.dynamic_epoch_length = args.GetArg("-dynamic_epoch_length", consensus.dynamic_epoch_length); // Default junk keys for testing consensus.first_extension_space = {ParseHex("02fcba7ecf41bc7e1be4ee122d9d22e3333671eb0a3a87b5cdf099d59874e1940f02fcba7ecf41bc7e1be4ee122d9d22e3333671eb0a3a87b5cdf099d59874e1940f")}; std::vector pak_list_str = args.GetArgs("-pak"); @@ -772,12 +775,16 @@ class CCustomParams : public CRegTestParams { fDefaultConsistencyChecks = args.GetBoolArg("-fdefaultconsistencychecks", fDefaultConsistencyChecks); m_is_test_chain = args.GetBoolArg("-fmineblocksondemand", m_is_test_chain); - bech32_hrp = args.GetArg("-bech32_hrp", "ert"); - blech32_hrp = args.GetArg("-blech32_hrp", "el"); - base58Prefixes[PUBKEY_ADDRESS] = std::vector(1, args.GetArg("-pubkeyprefix", 235)); - base58Prefixes[SCRIPT_ADDRESS] = std::vector(1, args.GetArg("-scriptprefix", 75)); - base58Prefixes[BLINDED_ADDRESS] = std::vector(1, args.GetArg("-blindedprefix", 4)); - base58Prefixes[SECRET_KEY] = std::vector(1, args.GetArg("-secretprefix", 239)); + bech32_hrp = args.GetArg("-bech32_hrp", bech32_hrp); + blech32_hrp = args.GetArg("-blech32_hrp", blech32_hrp); + assert(base58Prefixes[PUBKEY_ADDRESS].size() == 1); + assert(base58Prefixes[SCRIPT_ADDRESS].size() == 1); + assert(base58Prefixes[BLINDED_ADDRESS].size() == 1); + assert(base58Prefixes[SECRET_KEY].size() == 1); + base58Prefixes[PUBKEY_ADDRESS] = std::vector(1, args.GetArg("-pubkeyprefix", base58Prefixes[PUBKEY_ADDRESS][0])); + base58Prefixes[SCRIPT_ADDRESS] = std::vector(1, args.GetArg("-scriptprefix", base58Prefixes[SCRIPT_ADDRESS][0])); + base58Prefixes[BLINDED_ADDRESS] = std::vector(1, args.GetArg("-blindedprefix", base58Prefixes[BLINDED_ADDRESS][0])); + base58Prefixes[SECRET_KEY] = std::vector(1, args.GetArg("-secretprefix", base58Prefixes[SECRET_KEY][0])); base58Prefixes[PARENT_PUBKEY_ADDRESS] = std::vector(1, args.GetArg("-parentpubkeyprefix", 111)); base58Prefixes[PARENT_SCRIPT_ADDRESS] = std::vector(1, args.GetArg("-parentscriptprefix", 196)); parent_bech32_hrp = args.GetArg("-parent_bech32_hrp", "bcrt"); @@ -792,7 +799,7 @@ class CCustomParams : public CRegTestParams { assert(IsHex(extprvprefix) && extprvprefix.size() == 8 && "-extprvkeyprefix must be hex string of length 8"); base58Prefixes[EXT_SECRET_KEY] = ParseHex(extprvprefix); - const std::string magic_str = args.GetArg("-pchmessagestart", "5319F20E"); + const std::string magic_str = args.GetArg("-pchmessagestart", default_magic_str); assert(IsHex(magic_str) && magic_str.size() == 8 && "-pchmessagestart must be hex string of length 8"); const std::vector magic_byte = ParseHex(magic_str); std::copy(begin(magic_byte), end(magic_byte), pchMessageStart); @@ -812,10 +819,9 @@ class CCustomParams : public CRegTestParams { consensus.genesis_style = args.GetArg("-con_genesis_style", "elements"); // Block signing encumberance script, default of 51 aka OP_TRUE - std::vector sign_bytes = ParseHex(args.GetArg("-signblockscript", "51")); + std::vector sign_bytes = ParseHex(args.GetArg("-signblockscript", default_signblockscript)); consensus.signblockscript = CScript(sign_bytes.begin(), sign_bytes.end()); - // Default signature size is the size of dummy push, and single 72 byte DER signature - consensus.max_block_signature_size = args.GetArg("-con_max_block_sig_size", 74); + consensus.max_block_signature_size = args.GetArg("-con_max_block_sig_size", consensus.max_block_signature_size); g_signed_blocks = args.GetBoolArg("-con_signed_blocks", true); // Note: These globals are needed to avoid circular dependencies. @@ -834,11 +840,11 @@ class CCustomParams : public CRegTestParams { // Custom chains connect coinbase outputs to db by default consensus.connect_genesis_outputs = args.GetArg("-con_connect_genesis_outputs", true); - initialFreeCoins = args.GetArg("-initialfreecoins", 0); + initialFreeCoins = args.GetArg("-initialfreecoins", initialFreeCoins); - anyonecanspend_aremine = args.GetBoolArg("-anyonecanspendaremine", true); + anyonecanspend_aremine = args.GetBoolArg("-anyonecanspendaremine", anyonecanspend_aremine); - consensus.has_parent_chain = args.GetBoolArg("-con_has_parent_chain", true); + consensus.has_parent_chain = args.GetBoolArg("-con_has_parent_chain", consensus.has_parent_chain); enforce_pak = args.GetBoolArg("-enforce_pak", false); @@ -846,7 +852,7 @@ class CCustomParams : public CRegTestParams { multi_data_permitted = args.GetBoolArg("-multi_data_permitted", enforce_pak); // bitcoin regtest is the parent chain by default - parentGenesisBlockHash = uint256S(args.GetArg("-parentgenesisblockhash", "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")); + parentGenesisBlockHash = uint256S(args.GetArg("-parentgenesisblockhash", parentGenesisBlockHash.GetHex())); // Either it has a parent chain or not const bool parent_genesis_is_null = parentGenesisBlockHash == uint256(); assert(consensus.has_parent_chain != parent_genesis_is_null); @@ -880,11 +886,6 @@ class CCustomParams : public CRegTestParams { consensus.subsidy_asset = CAsset(uint256S(args.GetArg("-subsidyasset", "0x00"))); } - consensus.vDeployments[Consensus::DEPLOYMENT_DYNA_FED].bit = 25; - consensus.vDeployments[Consensus::DEPLOYMENT_DYNA_FED].nStartTime = Consensus::BIP9Deployment::ALWAYS_ACTIVE; - consensus.vDeployments[Consensus::DEPLOYMENT_DYNA_FED].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT; - consensus.vDeployments[Consensus::DEPLOYMENT_DYNA_FED].min_activation_height = 0; // No activation delay - UpdateElementsActivationParametersFromArgs(consensus, args); // END ELEMENTS fields } @@ -914,6 +915,30 @@ public: CCustomParams(const std::string& chain, const ArgsManager& args) : CRegTestParams(args) { strNetworkID = chain; + + //default settings + initialFreeCoins = 0; + anyonecanspend_aremine = true; + // Default signature size is the size of dummy push, and single 72 byte DER signature + consensus.max_block_signature_size = 74; + consensus.dynamic_epoch_length = 10; + // bitcoin regtest is the parent chain by default + consensus.has_parent_chain = true; + parentGenesisBlockHash = uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"); + + bech32_hrp = "ert"; + blech32_hrp = "el"; + + base58Prefixes[PUBKEY_ADDRESS] = std::vector(1, 235); + base58Prefixes[SCRIPT_ADDRESS] = std::vector(1, 75); + base58Prefixes[BLINDED_ADDRESS] = std::vector(1, 4); + base58Prefixes[SECRET_KEY] = std::vector(1, 239); + + consensus.vDeployments[Consensus::DEPLOYMENT_DYNA_FED].bit = 25; + consensus.vDeployments[Consensus::DEPLOYMENT_DYNA_FED].nStartTime = Consensus::BIP9Deployment::ALWAYS_ACTIVE; + consensus.vDeployments[Consensus::DEPLOYMENT_DYNA_FED].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT; + consensus.vDeployments[Consensus::DEPLOYMENT_DYNA_FED].min_activation_height = 0; // No activation delay + UpdateFromArgs(args); SetGenesisBlock(); consensus.hashGenesisBlock = genesis.GetHash(); From f955cb3d9c7f1cd01ace0b4229bda9f1eb7b6129 Mon Sep 17 00:00:00 2001 From: Pablo Greco Date: Sun, 28 Nov 2021 13:20:14 +0000 Subject: [PATCH 3/8] liquidtestnet: Add chainparams --- src/chainparams.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ src/chainparamsbase.cpp | 3 +++ src/chainparamsbase.h | 1 + 3 files changed, 45 insertions(+) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 66373a0787..32c9f810ed 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -945,6 +945,45 @@ public: } }; +/** + * Liquid testnet (customparams with a few defaults). + */ +class CLiquidTestNetParams : public CCustomParams { +public: + CLiquidTestNetParams(const std::string& chain, const ArgsManager& args) : CCustomParams(chain, args) + { + strNetworkID = chain; + // not a debug chain + fDefaultConsistencyChecks = false; + + initialFreeCoins = 2100000000000000; + anyonecanspend_aremine = false; + consensus.max_block_signature_size = 150; + consensus.dynamic_epoch_length = 1000; + + // no parent chain by default + consensus.has_parent_chain = false; + parentGenesisBlockHash = uint256(); + + bech32_hrp = "tex"; + blech32_hrp = "tlq"; + + base58Prefixes[PUBKEY_ADDRESS] = std::vector(1, 36); + base58Prefixes[SCRIPT_ADDRESS] = std::vector(1, 19); + base58Prefixes[BLINDED_ADDRESS] = std::vector(1, 23); + base58Prefixes[SECRET_KEY] = std::vector(1, base58Prefixes[SECRET_KEY][0]); + + // disable automatic dynafed + consensus.vDeployments[Consensus::DEPLOYMENT_DYNA_FED].nStartTime = 0; + + default_magic_str = "410EDD62"; + default_signblockscript = "51210217e403ddb181872c32a0cd468c710040b2f53d8cac69f18dad07985ee37e9a7151ae"; + UpdateFromArgs(args); + SetGenesisBlock(); + consensus.hashGenesisBlock = genesis.GetHash(); + } +}; + /** * Liquid v1 */ @@ -1486,6 +1525,8 @@ std::unique_ptr CreateChainParams(const ArgsManager& args, c return std::unique_ptr(new CLiquidV1Params()); } else if (chain == CBaseChainParams::LIQUID1TEST) { return std::unique_ptr(new CLiquidV1TestParams(args)); + } else if (chain == CBaseChainParams::LIQUIDTESTNET) { + return std::unique_ptr(new CLiquidTestNetParams(chain, args)); } return std::unique_ptr(new CCustomParams(chain, args)); diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp index b79ba9685d..35aa921cd9 100644 --- a/src/chainparamsbase.cpp +++ b/src/chainparamsbase.cpp @@ -16,6 +16,7 @@ const std::string CBaseChainParams::SIGNET = "signet"; const std::string CBaseChainParams::REGTEST = "regtest"; const std::string CBaseChainParams::LIQUID1 = "liquidv1"; const std::string CBaseChainParams::LIQUID1TEST = "liquidv1test"; +const std::string CBaseChainParams::LIQUIDTESTNET = "liquidtestnet"; const std::string CBaseChainParams::DEFAULT = CBaseChainParams::LIQUID1; @@ -89,6 +90,8 @@ std::unique_ptr CreateBaseChainParams(const std::string& chain return std::make_unique("liquidv1", 7041, 8332, 37041); } else if (chain == CBaseChainParams::LIQUID1TEST) { return std::make_unique("liquidv1test", 7040, 18332, 37040); // Use same ports as customparams + } else if (chain == CBaseChainParams::LIQUIDTESTNET) { + return std::make_unique(chain, 7039, 18331, 37039); } // ELEMENTS: diff --git a/src/chainparamsbase.h b/src/chainparamsbase.h index edbea7e02c..5ba4677ef3 100644 --- a/src/chainparamsbase.h +++ b/src/chainparamsbase.h @@ -25,6 +25,7 @@ public: static const std::string REGTEST; static const std::string LIQUID1; static const std::string LIQUID1TEST; + static const std::string LIQUIDTESTNET; ///@} static const std::string DEFAULT; From 0d1964766f38135322fd44dc72aed85bec8ea38c Mon Sep 17 00:00:00 2001 From: Pablo Greco Date: Thu, 23 Dec 2021 18:06:06 +0000 Subject: [PATCH 4/8] liquidtestnet: Accept multi OP_RETURN --- src/chainparams.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 32c9f810ed..eb60095204 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -979,6 +979,7 @@ public: default_magic_str = "410EDD62"; default_signblockscript = "51210217e403ddb181872c32a0cd468c710040b2f53d8cac69f18dad07985ee37e9a7151ae"; UpdateFromArgs(args); + multi_data_permitted = true; SetGenesisBlock(); consensus.hashGenesisBlock = genesis.GetHash(); } From 3b34c8e927f748dc82e4d4c1f519592973294f8d Mon Sep 17 00:00:00 2001 From: Pablo Greco Date: Mon, 6 Dec 2021 17:01:32 +0000 Subject: [PATCH 5/8] liquidtestnet: Add seed nodes --- src/chainparams.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index eb60095204..e63f3525ec 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -976,12 +976,20 @@ public: // disable automatic dynafed consensus.vDeployments[Consensus::DEPLOYMENT_DYNA_FED].nStartTime = 0; + nDefaultPort = 18891; + vSeeds.clear(); + vFixedSeeds.clear(); + default_magic_str = "410EDD62"; default_signblockscript = "51210217e403ddb181872c32a0cd468c710040b2f53d8cac69f18dad07985ee37e9a7151ae"; UpdateFromArgs(args); multi_data_permitted = true; SetGenesisBlock(); consensus.hashGenesisBlock = genesis.GetHash(); + if (!args.IsArgSet("-seednode")) { + vSeeds.emplace_back("seed.liquid-testnet.blockstream.com"); + vSeeds.emplace_back("seed.liquidtestnet.com"); + } } }; From 48ddfbf8d70a716adf8918768d613a3f61faa8f5 Mon Sep 17 00:00:00 2001 From: Pablo Greco Date: Thu, 8 Sep 2022 13:46:58 +0000 Subject: [PATCH 6/8] liquidtestnet: Add fixed seeds --- src/chainparams.cpp | 2 +- src/chainparamsseeds.h | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index e63f3525ec..7e13d54ffa 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -978,7 +978,7 @@ public: nDefaultPort = 18891; vSeeds.clear(); - vFixedSeeds.clear(); + vFixedSeeds = std::vector(std::begin(pnSeed6_liquidtestnet), std::end(pnSeed6_liquidtestnet)); default_magic_str = "410EDD62"; default_signblockscript = "51210217e403ddb181872c32a0cd468c710040b2f53d8cac69f18dad07985ee37e9a7151ae"; diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.h index dcbfea03cc..6e1492721e 100644 --- a/src/chainparamsseeds.h +++ b/src/chainparamsseeds.h @@ -718,4 +718,9 @@ static uint8_t pnSeed6_liquidv1[] = { 0x01,0x04,0x68,0xc4,0x30,0xb8,0x1b,0x82, 0x01,0x04,0x23,0xe7,0x0a,0x93,0x1b,0x82, }; + +static uint8_t pnSeed6_liquidtestnet[] = { + 0x01,0x04,0x22,0x44,0x43,0xaf,0x49,0xcb, + 0x01,0x04,0x4f,0x62,0x1e,0x0d,0x49,0xcb, +}; #endif // BITCOIN_CHAINPARAMSSEEDS_H From d0f391cfdb72655eb1b6b8e31ee84ad059200203 Mon Sep 17 00:00:00 2001 From: Pablo Greco Date: Mon, 1 Aug 2022 23:19:08 +0000 Subject: [PATCH 7/8] liquidtestnet: Add style for Elements-Qt --- src/qt/guiconstants.h | 1 + src/qt/networkstyle.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/qt/guiconstants.h b/src/qt/guiconstants.h index 1a4f3dca2f..6550fa0b7b 100644 --- a/src/qt/guiconstants.h +++ b/src/qt/guiconstants.h @@ -50,6 +50,7 @@ static const int TOOLTIP_WRAP_THRESHOLD = 80; #define QAPP_APP_NAME_SIGNET "Elements-Qt-signet" #define QAPP_APP_NAME_REGTEST "Elements-Qt-regtest" #define QAPP_APP_NAME_LIQUID "Elements-Qt (Liquid)" +#define QAPP_APP_NAME_LIQUIDTESTNET "Elements-Qt (liquidtestnet)" /* One gigabyte (GB) in bytes */ static constexpr uint64_t GB_BYTES{1000000000}; diff --git a/src/qt/networkstyle.cpp b/src/qt/networkstyle.cpp index 55af70ecca..81a76fddc4 100644 --- a/src/qt/networkstyle.cpp +++ b/src/qt/networkstyle.cpp @@ -20,6 +20,7 @@ static const struct { {"main", QAPP_APP_NAME_DEFAULT, 0, 0}, {"test", QAPP_APP_NAME_TESTNET, 70, 30}, {"liquidv1", QAPP_APP_NAME_LIQUID, 0, 0}, + {"liquidtestnet", QAPP_APP_NAME_LIQUIDTESTNET, 80, 80}, {"signet", QAPP_APP_NAME_SIGNET, 35, 15}, {"regtest", QAPP_APP_NAME_REGTEST, 160, 30} }; From c6e074e25b48b491120a5bad2e0ba1998d8b0dc7 Mon Sep 17 00:00:00 2001 From: Pablo Greco Date: Thu, 8 Sep 2022 12:10:04 +0000 Subject: [PATCH 8/8] liquidtestnet: Fix chain name in windows installer --- share/setup.nsi.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/setup.nsi.in b/share/setup.nsi.in index d76a5d3b61..cd9d9c9f5f 100644 --- a/share/setup.nsi.in +++ b/share/setup.nsi.in @@ -93,7 +93,7 @@ Section -post SEC0001 !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateDirectory $SMPROGRAMS\$StartMenuGroup CreateShortcut "$SMPROGRAMS\$StartMenuGroup\$(^Name).lnk" $INSTDIR\@BITCOIN_GUI_NAME@@EXEEXT@ - CreateShortcut "$SMPROGRAMS\$StartMenuGroup\@PACKAGE_NAME@ (testnet, 64-bit).lnk" "$INSTDIR\@BITCOIN_GUI_NAME@@EXEEXT@" "-testnet" "$INSTDIR\@BITCOIN_GUI_NAME@@EXEEXT@" 1 + CreateShortcut "$SMPROGRAMS\$StartMenuGroup\@PACKAGE_NAME@ (testnet, 64-bit).lnk" "$INSTDIR\@BITCOIN_GUI_NAME@@EXEEXT@" "-chain=liquidtestnet" "$INSTDIR\@BITCOIN_GUI_NAME@@EXEEXT@" 1 CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall $(^Name).lnk" $INSTDIR\uninstall.exe !insertmacro MUI_STARTMENU_WRITE_END WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayName "$(^Name)"