Bitcoin Core  25.99.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 private:
19 
20 public:
21  CNoDestination() = default;
22  CNoDestination(const CScript& script) : m_script(script) {}
23 
24  const CScript& GetScript() const { return m_script; }
25 
26  friend bool operator==(const CNoDestination& a, const CNoDestination& b) { return a.GetScript() == b.GetScript(); }
27  friend bool operator<(const CNoDestination& a, const CNoDestination& b) { return a.GetScript() < b.GetScript(); }
28 };
29 
31 private:
33 
34 public:
35  PubKeyDestination(const CPubKey& pubkey) : m_pubkey(pubkey) {}
36 
37  const CPubKey& GetPubKey() const LIFETIMEBOUND { return m_pubkey; }
38 
39  friend bool operator==(const PubKeyDestination& a, const PubKeyDestination& b) { return a.GetPubKey() == b.GetPubKey(); }
40  friend bool operator<(const PubKeyDestination& a, const PubKeyDestination& b) { return a.GetPubKey() < b.GetPubKey(); }
41 };
42 
43 struct PKHash : public BaseHash<uint160>
44 {
45  PKHash() : BaseHash() {}
46  explicit PKHash(const uint160& hash) : BaseHash(hash) {}
47  explicit PKHash(const CPubKey& pubkey);
48  explicit PKHash(const CKeyID& pubkey_id);
49 };
50 CKeyID ToKeyID(const PKHash& key_hash);
51 
52 struct WitnessV0KeyHash;
53 
54 struct ScriptHash : public BaseHash<uint160>
55 {
57  // These don't do what you'd expect.
58  // Use ScriptHash(GetScriptForDestination(...)) instead.
59  explicit ScriptHash(const WitnessV0KeyHash& hash) = delete;
60  explicit ScriptHash(const PKHash& hash) = delete;
61 
62  explicit ScriptHash(const uint160& hash) : BaseHash(hash) {}
63  explicit ScriptHash(const CScript& script);
64  explicit ScriptHash(const CScriptID& script);
65 };
66 CScriptID ToScriptID(const ScriptHash& script_hash);
67 
68 struct WitnessV0ScriptHash : public BaseHash<uint256>
69 {
71  explicit WitnessV0ScriptHash(const uint256& hash) : BaseHash(hash) {}
72  explicit WitnessV0ScriptHash(const CScript& script);
73 };
74 
75 struct WitnessV0KeyHash : public BaseHash<uint160>
76 {
78  explicit WitnessV0KeyHash(const uint160& hash) : BaseHash(hash) {}
79  explicit WitnessV0KeyHash(const CPubKey& pubkey);
80  explicit WitnessV0KeyHash(const PKHash& pubkey_hash);
81 };
82 CKeyID ToKeyID(const WitnessV0KeyHash& key_hash);
83 
85 {
87  explicit WitnessV1Taproot(const XOnlyPubKey& xpk) : XOnlyPubKey(xpk) {}
88 };
89 
92 {
93 private:
94  unsigned int m_version;
95  std::vector<unsigned char> m_program;
96 
97 public:
98  WitnessUnknown(unsigned int version, const std::vector<unsigned char>& program) : m_version(version), m_program(program) {}
99  WitnessUnknown(int version, const std::vector<unsigned char>& program) : m_version(static_cast<unsigned int>(version)), m_program(program) {}
100 
101  unsigned int GetWitnessVersion() const { return m_version; }
102  const std::vector<unsigned char>& GetWitnessProgram() const LIFETIMEBOUND { return m_program; }
103 
104  friend bool operator==(const WitnessUnknown& w1, const WitnessUnknown& w2) {
105  if (w1.GetWitnessVersion() != w2.GetWitnessVersion()) return false;
106  return w1.GetWitnessProgram() == w2.GetWitnessProgram();
107  }
108 
109  friend bool operator<(const WitnessUnknown& w1, const WitnessUnknown& w2) {
110  if (w1.GetWitnessVersion() < w2.GetWitnessVersion()) return true;
111  if (w1.GetWitnessVersion() > w2.GetWitnessVersion()) return false;
112  return w1.GetWitnessProgram() < w2.GetWitnessProgram();
113  }
114 };
115 
128 using CTxDestination = std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>;
129 
131 bool IsValidDestination(const CTxDestination& dest);
132 
143 bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet);
144 
151 
152 #endif // BITCOIN_ADDRESSTYPE_H
CScriptID ToScriptID(const ScriptHash &script_hash)
Definition: addresstype.cpp:39
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
Definition: addresstype.h:128
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a scriptPubKey for the destination.
Definition: addresstype.cpp:49
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination corresponds to one with an address.
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
CKeyID ToKeyID(const PKHash &key_hash)
Definition: addresstype.cpp:29
#define LIFETIMEBOUND
Definition: attributes.h:16
A reference to a CKey: the Hash160 of its serialized public key.
Definition: pubkey.h:24
friend bool operator<(const CNoDestination &a, const CNoDestination &b)
Definition: addresstype.h:27
friend bool operator==(const CNoDestination &a, const CNoDestination &b)
Definition: addresstype.h:26
CScript m_script
Definition: addresstype.h:18
CNoDestination(const CScript &script)
Definition: addresstype.h:22
const CScript & GetScript() const
Definition: addresstype.h:24
CNoDestination()=default
An encapsulated public key.
Definition: pubkey.h:34
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:413
A reference to a CScript: the Hash160 of its serialization.
Definition: script.h:582
160-bit opaque blob.
Definition: uint256.h:95
256-bit opaque blob.
Definition: uint256.h:106
PKHash(const uint160 &hash)
Definition: addresstype.h:46
PKHash()
Definition: addresstype.h:45
friend bool operator<(const PubKeyDestination &a, const PubKeyDestination &b)
Definition: addresstype.h:40
const CPubKey & GetPubKey() const LIFETIMEBOUND
Definition: addresstype.h:37
PubKeyDestination(const CPubKey &pubkey)
Definition: addresstype.h:35
friend bool operator==(const PubKeyDestination &a, const PubKeyDestination &b)
Definition: addresstype.h:39
ScriptHash(const WitnessV0KeyHash &hash)=delete
ScriptHash(const uint160 &hash)
Definition: addresstype.h:62
ScriptHash(const PKHash &hash)=delete
CTxDestination subtype to encode any future Witness version.
Definition: addresstype.h:92
WitnessUnknown(int version, const std::vector< unsigned char > &program)
Definition: addresstype.h:99
WitnessUnknown(unsigned int version, const std::vector< unsigned char > &program)
Definition: addresstype.h:98
friend bool operator<(const WitnessUnknown &w1, const WitnessUnknown &w2)
Definition: addresstype.h:109
unsigned int m_version
Definition: addresstype.h:94
unsigned int GetWitnessVersion() const
Definition: addresstype.h:101
const std::vector< unsigned char > & GetWitnessProgram() const LIFETIMEBOUND
Definition: addresstype.h:102
std::vector< unsigned char > m_program
Definition: addresstype.h:95
friend bool operator==(const WitnessUnknown &w1, const WitnessUnknown &w2)
Definition: addresstype.h:104
WitnessV0KeyHash(const uint160 &hash)
Definition: addresstype.h:78
WitnessV0ScriptHash(const uint256 &hash)
Definition: addresstype.h:71
WitnessV1Taproot(const XOnlyPubKey &xpk)
Definition: addresstype.h:87