From 639e3b6c9759a7a582c5c86fdbfa5ea99cb7bb16 Mon Sep 17 00:00:00 2001 From: Antoine Poinsot Date: Sat, 1 Jul 2023 11:59:11 +0200 Subject: [PATCH] descriptor: refuse to parse unspendable miniscript descriptors It's possible for some unsatisfiable miniscripts to be considered sane. Make sure we refuse to import those, as they would be unspendable. --- src/script/descriptor.cpp | 6 ++++-- src/script/miniscript.h | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/script/descriptor.cpp b/src/script/descriptor.cpp index b8ade1684ab..787bf43127d 100644 --- a/src/script/descriptor.cpp +++ b/src/script/descriptor.cpp @@ -1541,14 +1541,14 @@ std::unique_ptr ParseScript(uint32_t& key_exp_index, SpanIsSane()) { + if (!node->IsSane() || node->IsNotSatisfiable()) { // Try to find the first insane sub for better error reporting. auto insane_node = node.get(); if (const auto sub = node->FindInsaneSub()) insane_node = sub; if (const auto str = insane_node->ToString(parser)) error = *str; if (!insane_node->IsValid()) { error += " is invalid"; - } else { + } else if (!node->IsSane()) { error += " is not sane"; if (!insane_node->IsNonMalleable()) { error += ": malleable witnesses exist"; @@ -1561,6 +1561,8 @@ std::unique_ptr ParseScript(uint32_t& key_exp_index, SpanValidSatisfactions()) { error += ": needs witnesses that may exceed resource limits"; } + } else { + error += " is not satisfiable"; } return nullptr; } diff --git a/src/script/miniscript.h b/src/script/miniscript.h index 919e2b9f646..b58740a125a 100644 --- a/src/script/miniscript.h +++ b/src/script/miniscript.h @@ -1161,6 +1161,9 @@ public: return true; } + //! Whether no satisfaction exists for this node. + bool IsNotSatisfiable() const { return !GetStackSize(); } + //! Return the expression type. Type GetType() const { return typ; }