Bitcoin Core  26.1.0
P2P Digital Currency
addresstype.h
Go to the documentation of this file.
1 // Copyright (c) 2023 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or https://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef BITCOIN_ADDRESSTYPE_H
6 #define BITCOIN_ADDRESSTYPE_H
7 
8 #include <pubkey.h>
9 #include <script/script.h>
10 #include <uint256.h>
11 #include <util/hash_type.h>
12 
13 #include <variant>
14 #include <algorithm>
15 
17 {
18 private:
20 
21 public:
22  CNoDestination() = default;
23  explicit CNoDestination(const CScript& script) : m_script(script) {}
24 
25  const CScript& GetScript() const LIFETIMEBOUND { return m_script; }
26 
27  friend bool operator==(const CNoDestination& a, const CNoDestination& b) { return a.GetScript() == b.GetScript(); }
28  friend bool operator<(const CNoDestination& a, const CNoDestination& b) { return a.GetScript() < b.GetScript(); }
29 };
30 
32 private:
34 
35 public:
36  explicit PubKeyDestination(const CPubKey& pubkey) : m_pubkey(pubkey) {}
37 
38  const CPubKey& GetPubKey() const LIFETIMEBOUND { return m_pubkey; }
39 
40  friend bool operator==(const PubKeyDestination& a, const PubKeyDestination& b) { return a.GetPubKey() == b.GetPubKey(); }
41  friend bool operator<(const PubKeyDestination& a, const PubKeyDestination& b) { return a.GetPubKey() < b.GetPubKey(); }
42 };
43 
44 struct PKHash : public BaseHash<uint160>
45 {
46  PKHash() : BaseHash() {}
47  explicit PKHash(const uint160& hash) : BaseHash(hash) {}
48  explicit PKHash(const CPubKey& pubkey);
49  explicit PKHash(const CKeyID& pubkey_id);
50 };
51 CKeyID ToKeyID(const PKHash& key_hash);
52 
53 struct WitnessV0KeyHash;
54 
55 struct ScriptHash : public BaseHash<uint160>
56 {
58  // These don't do what you'd expect.
59  // Use ScriptHash(GetScriptForDestination(...)) instead.
60  explicit ScriptHash(const WitnessV0KeyHash& hash) = delete;
61  explicit ScriptHash(const PKHash& hash) = delete;
62 
63  explicit ScriptHash(const uint160& hash) : BaseHash(hash) {}
64  explicit ScriptHash(const CScript& script);
65  explicit ScriptHash(const CScriptID& script);
66 };
67 CScriptID ToScriptID(const ScriptHash& script_hash);
68 
69 struct WitnessV0ScriptHash : public BaseHash<uint256>
70 {
72  explicit WitnessV0ScriptHash(const uint256& hash) : BaseHash(hash) {}
73  explicit WitnessV0ScriptHash(const CScript& script);
74 };
75 
76 struct WitnessV0KeyHash : public BaseHash<uint160>
77 {
79  explicit WitnessV0KeyHash(const uint160& hash) : BaseHash(hash) {}
80  explicit WitnessV0KeyHash(const CPubKey& pubkey);
81  explicit WitnessV0KeyHash(const PKHash& pubkey_hash);
82 };
83 CKeyID ToKeyID(const WitnessV0KeyHash& key_hash);
84 
86 {
88  explicit WitnessV1Taproot(const XOnlyPubKey& xpk) : XOnlyPubKey(xpk) {}
89 };
90 
93 {
94 private:
95  unsigned int m_version;
96  std::vector<unsigned char> m_program;
97 
98 public:
99  WitnessUnknown(unsigned int version, const std::vector<unsigned char>& program) : m_version(version), m_program(program) {}
100  WitnessUnknown(int version, const std::vector<unsigned char>& program) : m_version(static_cast<unsigned int>(version)), m_program(program) {}
101 
102  unsigned int GetWitnessVersion() const { return m_version; }
103  const std::vector<unsigned char>& GetWitnessProgram() const LIFETIMEBOUND { return m_program; }
104 
105  friend bool operator==(const WitnessUnknown& w1, const WitnessUnknown& w2) {
106  if (w1.GetWitnessVersion() != w2.GetWitnessVersion()) return false;
107  return w1.GetWitnessProgram() == w2.GetWitnessProgram();
108  }
109 
110  friend bool operator<(const WitnessUnknown& w1, const WitnessUnknown& w2) {
111  if (w1.GetWitnessVersion() < w2.GetWitnessVersion()) return true;
112  if (w1.GetWitnessVersion() > w2.GetWitnessVersion()) return false;
113  return w1.GetWitnessProgram() < w2.GetWitnessProgram();
114  }
115 };
116 
129 using CTxDestination = std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>;
130 
132 bool IsValidDestination(const CTxDestination& dest);
133 
144 bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet);
145 
152 
153 #endif // BITCOIN_ADDRESSTYPE_H
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a scriptPubKey for the destination.
Definition: addresstype.cpp:49
CKeyID ToKeyID(const PKHash &key_hash)
Definition: addresstype.cpp:29
const CScript & GetScript() const LIFETIMEBOUND
Definition: addresstype.h:25
WitnessV0KeyHash(const uint160 &hash)
Definition: addresstype.h:79
unsigned int GetWitnessVersion() const
Definition: addresstype.h:102
const std::vector< unsigned char > & GetWitnessProgram() const LIFETIMEBOUND
Definition: addresstype.h:103
friend bool operator<(const PubKeyDestination &a, const PubKeyDestination &b)
Definition: addresstype.h:41
CNoDestination(const CScript &script)
Definition: addresstype.h:23
std::vector< unsigned char > m_program
Definition: addresstype.h:96
CScriptID ToScriptID(const ScriptHash &script_hash)
Definition: addresstype.cpp:39
friend bool operator==(const CNoDestination &a, const CNoDestination &b)
Definition: addresstype.h:27
CNoDestination()=default
friend bool operator<(const CNoDestination &a, const CNoDestination &b)
Definition: addresstype.h:28
friend bool operator==(const PubKeyDestination &a, const PubKeyDestination &b)
Definition: addresstype.h:40
#define LIFETIMEBOUND
Definition: attributes.h:16
WitnessV1Taproot(const XOnlyPubKey &xpk)
Definition: addresstype.h:88
CTxDestination subtype to encode any future Witness version.
Definition: addresstype.h:92
An encapsulated public key.
Definition: pubkey.h:33
PKHash(const uint160 &hash)
Definition: addresstype.h:47
unsigned int m_version
Definition: addresstype.h:95
WitnessV0ScriptHash(const uint256 &hash)
Definition: addresstype.h:72
PubKeyDestination(const CPubKey &pubkey)
Definition: addresstype.h:36
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
Definition: addresstype.h:129
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
256-bit opaque blob.
Definition: uint256.h:106
CScript m_script
Definition: addresstype.h:19
friend bool operator==(const WitnessUnknown &w1, const WitnessUnknown &w2)
Definition: addresstype.h:105
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:412
A reference to a CKey: the Hash160 of its serialized public key.
Definition: pubkey.h:23
160-bit opaque blob.
Definition: uint256.h:95
friend bool operator<(const WitnessUnknown &w1, const WitnessUnknown &w2)
Definition: addresstype.h:110
const CPubKey & GetPubKey() const LIFETIMEBOUND
Definition: addresstype.h:38
A reference to a CScript: the Hash160 of its serialization.
Definition: script.h:581
WitnessUnknown(unsigned int version, const std::vector< unsigned char > &program)
Definition: addresstype.h:99
WitnessUnknown(int version, const std::vector< unsigned char > &program)
Definition: addresstype.h:100
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination corresponds to one with an address.
ScriptHash(const uint160 &hash)
Definition: addresstype.h:63
PKHash()
Definition: addresstype.h:46