From ae353607707605f82c84877f1b5d321fff5a0cbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Tim=C3=B3n?= Date: Thu, 18 Oct 2018 22:47:14 +0200 Subject: [PATCH 1/4] Chainparams: Introduce consensus.genesis_style for compatibility and sanity --- src/chainparams.cpp | 34 ++- src/chainparamsbase.cpp | 1 + src/consensus/params.h | 1 + test/functional/data/rpc_getblockstats.json | 228 ++++++++++---------- 4 files changed, 146 insertions(+), 118 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 2f2b2d5c30f..8273437386a 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -4,9 +4,10 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include -#include #include +#include +#include #include #include #include @@ -17,13 +18,13 @@ #include #include -static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward) +static CBlock CreateGenesisBlock(const CScript& coinbase_sig, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward) { CMutableTransaction txNew; txNew.nVersion = 1; txNew.vin.resize(1); txNew.vout.resize(1); - txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << std::vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); + txNew.vin[0].scriptSig = coinbase_sig; txNew.vout[0].nValue = genesisReward; txNew.vout[0].scriptPubKey = genesisOutputScript; @@ -38,6 +39,12 @@ static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesi return genesis; } +static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward) +{ + CScript coinbase_sig = CScript() << 486604799 << CScriptNum(4) << std::vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); + return CreateGenesisBlock(coinbase_sig, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward); +} + /** * Build the genesis block. Note that the output of its generation * transaction cannot be spent since it did not originally exist in the @@ -403,6 +410,7 @@ class CCustomParams : public CRegTestParams { { UpdateVersionBitsParametersFromArgs(args); + consensus.genesis_style = args.GetArg("-con_genesis_style", "default_style"); consensus.nSubsidyHalvingInterval = args.GetArg("-con_nsubsidyhalvinginterval", consensus.nSubsidyHalvingInterval); consensus.BIP16Exception = uint256S(args.GetArg("-con_bip16exception", "0x0")); consensus.BIP34Height = args.GetArg("-con_bip34height", consensus.BIP34Height); @@ -452,12 +460,30 @@ class CCustomParams : public CRegTestParams { } } + void SetGenesisBlock() + { + if (consensus.genesis_style == "regtest2_style") { + // Same style as in https://github.com/bitcoin/bitcoin/pull/8994 + genesis = CreateGenesisBlock(strNetworkID.c_str(), CScript(OP_TRUE), 1296688602, 2, 0x207fffff, 1, 50 * COIN); + + } else if (consensus.genesis_style == "default_style") { + CHashWriter h(SER_DISK, 0); + h << strNetworkID; + uint256 hash = h.GetHash(); + CScript coinbase_sig = CScript() << std::vector(hash.begin(), hash.end()); + genesis = CreateGenesisBlock(coinbase_sig, CScript(OP_TRUE), 1296688602, 2, 0x207fffff, 1, 50 * COIN); + + } else { + throw std::runtime_error(strprintf("%s: Unknown consensus.genesis_style %s.", __func__, consensus.genesis_style)); + } + } + public: CCustomParams(const std::string& chain, ArgsManager& args) : CRegTestParams(args) { strNetworkID = chain; UpdateFromArgs(args); - genesis = CreateGenesisBlock(strNetworkID.c_str(), CScript(OP_TRUE), 1296688602, 2, 0x207fffff, 1, 50 * COIN); + SetGenesisBlock(); consensus.hashGenesisBlock = genesis.GetHash(); } }; diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp index 1a4b53a3524..0ea6f070bda 100644 --- a/src/chainparamsbase.cpp +++ b/src/chainparamsbase.cpp @@ -21,6 +21,7 @@ void SetupChainParamsBaseOptions() gArgs.AddArg("-regtest", "Enter regression test mode, which uses a special chain in which blocks can be solved instantly. " "This is intended for regression testing tools and app development.", true, OptionsCategory::CHAINPARAMS); gArgs.AddArg("-testnet", "Use the test chain", false, OptionsCategory::CHAINPARAMS); + gArgs.AddArg("-con_genesis_style=