Add SCRIPT_VERIFY_MINIMALDATA (BIP62 rules 3 and 4)

Also use the new flag as a standard rule, and replace the IsCanonicalPush
standardness check with it (as it is more complete).
This commit is contained in:
Pieter Wuille
2014-10-08 18:48:59 -07:00
parent d752ba86c1
commit 698c6abb25
11 changed files with 101 additions and 59 deletions

View File

@@ -192,10 +192,14 @@ public:
m_value = n;
}
explicit CScriptNum(const std::vector<unsigned char>& vch)
explicit CScriptNum(const std::vector<unsigned char>& vch, bool fRequireMinimal)
{
if (vch.size() > nMaxNumSize)
throw scriptnum_error("CScriptNum(const std::vector<unsigned char>&) : overflow");
if (vch.size() > nMaxNumSize) {
throw scriptnum_error("script number overflow");
}
if (fRequireMinimal && vch.size() > 0 && (vch.back() & 0x7f) == 0 && (vch.size() <= 1 || (vch[vch.size() - 2] & 0x80) == 0)) {
throw scriptnum_error("non-minimally encoded script number");
}
m_value = set_vch(vch);
}
@@ -319,7 +323,6 @@ private:
int64_t m_value;
};
/** Serialized script, used inside transaction inputs and outputs */
class CScript : public std::vector<unsigned char>
{
@@ -330,6 +333,10 @@ protected:
{
push_back(n + (OP_1 - 1));
}
else if (n == 0)
{
push_back(OP_0);
}
else
{
*this << CScriptNum::serialize(n);
@@ -554,9 +561,6 @@ public:
// Called by IsStandardTx and P2SH/BIP62 VerifyScript (which makes it consensus-critical).
bool IsPushOnly() const;
// Called by IsStandardTx.
bool HasCanonicalPushes() const;
// Returns whether the script is guaranteed to fail at execution,
// regardless of the initial stack. This allows outputs to be pruned
// instantly when entering the UTXO set.