Bitcoin Core  27.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 <attributes.h>
9 #include <pubkey.h>
10 #include <script/script.h>
11 #include <uint256.h>
12 #include <util/hash_type.h>
13 
14 #include <algorithm>
15 #include <variant>
16 #include <vector>
17 
19 {
20 private:
22 
23 public:
24  CNoDestination() = default;
25  explicit CNoDestination(const CScript& script) : m_script(script) {}
26 
27  const CScript& GetScript() const LIFETIMEBOUND { return m_script; }
28 
29  friend bool operator==(const CNoDestination& a, const CNoDestination& b) { return a.GetScript() == b.GetScript(); }
30  friend bool operator<(const CNoDestination& a, const CNoDestination& b) { return a.GetScript() < b.GetScript(); }
31 };
32 
34 private:
36 
37 public:
38  explicit PubKeyDestination(const CPubKey& pubkey) : m_pubkey(pubkey) {}
39 
40  const CPubKey& GetPubKey() const LIFETIMEBOUND { return m_pubkey; }
41 
42  friend bool operator==(const PubKeyDestination& a, const PubKeyDestination& b) { return a.GetPubKey() == b.GetPubKey(); }
43  friend bool operator<(const PubKeyDestination& a, const PubKeyDestination& b) { return a.GetPubKey() < b.GetPubKey(); }
44 };
45 
46 struct PKHash : public BaseHash<uint160>
47 {
48  PKHash() : BaseHash() {}
49  explicit PKHash(const uint160& hash) : BaseHash(hash) {}
50  explicit PKHash(const CPubKey& pubkey);
51  explicit PKHash(const CKeyID& pubkey_id);
52 };
53 CKeyID ToKeyID(const PKHash& key_hash);
54 
55 struct WitnessV0KeyHash;
56 
57 struct ScriptHash : public BaseHash<uint160>
58 {
60  // These don't do what you'd expect.
61  // Use ScriptHash(GetScriptForDestination(...)) instead.
62  explicit ScriptHash(const WitnessV0KeyHash& hash) = delete;
63  explicit ScriptHash(const PKHash& hash) = delete;
64 
65  explicit ScriptHash(const uint160& hash) : BaseHash(hash) {}
66  explicit ScriptHash(const CScript& script);
67  explicit ScriptHash(const CScriptID& script);
68 };
69 CScriptID ToScriptID(const ScriptHash& script_hash);
70 
71 struct WitnessV0ScriptHash : public BaseHash<uint256>
72 {
74  explicit WitnessV0ScriptHash(const uint256& hash) : BaseHash(hash) {}
75  explicit WitnessV0ScriptHash(const CScript& script);
76 };
77 
78 struct WitnessV0KeyHash : public BaseHash<uint160>
79 {
81  explicit WitnessV0KeyHash(const uint160& hash) : BaseHash(hash) {}
82  explicit WitnessV0KeyHash(const CPubKey& pubkey);
83  explicit WitnessV0KeyHash(const PKHash& pubkey_hash);
84 };
85 CKeyID ToKeyID(const WitnessV0KeyHash& key_hash);
86 
88 {
90  explicit WitnessV1Taproot(const XOnlyPubKey& xpk) : XOnlyPubKey(xpk) {}
91 };
92 
95 {
96 private:
97  unsigned int m_version;
98  std::vector<unsigned char> m_program;
99 
100 public:
101  WitnessUnknown(unsigned int version, const std::vector<unsigned char>& program) : m_version(version), m_program(program) {}
102  WitnessUnknown(int version, const std::vector<unsigned char>& program) : m_version(static_cast<unsigned int>(version)), m_program(program) {}
103 
104  unsigned int GetWitnessVersion() const { return m_version; }
105  const std::vector<unsigned char>& GetWitnessProgram() const LIFETIMEBOUND { return m_program; }
106 
107  friend bool operator==(const WitnessUnknown& w1, const WitnessUnknown& w2) {
108  if (w1.GetWitnessVersion() != w2.GetWitnessVersion()) return false;
109  return w1.GetWitnessProgram() == w2.GetWitnessProgram();
110  }
111 
112  friend bool operator<(const WitnessUnknown& w1, const WitnessUnknown& w2) {
113  if (w1.GetWitnessVersion() < w2.GetWitnessVersion()) return true;
114  if (w1.GetWitnessVersion() > w2.GetWitnessVersion()) return false;
115  return w1.GetWitnessProgram() < w2.GetWitnessProgram();
116  }
117 };
118 
131 using CTxDestination = std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>;
132 
134 bool IsValidDestination(const CTxDestination& dest);
135 
146 bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet);
147 
154 
155 #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:131
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:30
friend bool operator==(const CNoDestination &a, const CNoDestination &b)
Definition: addresstype.h:29
CScript m_script
Definition: addresstype.h:21
CNoDestination(const CScript &script)
Definition: addresstype.h:25
CNoDestination()=default
const CScript & GetScript() const LIFETIMEBOUND
Definition: addresstype.h:27
An encapsulated public key.
Definition: pubkey.h:34
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:414
A reference to a CScript: the Hash160 of its serialization.
Definition: script.h:583
160-bit opaque blob.
Definition: uint256.h:95
256-bit opaque blob.
Definition: uint256.h:106
PKHash(const uint160 &hash)
Definition: addresstype.h:49
PKHash()
Definition: addresstype.h:48
friend bool operator<(const PubKeyDestination &a, const PubKeyDestination &b)
Definition: addresstype.h:43
const CPubKey & GetPubKey() const LIFETIMEBOUND
Definition: addresstype.h:40
PubKeyDestination(const CPubKey &pubkey)
Definition: addresstype.h:38
friend bool operator==(const PubKeyDestination &a, const PubKeyDestination &b)
Definition: addresstype.h:42
ScriptHash(const WitnessV0KeyHash &hash)=delete
ScriptHash(const uint160 &hash)
Definition: addresstype.h:65
ScriptHash(const PKHash &hash)=delete
CTxDestination subtype to encode any future Witness version.
Definition: addresstype.h:95
WitnessUnknown(int version, const std::vector< unsigned char > &program)
Definition: addresstype.h:102
WitnessUnknown(unsigned int version, const std::vector< unsigned char > &program)
Definition: addresstype.h:101
friend bool operator<(const WitnessUnknown &w1, const WitnessUnknown &w2)
Definition: addresstype.h:112
unsigned int m_version
Definition: addresstype.h:97
unsigned int GetWitnessVersion() const
Definition: addresstype.h:104
const std::vector< unsigned char > & GetWitnessProgram() const LIFETIMEBOUND
Definition: addresstype.h:105
std::vector< unsigned char > m_program
Definition: addresstype.h:98
friend bool operator==(const WitnessUnknown &w1, const WitnessUnknown &w2)
Definition: addresstype.h:107
WitnessV0KeyHash(const uint160 &hash)
Definition: addresstype.h:81
WitnessV0ScriptHash(const uint256 &hash)
Definition: addresstype.h:74
WitnessV1Taproot(const XOnlyPubKey &xpk)
Definition: addresstype.h:90