diff --git a/src/init.cpp b/src/init.cpp index 5dc9ee6e56..f0021ca7a6 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -513,6 +513,7 @@ std::string HelpMessage(HelpMessageMode mode) if (showDebug) { strUsage += HelpMessageOpt("-fedpegscript=", _("Change federated peg to use a different script.") + " " + _("This creates a new chain with a different genesis block.")); + strUsage += HelpMessageOpt("-peginconfirmationdepth", strprintf(_("Pegin claims must be this deep to be considered valid. (default: %d)"), DEFAULT_PEGIN_CONFIRMATION_DEPTH)); } strUsage += HelpMessageOpt("-validatepegin", strprintf(_("Validate pegin claims. All functionaries must run this. (default: %u)"), DEFAULT_VALIDATE_PEGIN)); diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index acf3f86fc1..d63e8285d9 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1580,7 +1580,7 @@ bool EvalScript(vector >& stack, const CScript& script, un return set_error(serror, SCRIPT_ERR_WITHDRAW_VERIFY_OUTPUT_SCRIPT); #ifndef BITCOIN_SCRIPT_NO_CALLRPC - if (GetBoolArg("-validatepegin", DEFAULT_VALIDATE_PEGIN) && !checker.IsConfirmedBitcoinBlock(genesishash, merkleBlock.header.GetHash(), flags & SCRIPT_VERIFY_INCREASE_CONFIRMATIONS_REQUIRED)) + if (GetBoolArg("-validatepegin", DEFAULT_VALIDATE_PEGIN) && !checker.IsConfirmedBitcoinBlock(genesishash, merkleBlock.header.GetHash(), flags & SCRIPT_VERIFY_INCREASE_CONFIRMATIONS_REQUIRED, GetArg("-peginconfirmationdepth", DEFAULT_PEGIN_CONFIRMATION_DEPTH))) return set_error(serror, SCRIPT_ERR_WITHDRAW_VERIFY_BLOCKCONFIRMED); #endif } catch (std::exception& e) { @@ -1975,10 +1975,10 @@ CConfidentialValue TransactionSignatureChecker::GetValueInPrevIn() const return amountPreviousInput; } -bool TransactionSignatureChecker::IsConfirmedBitcoinBlock(const uint256& genesishash, const uint256& hash, bool fConservativeConfirmationRequirements) const +bool TransactionSignatureChecker::IsConfirmedBitcoinBlock(const uint256& genesishash, const uint256& hash, bool fConservativeConfirmationRequirements, uint32_t nConfirmationsRequired) const { #ifndef BITCOIN_SCRIPT_NO_CALLRPC - return ::IsConfirmedBitcoinBlock(genesishash, hash, fConservativeConfirmationRequirements ? 10 : 8); + return ::IsConfirmedBitcoinBlock(genesishash, hash, nConfirmationsRequired + (fConservativeConfirmationRequirements ? 2 : 0)); #else return true; #endif diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 389c940eee..308041866a 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -171,7 +171,7 @@ public: return -1; } - virtual bool IsConfirmedBitcoinBlock(const uint256& genesishash, const uint256& hash, bool fConservativeConfirmationRequirements) const + virtual bool IsConfirmedBitcoinBlock(const uint256& genesishash, const uint256& hash, bool fConservativeConfirmationRequirements, uint32_t nConfirmationsRequired) const { return false; } @@ -219,7 +219,7 @@ public: COutPoint GetPrevOut() const; CConfidentialValue GetValueIn() const; CConfidentialValue GetValueInPrevIn() const; - bool IsConfirmedBitcoinBlock(const uint256& genesishash, const uint256& hash, bool fConservativeConfirmationRequirements) const; + bool IsConfirmedBitcoinBlock(const uint256& genesishash, const uint256& hash, bool fConservativeConfirmationRequirements, uint32_t nConfirmationsRequired) const; virtual CScript GetFedpegScript() const { return fedpegScript; diff --git a/src/script/script.h b/src/script/script.h index dea83e8d7e..6eb21b826e 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -31,6 +31,9 @@ static const int MAX_PUBKEYS_PER_MULTISIG = 20; // mainchain. static const bool DEFAULT_VALIDATE_PEGIN = false; +// Number of confirms on parent chain required to confirm on sidechain +static const unsigned int DEFAULT_PEGIN_CONFIRMATION_DEPTH = 8; + // Maximum script length in bytes static const int MAX_SCRIPT_SIZE = 10000; class uint256;