 |
Ethereum
PoC-8
The C++ Implementation of Ethereum
|
Go to the documentation of this file.
28 #pragma warning(disable:4244)
31 #if _MSC_VER && _MSC_VER < 1900
32 #define _ALLOW_KEYWORD_MACROS
33 #define noexcept throw()
36 #ifdef __INTEL_COMPILER
37 #pragma warning(disable:3682) //call through incomplete class
41 #include <unordered_map>
44 #include <unordered_set>
49 #pragma GCC diagnostic push
50 #pragma GCC diagnostic ignored "-Wunused-parameter"
51 #include <boost/multiprecision/cpp_int.hpp>
53 #pragma GCC diagnostic pop
59 #define DEV_IGNORE_EXCEPTIONS(X) try { X; } catch (...) {}
61 #define DEV_IF_THROWS(X) try{X;}catch(...)
65 using namespace boost::multiprecision::literals;
72 using bytes = std::vector<byte>;
98 std::vector<T>&
writable() { clear();
return m_data; }
106 size_t size()
const {
return m_data.size(); }
107 bool empty()
const {
return m_data.empty(); }
112 std::vector<T> m_data;
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>>;
148 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_cppui256;
154 if (boost::multiprecision::bit_test(_u, 255))
155 return s256(-(c_end - _u));
167 return u256(c_end + _u);
177 for (ret = 0; _x >>= 1; ++ret) {}
193 inline N
diff(N
const& _a, N
const& _b)
195 return std::max(_a, _b) - std::min(_a, _b);
206 std::function<void(
void)> m_f;
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); }
224 static void checkInvariants(
HasInvariants const* _this,
char const* _fn,
char const* _file,
int line,
bool _pre);
228 char const* m_function;
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)
238 #define DEV_INVARIANT_CHECK (void)0;
239 #define DEV_INVARIANT_CHECK_HERE (void)0;
246 TimerHelper(std::string
const& _id,
unsigned _msReportWhenGreater = 0): m_t(
std::chrono::high_resolution_clock::now()), m_id(_id), m_ms(_msReportWhenGreater) {}
250 std::chrono::high_resolution_clock::time_point m_t;
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(); }
265 std::chrono::high_resolution_clock::time_point m_t;
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)
271 #define DEV_TIMED_FUNCTION DEV_TIMED_SCOPE(__FUNCSIG__)
273 #define DEV_TIMED_FUNCTION DEV_TIMED_SCOPE(__PRETTY_FUNCTION__)
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)
279 #define DEV_TIMED_FUNCTION_ABOVE(MS) DEV_TIMED_SCOPE_ABOVE(__FUNCSIG__, MS)
281 #define DEV_TIMED_FUNCTION_ABOVE(MS) DEV_TIMED_SCOPE_ABOVE(__PRETTY_FUNCTION__, MS)
288 #define DEV_UNUSED __attribute__((unused))
304 static constexpr
unsigned c_lineWidth = 160;
306 static const auto c_steadyClockMin = std::chrono::steady_clock::time_point::min();
315 static bool s_shouldExit;
318 bool isTrue(std::string
const& _m);
319 bool isFalse(std::string
const& _m);
Simple scope-based timer helper.
ScopeGuard(std::function< void(void)> _f)
std::map< bytes, bytes > HexMap
vector_ref< _T const > ref(_T const &_t)
std::chrono::high_resolution_clock::duration duration() const
std::map< bytes, bytes > BytesMap
secure_vector(size_t _size, T _item)
void swap(secure_vector< T > &io_other)
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 512, 512, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u512
N diff(N const &_a, N const &_b)
std::map< std::string, std::string > StringMap
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.
int64_t utcTime()
Get the current time in seconds since the epoch in UTC.
std::vector< T > & writable()
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u64
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 128, 128, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u128
unsigned int toLog2(u256 _x)
RAII utility class whose destructor calls a given function.
bool isTrue(std::string const &_m)
secure_vector< T > & operator=(secure_vector< T > const &_c)
TimerHelper(std::string const &_id, unsigned _msReportWhenGreater=0)
secure_vector(size_t _size)
std::unordered_map< u256, u256 > u256HashMap
static void exitHandler(int)
s256 u2s(u256 _u)
Interprets _u as a two's complement signed number and returns the resulting s256.
std::vector< byte > bytes
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void > > s256
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 160, 160, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u160
std::vector< T > const & makeInsecure() const
constexpr u256 Invalid256
secure_vector(vector_ref< const T > _c)
bool isFalse(std::string const &_m)
std::vector< std::string > strings
boost::multiprecision::number< boost::multiprecision::cpp_int_backend<> > bigint
Inheritable for classes that have invariants.
secure_vector(std::vector< T > const &_c)
std::map< u256, u256 > u256Map
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 160, 160, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void > > s160
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u256
secure_vector(secure_vector< T > const &)=default
std::string const EmptyString
InvariantChecker(HasInvariants *_this, char const *_fn, char const *_file, int _line)
vector_ref< T const > ref() const
std::unordered_map< std::string, std::string > StringHashMap
std::vector< u160 > u160s
RAII checker for invariant assertions.
virtual bool invariants() const =0
Reimplement to specify the invariants.
secure_vector(vector_ref< T > _c)
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 512, 512, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void > > s512
std::vector< u256 > u256s
void setDefaultOrCLocale()