Ethereum  PoC-8
The C++ Implementation of Ethereum
Common.h
Go to the documentation of this file.
1 /*
2  This file is part of cpp-ethereum.
3 
4  cpp-ethereum is free software: you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation, either version 3 of the License, or
7  (at your option) any later version.
8 
9  cpp-ethereum is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
16 */
24 #pragma once
25 
26 // way too many unsigned to size_t warnings in 32 bit build
27 #ifdef _M_IX86
28 #pragma warning(disable:4244)
29 #endif
30 
31 #if _MSC_VER && _MSC_VER < 1900
32 #define _ALLOW_KEYWORD_MACROS
33 #define noexcept throw()
34 #endif
35 
36 #ifdef __INTEL_COMPILER
37 #pragma warning(disable:3682) //call through incomplete class
38 #endif
39 
40 #include <map>
41 #include <unordered_map>
42 #include <vector>
43 #include <set>
44 #include <unordered_set>
45 #include <functional>
46 #include <string>
47 #include <chrono>
48 #pragma warning(push)
49 #pragma GCC diagnostic push
50 #pragma GCC diagnostic ignored "-Wunused-parameter"
51 #include <boost/multiprecision/cpp_int.hpp>
52 #pragma warning(pop)
53 #pragma GCC diagnostic pop
54 #include "vector_ref.h"
55 
56 // CryptoPP defines byte in the global namespace, so must we.
57 using byte = uint8_t;
58 
59 #define DEV_IGNORE_EXCEPTIONS(X) try { X; } catch (...) {}
60 
61 #define DEV_IF_THROWS(X) try{X;}catch(...)
62 
63 namespace dev
64 {
65 using namespace boost::multiprecision::literals;
66 
67 extern char const* Version;
68 
69 extern std::string const EmptyString;
70 
71 // Binary data types.
72 using bytes = std::vector<byte>;
75 
76 template <class T>
78 {
79 public:
81  secure_vector(secure_vector<T> const& /*_c*/) = default; // See https://github.com/ethereum/libweb3core/pull/44
82  explicit secure_vector(size_t _size): m_data(_size) {}
83  explicit secure_vector(size_t _size, T _item): m_data(_size, _item) {}
84  explicit secure_vector(std::vector<T> const& _c): m_data(_c) {}
85  explicit secure_vector(vector_ref<T> _c): m_data(_c.data(), _c.data() + _c.size()) {}
86  explicit secure_vector(vector_ref<const T> _c): m_data(_c.data(), _c.data() + _c.size()) {}
87  ~secure_vector() { ref().cleanse(); }
88 
90  {
91  if (&_c == this)
92  return *this;
93 
94  ref().cleanse();
95  m_data = _c.m_data;
96  return *this;
97  }
98  std::vector<T>& writable() { clear(); return m_data; }
99  std::vector<T> const& makeInsecure() const { return m_data; }
100 
101  void clear() { ref().cleanse(); }
102 
103  vector_ref<T> ref() { return vector_ref<T>(&m_data); }
104  vector_ref<T const> ref() const { return vector_ref<T const>(&m_data); }
105 
106  size_t size() const { return m_data.size(); }
107  bool empty() const { return m_data.empty(); }
108 
109  void swap(secure_vector<T>& io_other) { m_data.swap(io_other.m_data); }
110 
111 private:
112  std::vector<T> m_data;
113 };
114 
116 
117 // Numeric types.
118 using bigint = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<>>;
119 using u64 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
120 using u128 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<128, 128, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
121 using u256 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
122 using s256 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>>;
123 using u160 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<160, 160, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
124 using s160 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<160, 160, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>>;
125 using u512 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<512, 512, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
126 using s512 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<512, 512, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>>;
127 using u256s = std::vector<u256>;
128 using u160s = std::vector<u160>;
129 using u256Set = std::set<u256>;
130 using u160Set = std::set<u160>;
131 
132 // Map types.
133 using StringMap = std::map<std::string, std::string>;
134 using BytesMap = std::map<bytes, bytes>;
135 using u256Map = std::map<u256, u256>;
136 using HexMap = std::map<bytes, bytes>;
137 
138 // Hash types.
139 using StringHashMap = std::unordered_map<std::string, std::string>;
140 using u256HashMap = std::unordered_map<u256, u256>;
141 
142 // String types.
143 using strings = std::vector<std::string>;
144 
145 // Null/Invalid values for convenience.
146 extern bytes const NullBytes;
147 u256 constexpr Invalid256 =
148  0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_cppui256;
149 
151 inline s256 u2s(u256 _u)
152 {
153  static const bigint c_end = bigint(1) << 256;
154  if (boost::multiprecision::bit_test(_u, 255))
155  return s256(-(c_end - _u));
156  else
157  return s256(_u);
158 }
159 
161 inline u256 s2u(s256 _u)
162 {
163  static const bigint c_end = bigint(1) << 256;
164  if (_u >= 0)
165  return u256(_u);
166  else
167  return u256(c_end + _u);
168 }
169 
171 std::string inUnits(bigint const& _b, strings const& _units);
172 
174 inline unsigned int toLog2(u256 _x)
175 {
176  unsigned ret;
177  for (ret = 0; _x >>= 1; ++ret) {}
178  return ret;
179 }
180 
181 template <size_t n> inline u256 exp10()
182 {
183  return exp10<n - 1>() * u256(10);
184 }
185 
186 template <> inline u256 exp10<0>()
187 {
188  return u256(1);
189 }
190 
192 template <class N>
193 inline N diff(N const& _a, N const& _b)
194 {
195  return std::max(_a, _b) - std::min(_a, _b);
196 }
197 
200 {
201 public:
202  ScopeGuard(std::function<void(void)> _f): m_f(_f) {}
203  ~ScopeGuard() { m_f(); }
204 
205 private:
206  std::function<void(void)> m_f;
207 };
208 
211 {
212 public:
214  virtual bool invariants() const = 0;
215 };
216 
219 {
220 public:
221  InvariantChecker(HasInvariants* _this, char const* _fn, char const* _file, int _line): m_this(_this), m_function(_fn), m_file(_file), m_line(_line) { checkInvariants(_this, _fn , _file, _line, true); }
222  ~InvariantChecker() { checkInvariants(m_this, m_function, m_file, m_line, false); }
224  static void checkInvariants(HasInvariants const* _this, char const* _fn, char const* _file, int line, bool _pre);
225 
226 private:
227  HasInvariants const* m_this;
228  char const* m_function;
229  char const* m_file;
230  int m_line;
231 };
232 
234 #if ETH_DEBUG
235 #define DEV_INVARIANT_CHECK ::dev::InvariantChecker __dev_invariantCheck(this, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__)
236 #define DEV_INVARIANT_CHECK_HERE ::dev::InvariantChecker::checkInvariants(this, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__, true)
237 #else
238 #define DEV_INVARIANT_CHECK (void)0;
239 #define DEV_INVARIANT_CHECK_HERE (void)0;
240 #endif
241 
244 {
245 public:
246  TimerHelper(std::string const& _id, unsigned _msReportWhenGreater = 0): m_t(std::chrono::high_resolution_clock::now()), m_id(_id), m_ms(_msReportWhenGreater) {}
247  ~TimerHelper();
248 
249 private:
250  std::chrono::high_resolution_clock::time_point m_t;
251  std::string m_id;
252  unsigned m_ms;
253 };
254 
255 class Timer
256 {
257 public:
258  Timer() { restart(); }
259 
260  std::chrono::high_resolution_clock::duration duration() const { return std::chrono::high_resolution_clock::now() - m_t; }
261  double elapsed() const { return std::chrono::duration_cast<std::chrono::microseconds>(duration()).count() / 1000000.0; }
262  void restart() { m_t = std::chrono::high_resolution_clock::now(); }
263 
264 private:
265  std::chrono::high_resolution_clock::time_point m_t;
266 };
267 
268 #define DEV_TIMED(S) for (::std::pair<::dev::TimerHelper, bool> __eth_t(S, true); __eth_t.second; __eth_t.second = false)
269 #define DEV_TIMED_SCOPE(S) ::dev::TimerHelper __eth_t(S)
270 #if defined(_WIN32)
271 #define DEV_TIMED_FUNCTION DEV_TIMED_SCOPE(__FUNCSIG__)
272 #else
273 #define DEV_TIMED_FUNCTION DEV_TIMED_SCOPE(__PRETTY_FUNCTION__)
274 #endif
275 
276 #define DEV_TIMED_ABOVE(S, MS) for (::std::pair<::dev::TimerHelper, bool> __eth_t(::dev::TimerHelper(S, MS), true); __eth_t.second; __eth_t.second = false)
277 #define DEV_TIMED_SCOPE_ABOVE(S, MS) ::dev::TimerHelper __eth_t(S, MS)
278 #if defined(_WIN32)
279 #define DEV_TIMED_FUNCTION_ABOVE(MS) DEV_TIMED_SCOPE_ABOVE(__FUNCSIG__, MS)
280 #else
281 #define DEV_TIMED_FUNCTION_ABOVE(MS) DEV_TIMED_SCOPE_ABOVE(__PRETTY_FUNCTION__, MS)
282 #endif
283 
284 #ifdef _MSC_VER
285 // TODO.
286 #define DEV_UNUSED
287 #else
288 #define DEV_UNUSED __attribute__((unused))
289 #endif
290 
291 enum class WithExisting: int
292 {
293  Trust = 0,
294  Verify,
295  Rescue,
296  Kill
297 };
298 
300 int64_t utcTime();
301 
302 void setDefaultOrCLocale();
303 
304 static constexpr unsigned c_lineWidth = 160;
305 
306 static const auto c_steadyClockMin = std::chrono::steady_clock::time_point::min();
307 
309 {
310 public:
311  static void exitHandler(int) { s_shouldExit = true; }
312  bool shouldExit() const { return s_shouldExit; }
313 
314 private:
315  static bool s_shouldExit;
316 };
317 
318 bool isTrue(std::string const& _m);
319 bool isFalse(std::string const& _m);
320 } // namespace dev
dev::TimerHelper
Simple scope-based timer helper.
Definition: Common.h:244
dev::ScopeGuard::ScopeGuard
ScopeGuard(std::function< void(void)> _f)
Definition: Common.h:202
dev::ExitHandler
Definition: Common.h:309
dev::HexMap
std::map< bytes, bytes > HexMap
Definition: Common.h:136
dev::ref
vector_ref< _T const > ref(_T const &_t)
Definition: vector_ref.h:109
dev::InvariantChecker::~InvariantChecker
~InvariantChecker()
Definition: Common.h:222
dev::Timer::duration
std::chrono::high_resolution_clock::duration duration() const
Definition: Common.h:260
dev::secure_vector::~secure_vector
~secure_vector()
Definition: Common.h:87
dev::WithExisting::Verify
@ Verify
dev::vector_ref
Definition: vector_ref.h:22
dev::BytesMap
std::map< bytes, bytes > BytesMap
Definition: Common.h:134
dev::secure_vector::empty
bool empty() const
Definition: Common.h:107
dev::secure_vector::ref
vector_ref< T > ref()
Definition: Common.h:103
dev::secure_vector::secure_vector
secure_vector(size_t _size, T _item)
Definition: Common.h:83
dev::Timer
Definition: Common.h:256
dev::secure_vector::swap
void swap(secure_vector< T > &io_other)
Definition: Common.h:109
dev::u512
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 512, 512, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u512
Definition: Common.h:125
dev::u160Set
std::set< u160 > u160Set
Definition: Common.h:130
dev::diff
N diff(N const &_a, N const &_b)
Definition: Common.h:193
dev::u256Set
std::set< u256 > u256Set
Definition: Common.h:129
dev::StringMap
std::map< std::string, std::string > StringMap
Definition: Common.h:133
dev::inUnits
string inUnits(bigint const &_b, strings const &_units)
Converts given int to a string and appends one of a series of units according to its size.
Definition: Common.cpp:61
dev::utcTime
int64_t utcTime()
Get the current time in seconds since the epoch in UTC.
Definition: Common.cpp:53
dev::exp10
u256 exp10()
Definition: Common.h:181
dev::secure_vector::writable
std::vector< T > & writable()
Definition: Common.h:98
dev::u64
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u64
Definition: Common.h:119
dev::secure_vector::size
size_t size() const
Definition: Common.h:106
dev::Timer::elapsed
double elapsed() const
Definition: Common.h:261
dev::WithExisting::Kill
@ Kill
dev::u128
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 128, 128, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u128
Definition: Common.h:120
dev::WithExisting
WithExisting
Definition: Common.h:292
dev::toLog2
unsigned int toLog2(u256 _x)
Definition: Common.h:174
dev::ScopeGuard
RAII utility class whose destructor calls a given function.
Definition: Common.h:200
dev::Version
char const * Version
Definition: Common.cpp:32
dev::WithExisting::Trust
@ Trust
dev::isTrue
bool isTrue(std::string const &_m)
Definition: Common.cpp:129
dev::s2u
u256 s2u(s256 _u)
Definition: Common.h:161
dev::secure_vector::operator=
secure_vector< T > & operator=(secure_vector< T > const &_c)
Definition: Common.h:89
dev::Timer::Timer
Timer()
Definition: Common.h:258
dev::secure_vector
Definition: Common.h:78
dev::TimerHelper::TimerHelper
TimerHelper(std::string const &_id, unsigned _msReportWhenGreater=0)
Definition: Common.h:246
dev::secure_vector::secure_vector
secure_vector(size_t _size)
Definition: Common.h:82
dev::u256HashMap
std::unordered_map< u256, u256 > u256HashMap
Definition: Common.h:140
dev::ExitHandler::exitHandler
static void exitHandler(int)
Definition: Common.h:311
dev::u2s
s256 u2s(u256 _u)
Interprets _u as a two's complement signed number and returns the resulting s256.
Definition: Common.h:151
dev::bytes
std::vector< byte > bytes
Definition: Common.h:72
dev::secure_vector::secure_vector
secure_vector()
Definition: Common.h:80
dev::s256
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void > > s256
Definition: Common.h:122
dev::u160
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 160, 160, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u160
Definition: Common.h:123
dev::secure_vector::makeInsecure
std::vector< T > const & makeInsecure() const
Definition: Common.h:99
dev::ScopeGuard::~ScopeGuard
~ScopeGuard()
Definition: Common.h:203
dev::Invalid256
constexpr u256 Invalid256
Definition: Common.h:147
dev::secure_vector::secure_vector
secure_vector(vector_ref< const T > _c)
Definition: Common.h:86
dev::ExitHandler::shouldExit
bool shouldExit() const
Definition: Common.h:312
dev::NullBytes
bytes const NullBytes
Definition: Common.cpp:33
vector_ref.h
dev::isFalse
bool isFalse(std::string const &_m)
Definition: Common.cpp:134
dev::Timer::restart
void restart()
Definition: Common.h:262
dev::secure_vector::clear
void clear()
Definition: Common.h:101
dev::strings
std::vector< std::string > strings
Definition: Common.h:143
dev::bigint
boost::multiprecision::number< boost::multiprecision::cpp_int_backend<> > bigint
Definition: Common.h:118
dev::HasInvariants
Inheritable for classes that have invariants.
Definition: Common.h:211
dev::secure_vector::secure_vector
secure_vector(std::vector< T > const &_c)
Definition: Common.h:84
dev::u256Map
std::map< u256, u256 > u256Map
Definition: Common.h:135
dev::s160
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 160, 160, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void > > s160
Definition: Common.h:124
dev::WithExisting::Rescue
@ Rescue
std
Definition: FixedHash.h:393
dev::u256
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u256
Definition: Common.h:121
dev::secure_vector::secure_vector
secure_vector(secure_vector< T > const &)=default
dev::exp10< 0 >
u256 exp10< 0 >()
Definition: Common.h:186
dev::EmptyString
std::string const EmptyString
Definition: Common.cpp:34
dev::InvariantChecker::InvariantChecker
InvariantChecker(HasInvariants *_this, char const *_fn, char const *_file, int _line)
Definition: Common.h:221
dev
Definition: Address.cpp:21
dev::secure_vector::ref
vector_ref< T const > ref() const
Definition: Common.h:104
dev::StringHashMap
std::unordered_map< std::string, std::string > StringHashMap
Definition: Common.h:139
dev::u160s
std::vector< u160 > u160s
Definition: Common.h:128
dev::InvariantChecker
RAII checker for invariant assertions.
Definition: Common.h:219
dev::HasInvariants::invariants
virtual bool invariants() const =0
Reimplement to specify the invariants.
dev::secure_vector::secure_vector
secure_vector(vector_ref< T > _c)
Definition: Common.h:85
dev::s512
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 512, 512, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void > > s512
Definition: Common.h:126
dev::u256s
std::vector< u256 > u256s
Definition: Common.h:127
dev::setDefaultOrCLocale
void setDefaultOrCLocale()
Definition: Common.cpp:113