|
|
|
@ -1881,6 +1881,33 @@ bool CScript::IsPushOnly() const
@@ -1881,6 +1881,33 @@ bool CScript::IsPushOnly() const
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool CScript::HasCanonicalPushes() const |
|
|
|
|
{ |
|
|
|
|
const_iterator pc = begin(); |
|
|
|
|
while (pc < end()) |
|
|
|
|
{ |
|
|
|
|
opcodetype opcode; |
|
|
|
|
std::vector<unsigned char> data; |
|
|
|
|
if (!GetOp(pc, opcode, data)) |
|
|
|
|
return false; |
|
|
|
|
if (opcode > OP_16) |
|
|
|
|
continue; |
|
|
|
|
if (opcode < OP_PUSHDATA1 && opcode > OP_0 && (data.size() == 1 && data[0] <= 16)) |
|
|
|
|
// Could have used an OP_n code, rather than a 1-byte push.
|
|
|
|
|
return false; |
|
|
|
|
if (opcode == OP_PUSHDATA1 && data.size() < OP_PUSHDATA1) |
|
|
|
|
// Could have used a normal n-byte push, rather than OP_PUSHDATA1.
|
|
|
|
|
return false; |
|
|
|
|
if (opcode == OP_PUSHDATA2 && data.size() <= 0xFF) |
|
|
|
|
// Could have used an OP_PUSHDATA1.
|
|
|
|
|
return false; |
|
|
|
|
if (opcode == OP_PUSHDATA4 && data.size() <= 0xFFFF) |
|
|
|
|
// Could have used an OP_PUSHDATA2.
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
class CScriptVisitor : public boost::static_visitor<bool> |
|
|
|
|
{ |
|
|
|
|
private: |
|
|
|
|