diff --git a/libdevcore/CMakeLists.txt b/libdevcore/CMakeLists.txt index 1ba160a3a..c7057ac5a 100644 --- a/libdevcore/CMakeLists.txt +++ b/libdevcore/CMakeLists.txt @@ -16,7 +16,7 @@ target_link_libraries(devcore ${Boost_THREAD_LIBRARIES}) target_link_libraries(devcore ${Boost_RANDOM_LIBRARIES}) target_link_libraries(devcore ${Boost_FILESYSTEM_LIBRARIES}) target_link_libraries(devcore ${Boost_SYSTEM_LIBRARIES}) -target_link_libraries(${EXECUTABLE} ${JSONCPP_LIBRARIES}) +target_link_libraries(devcore ${JSONCPP_LIBRARIES}) # transitive dependencies for windows executables if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") diff --git a/libdevcore/CommonData.cpp b/libdevcore/CommonData.cpp index 3e5231b6e..5d817ea46 100644 --- a/libdevcore/CommonData.cpp +++ b/libdevcore/CommonData.cpp @@ -56,17 +56,6 @@ std::string dev::escaped(std::string const& _s, bool _all) return ret; } -std::string dev::randomWord() -{ - static std::mt19937_64 s_eng(0); - std::string ret(boost::random::uniform_int_distribution(1, 5)(s_eng), ' '); - char const n[] = "qwertyuiop";//asdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890"; - boost::random::uniform_int_distribution d(0, sizeof(n) - 2); - for (char& c: ret) - c = n[d(s_eng)]; - return ret; -} - int dev::fromHex(char _i, WhenError _throw) { if (_i >= '0' && _i <= '9') @@ -111,18 +100,6 @@ bytes dev::fromHex(std::string const& _s, WhenError _throw) return ret; } -bytes dev::asNibbles(bytesConstRef const& _s) -{ - std::vector ret; - ret.reserve(_s.size() * 2); - for (auto i: _s) - { - ret.push_back(i / 16); - ret.push_back(i % 16); - } - return ret; -} - std::string dev::toString(string32 const& _s) { std::string ret; diff --git a/libdevcore/CommonData.h b/libdevcore/CommonData.h index 016faff6f..00e534e8b 100644 --- a/libdevcore/CommonData.h +++ b/libdevcore/CommonData.h @@ -76,23 +76,12 @@ inline std::string asString(bytes const& _b) return std::string((char const*)_b.data(), (char const*)(_b.data() + _b.size())); } -/// Converts byte array ref to a string containing the same (binary) data. Unless -/// the byte array happens to contain ASCII data, this won't be printable. -inline std::string asString(bytesConstRef _b) -{ - return std::string((char const*)_b.data(), (char const*)(_b.data() + _b.size())); -} - /// Converts a string to a byte array containing the string's (byte) data. inline bytes asBytes(std::string const& _b) { return bytes((byte const*)_b.data(), (byte const*)(_b.data() + _b.size())); } -/// Converts a string into the big-endian base-16 stream of integers (NOT ASCII). -/// @example asNibbles("A")[0] == 4 && asNibbles("A")[1] == 1 -bytes asNibbles(bytesConstRef const& _s); - // Big-endian to/from host endian conversion functions. @@ -167,35 +156,12 @@ inline std::string toHex(u256 val, HexPrefix prefix = HexPrefix::DontAdd) return (prefix == HexPrefix::Add) ? "0x" + str : str; } -inline std::string toCompactHex(u256 val, HexPrefix prefix = HexPrefix::DontAdd, unsigned _min = 0) -{ - std::string str = toHex(toCompactBigEndian(val, _min)); - return (prefix == HexPrefix::Add) ? "0x" + str : str; -} - // Algorithms for string and string-like collections. /// Escapes a string into the C-string representation. /// @p _all if true will escape all characters, not just the unprintable ones. std::string escaped(std::string const& _s, bool _all = true); -/// Determines the length of the common prefix of the two collections given. -/// @returns the number of elements both @a _t and @a _u share, in order, at the beginning. -/// @example commonPrefix("Hello world!", "Hello, world!") == 5 -template -unsigned commonPrefix(T const& _t, _U const& _u) -{ - unsigned s = std::min(_t.size(), _u.size()); - for (unsigned i = 0;; ++i) - if (i == s || _t[i] != _u[i]) - return i; - return s; -} - -/// Creates a random, printable, word. -std::string randomWord(); - - // General datatype convenience functions. /// Determine bytes required to encode the given integer value. @returns 0 if @a _i is zero. diff --git a/libethcore/Common.cpp b/libethcore/Common.cpp deleted file mode 100644 index 1cb587817..000000000 --- a/libethcore/Common.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/* - This file is part of cpp-ethereum. - - cpp-ethereum is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - cpp-ethereum is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with cpp-ethereum. If not, see . -*/ -/** @file Common.cpp - * @author Gav Wood - * @date 2014 - */ - -#include "Common.h" -#include -#include -#include -#include -#include -#include -#include "Exceptions.h" -#include "Params.h" -#include "BlockInfo.h" -using namespace std; -using namespace dev; -using namespace dev::eth; - -namespace dev -{ -namespace eth -{ - -const unsigned c_protocolVersion = 61; -const unsigned c_minorProtocolVersion = 2; -const unsigned c_databaseBaseVersion = 9; -const unsigned c_databaseVersionModifier = 0; - -const unsigned c_databaseVersion = c_databaseBaseVersion + (c_databaseVersionModifier << 8) + (23 << 9); - -Address toAddress(std::string const& _s) -{ - try - { - auto b = fromHex(_s.substr(0, 2) == "0x" ? _s.substr(2) : _s, WhenError::Throw); - if (b.size() == 20) - return Address(b); - } - catch (BadHexCharacter&) {} - BOOST_THROW_EXCEPTION(InvalidAddress()); -} - - -vector> const& units() -{ - static const vector> s_units = - { - {exp10<54>(), "Uether"}, - {exp10<51>(), "Vether"}, - {exp10<48>(), "Dether"}, - {exp10<45>(), "Nether"}, - {exp10<42>(), "Yether"}, - {exp10<39>(), "Zether"}, - {exp10<36>(), "Eether"}, - {exp10<33>(), "Pether"}, - {exp10<30>(), "Tether"}, - {exp10<27>(), "Gether"}, - {exp10<24>(), "Mether"}, - {exp10<21>(), "grand"}, - {exp10<18>(), "ether"}, - {exp10<15>(), "finney"}, - {exp10<12>(), "szabo"}, - {exp10<9>(), "Gwei"}, - {exp10<6>(), "Mwei"}, - {exp10<3>(), "Kwei"}, - {exp10<0>(), "wei"} - }; - - return s_units; -} - -std::string formatBalance(bigint const& _b) -{ - ostringstream ret; - u256 b; - if (_b < 0) - { - ret << "-"; - b = (u256)-_b; - } - else - b = (u256)_b; - - if (b > units()[0].first * 1000) - { - ret << (b / units()[0].first) << " " << units()[0].second; - return ret.str(); - } - ret << setprecision(5); - for (auto const& i: units()) - if (i.first != 1 && b >= i.first * 1) - { - ret << (double(b / (i.first / 1000)) / 1000.0) << " " << i.second; - return ret.str(); - } - ret << b << " wei"; - return ret.str(); -} - -static void badBlockInfo(BlockInfo const& _bi, string const& _err) -{ - string const c_line = EthReset EthOnMaroon + string(80, ' ') + EthReset; - string const c_border = EthReset EthOnMaroon + string(2, ' ') + EthReset EthMaroonBold; - string const c_space = c_border + string(76, ' ') + c_border + EthReset; - stringstream ss; - ss << c_line << endl; - ss << c_space << endl; - ss << c_border + " Import Failure " + _err + string(max(0, 53 - _err.size()), ' ') + " " + c_border << endl; - ss << c_space << endl; - string bin = toString(_bi.number()); - ss << c_border + (" Guru Meditation #" + string(max(0, 8 - bin.size()), '0') + bin + "." + _bi.hash().abridged() + " ") + c_border << endl; - ss << c_space << endl; - ss << c_line; - cwarn << "\n" + ss.str(); -} - -void badBlock(bytesConstRef _block, string const& _err) -{ - BlockInfo bi; - DEV_IGNORE_EXCEPTIONS(bi = BlockInfo(_block, CheckNothing)); - badBlockInfo(bi, _err); -} - -} -} diff --git a/libethcore/Common.h b/libethcore/Common.h index 5adc6c4f5..f56641562 100644 --- a/libethcore/Common.h +++ b/libethcore/Common.h @@ -34,15 +34,6 @@ namespace dev namespace eth { -/// Current protocol version. -extern const unsigned c_protocolVersion; - -/// Current minor protocol version. -extern const unsigned c_minorProtocolVersion; - -/// Current database version. -extern const unsigned c_databaseVersion; - /// The network id. enum class Network { @@ -54,18 +45,12 @@ extern Network c_network; Network resetNetwork(Network _n); -/// User-friendly string representation of the amount _b in wei. -std::string formatBalance(bigint const& _b); - /// An Ethereum address: 20 bytes. /// @NOTE This is not endian-specific; it's just a bunch of bytes. using Address = h160; DEV_SIMPLE_EXCEPTION(InvalidAddress); -/// Convert the given string into an address. -Address toAddress(std::string const& _s); - /// Get information concerning the currency denominations. std::vector> const& units(); @@ -96,128 +81,6 @@ using Nonce = h64; using BlockNumber = unsigned; -static const BlockNumber LatestBlock = (BlockNumber)-2; -static const BlockNumber PendingBlock = (BlockNumber)-1; -static const h256 LatestBlockHash = h256(2); -static const h256 EarliestBlockHash = h256(1); -static const h256 PendingBlockHash = h256(0); - - -enum class RelativeBlock: BlockNumber -{ - Latest = LatestBlock, - Pending = PendingBlock -}; - -class Transaction; - -struct ImportRoute -{ - h256s deadBlocks; - h256s liveBlocks; - std::vector goodTranactions; -}; - -enum class ImportResult -{ - Success = 0, - UnknownParent, - FutureTimeKnown, - FutureTimeUnknown, - AlreadyInChain, - AlreadyKnown, - Malformed, - OverbidGasPrice, - BadChain -}; - -struct ImportRequirements -{ - using value = unsigned; - enum - { - ValidSeal = 1, ///< Validate seal - UncleBasic = 4, ///< Check the basic structure of the uncles. - TransactionBasic = 8, ///< Check the basic structure of the transactions. - UncleSeals = 16, ///< Check the basic structure of the uncles. - TransactionSignatures = 32, ///< Check the basic structure of the transactions. - Parent = 64, ///< Check parent block header. - UncleParent = 128, ///< Check uncle parent block header. - CheckUncles = UncleBasic | UncleSeals, ///< Check uncle seals. - CheckTransactions = TransactionBasic | TransactionSignatures, ///< Check transaction signatures. - OutOfOrderChecks = ValidSeal | CheckUncles | CheckTransactions, ///< Do all checks that can be done independently of prior blocks having been imported. - InOrderChecks = Parent | UncleParent, ///< Do all checks that cannot be done independently of prior blocks having been imported. - Everything = ValidSeal | CheckUncles | CheckTransactions | Parent | UncleParent, - None = 0 - }; -}; - -/// Super-duper signal mechanism. TODO: replace with somthing a bit heavier weight. -template class Signal -{ -public: - using Callback = std::function; - - class HandlerAux - { - friend class Signal; - - public: - ~HandlerAux() { if (m_s) m_s->m_fire.erase(m_i); } - void reset() { m_s = nullptr; } - void fire(Args const&... _args) { m_h(_args...); } - - private: - HandlerAux(unsigned _i, Signal* _s, Callback const& _h): m_i(_i), m_s(_s), m_h(_h) {} - - unsigned m_i = 0; - Signal* m_s = nullptr; - Callback m_h; - }; - - ~Signal() - { - for (auto const& h : m_fire) - if (auto l = h.second.lock()) - l->reset(); - } - - std::shared_ptr add(Callback const& _h) - { - auto n = m_fire.empty() ? 0 : (m_fire.rbegin()->first + 1); - auto h = std::shared_ptr(new HandlerAux(n, this, _h)); - m_fire[n] = h; - return h; - } - - void operator()(Args const&... _args) - { - for (auto const& f: valuesOf(m_fire)) - if (auto h = f.lock()) - h->fire(_args...); - } - -private: - std::map> m_fire; -}; - -template using Handler = std::shared_ptr::HandlerAux>; - -struct TransactionSkeleton -{ - bool creation = false; - Address from; - Address to; - u256 value; - bytes data; - u256 nonce = UndefinedU256; - u256 gas = UndefinedU256; - u256 gasPrice = UndefinedU256; -}; - -void badBlock(bytesConstRef _header, std::string const& _err); -inline void badBlock(bytes const& _header, std::string const& _err) { badBlock(&_header, _err); } - // TODO: move back into a mining subsystem and have it be accessible from Sealant only via a dynamic_cast. /** * @brief Describes the progress of a mining operation. @@ -230,12 +93,5 @@ struct WorkingProgress uint64_t rate() const { return ms == 0 ? 0 : hashes * 1000 / ms; } }; -/// Import transaction policy -enum class IfDropped -{ - Ignore, ///< Don't import transaction that was previously dropped. - Retry ///< Import transaction even if it was dropped before. -}; - } }