diff options
author | Pieter Wuille <pieter@wuille.net> | 2021-05-23 17:38:40 -0700 |
---|---|---|
committer | Pieter Wuille <pieter@wuille.net> | 2021-05-24 12:14:16 -0700 |
commit | a4bf84039c00b196b87f969acf6369d72c56ab46 (patch) | |
tree | 93acdb7aa3dadf25b60e6c165750f3dafbde7006 /src/script | |
parent | 41839bdb89b3777ece2318877b9c7921ecca2472 (diff) | |
download | bitcoin-a4bf84039c00b196b87f969acf6369d72c56ab46.tar.xz |
Separate WitnessV1Taproot variant in CTxDestination
Diffstat (limited to 'src/script')
-rw-r--r-- | src/script/descriptor.cpp | 1 | ||||
-rw-r--r-- | src/script/standard.cpp | 15 | ||||
-rw-r--r-- | src/script/standard.h | 13 |
3 files changed, 19 insertions, 10 deletions
diff --git a/src/script/descriptor.cpp b/src/script/descriptor.cpp index 19fad1009e..d4b43932b9 100644 --- a/src/script/descriptor.cpp +++ b/src/script/descriptor.cpp @@ -645,6 +645,7 @@ static std::optional<OutputType> OutputTypeFromDestination(const CTxDestination& } if (std::holds_alternative<WitnessV0KeyHash>(dest) || std::holds_alternative<WitnessV0ScriptHash>(dest) || + std::holds_alternative<WitnessV1Taproot>(dest) || std::holds_alternative<WitnessUnknown>(dest)) { return OutputType::BECH32; } diff --git a/src/script/standard.cpp b/src/script/standard.cpp index 540aa0f2d9..0a233b550a 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -242,13 +242,9 @@ bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet) return true; } case TxoutType::WITNESS_V1_TAPROOT: { - /* For now, no WitnessV1Taproot variant in CTxDestination exists, so map - * this to WitnessUnknown. */ - WitnessUnknown unk; - unk.version = 1; - std::copy(vSolutions[0].begin(), vSolutions[0].end(), unk.program); - unk.length = vSolutions[0].size(); - addressRet = unk; + WitnessV1Taproot tap; + std::copy(vSolutions[0].begin(), vSolutions[0].end(), tap.begin()); + addressRet = tap; return true; } case TxoutType::WITNESS_UNKNOWN: { @@ -337,6 +333,11 @@ public: return CScript() << OP_0 << ToByteVector(id); } + CScript operator()(const WitnessV1Taproot& tap) const + { + return CScript() << OP_1 << ToByteVector(tap); + } + CScript operator()(const WitnessUnknown& id) const { return CScript() << CScript::EncodeOP_N(id.version) << std::vector<unsigned char>(id.program, id.program + id.length); diff --git a/src/script/standard.h b/src/script/standard.h index 12ab9979a8..a96b096fa7 100644 --- a/src/script/standard.h +++ b/src/script/standard.h @@ -6,6 +6,7 @@ #ifndef BITCOIN_SCRIPT_STANDARD_H #define BITCOIN_SCRIPT_STANDARD_H +#include <pubkey.h> #include <script/interpreter.h> #include <uint256.h> #include <util/hash_type.h> @@ -113,6 +114,12 @@ struct WitnessV0KeyHash : public BaseHash<uint160> }; CKeyID ToKeyID(const WitnessV0KeyHash& key_hash); +struct WitnessV1Taproot : public XOnlyPubKey +{ + WitnessV1Taproot() : XOnlyPubKey() {} + explicit WitnessV1Taproot(const XOnlyPubKey& xpk) : XOnlyPubKey(xpk) {} +}; + //! CTxDestination subtype to encode any future Witness version struct WitnessUnknown { @@ -142,11 +149,11 @@ struct WitnessUnknown * * ScriptHash: TxoutType::SCRIPTHASH destination (P2SH) * * WitnessV0ScriptHash: TxoutType::WITNESS_V0_SCRIPTHASH destination (P2WSH) * * WitnessV0KeyHash: TxoutType::WITNESS_V0_KEYHASH destination (P2WPKH) - * * WitnessUnknown: TxoutType::WITNESS_UNKNOWN/WITNESS_V1_TAPROOT destination (P2W???) - * (taproot outputs do not require their own type as long as no wallet support exists) + * * WitnessV1Taproot: TxoutType::WITNESS_V1_TAPROOT destination (P2TR) + * * WitnessUnknown: TxoutType::WITNESS_UNKNOWN destination (P2W???) * A CTxDestination is the internal data type encoded in a bitcoin address */ -using CTxDestination = std::variant<CNoDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessUnknown>; +using CTxDestination = std::variant<CNoDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>; /** Check whether a CTxDestination is a CNoDestination. */ bool IsValidDestination(const CTxDestination& dest); |