TARAXA
Common.h
Go to the documentation of this file.
1 // Aleth: Ethereum C++ client, tools and libraries.
2 // Copyright 2013-2019 Aleth Authors.
3 // Licensed under the GNU General Public License, Version 3.
4 
7 #pragma once
8 
9 #include <chrono>
10 #include <functional>
11 #include <map>
12 #include <set>
13 #include <string>
14 #include <unordered_map>
15 #include <vector>
16 #pragma warning(push)
17 #pragma GCC diagnostic push
18 #pragma GCC diagnostic ignored "-Wunused-parameter"
19 #include <boost/multiprecision/cpp_int.hpp>
20 #pragma warning(pop)
21 #pragma GCC diagnostic pop
22 #include "vector_ref.h"
23 
24 // CryptoPP defines byte in the global namespace, so must we.
25 using byte = uint8_t;
26 
27 #define DEV_IGNORE_EXCEPTIONS(X) \
28  try { \
29  X; \
30  } catch (...) { \
31  }
32 
33 #define DEV_IF_THROWS(X) \
34  try { \
35  X; \
36  } catch (...)
37 
38 namespace dev {
39 using namespace boost::multiprecision::literals;
40 
41 extern char const* Version;
42 
43 extern std::string const EmptyString;
44 
45 // Binary data types.
46 using bytes = std::vector<::byte>;
49 
50 template <class T>
52  public:
54  secure_vector(secure_vector<T> const& /*_c*/) = default; // See https://github.com/ethereum/libweb3core/pull/44
55  explicit secure_vector(size_t _size) : m_data(_size) {}
56  explicit secure_vector(size_t _size, T _item) : m_data(_size, _item) {}
57  explicit secure_vector(std::vector<T> const& _c) : m_data(_c) {}
58  explicit secure_vector(vector_ref<T> _c) : m_data(_c.data(), _c.data() + _c.size()) {}
59  explicit secure_vector(vector_ref<const T> _c) : m_data(_c.data(), _c.data() + _c.size()) {}
60  ~secure_vector() { ref().cleanse(); }
61 
63  if (&_c == this) return *this;
64 
65  ref().cleanse();
66  m_data = _c.m_data;
67  return *this;
68  }
69  std::vector<T>& writable() {
70  clear();
71  return m_data;
72  }
73  std::vector<T> const& makeInsecure() const { return m_data; }
74 
75  void clear() { ref().cleanse(); }
76 
77  vector_ref<T> ref() { return vector_ref<T>(&m_data); }
78  vector_ref<T const> ref() const { return vector_ref<T const>(&m_data); }
79 
80  size_t size() const { return m_data.size(); }
81  bool empty() const { return m_data.empty(); }
82 
83  void swap(secure_vector<T>& io_other) { m_data.swap(io_other.m_data); }
84 
85  private:
86  std::vector<T> m_data;
87 };
88 
90 
91 // Numeric types.
92 using bigint = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<>>;
93 using u64 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
94  64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
95 using u128 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
96  128, 128, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
97 using u256 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
98  256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
99 using s256 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
100  256, 256, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>>;
101 using u160 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
102  160, 160, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
103 using s160 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
104  160, 160, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>>;
105 using u512 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
106  512, 512, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
107 using s512 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
108  512, 512, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>>;
109 using u256s = std::vector<u256>;
110 using u160s = std::vector<u160>;
111 using u256Set = std::set<u256>;
112 using u160Set = std::set<u160>;
113 
114 // Map types.
115 using StringMap = std::map<std::string, std::string>;
116 using BytesMap = std::map<bytes, bytes>;
117 using u256Map = std::map<u256, u256>;
118 using HexMap = std::map<bytes, bytes>;
119 
120 // Hash types.
121 using StringHashMap = std::unordered_map<std::string, std::string>;
122 using u256HashMap = std::unordered_map<u256, u256>;
123 
124 // String types.
125 using strings = std::vector<std::string>;
126 
127 // Null/Invalid values for convenience.
128 extern bytes const NullBytes;
129 
132 inline s256 u2s(u256 _u) {
133  static const bigint c_end = bigint(1) << 256;
134  if (boost::multiprecision::bit_test(_u, 255))
135  return s256(-(c_end - _u));
136  else
137  return s256(_u);
138 }
139 
141 inline u256 s2u(s256 _u) {
142  static const bigint c_end = bigint(1) << 256;
143  if (_u >= 0)
144  return u256(_u);
145  else
146  return u256(c_end + _u);
147 }
148 
150 inline unsigned int toLog2(u256 _x) {
151  unsigned ret;
152  for (ret = 0; _x >>= 1; ++ret) {
153  }
154  return ret;
155 }
156 
157 template <size_t n>
158 inline u256 exp10() {
159  return exp10<n - 1>() * u256(10);
160 }
161 
162 template <>
163 inline u256 exp10<0>() {
164  return u256(1);
165 }
166 
168 template <class N>
169 inline N diff(N const& _a, N const& _b) {
170  return std::max(_a, _b) - std::min(_a, _b);
171 }
172 
174 class ScopeGuard {
175  public:
176  ScopeGuard(std::function<void(void)> _f) : m_f(_f) {}
177  ~ScopeGuard() { m_f(); }
178 
179  private:
180  std::function<void(void)> m_f;
181 };
182 
184 class TimerHelper {
185  public:
186  TimerHelper(std::string const& _id, unsigned _msReportWhenGreater = 0)
187  : m_t(std::chrono::high_resolution_clock::now()), m_id(_id), m_ms(_msReportWhenGreater) {}
188  ~TimerHelper();
189 
190  private:
192  std::string m_id;
193  unsigned m_ms;
194 };
195 
196 class Timer {
197  public:
198  Timer() { restart(); }
199 
200  std::chrono::high_resolution_clock::duration duration() const {
201  return std::chrono::high_resolution_clock::now() - m_t;
202  }
203  double elapsed() const {
204  return std::chrono::duration_cast<std::chrono::microseconds>(duration()).count() / 1000000.0;
205  }
206  void restart() { m_t = std::chrono::high_resolution_clock::now(); }
207 
208  private:
210 };
211 
212 #define DEV_TIMED(S) \
213  for (::std::pair<::dev::TimerHelper, bool> __eth_t(S, true); __eth_t.second; __eth_t.second = false)
214 #define DEV_TIMED_SCOPE(S) ::dev::TimerHelper __eth_t(S)
215 #if defined(_WIN32)
216 #define DEV_TIMED_FUNCTION DEV_TIMED_SCOPE(__FUNCSIG__)
217 #else
218 #define DEV_TIMED_FUNCTION DEV_TIMED_SCOPE(__PRETTY_FUNCTION__)
219 #endif
220 
221 #define DEV_TIMED_ABOVE(S, MS) \
222  for (::std::pair<::dev::TimerHelper, bool> __eth_t(::dev::TimerHelper(S, MS), true); __eth_t.second; \
223  __eth_t.second = false)
224 #define DEV_TIMED_SCOPE_ABOVE(S, MS) ::dev::TimerHelper __eth_t(S, MS)
225 #if defined(_WIN32)
226 #define DEV_TIMED_FUNCTION_ABOVE(MS) DEV_TIMED_SCOPE_ABOVE(__FUNCSIG__, MS)
227 #else
228 #define DEV_TIMED_FUNCTION_ABOVE(MS) DEV_TIMED_SCOPE_ABOVE(__PRETTY_FUNCTION__, MS)
229 #endif
230 
231 #define DEV_UNUSED __attribute__((unused))
232 
234 int64_t utcTime();
235 
236 static const auto c_steadyClockMin = std::chrono::steady_clock::time_point::min();
237 
238 } // namespace dev
RAII utility class whose destructor calls a given function.
Definition: Common.h:174
ScopeGuard(std::function< void(void)> _f)
Definition: Common.h:176
std::function< void(void)> m_f
Definition: Common.h:180
~ScopeGuard()
Definition: Common.h:177
Simple scope-based timer helper.
Definition: Common.h:184
std::chrono::high_resolution_clock::time_point m_t
Definition: Common.h:191
TimerHelper(std::string const &_id, unsigned _msReportWhenGreater=0)
Definition: Common.h:186
std::string m_id
Definition: Common.h:192
unsigned m_ms
Definition: Common.h:193
Definition: Common.h:196
Timer()
Definition: Common.h:198
double elapsed() const
Definition: Common.h:203
std::chrono::high_resolution_clock::duration duration() const
Definition: Common.h:200
std::chrono::high_resolution_clock::time_point m_t
Definition: Common.h:209
void restart()
Definition: Common.h:206
Definition: Common.h:51
secure_vector(size_t _size)
Definition: Common.h:55
secure_vector< T > & operator=(secure_vector< T > const &_c)
Definition: Common.h:62
bool empty() const
Definition: Common.h:81
secure_vector(size_t _size, T _item)
Definition: Common.h:56
void swap(secure_vector< T > &io_other)
Definition: Common.h:83
void clear()
Definition: Common.h:75
std::vector< T > m_data
Definition: Common.h:86
vector_ref< T > ref()
Definition: Common.h:77
secure_vector(secure_vector< T > const &)=default
vector_ref< T const > ref() const
Definition: Common.h:78
secure_vector(std::vector< T > const &_c)
Definition: Common.h:57
secure_vector(vector_ref< T > _c)
Definition: Common.h:58
secure_vector()
Definition: Common.h:53
std::vector< T > const & makeInsecure() const
Definition: Common.h:73
size_t size() const
Definition: Common.h:80
std::vector< T > & writable()
Definition: Common.h:69
secure_vector(vector_ref< const T > _c)
Definition: Common.h:59
~secure_vector()
Definition: Common.h:60
Definition: vector_ref.h:23
Definition: Address.h:13
char const * Version
u256 exp10< 0 >()
Definition: Common.h:163
std::vector< std::string > strings
Definition: Common.h:125
std::map< bytes, bytes > BytesMap
Definition: Common.h:116
std::map< u256, u256 > u256Map
Definition: Common.h:117
std::set< u256 > u256Set
Definition: Common.h:111
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 128, 128, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u128
Definition: Common.h:96
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 512, 512, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void > > s512
Definition: Common.h:108
std::map< std::string, std::string > StringMap
Definition: Common.h:115
vector_ref< _T const > ref(_T const &_t)
Definition: vector_ref.h:188
std::string const EmptyString
Definition: Common.cpp:17
std::vector<::byte > bytes
Definition: Common.h:46
std::unordered_map< u256, u256 > u256HashMap
Definition: Common.h:122
s256 u2s(u256 _u)
Definition: Common.h:132
std::set< u160 > u160Set
Definition: Common.h:112
std::vector< u256 > u256s
Definition: Common.h:109
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void > > s256
Definition: Common.h:100
std::map< bytes, bytes > HexMap
Definition: Common.h:118
boost::multiprecision::number< boost::multiprecision::cpp_int_backend<> > bigint
Definition: Common.h:92
int64_t utcTime()
Get the current time in seconds since the epoch in UTC.
Definition: Common.cpp:25
std::vector< u160 > u160s
Definition: Common.h:110
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u64
Definition: Common.h:94
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u256
Definition: Common.h:98
u256 exp10()
Definition: Common.h:158
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 160, 160, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u160
Definition: Common.h:102
std::unordered_map< std::string, std::string > StringHashMap
Definition: Common.h:121
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 512, 512, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u512
Definition: Common.h:106
unsigned int toLog2(u256 _x)
Definition: Common.h:150
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 160, 160, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void > > s160
Definition: Common.h:104
N diff(N const &_a, N const &_b)
Definition: Common.h:169
u256 s2u(s256 _u)
Definition: Common.h:141
static const auto c_steadyClockMin
Definition: Common.h:236
bytes const NullBytes
Definition: Common.cpp:16
std::hash for asio::adress
Definition: FixedHash.h:483
std::chrono::system_clock::time_point time_point
Definition: watches.hpp:12