MCPcopy Create free account
hub / github.com/bitcoin/bitcoin / DecomposeScript

Function DecomposeScript

src/script/miniscript.cpp:368–406  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

366}
367
368std::optional<std::vector<Opcode>> DecomposeScript(const CScript& script)
369{
370 std::vector<Opcode> out;
371 CScript::const_iterator it = script.begin(), itend = script.end();
372 while (it != itend) {
373 std::vector<unsigned char> push_data;
374 opcodetype opcode;
375 if (!script.GetOp(it, opcode, push_data)) {
376 return {};
377 } else if (opcode >= OP_1 && opcode <= OP_16) {
378 // Deal with OP_n (GetOp does not turn them into pushes).
379 push_data.assign(1, CScript::DecodeOP_N(opcode));
380 } else if (opcode == OP_CHECKSIGVERIFY) {
381 // Decompose OP_CHECKSIGVERIFY into OP_CHECKSIG OP_VERIFY
382 out.emplace_back(OP_CHECKSIG, std::vector<unsigned char>());
383 opcode = OP_VERIFY;
384 } else if (opcode == OP_CHECKMULTISIGVERIFY) {
385 // Decompose OP_CHECKMULTISIGVERIFY into OP_CHECKMULTISIG OP_VERIFY
386 out.emplace_back(OP_CHECKMULTISIG, std::vector<unsigned char>());
387 opcode = OP_VERIFY;
388 } else if (opcode == OP_EQUALVERIFY) {
389 // Decompose OP_EQUALVERIFY into OP_EQUAL OP_VERIFY
390 out.emplace_back(OP_EQUAL, std::vector<unsigned char>());
391 opcode = OP_VERIFY;
392 } else if (opcode == OP_NUMEQUALVERIFY) {
393 // Decompose OP_NUMEQUALVERIFY into OP_NUMEQUAL OP_VERIFY
394 out.emplace_back(OP_NUMEQUAL, std::vector<unsigned char>());
395 opcode = OP_VERIFY;
396 } else if (IsPushdataOp(opcode)) {
397 if (!CheckMinimalPush(push_data, opcode)) return {};
398 } else if (it != itend && (opcode == OP_CHECKSIG || opcode == OP_CHECKMULTISIG || opcode == OP_EQUAL || opcode == OP_NUMEQUAL) && (*it == OP_VERIFY)) {
399 // Rule out non minimal VERIFY sequences
400 return {};
401 }
402 out.emplace_back(opcode, std::move(push_data));
403 }
404 std::reverse(out.begin(), out.end());
405 return out;
406}
407
408std::optional<int64_t> ParseScriptNumber(const Opcode& in) {
409 if (in.first == OP_0) {

Callers 1

FromScriptFunction · 0.85

Calls 7

IsPushdataOpFunction · 0.85
CheckMinimalPushFunction · 0.85
GetOpMethod · 0.80
beginMethod · 0.45
endMethod · 0.45
assignMethod · 0.45
emplace_backMethod · 0.45

Tested by

no test coverage detected