Skip to content

Commit 710df6d

Browse files
committed
NO-HF: Move block.proof.challenge to Consensus::Params::signblockscript
Since the scriptPubKey for signing blocks never changes, there's no point reading repeating it from every block header.
1 parent c6f9fc0 commit 710df6d

File tree

8 files changed

+32
-29
lines changed

8 files changed

+32
-29
lines changed

src/chainparams.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
#include <boost/assign/list_of.hpp>
1818

1919
// Safer for users if they load incorrect parameters via arguments.
20-
static std::vector<unsigned char> CommitToArguments(const Consensus::Params& params, const std::string& networkID, const CScript& signblockscript)
20+
static std::vector<unsigned char> CommitToArguments(const Consensus::Params& params, const std::string& networkID)
2121
{
2222
CSHA256 sha2;
2323
unsigned char commitment[32];
2424
sha2.Write((const unsigned char*)networkID.c_str(), networkID.length());
2525
sha2.Write((const unsigned char*)HexStr(params.fedpegScript).c_str(), HexStr(params.fedpegScript).length());
26-
sha2.Write((const unsigned char*)HexStr(signblockscript).c_str(), HexStr(signblockscript).length());
26+
sha2.Write((const unsigned char*)HexStr(params.signblockscript).c_str(), HexStr(params.signblockscript).length());
2727
sha2.Finalize(commitment);
2828
return std::vector<unsigned char>(commitment, commitment + 32);
2929
}
@@ -40,19 +40,19 @@ static CScript StrHexToScriptWithDefault(std::string strScript, const CScript de
4040
return returnScript;
4141
}
4242

43-
static CBlock CreateGenesisBlock(const Consensus::Params& params, const std::string& networkID, uint32_t nTime, const CScript& scriptChallenge, int32_t nVersion)
43+
static CBlock CreateGenesisBlock(const Consensus::Params& params, const std::string& networkID, uint32_t nTime, int32_t nVersion)
4444
{
4545
CMutableTransaction txNew;
4646
txNew.nVersion = 1;
4747
txNew.vin.resize(1);
4848
// Any consensus-related values that are command-line set can be added here for anti-footgun
49-
txNew.vin[0].scriptSig = CScript(CommitToArguments(params, networkID, scriptChallenge));
49+
txNew.vin[0].scriptSig = CScript(CommitToArguments(params, networkID));
5050
txNew.vout.clear();
5151
txNew.vout.push_back(CTxOut(CAsset(), 0, CScript() << OP_RETURN));
5252

5353
CBlock genesis;
5454
genesis.nTime = nTime;
55-
genesis.proof = CProof(scriptChallenge, CScript());
55+
genesis.proof = CProof(params.signblockscript, CScript());
5656
genesis.nVersion = nVersion;
5757
genesis.vtx.push_back(MakeTransactionRef(std::move(txNew)));
5858
genesis.hashPrevBlock.SetNull();
@@ -134,6 +134,10 @@ class CCustomParams : public CChainParams {
134134
parentGenesisBlockHash = uint256S(GetArg("-parentgenesisblockhash", "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"));
135135
initialFreeCoins = GetArg("-initialfreecoins", 0);
136136

137+
const CScript default_script(CScript() << OP_TRUE);
138+
consensus.signblockscript = StrHexToScriptWithDefault(GetArg("-signblockscript", ""), default_script);
139+
consensus.fedpegScript = StrHexToScriptWithDefault(GetArg("-fedpegscript", ""), default_script);
140+
137141
nDefaultPort = GetArg("-ndefaultport", 7042);
138142
nPruneAfterHeight = GetArg("-npruneafterheight", 1000);
139143
fMiningRequiresPeers = GetBoolArg("-fminingrequirespeers", false);
@@ -168,10 +172,6 @@ class CCustomParams : public CChainParams {
168172
{
169173
this->UpdateFromArgs();
170174

171-
const CScript defaultRegtestScript(CScript() << OP_TRUE);
172-
CScript genesisChallengeScript = StrHexToScriptWithDefault(GetArg("-signblockscript", ""), defaultRegtestScript);
173-
consensus.fedpegScript = StrHexToScriptWithDefault(GetArg("-fedpegscript", ""), defaultRegtestScript);
174-
175175
if (!anyonecanspend_aremine) {
176176
assert("Anyonecanspendismine was marked as false, but they are in the genesis block"
177177
&& initialFreeCoins == 0);
@@ -193,12 +193,12 @@ class CCustomParams : public CChainParams {
193193
pchMessageStart[3] = 0xda;
194194

195195
// Generate pegged Bitcoin asset
196-
std::vector<unsigned char> commit = CommitToArguments(consensus, strNetworkID, genesisChallengeScript);
196+
std::vector<unsigned char> commit = CommitToArguments(consensus, strNetworkID);
197197
uint256 entropy;
198198
GenerateAssetEntropy(entropy, COutPoint(uint256(commit), 0), parentGenesisBlockHash);
199199
CalculateAsset(consensus.pegged_asset, entropy);
200200

201-
genesis = CreateGenesisBlock(consensus, strNetworkID, 1296688602, genesisChallengeScript, 1);
201+
genesis = CreateGenesisBlock(consensus, strNetworkID, 1296688602, 1);
202202
if (initialFreeCoins != 0) {
203203
AppendInitialIssuance(genesis, COutPoint(uint256(commit), 0), parentGenesisBlockHash, 1, initialFreeCoins, 0, 0, CScript() << OP_TRUE);
204204
}
@@ -276,4 +276,3 @@ void UpdateBIP9Parameters(Consensus::DeploymentPos d, int64_t nStartTime, int64_
276276
{
277277
globalChainParams->UpdateBIP9Parameters(d, nStartTime, nTimeout);
278278
}
279-

src/consensus/params.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ struct Params {
7171
uint256 defaultAssumeValid;
7272
uint32_t pegin_min_depth;
7373
CScript mandatory_coinbase_destination;
74+
CScript signblockscript;
7475
};
7576
} // namespace Consensus
7677

src/miner.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,14 +150,14 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
150150

151151
// Pad weight for challenge
152152
// We won't bother with serialization byte(s), we have room
153-
nBlockWeight += pblock->proof.challenge.size()*WITNESS_SCALE_FACTOR;
153+
nBlockWeight += chainparams.GetConsensus().signblockscript.size() * WITNESS_SCALE_FACTOR;
154154

155155
// Pad weight for proof
156156
// Note: Assumes "naked" script template with pubkeys
157157
txnouttype dummy_type;
158158
std::vector<CTxDestination> dummy_addresses;
159159
int required_sigs = -1;
160-
if (!ExtractDestinations(pblock->proof.challenge, dummy_type, dummy_addresses, required_sigs)) {
160+
if (!ExtractDestinations(chainparams.GetConsensus().signblockscript, dummy_type, dummy_addresses, required_sigs)) {
161161
// No idea how to sign this... log error but return block.
162162
LogPrintf("CreateNewBlock: Can not extract destinations from signblockscript");
163163
} else {

src/pow.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
2121
#include "wallet/wallet.h"
2222
#endif
2323

24-
CScript CombineBlockSignatures(const CBlockHeader& header, const CScript& scriptSig1, const CScript& scriptSig2)
24+
CScript CombineBlockSignatures(const Consensus::Params& params, const CBlockHeader& header, const CScript& scriptSig1, const CScript& scriptSig2)
2525
{
2626
SignatureData sig1(scriptSig1);
2727
SignatureData sig2(scriptSig2);
28-
return GenericCombineSignatures(header.proof.challenge, header, sig1, sig2).scriptSig;
28+
return GenericCombineSignatures(params.signblockscript, header, sig1, sig2).scriptSig;
2929
}
3030

3131
bool CheckChallenge(const CBlockHeader& block, const CBlockIndex& indexLast, const Consensus::Params& params)
@@ -82,14 +82,14 @@ bool CheckProof(const CBlockHeader& block, const Consensus::Params& params)
8282
| SCRIPT_VERIFY_LOW_S // Stop easiest signature fiddling
8383
| SCRIPT_VERIFY_WITNESS // Required for cleanstack eval in VerifyScript
8484
| SCRIPT_NO_SIGHASH_BYTE; // non-Check(Multi)Sig signatures will not have sighash byte
85-
return GenericVerifyScript(block.proof.solution, block.proof.challenge, proof_flags, block);
85+
return GenericVerifyScript(block.proof.solution, params.signblockscript, proof_flags, block);
8686
}
8787

88-
bool MaybeGenerateProof(CBlockHeader *pblock, CWallet *pwallet)
88+
bool MaybeGenerateProof(const Consensus::Params& params, CBlockHeader *pblock, CWallet *pwallet)
8989
{
9090
#ifdef ENABLE_WALLET
9191
SignatureData solution(pblock->proof.solution);
92-
bool res = GenericSignScript(*pwallet, *pblock, pblock->proof.challenge, solution);
92+
bool res = GenericSignScript(*pwallet, *pblock, params.signblockscript, solution);
9393
pblock->proof.solution = solution.scriptSig;
9494
return res;
9595
#endif

src/pow.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,12 @@ class uint256;
2222
/** Check whether a block hash satisfies the proof-of-work requirement specified by nBits */
2323
bool CheckBitcoinProof(uint256 hash, unsigned int nBits);
2424
bool CheckProof(const CBlockHeader& block, const Consensus::Params&);
25+
/** Scans nonces looking for a hash with at least some zero bits */
26+
bool MaybeGenerateProof(const Consensus::Params& params, CBlockHeader* pblock, CWallet* pwallet);
2527
void ResetProof(CBlockHeader& block);
2628
bool CheckChallenge(const CBlockHeader& block, const CBlockIndex& indexLast, const Consensus::Params&);
2729
void ResetChallenge(CBlockHeader& block, const CBlockIndex& indexLast, const Consensus::Params&);
2830

29-
bool MaybeGenerateProof(CBlockHeader* pblock, CWallet* pwallet);
30-
CScript CombineBlockSignatures(const CBlockHeader& header, const CScript& scriptSig1, const CScript& scriptSig2);
31+
CScript CombineBlockSignatures(const Consensus::Params& params, const CBlockHeader& header, const CScript& scriptSig1, const CScript& scriptSig2);
3132

3233
#endif // BITCOIN_POW_H

src/rpc/blockchain.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "consensus/validation.h"
1212
#include "core_io.h"
1313
#include "validation.h"
14+
#include "core_io.h"
1415
#include "policy/policy.h"
1516
#include "primitives/transaction.h"
1617
#include "rpc/server.h"
@@ -1065,6 +1066,7 @@ UniValue getblockchaininfo(const JSONRPCRequest& request)
10651066
+ HelpExampleRpc("getblockchaininfo", "")
10661067
);
10671068

1069+
const Consensus::Params& consensusParams = Params().GetConsensus();
10681070
LOCK(cs_main);
10691071
CBlockIndex* tip = chainActive.Tip();
10701072

@@ -1076,10 +1078,9 @@ UniValue getblockchaininfo(const JSONRPCRequest& request)
10761078
obj.push_back(Pair("mediantime", (int64_t)tip->GetMedianTimePast()));
10771079
obj.push_back(Pair("verificationprogress", GuessVerificationProgress(Params().TxData(), tip)));
10781080
obj.push_back(Pair("pruned", fPruneMode));
1079-
obj.push_back(Pair("signblock_asm", ScriptToAsmStr(tip->proof.challenge)));
1080-
obj.push_back(Pair("signblock_hex", HexStr(tip->proof.challenge.begin(), tip->proof.challenge.end())));
1081+
obj.push_back(Pair("signblock_asm", ScriptToAsmStr(consensusParams.signblockscript)));
1082+
obj.push_back(Pair("signblock_hex", HexStr(consensusParams.signblockscript)));
10811083

1082-
const Consensus::Params& consensusParams = Params().GetConsensus();
10831084
UniValue bip9_softforks(UniValue::VOBJ);
10841085
BIP9SoftForkDescPushBack(bip9_softforks, "csv", consensusParams, Consensus::DEPLOYMENT_CSV);
10851086
BIP9SoftForkDescPushBack(bip9_softforks, "segwit", consensusParams, Consensus::DEPLOYMENT_SEGWIT);

src/rpc/mining.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -223,14 +223,15 @@ UniValue combineblocksigs(const JSONRPCRequest& request)
223223
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block decode failed");
224224

225225
UniValue result(UniValue::VOBJ);
226+
const Consensus::Params& params = Params().GetConsensus();
226227
const UniValue& sigs = request.params[1].get_array();
227228
for (unsigned int i = 0; i < sigs.size(); i++) {
228229
const std::string& sig = sigs[i].get_str();
229230
if (!IsHex(sig))
230231
continue;
231232
std::vector<unsigned char> vchScript = ParseHex(sig);
232-
block.proof.solution = CombineBlockSignatures(block, block.proof.solution, CScript(vchScript.begin(), vchScript.end()));
233-
if (CheckProof(block, Params().GetConsensus())) {
233+
block.proof.solution = CombineBlockSignatures(params, block, block.proof.solution, CScript(vchScript.begin(), vchScript.end()));
234+
if (CheckProof(block, params)) {
234235
result.push_back(Pair("hex", EncodeHexBlock(block)));
235236
result.push_back(Pair("complete", true));
236237
return result;
@@ -774,8 +775,8 @@ UniValue getblocktemplate(const JSONRPCRequest& request)
774775
result.push_back(Pair("weightlimit", (int64_t)MAX_BLOCK_WEIGHT));
775776
}
776777
result.push_back(Pair("curtime", pblock->GetBlockTime()));
777-
result.push_back(Pair("signblock_asm", ScriptToAsmStr(pblock->proof.challenge)));
778-
result.push_back(Pair("signblock_hex", HexStr(pblock->proof.challenge.begin(), pblock->proof.challenge.end())));
778+
result.push_back(Pair("signblock_asm", ScriptToAsmStr(consensusParams.signblockscript)));
779+
result.push_back(Pair("signblock_hex", HexStr(consensusParams.signblockscript.begin(), consensusParams.signblockscript.end())));
779780
result.push_back(Pair("height", (int64_t)(pindexPrev->nHeight+1)));
780781

781782
if (!pblocktemplate->vchCoinbaseCommitment.empty() && fSupportsSegwit) {

src/wallet/rpcwallet.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3374,7 +3374,7 @@ UniValue signblock(const JSONRPCRequest& request)
33743374
}
33753375

33763376
block.proof.solution = CScript();
3377-
MaybeGenerateProof(&block, pwalletMain);
3377+
MaybeGenerateProof(Params().GetConsensus(), &block, pwalletMain);
33783378
return HexStr(block.proof.solution.begin(), block.proof.solution.end());
33793379
}
33803380

0 commit comments

Comments
 (0)