[MOVEONLY] Move CSCript::FindAndDelete to interpreter

This commit is contained in:
Pieter Wuille 2018-04-04 09:02:24 -07:00
parent 33a8ecfbce
commit 6a7456ad60
5 changed files with 49 additions and 47 deletions
src/script

View file

@ -250,6 +250,34 @@ bool static CheckMinimalPush(const valtype& data, opcodetype opcode) {
return true;
}
int FindAndDelete(CScript& script, const CScript& b)
{
int nFound = 0;
if (b.empty())
return nFound;
CScript result;
CScript::const_iterator pc = script.begin(), pc2 = script.begin(), end = script.end();
opcodetype opcode;
do
{
result.insert(result.end(), pc2, pc);
while (static_cast<size_t>(end - pc) >= b.size() && std::equal(b.begin(), b.end(), pc))
{
pc = pc + b.size();
++nFound;
}
pc2 = pc;
}
while (script.GetOp(pc, opcode));
if (nFound > 0) {
result.insert(result.end(), pc2, end);
script = std::move(result);
}
return nFound;
}
bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror)
{
static const CScriptNum bnZero(0);
@ -891,7 +919,7 @@ bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript&
// Drop the signature in pre-segwit scripts but not segwit scripts
if (sigversion == SigVersion::BASE) {
scriptCode.FindAndDelete(CScript(vchSig));
FindAndDelete(scriptCode, CScript(vchSig));
}
if (!CheckSignatureEncoding(vchSig, flags, serror) || !CheckPubKeyEncoding(vchPubKey, flags, sigversion, serror)) {
@ -955,7 +983,7 @@ bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript&
{
valtype& vchSig = stacktop(-isig-k);
if (sigversion == SigVersion::BASE) {
scriptCode.FindAndDelete(CScript(vchSig));
FindAndDelete(scriptCode, CScript(vchSig));
}
}