MCPcopy Create free account
hub / github.com/BTCGPU/BTCGPU / VerifyWitnessProgram

Function VerifyWitnessProgram

src/script/interpreter.cpp:1462–1513  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1460template class GenericTransactionSignatureChecker<CMutableTransaction>;
1461
1462static bool VerifyWitnessProgram(const CScriptWitness& witness, int witversion, const std::vector<unsigned char>& program, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror)
1463{
1464 std::vector<std::vector<unsigned char> > stack;
1465 CScript scriptPubKey;
1466
1467 if (witversion == 0) {
1468 if (program.size() == WITNESS_V0_SCRIPTHASH_SIZE) {
1469 // Version 0 segregated witness program: SHA256(CScript) inside the program, CScript + inputs in witness
1470 if (witness.stack.size() == 0) {
1471 return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_WITNESS_EMPTY);
1472 }
1473 scriptPubKey = CScript(witness.stack.back().begin(), witness.stack.back().end());
1474 stack = std::vector<std::vector<unsigned char> >(witness.stack.begin(), witness.stack.end() - 1);
1475 uint256 hashScriptPubKey;
1476 CSHA256().Write(&scriptPubKey[0], scriptPubKey.size()).Finalize(hashScriptPubKey.begin());
1477 if (memcmp(hashScriptPubKey.begin(), program.data(), 32)) {
1478 return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH);
1479 }
1480 } else if (program.size() == WITNESS_V0_KEYHASH_SIZE) {
1481 // Special case for pay-to-pubkeyhash; signature + pubkey in witness
1482 if (witness.stack.size() != 2) {
1483 return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH); // 2 items in witness
1484 }
1485 scriptPubKey << OP_DUP << OP_HASH160 << program << OP_EQUALVERIFY << OP_CHECKSIG;
1486 stack = witness.stack;
1487 } else {
1488 return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_WRONG_LENGTH);
1489 }
1490 } else if (flags & SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM) {
1491 return set_error(serror, SCRIPT_ERR_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM);
1492 } else {
1493 // Higher version witness scripts return true for future softfork compatibility
1494 return set_success(serror);
1495 }
1496
1497 // Disallow stack item size > MAX_SCRIPT_ELEMENT_SIZE in witness stack
1498 for (unsigned int i = 0; i < stack.size(); i++) {
1499 if (stack.at(i).size() > MAX_SCRIPT_ELEMENT_SIZE)
1500 return set_error(serror, SCRIPT_ERR_PUSH_SIZE);
1501 }
1502
1503 if (!EvalScript(stack, scriptPubKey, flags, checker, SigVersion::WITNESS_V0, serror)) {
1504 return false;
1505 }
1506
1507 // Scripts inside witness implicitly require cleanstack behaviour
1508 if (stack.size() != 1)
1509 return set_error(serror, SCRIPT_ERR_CLEANSTACK);
1510 if (!CastToBool(stack.back()))
1511 return set_error(serror, SCRIPT_ERR_EVAL_FALSE);
1512 return true;
1513}
1514
1515bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror)
1516{

Callers 1

VerifyScriptFunction · 0.85

Calls 12

CSHA256Class · 0.85
set_successFunction · 0.85
EvalScriptFunction · 0.85
CastToBoolFunction · 0.85
set_errorFunction · 0.70
CScriptClass · 0.70
sizeMethod · 0.45
beginMethod · 0.45
endMethod · 0.45
FinalizeMethod · 0.45
WriteMethod · 0.45
dataMethod · 0.45

Tested by

no test coverage detected