mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-20 15:19:07 +01:00
miniscript: make GetStackSize() and GetOps() return optionals
The value is only set for satisfiable nodes, so it was undefined for non-satisfiable nodes. Make it clear in the interface by returning std::nullopt if the node isn't satisfiable instead of an undefined value.
This commit is contained in:
@@ -943,7 +943,8 @@ void TestNode(const NodeRef& node, FuzzedDataProvider& provider)
|
||||
assert(decoded->ToScript(PARSER_CTX) == script);
|
||||
assert(decoded->GetType() == node->GetType());
|
||||
|
||||
if (provider.ConsumeBool() && node->GetOps() < MAX_OPS_PER_SCRIPT && node->ScriptSize() < MAX_STANDARD_P2WSH_SCRIPT_SIZE) {
|
||||
const auto node_ops{node->GetOps()};
|
||||
if (provider.ConsumeBool() && node_ops && *node_ops < MAX_OPS_PER_SCRIPT && node->ScriptSize() < MAX_STANDARD_P2WSH_SCRIPT_SIZE) {
|
||||
// Optionally pad the script with OP_NOPs to max op the ops limit of the constructed script.
|
||||
// This makes the script obviously not actually miniscript-compatible anymore, but the
|
||||
// signatures constructed in this test don't commit to the script anyway, so the same
|
||||
@@ -954,7 +955,7 @@ void TestNode(const NodeRef& node, FuzzedDataProvider& provider)
|
||||
// Do not pad more than what would cause MAX_STANDARD_P2WSH_SCRIPT_SIZE to be reached, however,
|
||||
// as that also invalidates scripts.
|
||||
int add = std::min<int>(
|
||||
MAX_OPS_PER_SCRIPT - node->GetOps(),
|
||||
MAX_OPS_PER_SCRIPT - *node_ops,
|
||||
MAX_STANDARD_P2WSH_SCRIPT_SIZE - node->ScriptSize());
|
||||
for (int i = 0; i < add; ++i) script.push_back(OP_NOP);
|
||||
}
|
||||
@@ -972,7 +973,7 @@ void TestNode(const NodeRef& node, FuzzedDataProvider& provider)
|
||||
|
||||
if (nonmal_success) {
|
||||
// Non-malleable satisfactions are bounded by GetStackSize().
|
||||
assert(witness_nonmal.stack.size() <= node->GetStackSize());
|
||||
assert(witness_nonmal.stack.size() <= *node->GetStackSize());
|
||||
// If a non-malleable satisfaction exists, the malleable one must also exist, and be identical to it.
|
||||
assert(mal_success);
|
||||
assert(witness_nonmal.stack == witness_mal.stack);
|
||||
|
||||
Reference in New Issue
Block a user