Changeset View
Changeset View
Standalone View
Standalone View
src/script/interpreter.cpp
Show First 20 Lines • Show All 292 Lines • ▼ Show 20 Lines | |||||
static inline bool IsOpcodeDisabled(opcodetype opcode, uint32_t flags) { | static inline bool IsOpcodeDisabled(opcodetype opcode, uint32_t flags) { | ||||
bool fEnabledOpCodesMonolith = | bool fEnabledOpCodesMonolith = | ||||
(flags & SCRIPT_ENABLE_MONOLITH_OPCODES) != 0; | (flags & SCRIPT_ENABLE_MONOLITH_OPCODES) != 0; | ||||
if (fEnabledOpCodesMonolith) { | if (fEnabledOpCodesMonolith) { | ||||
switch (opcode) { | switch (opcode) { | ||||
case OP_CAT: | case OP_CAT: | ||||
return true; | return false; | ||||
case OP_SPLIT: | case OP_SPLIT: | ||||
return true; | return false; | ||||
case OP_BIN2NUM: | case OP_BIN2NUM: | ||||
return true; | return true; | ||||
case OP_NUM2BIN: | case OP_NUM2BIN: | ||||
return true; | return true; | ||||
case OP_AND: | case OP_AND: | ||||
▲ Show 20 Lines • Show All 521 Lines • ▼ Show 20 Lines | try { | ||||
} | } | ||||
CScriptNum bn(stacktop(-1).size()); | CScriptNum bn(stacktop(-1).size()); | ||||
stack.push_back(bn.getvch()); | stack.push_back(bn.getvch()); | ||||
} break; | } break; | ||||
// | // | ||||
// Bitwise logic | // Bitwise logic | ||||
// | // | ||||
case OP_EQUAL: | case OP_EQUAL: | ||||
case OP_EQUALVERIFY: | case OP_EQUALVERIFY: | ||||
// case OP_NOTEQUAL: // use OP_NUMNOTEQUAL | // case OP_NOTEQUAL: // use OP_NUMNOTEQUAL | ||||
{ | { | ||||
// (x1 x2 - bool) | // (x1 x2 - bool) | ||||
if (stack.size() < 2) { | if (stack.size() < 2) { | ||||
return set_error( | return set_error( | ||||
serror, SCRIPT_ERR_INVALID_STACK_OPERATION); | serror, SCRIPT_ERR_INVALID_STACK_OPERATION); | ||||
▲ Show 20 Lines • Show All 383 Lines • ▼ Show 20 Lines | try { | ||||
popstack(stack); | popstack(stack); | ||||
} else { | } else { | ||||
return set_error( | return set_error( | ||||
serror, SCRIPT_ERR_CHECKMULTISIGVERIFY); | serror, SCRIPT_ERR_CHECKMULTISIGVERIFY); | ||||
} | } | ||||
} | } | ||||
} break; | } break; | ||||
// | |||||
// Byte string operations | |||||
// | |||||
case OP_CAT: { | |||||
// (x1 x2 -- out) | |||||
if (stack.size() < 2) { | |||||
return set_error( | |||||
serror, SCRIPT_ERR_INVALID_STACK_OPERATION); | |||||
} | |||||
valtype &vch1 = stacktop(-2); | |||||
valtype &vch2 = stacktop(-1); | |||||
if (vch1.size() + vch2.size() > | |||||
MAX_SCRIPT_ELEMENT_SIZE) { | |||||
return set_error(serror, SCRIPT_ERR_PUSH_SIZE); | |||||
} | |||||
vch1.insert(vch1.end(), vch2.begin(), vch2.end()); | |||||
stack.pop_back(); | |||||
} break; | |||||
case OP_SPLIT: { | |||||
// (in position -- x1 x2) | |||||
if (stack.size() < 2) { | |||||
return set_error( | |||||
serror, SCRIPT_ERR_INVALID_STACK_OPERATION); | |||||
} | |||||
valtype vch = stacktop(-2); | |||||
int64_t nPosition = | |||||
CScriptNum(stacktop(-1), fRequireMinimal).getint(); | |||||
// if nPosition is less than 0 or is larger than the | |||||
// input then throw error | |||||
if (nPosition < 0 || | |||||
static_cast<size_t>(nPosition) > vch.size()) { | |||||
return set_error(serror, | |||||
SCRIPT_ERR_INVALID_SPLIT_RANGE); | |||||
} | |||||
stack.pop_back(); | |||||
stack.pop_back(); | |||||
// initialize outputs | |||||
if (nPosition == 0) { | |||||
stack.push_back(valtype()); | |||||
stack.push_back(vch); | |||||
} else if (static_cast<size_t>(nPosition) == | |||||
vch.size()) { | |||||
stack.push_back(vch); | |||||
stack.push_back(valtype()); | |||||
} else { | |||||
valtype vchOut1, vchOut2; | |||||
vchOut1.insert(vchOut1.end(), vch.begin(), | |||||
vch.begin() + nPosition); | |||||
vchOut2.insert(vchOut2.end(), | |||||
vch.begin() + nPosition, vch.end()); | |||||
stack.emplace_back(move(vchOut1)); | |||||
stack.emplace_back(move(vchOut2)); | |||||
} | |||||
} break; | |||||
default: | default: | ||||
return set_error(serror, SCRIPT_ERR_BAD_OPCODE); | return set_error(serror, SCRIPT_ERR_BAD_OPCODE); | ||||
} | } | ||||
} | } | ||||
// Size limits | // Size limits | ||||
if (stack.size() + altstack.size() > 1000) { | if (stack.size() + altstack.size() > 1000) { | ||||
return set_error(serror, SCRIPT_ERR_STACK_SIZE); | return set_error(serror, SCRIPT_ERR_STACK_SIZE); | ||||
▲ Show 20 Lines • Show All 445 Lines • Show Last 20 Lines |