mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-10 10:52:31 -05:00
Add XOnlyPubKey::CreateTapTweak
This commit is contained in:
parent
2fbfb1becb
commit
5f6cc8daa8
2 changed files with 22 additions and 0 deletions
|
@ -209,6 +209,24 @@ bool XOnlyPubKey::CheckTapTweak(const XOnlyPubKey& internal, const uint256& merk
|
||||||
return secp256k1_xonly_pubkey_tweak_add_check(secp256k1_context_verify, m_keydata.begin(), parity, &internal_key, tweak.begin());
|
return secp256k1_xonly_pubkey_tweak_add_check(secp256k1_context_verify, m_keydata.begin(), parity, &internal_key, tweak.begin());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::optional<std::pair<XOnlyPubKey, bool>> XOnlyPubKey::CreateTapTweak(const uint256* merkle_root) const
|
||||||
|
{
|
||||||
|
secp256k1_xonly_pubkey base_point;
|
||||||
|
if (!secp256k1_xonly_pubkey_parse(secp256k1_context_verify, &base_point, data())) return std::nullopt;
|
||||||
|
secp256k1_pubkey out;
|
||||||
|
uint256 tweak = ComputeTapTweakHash(merkle_root);
|
||||||
|
if (!secp256k1_xonly_pubkey_tweak_add(secp256k1_context_verify, &out, &base_point, tweak.data())) return std::nullopt;
|
||||||
|
int parity = -1;
|
||||||
|
std::pair<XOnlyPubKey, bool> ret;
|
||||||
|
secp256k1_xonly_pubkey out_xonly;
|
||||||
|
if (!secp256k1_xonly_pubkey_from_pubkey(secp256k1_context_verify, &out_xonly, &parity, &out)) return std::nullopt;
|
||||||
|
secp256k1_xonly_pubkey_serialize(secp256k1_context_verify, ret.first.begin(), &out_xonly);
|
||||||
|
assert(parity == 0 || parity == 1);
|
||||||
|
ret.second = parity;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool CPubKey::Verify(const uint256 &hash, const std::vector<unsigned char>& vchSig) const {
|
bool CPubKey::Verify(const uint256 &hash, const std::vector<unsigned char>& vchSig) const {
|
||||||
if (!IsValid())
|
if (!IsValid())
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <uint256.h>
|
#include <uint256.h>
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <optional>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
const unsigned int BIP32_EXTKEY_SIZE = 74;
|
const unsigned int BIP32_EXTKEY_SIZE = 74;
|
||||||
|
@ -251,6 +252,9 @@ public:
|
||||||
* Merkle root, and parity. */
|
* Merkle root, and parity. */
|
||||||
bool CheckTapTweak(const XOnlyPubKey& internal, const uint256& merkle_root, bool parity) const;
|
bool CheckTapTweak(const XOnlyPubKey& internal, const uint256& merkle_root, bool parity) const;
|
||||||
|
|
||||||
|
/** Construct a Taproot tweaked output point with this point as internal key. */
|
||||||
|
std::optional<std::pair<XOnlyPubKey, bool>> CreateTapTweak(const uint256* merkle_root) const;
|
||||||
|
|
||||||
const unsigned char& operator[](int pos) const { return *(m_keydata.begin() + pos); }
|
const unsigned char& operator[](int pos) const { return *(m_keydata.begin() + pos); }
|
||||||
const unsigned char* data() const { return m_keydata.begin(); }
|
const unsigned char* data() const { return m_keydata.begin(); }
|
||||||
static constexpr size_t size() { return decltype(m_keydata)::size(); }
|
static constexpr size_t size() { return decltype(m_keydata)::size(); }
|
||||||
|
|
Loading…
Add table
Reference in a new issue