Changeset View
Changeset View
Standalone View
Standalone View
src/script/interpreter.cpp
Show First 20 Lines • Show All 905 Lines • ▼ Show 20 Lines | try { | ||||
popstack(stack); | popstack(stack); | ||||
} else { | } else { | ||||
return set_error(serror, | return set_error(serror, | ||||
SCRIPT_ERR_CHECKSIGVERIFY); | SCRIPT_ERR_CHECKSIGVERIFY); | ||||
} | } | ||||
} | } | ||||
} break; | } break; | ||||
case OP_CHECKDATASIG: | |||||
case OP_CHECKDATASIGVERIFY: { | |||||
// Make sure this remains an error before activation. | |||||
if ((flags & SCRIPT_ENABLE_CHECKDATASIG) == 0) { | |||||
return set_error(serror, SCRIPT_ERR_BAD_OPCODE); | |||||
} | |||||
// (sig message pubkey -- bool) | |||||
if (stack.size() < 3) { | |||||
return set_error( | |||||
serror, SCRIPT_ERR_INVALID_STACK_OPERATION); | |||||
} | |||||
valtype &vchSig = stacktop(-3); | |||||
valtype &vchMessage = stacktop(-2); | |||||
valtype &vchPubKey = stacktop(-1); | |||||
// The size of the message must be 32 bytes. | |||||
if (vchMessage.size() != 32) { | |||||
return set_error(serror, | |||||
SCRIPT_ERR_INVALID_OPERAND_SIZE); | |||||
} | |||||
if (!CheckDataSignatureEncoding(vchSig, flags, | |||||
serror) || | |||||
!CheckPubKeyEncoding(vchPubKey, flags, serror)) { | |||||
// serror is set | |||||
return false; | |||||
} | |||||
bool fSuccess = false; | |||||
if (vchSig.size()) { | |||||
uint256 message(vchMessage); | |||||
CPubKey pubkey(vchPubKey); | |||||
fSuccess = pubkey.Verify(message, vchSig); | |||||
} | |||||
if (!fSuccess && (flags & SCRIPT_VERIFY_NULLFAIL) && | |||||
vchSig.size()) { | |||||
return set_error(serror, SCRIPT_ERR_SIG_NULLFAIL); | |||||
} | |||||
popstack(stack); | |||||
popstack(stack); | |||||
popstack(stack); | |||||
stack.push_back(fSuccess ? vchTrue : vchFalse); | |||||
if (opcode == OP_CHECKDATASIGVERIFY) { | |||||
if (fSuccess) { | |||||
popstack(stack); | |||||
} else { | |||||
return set_error(serror, | |||||
SCRIPT_ERR_CHECKDATASIGVERIFY); | |||||
} | |||||
} | |||||
} 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; | int i = 1; | ||||
if ((int)stack.size() < i) { | if ((int)stack.size() < i) { | ||||
return set_error( | return set_error( | ||||
▲ Show 20 Lines • Show All 118 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; | ||||
case OP_CHECKDATASIG: | |||||
case OP_CHECKDATASIGVERIFY: | |||||
return set_error(serror, SCRIPT_ERR_BAD_OPCODE); | |||||
// | // | ||||
// Byte string operations | // Byte string operations | ||||
// | // | ||||
case OP_CAT: { | case OP_CAT: { | ||||
// (x1 x2 -- out) | // (x1 x2 -- out) | ||||
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 556 Lines • Show Last 20 Lines |