MCPcopy Create free account
hub / github.com/ElementsProject/elements / ProduceSignature

Function ProduceSignature

src/script/sign.cpp:346–411  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

344}
345
346bool ProduceSignature(const SigningProvider& provider, const BaseSignatureCreator& creator, const CScript& fromPubKey, SignatureData& sigdata, unsigned int additional_flags)
347{
348 if (sigdata.complete) return true;
349
350 // We will already activate SIGHASH_RANGEPROOF for signing. This means that
351 // users using the flag before it activates will produce invalid signatures.
352 unsigned int signFlags = SCRIPT_SIGHASH_RANGEPROOF;
353 unsigned int verifyFlags = STANDARD_SCRIPT_VERIFY_FLAGS | SCRIPT_SIGHASH_RANGEPROOF | additional_flags;
354
355 std::vector<valtype> result;
356 TxoutType whichType;
357 bool solved = SignStep(provider, creator, fromPubKey, result, whichType, SigVersion::BASE, sigdata, signFlags);
358 bool P2SH = false;
359 CScript subscript;
360
361 if (solved && whichType == TxoutType::SCRIPTHASH)
362 {
363 // Solver returns the subscript that needs to be evaluated;
364 // the final scriptSig is the signatures from that
365 // and then the serialized subscript:
366 subscript = CScript(result[0].begin(), result[0].end());
367 sigdata.redeem_script = subscript;
368 solved = solved && SignStep(provider, creator, subscript, result, whichType, SigVersion::BASE, sigdata, signFlags) && whichType != TxoutType::SCRIPTHASH;
369 P2SH = true;
370 }
371
372 if (solved && whichType == TxoutType::WITNESS_V0_KEYHASH)
373 {
374 CScript witnessscript;
375 witnessscript << OP_DUP << OP_HASH160 << ToByteVector(result[0]) << OP_EQUALVERIFY << OP_CHECKSIG;
376 TxoutType subType;
377 solved = solved && SignStep(provider, creator, witnessscript, result, subType, SigVersion::WITNESS_V0, sigdata, signFlags);
378 sigdata.scriptWitness.stack = result;
379 sigdata.witness = true;
380 result.clear();
381 }
382 else if (solved && whichType == TxoutType::WITNESS_V0_SCRIPTHASH)
383 {
384 CScript witnessscript(result[0].begin(), result[0].end());
385 sigdata.witness_script = witnessscript;
386 TxoutType subType;
387 solved = solved && SignStep(provider, creator, witnessscript, result, subType, SigVersion::WITNESS_V0, sigdata, signFlags) && subType != TxoutType::SCRIPTHASH && subType != TxoutType::WITNESS_V0_SCRIPTHASH && subType != TxoutType::WITNESS_V0_KEYHASH;
388 result.push_back(std::vector<unsigned char>(witnessscript.begin(), witnessscript.end()));
389 sigdata.scriptWitness.stack = result;
390 sigdata.witness = true;
391 result.clear();
392 } else if (whichType == TxoutType::WITNESS_V1_TAPROOT && !P2SH) {
393 sigdata.witness = true;
394 if (solved) {
395 sigdata.scriptWitness.stack = std::move(result);
396 }
397 result.clear();
398 } else if (solved && whichType == TxoutType::WITNESS_UNKNOWN) {
399 sigdata.witness = true;
400 }
401
402 if (!sigdata.witness) sigdata.scriptWitness.stack.clear();
403 if (P2SH) {

Callers 15

MutateTxSignFunction · 0.85
UpdatePSBTOutputFunction · 0.85
SignPSBTInputFunction · 0.85
CanProvideMethod · 0.85
DummySignInputFunction · 0.85
GenericSignScriptFunction · 0.85
SignSignatureFunction · 0.85
IsSolvableFunction · 0.85
SignTransactionFunction · 0.85
BOOST_FIXTURE_TEST_CASEFunction · 0.85
CombineSignaturesFunction · 0.85

Calls 9

SignStepFunction · 0.85
ToByteVectorFunction · 0.85
VerifyScriptFunction · 0.85
CScriptClass · 0.70
PushAllFunction · 0.70
beginMethod · 0.45
endMethod · 0.45
clearMethod · 0.45
push_backMethod · 0.45

Tested by 6

BOOST_FIXTURE_TEST_CASEFunction · 0.68
CombineSignaturesFunction · 0.68
CombineSignaturesFunction · 0.68
DoCheckFunction · 0.68
FUZZ_TARGET_INITFunction · 0.68