1010#include " util.h"
1111#include " utilstrencodings.h"
1212#include " amount.h"
13+ #include " crypto/ripemd160.h"
1314
1415#include < assert.h>
1516
1819
1920#include " chainparamsseeds.h"
2021
22+ // Safer for users if they load incorrect parameters via arguments.
23+ static std::vector<unsigned char > CommitToArguments (const Consensus::Params& params, const std::string& networkID, const CScript& signblockscript)
24+ {
25+ CRIPEMD160 ripemd;
26+ unsigned char commitment[20 ];
27+ ripemd.Write ((const unsigned char *)networkID.c_str (), networkID.length ());
28+ ripemd.Write ((const unsigned char *)HexStr (params.fedpegScript ).c_str (), HexStr (params.fedpegScript ).length ());
29+ ripemd.Write ((const unsigned char *)HexStr (signblockscript).c_str (), HexStr (signblockscript).length ());
30+ ripemd.Finalize (commitment);
31+ return std::vector<unsigned char >(commitment, commitment + 20 );
32+ }
33+
2134static CScript StrHexToScriptWithDefault (std::string strScript, const CScript defaultScript)
2235{
2336 CScript returnScript;
@@ -30,14 +43,15 @@ static CScript StrHexToScriptWithDefault(std::string strScript, const CScript de
3043 return returnScript;
3144}
3245
33- static CBlock CreateGenesisBlock (const char * pszTimestamp , const CScript& genesisOutputScript, uint32_t nTime, const CScript& scriptChallenge, int32_t nVersion, const CAmount& genesisReward, const uint32_t rewardShards, const CAsset& asset)
46+ static CBlock CreateGenesisBlock (const Consensus::Params& params, const std::string& networkID , const CScript& genesisOutputScript, uint32_t nTime, const CScript& scriptChallenge, int32_t nVersion, const CAmount& genesisReward, const uint32_t rewardShards, const CAsset& asset)
3447{
3548 // Shards must be evenly divisible
3649 assert (MAX_MONEY % rewardShards == 0 );
3750 CMutableTransaction txNew;
3851 txNew.nVersion = 1 ;
3952 txNew.vin .resize (1 );
40- txNew.vin [0 ].scriptSig = CScript () << 486604799 << CScriptNum (4 ) << std::vector<unsigned char >((const unsigned char *)pszTimestamp, (const unsigned char *)pszTimestamp + strlen (pszTimestamp));
53+ // Any consensus-related values that are command-line set can be added here for anti-footgun
54+ txNew.vin [0 ].scriptSig = CScript (CommitToArguments (params, networkID, scriptChallenge));
4155 txNew.vout .resize (rewardShards);
4256 for (unsigned int i = 0 ; i < rewardShards; i++) {
4357 txNew.vout [i].nValue = genesisReward/rewardShards;
@@ -128,7 +142,7 @@ class CElementsParams : public CChainParams {
128142
129143 parentGenesisBlockHash = uint256S (" 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943" );
130144 CScript scriptDestination (CScript () << std::vector<unsigned char >(parentGenesisBlockHash.begin (), parentGenesisBlockHash.end ()) << OP_WITHDRAWPROOFVERIFY);
131- genesis = CreateGenesisBlock (strNetworkID. c_str () , scriptDestination, 1231006505 , genesisChallengeScript, 1 , MAX_MONEY, 100 , bitcoinID);
145+ genesis = CreateGenesisBlock (consensus, strNetworkID, scriptDestination, 1231006505 , genesisChallengeScript, 1 , MAX_MONEY, 100 , bitcoinID);
132146 consensus.hashGenesisBlock = genesis.GetHash ();
133147
134148 scriptCoinbaseDestination = CScript () << ParseHex (" 0229536c4c83789f59c30b93eb40d4abbd99b8dcc99ba8bd748f29e33c1d279e3c" ) << OP_CHECKSIG;
@@ -233,7 +247,7 @@ class CRegTestParams : public CChainParams {
233247 // SHA256 of Bitcoin genesis mainnet hash for NUMS bitcoin asset id
234248 bitcoinID = BITCOINID;
235249
236- genesis = CreateGenesisBlock (strNetworkID. c_str () , defaultRegtestScript, 1296688602 , genesisChallengeScript, 1 , MAX_MONEY, 100 , bitcoinID);
250+ genesis = CreateGenesisBlock (consensus, strNetworkID, defaultRegtestScript, 1296688602 , genesisChallengeScript, 1 , MAX_MONEY, 100 , bitcoinID);
237251 consensus.hashGenesisBlock = genesis.GetHash ();
238252
239253 parentGenesisBlockHash = uint256S (" 0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206" );
0 commit comments