Skip to content

Commit febe2ab

Browse files
committed
MOVEONLY: script/sign: move Satisfier declaration above Tapscript signing
We'll need the Miniscript satisfier for Tapscript too.
1 parent bd4b11e commit febe2ab

File tree

1 file changed

+92
-92
lines changed

1 file changed

+92
-92
lines changed

src/script/sign.cpp

Lines changed: 92 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,98 @@ static bool CreateTaprootScriptSig(const BaseSignatureCreator& creator, Signatur
171171
return false;
172172
}
173173

174+
template<typename M, typename K, typename V>
175+
miniscript::Availability MsLookupHelper(const M& map, const K& key, V& value)
176+
{
177+
auto it = map.find(key);
178+
if (it != map.end()) {
179+
value = it->second;
180+
return miniscript::Availability::YES;
181+
}
182+
return miniscript::Availability::NO;
183+
}
184+
185+
/**
186+
* Context for solving a Miniscript.
187+
* If enough material (access to keys, hash preimages, ..) is given, produces a valid satisfaction.
188+
*/
189+
struct Satisfier {
190+
typedef CPubKey Key;
191+
192+
const SigningProvider& m_provider;
193+
SignatureData& m_sig_data;
194+
const BaseSignatureCreator& m_creator;
195+
const CScript& m_witness_script;
196+
//! For now Miniscript is only available under P2WSH.
197+
const miniscript::MiniscriptContext m_script_ctx{miniscript::MiniscriptContext::P2WSH};
198+
199+
explicit Satisfier(const SigningProvider& provider LIFETIMEBOUND, SignatureData& sig_data LIFETIMEBOUND,
200+
const BaseSignatureCreator& creator LIFETIMEBOUND,
201+
const CScript& witscript LIFETIMEBOUND) : m_provider(provider),
202+
m_sig_data(sig_data),
203+
m_creator(creator),
204+
m_witness_script(witscript) {}
205+
206+
static bool KeyCompare(const Key& a, const Key& b) {
207+
return a < b;
208+
}
209+
210+
//! Conversion from a raw public key.
211+
template <typename I>
212+
std::optional<Key> FromPKBytes(I first, I last) const
213+
{
214+
Key pubkey{first, last};
215+
if (pubkey.IsValid()) return pubkey;
216+
return {};
217+
}
218+
219+
//! Conversion from a raw public key hash.
220+
template<typename I>
221+
std::optional<Key> FromPKHBytes(I first, I last) const {
222+
assert(last - first == 20);
223+
Key pubkey;
224+
CKeyID key_id;
225+
std::copy(first, last, key_id.begin());
226+
if (GetPubKey(m_provider, m_sig_data, key_id, pubkey)) return pubkey;
227+
m_sig_data.missing_pubkeys.push_back(key_id);
228+
return {};
229+
}
230+
231+
//! Conversion to raw public key.
232+
std::vector<unsigned char> ToPKBytes(const CPubKey& key) const { return {key.begin(), key.end()}; }
233+
234+
//! Satisfy a signature check.
235+
miniscript::Availability Sign(const CPubKey& key, std::vector<unsigned char>& sig) const {
236+
if (CreateSig(m_creator, m_sig_data, m_provider, sig, key, m_witness_script, SigVersion::WITNESS_V0)) {
237+
return miniscript::Availability::YES;
238+
}
239+
return miniscript::Availability::NO;
240+
}
241+
242+
//! Time lock satisfactions.
243+
bool CheckAfter(uint32_t value) const { return m_creator.Checker().CheckLockTime(CScriptNum(value)); }
244+
bool CheckOlder(uint32_t value) const { return m_creator.Checker().CheckSequence(CScriptNum(value)); }
245+
246+
247+
//! Hash preimage satisfactions.
248+
miniscript::Availability SatSHA256(const std::vector<unsigned char>& hash, std::vector<unsigned char>& preimage) const {
249+
return MsLookupHelper(m_sig_data.sha256_preimages, hash, preimage);
250+
}
251+
miniscript::Availability SatRIPEMD160(const std::vector<unsigned char>& hash, std::vector<unsigned char>& preimage) const {
252+
return MsLookupHelper(m_sig_data.ripemd160_preimages, hash, preimage);
253+
}
254+
miniscript::Availability SatHASH256(const std::vector<unsigned char>& hash, std::vector<unsigned char>& preimage) const {
255+
return MsLookupHelper(m_sig_data.hash256_preimages, hash, preimage);
256+
}
257+
miniscript::Availability SatHASH160(const std::vector<unsigned char>& hash, std::vector<unsigned char>& preimage) const {
258+
return MsLookupHelper(m_sig_data.hash160_preimages, hash, preimage);
259+
}
260+
261+
miniscript::MiniscriptContext MsContext() const {
262+
return m_script_ctx;
263+
}
264+
};
265+
174266
static bool SignTaprootScript(const SigningProvider& provider, const BaseSignatureCreator& creator, SignatureData& sigdata, int leaf_version, Span<const unsigned char> script_bytes, std::vector<valtype>& result)
175267
{
176268
// Only BIP342 tapscript signing is supported for now.
@@ -382,98 +474,6 @@ static CScript PushAll(const std::vector<valtype>& values)
382474
return result;
383475
}
384476

385-
template<typename M, typename K, typename V>
386-
miniscript::Availability MsLookupHelper(const M& map, const K& key, V& value)
387-
{
388-
auto it = map.find(key);
389-
if (it != map.end()) {
390-
value = it->second;
391-
return miniscript::Availability::YES;
392-
}
393-
return miniscript::Availability::NO;
394-
}
395-
396-
/**
397-
* Context for solving a Miniscript.
398-
* If enough material (access to keys, hash preimages, ..) is given, produces a valid satisfaction.
399-
*/
400-
struct Satisfier {
401-
typedef CPubKey Key;
402-
403-
const SigningProvider& m_provider;
404-
SignatureData& m_sig_data;
405-
const BaseSignatureCreator& m_creator;
406-
const CScript& m_witness_script;
407-
//! For now Miniscript is only available under P2WSH.
408-
const miniscript::MiniscriptContext m_script_ctx{miniscript::MiniscriptContext::P2WSH};
409-
410-
explicit Satisfier(const SigningProvider& provider LIFETIMEBOUND, SignatureData& sig_data LIFETIMEBOUND,
411-
const BaseSignatureCreator& creator LIFETIMEBOUND,
412-
const CScript& witscript LIFETIMEBOUND) : m_provider(provider),
413-
m_sig_data(sig_data),
414-
m_creator(creator),
415-
m_witness_script(witscript) {}
416-
417-
static bool KeyCompare(const Key& a, const Key& b) {
418-
return a < b;
419-
}
420-
421-
//! Conversion from a raw public key.
422-
template <typename I>
423-
std::optional<Key> FromPKBytes(I first, I last) const
424-
{
425-
Key pubkey{first, last};
426-
if (pubkey.IsValid()) return pubkey;
427-
return {};
428-
}
429-
430-
//! Conversion from a raw public key hash.
431-
template<typename I>
432-
std::optional<Key> FromPKHBytes(I first, I last) const {
433-
assert(last - first == 20);
434-
Key pubkey;
435-
CKeyID key_id;
436-
std::copy(first, last, key_id.begin());
437-
if (GetPubKey(m_provider, m_sig_data, key_id, pubkey)) return pubkey;
438-
m_sig_data.missing_pubkeys.push_back(key_id);
439-
return {};
440-
}
441-
442-
//! Conversion to raw public key.
443-
std::vector<unsigned char> ToPKBytes(const CPubKey& key) const { return {key.begin(), key.end()}; }
444-
445-
//! Satisfy a signature check.
446-
miniscript::Availability Sign(const CPubKey& key, std::vector<unsigned char>& sig) const {
447-
if (CreateSig(m_creator, m_sig_data, m_provider, sig, key, m_witness_script, SigVersion::WITNESS_V0)) {
448-
return miniscript::Availability::YES;
449-
}
450-
return miniscript::Availability::NO;
451-
}
452-
453-
//! Time lock satisfactions.
454-
bool CheckAfter(uint32_t value) const { return m_creator.Checker().CheckLockTime(CScriptNum(value)); }
455-
bool CheckOlder(uint32_t value) const { return m_creator.Checker().CheckSequence(CScriptNum(value)); }
456-
457-
458-
//! Hash preimage satisfactions.
459-
miniscript::Availability SatSHA256(const std::vector<unsigned char>& hash, std::vector<unsigned char>& preimage) const {
460-
return MsLookupHelper(m_sig_data.sha256_preimages, hash, preimage);
461-
}
462-
miniscript::Availability SatRIPEMD160(const std::vector<unsigned char>& hash, std::vector<unsigned char>& preimage) const {
463-
return MsLookupHelper(m_sig_data.ripemd160_preimages, hash, preimage);
464-
}
465-
miniscript::Availability SatHASH256(const std::vector<unsigned char>& hash, std::vector<unsigned char>& preimage) const {
466-
return MsLookupHelper(m_sig_data.hash256_preimages, hash, preimage);
467-
}
468-
miniscript::Availability SatHASH160(const std::vector<unsigned char>& hash, std::vector<unsigned char>& preimage) const {
469-
return MsLookupHelper(m_sig_data.hash160_preimages, hash, preimage);
470-
}
471-
472-
miniscript::MiniscriptContext MsContext() const {
473-
return m_script_ctx;
474-
}
475-
};
476-
477477
bool ProduceSignature(const SigningProvider& provider, const BaseSignatureCreator& creator, const CScript& fromPubKey, SignatureData& sigdata)
478478
{
479479
if (sigdata.complete) return true;

0 commit comments

Comments
 (0)