From d16d0760537ef7e95a005f4b88d1a22ed7c09e5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Tim=C3=B3n?= Date: Wed, 1 Jul 2015 19:02:51 +0200 Subject: [PATCH] Checkpoints: The hash of the genesis block it's the genesis checkpoint and chain id --- src/chainparams.cpp | 20 +++++++++++++------- src/chainparams.h | 5 +++++ src/test/Checkpoints_tests.cpp | 22 +++++++++++++++------- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 66c12a34ca..20d1d8764c 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -17,6 +17,13 @@ #include "chainparamsseeds.h" +const std::map CChainParams::supportedChains = + boost::assign::map_list_of + ( "main", uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f")) + ( "test", uint256S("0x000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943")) + ( "regtest", uint256S("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")) + ; + static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward) { CMutableTransaction txNew; @@ -112,8 +119,7 @@ public: genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN); consensus.hashGenesisBlock = genesis.GetHash(); - assert(consensus.hashGenesisBlock == uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f")); - assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b")); + assert(consensus.hashGenesisBlock == supportedChains.find(strNetworkID)->second); // Note that of those with the service bits flag, most only support a subset of possible options vSeeds.push_back(CDNSSeedData("bitcoin.sipa.be", "seed.bitcoin.sipa.be", true)); // Pieter Wuille, only supports x1, x5, x9, and xd @@ -139,6 +145,7 @@ public: checkpointData = (CCheckpointData) { boost::assign::map_list_of + ( 0, consensus.hashGenesisBlock) ( 11111, uint256S("0x0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d")) ( 33333, uint256S("0x000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6")) ( 74000, uint256S("0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20")) @@ -203,8 +210,7 @@ public: genesis = CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN); consensus.hashGenesisBlock = genesis.GetHash(); - assert(consensus.hashGenesisBlock == uint256S("0x000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943")); - assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b")); + assert(consensus.hashGenesisBlock == supportedChains.find(strNetworkID)->second); vFixedSeeds.clear(); vSeeds.clear(); @@ -230,6 +236,7 @@ public: checkpointData = (CCheckpointData) { boost::assign::map_list_of + ( 0, consensus.hashGenesisBlock) ( 546, uint256S("000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70")), 1337966069, 1488, @@ -278,8 +285,7 @@ public: genesis = CreateGenesisBlock(1296688602, 2, 0x207fffff, 1, 50 * COIN); consensus.hashGenesisBlock = genesis.GetHash(); - assert(consensus.hashGenesisBlock == uint256S("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")); - assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b")); + assert(consensus.hashGenesisBlock == supportedChains.find(strNetworkID)->second); vFixedSeeds.clear(); //!< Regtest mode doesn't have any fixed seeds. vSeeds.clear(); //!< Regtest mode doesn't have any DNS seeds. @@ -292,7 +298,7 @@ public: checkpointData = (CCheckpointData){ boost::assign::map_list_of - ( 0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")), + ( 0, consensus.hashGenesisBlock), 0, 0, 0 diff --git a/src/chainparams.h b/src/chainparams.h index e5b2fb36b0..bc09bf04f6 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -53,6 +53,11 @@ public: MAX_BASE58_TYPES }; + /** + * Maps strNetworkID [see BIP70] to chainID (hashGenesisBlock and genesis checkpoint) + */ + static const std::map supportedChains; + const Consensus::Params& GetConsensus() const { return consensus; } const CMessageHeader::MessageStartChars& MessageStart() const { return pchMessageStart; } int GetDefaultPort() const { return nDefaultPort; } diff --git a/src/test/Checkpoints_tests.cpp b/src/test/Checkpoints_tests.cpp index b4564c3373..5a79f57331 100644 --- a/src/test/Checkpoints_tests.cpp +++ b/src/test/Checkpoints_tests.cpp @@ -2,22 +2,30 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -// -// Unit tests for block-chain checkpoints -// - #include "checkpoints.h" - #include "uint256.h" #include "test/test_bitcoin.h" #include "chainparams.h" #include -using namespace std; - BOOST_FIXTURE_TEST_SUITE(Checkpoints_tests, BasicTestingSetup) +// The hash of the genesis block it's the genesis checkpoint and chain id +BOOST_AUTO_TEST_CASE(genesisblockhash_test) +{ + std::map::const_iterator iter; + for (iter = CChainParams::supportedChains.begin(); iter != CChainParams::supportedChains.end(); ++iter) { + const boost::scoped_ptr testChainParams(CChainParams::Factory(iter->first)); + const CChainParams& chainparams = *testChainParams; + std::string hashStr = chainparams.GenesisBlock().GetHash().GetHex(); + BOOST_CHECK_EQUAL(hashStr, iter->second.GetHex()); + BOOST_CHECK_EQUAL(hashStr, chainparams.GetConsensus().hashGenesisBlock.GetHex()); + const uint256& genesisCheckpoint = chainparams.Checkpoints().mapCheckpoints.find(0)->second; + BOOST_CHECK_EQUAL(hashStr, genesisCheckpoint.GetHex()); + } +} + BOOST_AUTO_TEST_CASE(sanity) { const boost::scoped_ptr testChainParams(CChainParams::Factory(CBaseChainParams::MAIN));