Changeset View
Changeset View
Standalone View
Standalone View
src/script/interpreter.cpp
Show First 20 Lines • Show All 958 Lines • ▼ Show 20 Lines | try { | ||||
} | } | ||||
} break; | } break; | ||||
case OP_CHECKMULTISIG: | case OP_CHECKMULTISIG: | ||||
case OP_CHECKMULTISIGVERIFY: { | case OP_CHECKMULTISIGVERIFY: { | ||||
// ([sig ...] num_of_signatures [pubkey ...] | // ([sig ...] num_of_signatures [pubkey ...] | ||||
// num_of_pubkeys -- bool) | // num_of_pubkeys -- bool) | ||||
int i = 1; | size_t i = 1; | ||||
if ((int)stack.size() < i) { | if (stack.size() < i) { | ||||
return set_error( | return set_error( | ||||
serror, SCRIPT_ERR_INVALID_STACK_OPERATION); | serror, SCRIPT_ERR_INVALID_STACK_OPERATION); | ||||
} | } | ||||
int nKeysCount = | int nKeysCount = | ||||
CScriptNum(stacktop(-i), fRequireMinimal).getint(); | CScriptNum(stacktop(-i), fRequireMinimal).getint(); | ||||
if (nKeysCount < 0 || | if (nKeysCount < 0 || | ||||
nKeysCount > MAX_PUBKEYS_PER_MULTISIG) { | nKeysCount > MAX_PUBKEYS_PER_MULTISIG) { | ||||
return set_error(serror, SCRIPT_ERR_PUBKEY_COUNT); | return set_error(serror, SCRIPT_ERR_PUBKEY_COUNT); | ||||
} | } | ||||
nOpCount += nKeysCount; | nOpCount += nKeysCount; | ||||
if (nOpCount > MAX_OPS_PER_SCRIPT) { | if (nOpCount > MAX_OPS_PER_SCRIPT) { | ||||
return set_error(serror, SCRIPT_ERR_OP_COUNT); | return set_error(serror, SCRIPT_ERR_OP_COUNT); | ||||
} | } | ||||
int ikey = ++i; | size_t ikey = ++i; | ||||
// ikey2 is the position of last non-signature item in | // ikey2 is the position of last non-signature item in | ||||
// the stack. Top stack item = 1. With | // the stack. Top stack item = 1. With | ||||
// SCRIPT_VERIFY_NULLFAIL, this is used for cleanup if | // SCRIPT_VERIFY_NULLFAIL, this is used for cleanup if | ||||
// operation fails. | // operation fails. | ||||
int ikey2 = nKeysCount + 2; | size_t ikey2 = nKeysCount + 2; | ||||
i += nKeysCount; | i += nKeysCount; | ||||
if ((int)stack.size() < i) { | if (stack.size() < i) { | ||||
return set_error( | return set_error( | ||||
serror, SCRIPT_ERR_INVALID_STACK_OPERATION); | serror, SCRIPT_ERR_INVALID_STACK_OPERATION); | ||||
} | } | ||||
int nSigsCount = | int nSigsCount = | ||||
CScriptNum(stacktop(-i), fRequireMinimal).getint(); | CScriptNum(stacktop(-i), fRequireMinimal).getint(); | ||||
if (nSigsCount < 0 || nSigsCount > nKeysCount) { | if (nSigsCount < 0 || nSigsCount > nKeysCount) { | ||||
return set_error(serror, SCRIPT_ERR_SIG_COUNT); | return set_error(serror, SCRIPT_ERR_SIG_COUNT); | ||||
} | } | ||||
int isig = ++i; | size_t isig = ++i; | ||||
i += nSigsCount; | i += nSigsCount; | ||||
if ((int)stack.size() < i) { | if (stack.size() < i) { | ||||
return set_error( | return set_error( | ||||
serror, SCRIPT_ERR_INVALID_STACK_OPERATION); | serror, SCRIPT_ERR_INVALID_STACK_OPERATION); | ||||
} | } | ||||
// Subset of script starting at the most recent | // Subset of script starting at the most recent | ||||
// codeseparator | // codeseparator | ||||
CScript scriptCode(pbegincodehash, pend); | CScript scriptCode(pbegincodehash, pend); | ||||
▲ Show 20 Lines • Show All 661 Lines • Show Last 20 Lines |