Bitcoin ABC 0.34.2
P2P Digital Currency
uint256.h
Go to the documentation of this file.
1// Copyright (c) 2009-2010 Satoshi Nakamoto
2// Copyright (c) 2009-present The Bitcoin Core developers
3// Distributed under the MIT software license, see the accompanying
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6#ifndef BITCOIN_UINT256_H
7#define BITCOIN_UINT256_H
8
9#include <crypto/common.h>
10#include <span.h>
11#include <util/strencodings.h>
12#include <util/string.h>
13
14#include <algorithm>
15#include <array>
16#include <cassert>
17#include <cstdint>
18#include <cstring>
19#include <optional>
20#include <string>
21#include <string_view>
22
24template <unsigned int BITS> class base_blob {
25protected:
26 static constexpr int WIDTH = BITS / 8;
27 static_assert(BITS % 8 == 0,
28 "base_blob currently only supports whole bytes.");
29 std::array<uint8_t, WIDTH> m_data;
30 static_assert(WIDTH == sizeof(m_data), "Sanity check");
31
32public:
33 /* construct 0 value by default */
34 constexpr base_blob() : m_data() {}
35
36 /* constructor for constants between 1 and 255 */
37 constexpr explicit base_blob(uint8_t v) : m_data{{v}} {}
38
39 constexpr explicit base_blob(Span<const uint8_t> vch) {
40 assert(vch.size() == WIDTH);
41 std::copy(vch.begin(), vch.end(), m_data.begin());
42 }
43
44 constexpr bool IsNull() const {
45 return std::all_of(m_data.begin(), m_data.end(),
46 [](uint8_t val) { return val == 0; });
47 }
48
49 constexpr void SetNull() { std::fill(m_data.begin(), m_data.end(), 0); }
50
51 constexpr int Compare(const base_blob &other) const {
52 for (size_t i = 0; i < WIDTH; i++) {
53 uint8_t a = m_data[WIDTH - 1 - i];
54 uint8_t b = other.m_data[WIDTH - 1 - i];
55 if (a > b) {
56 return 1;
57 }
58 if (a < b) {
59 return -1;
60 }
61 }
62
63 return 0;
64 }
65
66 friend constexpr bool operator==(const base_blob &a, const base_blob &b) {
67 return a.Compare(b) == 0;
68 }
69 friend constexpr bool operator!=(const base_blob &a, const base_blob &b) {
70 return a.Compare(b) != 0;
71 }
72 friend constexpr bool operator<(const base_blob &a, const base_blob &b) {
73 return a.Compare(b) < 0;
74 }
75 friend constexpr bool operator<=(const base_blob &a, const base_blob &b) {
76 return a.Compare(b) <= 0;
77 }
78 friend constexpr bool operator>(const base_blob &a, const base_blob &b) {
79 return a.Compare(b) > 0;
80 }
81 friend constexpr bool operator>=(const base_blob &a, const base_blob &b) {
82 return a.Compare(b) >= 0;
83 }
84
99 std::string GetHex() const;
100
116 void SetHexDeprecated(std::string_view str);
117 std::string ToString() const { return GetHex(); }
118
119 constexpr const uint8_t *data() const { return m_data.data(); }
120 constexpr uint8_t *data() { return m_data.data(); }
121
122 constexpr uint8_t *begin() { return m_data.data(); }
123 constexpr uint8_t *end() { return m_data.data() + WIDTH; }
124
125 constexpr const uint8_t *begin() const { return m_data.data(); }
126 constexpr const uint8_t *end() const { return m_data.data() + WIDTH; }
127
128 static constexpr unsigned int size() { return WIDTH; }
129
130 constexpr uint64_t GetUint64(int pos) const {
131 return ReadLE64(m_data.data() + pos * 8);
132 }
133
134 template <typename Stream> void Serialize(Stream &s) const {
135 s << Span(m_data);
136 }
137
138 template <typename Stream> void Unserialize(Stream &s) {
139 s.read(MakeWritableByteSpan(m_data));
140 }
141};
142
143namespace detail {
150template <class uintN_t> std::optional<uintN_t> FromHex(std::string_view str) {
151 if (uintN_t::size() * 2 != str.size() || !IsHex(str)) {
152 return std::nullopt;
153 }
154 uintN_t rv;
155 rv.SetHexDeprecated(str);
156 return rv;
157}
165template <class uintN_t>
166std::optional<uintN_t> FromUserHex(std::string_view input) {
167 input = util::RemovePrefixView(input, "0x");
168 constexpr auto expected_size{uintN_t::size() * 2};
169 if (input.size() < expected_size) {
170 auto padded = std::string(expected_size, '0');
171 std::copy(input.begin(), input.end(),
172 padded.begin() + expected_size - input.size());
173 return FromHex<uintN_t>(padded);
174 }
175 return FromHex<uintN_t>(input);
176}
177} // namespace detail
178
184class uint160 : public base_blob<160> {
185public:
186 static std::optional<uint160> FromHex(std::string_view str) {
187 return detail::FromHex<uint160>(str);
188 }
189 constexpr uint160() = default;
190 constexpr explicit uint160(Span<const uint8_t> vch) : base_blob<160>(vch) {}
191};
192
199class uint256 : public base_blob<256> {
200public:
201 static std::optional<uint256> FromHex(std::string_view str) {
202 return detail::FromHex<uint256>(str);
203 }
204 static std::optional<uint256> FromUserHex(std::string_view str) {
205 return detail::FromUserHex<uint256>(str);
206 }
207 constexpr uint256() = default;
208 constexpr explicit uint256(uint8_t v) : base_blob<256>(v) {}
209 constexpr explicit uint256(Span<const uint8_t> vch) : base_blob<256>(vch) {}
210 static const uint256 ZERO;
211 static const uint256 ONE;
212};
213
221inline uint256 uint256S(std::string_view str) {
222 uint256 rv;
223 rv.SetHexDeprecated(str);
224 return rv;
225}
226
227#endif // BITCOIN_UINT256_H
constexpr std::size_t size() const noexcept
Definition: span.h:210
constexpr C * begin() const noexcept
Definition: span.h:200
constexpr C * end() const noexcept
Definition: span.h:201
Template base class for fixed-sized opaque blobs.
Definition: uint256.h:24
constexpr base_blob(uint8_t v)
Definition: uint256.h:37
constexpr bool IsNull() const
Definition: uint256.h:44
constexpr const uint8_t * data() const
Definition: uint256.h:119
friend constexpr bool operator!=(const base_blob &a, const base_blob &b)
Definition: uint256.h:69
static constexpr int WIDTH
Definition: uint256.h:26
constexpr base_blob(Span< const uint8_t > vch)
Definition: uint256.h:39
static constexpr unsigned int size()
Definition: uint256.h:128
friend constexpr bool operator<(const base_blob &a, const base_blob &b)
Definition: uint256.h:72
friend constexpr bool operator>(const base_blob &a, const base_blob &b)
Definition: uint256.h:78
constexpr uint64_t GetUint64(int pos) const
Definition: uint256.h:130
void Unserialize(Stream &s)
Definition: uint256.h:138
constexpr uint8_t * begin()
Definition: uint256.h:122
constexpr uint8_t * data()
Definition: uint256.h:120
friend constexpr bool operator<=(const base_blob &a, const base_blob &b)
Definition: uint256.h:75
std::string ToString() const
Definition: uint256.h:117
friend constexpr bool operator==(const base_blob &a, const base_blob &b)
Definition: uint256.h:66
void SetHexDeprecated(std::string_view str)
Unlike FromHex this accepts any invalid input, thus it is fragile and deprecated.
Definition: uint256.cpp:19
constexpr const uint8_t * begin() const
Definition: uint256.h:125
constexpr uint8_t * end()
Definition: uint256.h:123
friend constexpr bool operator>=(const base_blob &a, const base_blob &b)
Definition: uint256.h:81
constexpr int Compare(const base_blob &other) const
Definition: uint256.h:51
constexpr const uint8_t * end() const
Definition: uint256.h:126
void Serialize(Stream &s) const
Definition: uint256.h:134
constexpr void SetNull()
Definition: uint256.h:49
std::array< uint8_t, WIDTH > m_data
Definition: uint256.h:29
constexpr base_blob()
Definition: uint256.h:34
160-bit opaque blob.
Definition: uint256.h:184
constexpr uint160(Span< const uint8_t > vch)
Definition: uint256.h:190
static std::optional< uint160 > FromHex(std::string_view str)
Definition: uint256.h:186
constexpr uint160()=default
256-bit opaque blob.
Definition: uint256.h:199
static std::optional< uint256 > FromUserHex(std::string_view str)
Definition: uint256.h:204
constexpr uint256()=default
constexpr uint256(Span< const uint8_t > vch)
Definition: uint256.h:209
static const uint256 ONE
Definition: uint256.h:211
static const uint256 ZERO
Definition: uint256.h:210
static std::optional< uint256 > FromHex(std::string_view str)
Definition: uint256.h:201
constexpr uint256(uint8_t v)
Definition: uint256.h:208
static uint64_t ReadLE64(const uint8_t *ptr)
Definition: common.h:25
std::optional< uintN_t > FromHex(std::string_view str)
Writes the hex string (treated as little-endian) into a new uintN_t object and only returns a value i...
Definition: uint256.h:150
std::optional< uintN_t > FromUserHex(std::string_view input)
Like FromHex(std::string_view str), but allows an "0x" prefix and pads the input with leading zeroes ...
Definition: uint256.h:166
std::string_view RemovePrefixView(std::string_view str, std::string_view prefix)
Definition: string.h:89
Span(T *, EndOrSize) -> Span< T >
Span< std::byte > MakeWritableByteSpan(V &&v) noexcept
Definition: span.h:305
uint256 uint256S(std::string_view str)
DEPRECATED.
Definition: uint256.h:221
bool IsHex(std::string_view str)
Returns true if each character in str is a hex character, and has an even number of hex digits.
assert(!tx.IsCoinBase())