From 016ce6964fc8e2e64c717b3184ba07532c88191d Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 16 Jul 2015 09:46:22 +0200 Subject: [PATCH 01/10] copy evmjit dll to output on windows --- CMakeLists.txt | 10 ++++++---- alethzero/CMakeLists.txt | 2 +- eth/CMakeLists.txt | 2 +- evmjit/libevmjit/CMakeLists.txt | 1 - 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 271f3ed65..48f1efee0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -368,6 +368,10 @@ if (EVMJIT) endif() set(EVMJIT_CPP TRUE) # include CPP-JIT connector add_subdirectory(evmjit) + if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + get_property(EVMJIT_DLLS_LOCAL TARGET "evmjit" PROPERTY LOCATION) + set(EVMJIT_DLLS optimized ${EVMJIT_DLLS_LOCAL} debug ${EVMJIT_DLLS_LOCAL}) + endif() endif() if (TOOLS OR GUI OR SOLIDITY OR NCURSES OR TESTS) @@ -409,10 +413,8 @@ if (JSCONSOLE) add_subdirectory(ethconsole) endif () -if (NOT WIN32) - add_definitions(-DETH_HAVE_SECP256K1) - add_subdirectory(secp256k1) -endif () +add_definitions(-DETH_HAVE_SECP256K1) +add_subdirectory(secp256k1) add_subdirectory(libscrypt) add_subdirectory(libdevcrypto) diff --git a/alethzero/CMakeLists.txt b/alethzero/CMakeLists.txt index 8bc349fb2..6f9dc59b3 100644 --- a/alethzero/CMakeLists.txt +++ b/alethzero/CMakeLists.txt @@ -72,5 +72,5 @@ if (SERPENT) endif() # eth_install_executable is defined in cmake/EthExecutableHelper.cmake -eth_install_executable(${EXECUTABLE} DLLS MHD_DLLS) +eth_install_executable(${EXECUTABLE} DLLS MHD_DLLS EVMJIT_DLLS) diff --git a/eth/CMakeLists.txt b/eth/CMakeLists.txt index d317be28a..dd4d61cd2 100644 --- a/eth/CMakeLists.txt +++ b/eth/CMakeLists.txt @@ -42,7 +42,7 @@ if (JSCONSOLE) endif() if (DEFINED WIN32 AND NOT DEFINED CMAKE_COMPILER_IS_MINGW) - eth_copy_dlls("${EXECUTABLE}" MHD_DLLS) + eth_copy_dlls("${EXECUTABLE}" MHD_DLLS EVMJIT_DLLS) endif() if (APPLE) diff --git a/evmjit/libevmjit/CMakeLists.txt b/evmjit/libevmjit/CMakeLists.txt index 80108e15b..a41c7b365 100644 --- a/evmjit/libevmjit/CMakeLists.txt +++ b/evmjit/libevmjit/CMakeLists.txt @@ -29,7 +29,6 @@ else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti") endif() - set(EVMJIT_VERSION "0.0.0") set(EVMJIT_VERSION_MAJOR 0) set(EVMJIT_VERSION_MINOR 0) From 63ef6a74f9ae708ade1f840925b5c70cf47c37a4 Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 16 Jul 2015 12:28:00 +0200 Subject: [PATCH 02/10] reverted libsecp256k1 changes --- CMakeLists.txt | 10 ++++++---- evmjit/libevmjit/CMakeLists.txt | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 48f1efee0..4eade560f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -369,8 +369,8 @@ if (EVMJIT) set(EVMJIT_CPP TRUE) # include CPP-JIT connector add_subdirectory(evmjit) if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") - get_property(EVMJIT_DLLS_LOCAL TARGET "evmjit" PROPERTY LOCATION) - set(EVMJIT_DLLS optimized ${EVMJIT_DLLS_LOCAL} debug ${EVMJIT_DLLS_LOCAL}) + get_property(EVMJIT_DLLS_LOCAL TARGET "evmjit" PROPERTY LOCATION) + set(EVMJIT_DLLS optimized ${EVMJIT_DLLS_LOCAL} debug ${EVMJIT_DLLS_LOCAL}) endif() endif() @@ -413,8 +413,10 @@ if (JSCONSOLE) add_subdirectory(ethconsole) endif () -add_definitions(-DETH_HAVE_SECP256K1) -add_subdirectory(secp256k1) +if (NOT WIN32) + add_definitions(-DETH_HAVE_SECP256K1) + add_subdirectory(secp256k1) +endif () add_subdirectory(libscrypt) add_subdirectory(libdevcrypto) diff --git a/evmjit/libevmjit/CMakeLists.txt b/evmjit/libevmjit/CMakeLists.txt index a41c7b365..80108e15b 100644 --- a/evmjit/libevmjit/CMakeLists.txt +++ b/evmjit/libevmjit/CMakeLists.txt @@ -29,6 +29,7 @@ else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti") endif() + set(EVMJIT_VERSION "0.0.0") set(EVMJIT_VERSION_MAJOR 0) set(EVMJIT_VERSION_MINOR 0) From e7f34beb45516759120bbc89cbc4f280a9d479f1 Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 16 Jul 2015 23:05:29 +0200 Subject: [PATCH 03/10] fixed eth_copy_dlls reverted libsecp256k1 changes --- CMakeLists.txt | 8 +++++--- cmake/EthExecutableHelper.cmake | 14 ++++++++++---- evmjit/libevmjit/CMakeLists.txt | 1 + 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 48f1efee0..ceae8554c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -369,7 +369,7 @@ if (EVMJIT) set(EVMJIT_CPP TRUE) # include CPP-JIT connector add_subdirectory(evmjit) if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") - get_property(EVMJIT_DLLS_LOCAL TARGET "evmjit" PROPERTY LOCATION) + set(EVMJIT_DLLS_LOCAL $) set(EVMJIT_DLLS optimized ${EVMJIT_DLLS_LOCAL} debug ${EVMJIT_DLLS_LOCAL}) endif() endif() @@ -413,8 +413,10 @@ if (JSCONSOLE) add_subdirectory(ethconsole) endif () -add_definitions(-DETH_HAVE_SECP256K1) -add_subdirectory(secp256k1) +if (NOT WIN32) + add_definitions(-DETH_HAVE_SECP256K1) + add_subdirectory(secp256k1) +endif () add_subdirectory(libscrypt) add_subdirectory(libdevcrypto) diff --git a/cmake/EthExecutableHelper.cmake b/cmake/EthExecutableHelper.cmake index 1d1cb887b..1fa02bb40 100644 --- a/cmake/EthExecutableHelper.cmake +++ b/cmake/EthExecutableHelper.cmake @@ -43,11 +43,11 @@ macro(eth_add_executable EXECUTABLE) endmacro() -macro(eth_copy_dlls EXECUTABLE DLLS) +macro(eth_copy_dll EXECUTABLE DLL) # dlls must be unsubstitud list variable (without ${}) in format # optimized;path_to_dll.dll;debug;path_to_dlld.dll - list(GET ${DLLS} 1 DLL_RELEASE) - list(GET ${DLLS} 3 DLL_DEBUG) + list(GET ${DLL} 1 DLL_RELEASE) + list(GET ${DLL} 3 DLL_DEBUG) add_custom_command(TARGET ${EXECUTABLE} POST_BUILD COMMAND ${CMAKE_COMMAND} ARGS @@ -59,6 +59,12 @@ macro(eth_copy_dlls EXECUTABLE DLLS) ) endmacro() +macro(eth_copy_dlls EXECUTABLE) + foreach(dll ${ARGN}) + eth_copy_dll(${EXECUTABLE} ${dll}) + endforeach(dll) +endmacro() + # # this function requires the following variables to be specified: # ETH_DEPENDENCY_INSTALL_DIR @@ -124,7 +130,7 @@ macro(eth_install_executable EXECUTABLE) #copy additional dlls foreach(dll ${ETH_INSTALL_EXECUTABLE_DLLS}) - eth_copy_dlls(${EXECUTABLE} ${dll}) + eth_copy_dll(${EXECUTABLE} ${dll}) endforeach(dll) install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/Debug" diff --git a/evmjit/libevmjit/CMakeLists.txt b/evmjit/libevmjit/CMakeLists.txt index a41c7b365..80108e15b 100644 --- a/evmjit/libevmjit/CMakeLists.txt +++ b/evmjit/libevmjit/CMakeLists.txt @@ -29,6 +29,7 @@ else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti") endif() + set(EVMJIT_VERSION "0.0.0") set(EVMJIT_VERSION_MAJOR 0) set(EVMJIT_VERSION_MINOR 0) From a2df5389405af2cb5c65b2ce1a3a3503cbafcac7 Mon Sep 17 00:00:00 2001 From: arkpar Date: Mon, 20 Jul 2015 08:35:25 +0200 Subject: [PATCH 04/10] opencl.dll copied to alethzero outputs --- alethzero/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alethzero/CMakeLists.txt b/alethzero/CMakeLists.txt index 6f9dc59b3..1b1138eab 100644 --- a/alethzero/CMakeLists.txt +++ b/alethzero/CMakeLists.txt @@ -72,5 +72,5 @@ if (SERPENT) endif() # eth_install_executable is defined in cmake/EthExecutableHelper.cmake -eth_install_executable(${EXECUTABLE} DLLS MHD_DLLS EVMJIT_DLLS) +eth_install_executable(${EXECUTABLE} DLLS MHD_DLLS EVMJIT_DLLS OpenCL_DLLS) From a8b8ce540feea3c1d4909548ba7afdb31b9e68d0 Mon Sep 17 00:00:00 2001 From: chriseth Date: Mon, 20 Jul 2015 18:44:06 +0200 Subject: [PATCH 05/10] Windows fix. --- test/libsolidity/SolidityWallet.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/libsolidity/SolidityWallet.cpp b/test/libsolidity/SolidityWallet.cpp index 707f49b1b..b5f0f7249 100644 --- a/test/libsolidity/SolidityWallet.cpp +++ b/test/libsolidity/SolidityWallet.cpp @@ -523,7 +523,9 @@ BOOST_AUTO_TEST_CASE(initial_owners) BOOST_CHECK(callContractFunction("m_numOwners()") == encodeArgs(u256(8))); BOOST_CHECK(callContractFunction("isOwner(address)", h256(m_sender, h256::AlignRight)) == encodeArgs(true)); for (u256 const& owner: owners) + { BOOST_CHECK(callContractFunction("isOwner(address)", owner) == encodeArgs(true)); + } } BOOST_AUTO_TEST_CASE(multisig_value_transfer) From 3bd1aecd2dd1a16aa63f61c642bdd49c47a96b3f Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 16 Jul 2015 09:57:27 +0200 Subject: [PATCH 06/10] performance optimizations --- libethereum/BlockChain.cpp | 25 ++++---- libethereum/BlockChain.h | 14 +++-- libethereum/BlockDetails.h | 2 +- libethereum/BlockQueue.cpp | 2 +- libethereum/BlockQueue.h | 2 +- libethereum/DownloadMan.cpp | 56 ++--------------- libethereum/DownloadMan.h | 104 ------------------------------- libethereum/TransactionQueue.cpp | 1 + 8 files changed, 33 insertions(+), 173 deletions(-) diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index a992c5851..00117e679 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -84,17 +84,22 @@ std::ostream& dev::eth::operator<<(std::ostream& _out, BlockChain const& _bc) ldb::Slice dev::eth::toSlice(h256 const& _h, unsigned _sub) { -#if ALL_COMPILERS_ARE_CPP11_COMPLIANT - static thread_local h256 h = _h ^ sha3(h256(u256(_sub))); - return ldb::Slice((char const*)&h, 32); -#else static boost::thread_specific_ptr> t_h; if (!t_h.get()) t_h.reset(new FixedHash<33>); *t_h = FixedHash<33>(_h); (*t_h)[32] = (uint8_t)_sub; return (ldb::Slice)t_h->ref();//(char const*)t_h.get(), 32); -#endif +} + +ldb::Slice dev::eth::toSlice(uint64_t _n, unsigned _sub) +{ + static boost::thread_specific_ptr> t_h; + if (!t_h.get()) + t_h.reset(new FixedHash<33>); + toBigEndian(_n, bytesRef(t_h->data() + 24, 8)); + (*t_h)[32] = (uint8_t)_sub; + return (ldb::Slice)t_h->ref(); } namespace dev @@ -289,7 +294,7 @@ void BlockChain::rebuild(std::string const& _path, std::function(h256(u256(d)), m_blockHashes, x_blockHashes, NullBlockHash, oldExtrasDB).value); + bytes b = block(queryExtras(d, m_blockHashes, x_blockHashes, NullBlockHash, oldExtrasDB).value); BlockInfo bi(&b); if (_prepPoW) @@ -359,7 +364,8 @@ tuple BlockChain::sync(BlockQueue& _bq, OverlayDB c r = import(block.verified, _stateDB, ImportRequirements::Everything & ~ImportRequirements::ValidSeal & ~ImportRequirements::CheckUncles); fresh += r.liveBlocks; dead += r.deadBlocks; - goodTransactions += r.goodTranactions; + goodTransactions.reserve(goodTransactions.size() + r.goodTranactions.size()); + std::move(std::begin(r.goodTranactions), std::end(r.goodTranactions), std::back_inserter(goodTransactions)); ++count; } catch (dev::eth::UnknownParent) @@ -947,7 +953,7 @@ void BlockChain::noteUsed(h256 const& _h, unsigned _extra) const m_inUse.insert(id); } -template static unsigned getHashSize(unordered_map const& _map) +template static unsigned getHashSize(unordered_map const& _map) { unsigned ret = 0; for (auto const& i: _map) @@ -1005,9 +1011,6 @@ void BlockChain::garbageCollect(bool _force) case ExtraDetails: m_details.erase(id.first); break; - case ExtraBlockHash: - m_blockHashes.erase(id.first); - break; case ExtraReceipts: m_receipts.erase(id.first); break; diff --git a/libethereum/BlockChain.h b/libethereum/BlockChain.h index d60be548a..415581f29 100644 --- a/libethereum/BlockChain.h +++ b/libethereum/BlockChain.h @@ -72,6 +72,7 @@ struct BlockChainDebug: public LogChannel { static const char* name(); static co std::unordered_map const& genesisState(); ldb::Slice toSlice(h256 const& _h, unsigned _sub = 0); +ldb::Slice toSlice(uint64_t _n, unsigned _sub = 0); using BlocksHash = std::unordered_map; using TransactionHashes = h256s; @@ -168,7 +169,7 @@ public: UncleHashes uncleHashes() const { return uncleHashes(currentHash()); } /// Get the hash for a given block's number. - h256 numberHash(unsigned _i) const { if (!_i) return genesisHash(); return queryExtras(h256(_i), m_blockHashes, x_blockHashes, NullBlockHash).value; } + h256 numberHash(unsigned _i) const { if (!_i) return genesisHash(); return queryExtras(_i, m_blockHashes, x_blockHashes, NullBlockHash).value; } /// Get the last N hashes for a given block. (N is determined by the LastHashes type.) LastHashes lastHashes() const { return lastHashes(number()); } @@ -293,7 +294,7 @@ protected: unsigned open(std::string const& _path, WithExisting _we = WithExisting::Trust); void close(); - template T queryExtras(h256 const& _h, std::unordered_map& _m, boost::shared_mutex& _x, T const& _n, ldb::DB* _extrasDB = nullptr) const + template T queryExtras(K const& _h, std::unordered_map& _m, boost::shared_mutex& _x, T const& _n, ldb::DB* _extrasDB = nullptr) const { { ReadGuard l(_x); @@ -305,10 +306,7 @@ protected: std::string s; (_extrasDB ? _extrasDB : m_extrasDB)->Get(m_readOptions, toSlice(_h, N), &s); if (s.empty()) - { -// cout << "Not found in DB: " << _h << endl; return _n; - } noteUsed(_h, N); @@ -317,6 +315,11 @@ protected: return ret.first->second; } + template T queryExtras(h256 const& _h, std::unordered_map& _m, boost::shared_mutex& _x, T const& _n, ldb::DB* _extrasDB = nullptr) const + { + return queryExtras(_h, _m, _x, _n, _extrasDB); + } + void checkConsistency(); /// The caches of the disk DB and their locks. @@ -340,6 +343,7 @@ protected: mutable std::deque> m_cacheUsage; mutable std::unordered_set m_inUse; void noteUsed(h256 const& _h, unsigned _extra = (unsigned)-1) const; + void noteUsed(uint64_t const& _h, unsigned _extra = (unsigned)-1) const { (void)_h; (void)_extra; } // don't note non-hash types std::chrono::system_clock::time_point m_lastCollection; void noteCanonChanged() const { Guard l(x_lastLastHashes); m_lastLastHashes.clear(); } diff --git a/libethereum/BlockDetails.h b/libethereum/BlockDetails.h index 73026834e..81f3cecdb 100644 --- a/libethereum/BlockDetails.h +++ b/libethereum/BlockDetails.h @@ -114,7 +114,7 @@ using BlockDetailsHash = std::unordered_map; using BlockLogBloomsHash = std::unordered_map; using BlockReceiptsHash = std::unordered_map; using TransactionAddressHash = std::unordered_map; -using BlockHashHash = std::unordered_map; +using BlockHashHash = std::unordered_map; using BlocksBloomsHash = std::unordered_map; static const BlockDetails NullBlockDetails; diff --git a/libethereum/BlockQueue.cpp b/libethereum/BlockQueue.cpp index d0ca34b1c..97352fbf1 100644 --- a/libethereum/BlockQueue.cpp +++ b/libethereum/BlockQueue.cpp @@ -292,7 +292,7 @@ void BlockQueue::updateBad_WITH_LOCK(h256 const& _bad) while (moreBad) { moreBad = false; - std::vector oldVerified; + std::deque oldVerified; swap(m_verified, oldVerified); for (auto& b: oldVerified) if (m_knownBad.count(b.verified.info.parentHash()) || m_knownBad.count(b.verified.info.hash())) diff --git a/libethereum/BlockQueue.h b/libethereum/BlockQueue.h index 97fca7c72..0d90aac21 100644 --- a/libethereum/BlockQueue.h +++ b/libethereum/BlockQueue.h @@ -154,7 +154,7 @@ private: mutable Mutex m_verification; ///< Mutex that allows writing to m_verified, m_verifying and m_unverified. std::condition_variable m_moreToVerify; ///< Signaled when m_unverified has a new entry. - std::vector m_verified; ///< List of blocks, in correct order, verified and ready for chain-import. + std::deque m_verified; ///< List of blocks, in correct order, verified and ready for chain-import. std::deque m_verifying; ///< List of blocks being verified; as long as the block component (bytes) is empty, it's not finished. std::deque m_unverified; ///< List of in correct order, ready for verification. diff --git a/libethereum/DownloadMan.cpp b/libethereum/DownloadMan.cpp index a9d353292..84931def2 100644 --- a/libethereum/DownloadMan.cpp +++ b/libethereum/DownloadMan.cpp @@ -24,6 +24,8 @@ using namespace std; using namespace dev; using namespace dev::eth; +size_t const c_maxDownloadAhead = 50000; // Must not be higher than BlockQueue::c_maxUnknownCount + DownloadMan::Overview DownloadMan::overview() const { ReadGuard l(m_lock); @@ -63,9 +65,10 @@ h256Hash DownloadSub::nextFetch(unsigned _n) if (!m_man || m_man->chainEmpty()) return h256Hash(); - m_asked = (~(m_man->taken() + m_attempted)).lowest(_n); - if (m_asked.empty()) - m_asked = (~(m_man->taken(true) + m_attempted)).lowest(_n); + RangeMask downloaded = m_man->taken(true); + m_asked = (~(m_man->taken(false) + m_attempted)).lowest(_n); + if (m_asked.empty() || m_asked.lastIn() - downloaded.firstOut() >= c_maxDownloadAhead) + m_asked = (~(downloaded + m_attempted)).lowest(_n); m_attempted += m_asked; for (auto i: m_asked) { @@ -85,50 +88,3 @@ bool DownloadSub::noteBlock(h256 _hash) m_remaining.erase(_hash); return ret; } - -HashDownloadSub::HashDownloadSub(HashDownloadMan& _man): m_man(&_man) -{ - WriteGuard l(m_man->x_subs); - m_asked = RangeMask(m_man->m_chainStart, m_man->m_chainStart + m_man->m_chainCount); - m_man->m_subs.insert(this); -} - -HashDownloadSub::~HashDownloadSub() -{ - if (m_man) - { - WriteGuard l(m_man->x_subs); - m_man->m_subs.erase(this); - } -} - -void HashDownloadSub::resetFetch() -{ - Guard l(m_fetch); - m_remaining = 0; - m_asked = RangeMask(m_man->m_chainStart, m_man->m_chainStart + m_man->m_chainCount); -} - -unsigned HashDownloadSub::nextFetch(unsigned _n) -{ - Guard l(m_fetch); - - m_asked = RangeMask(m_man->m_chainStart, m_man->m_chainStart + m_man->m_chainCount); - - if (!m_man || m_man->chainEmpty()) - return 0; - - m_asked = (~(m_man->taken())).lowest(_n); - if (m_asked.empty()) - m_asked = (~(m_man->taken(true))).lowest(_n); - return *m_asked.begin(); -} - -void HashDownloadSub::noteHash(unsigned _index, unsigned _size) -{ - Guard l(m_fetch); - if (m_man) - for(unsigned i = _index; i < _index + _size; ++i) - if (i >= m_man->m_got.all().first && i < m_man->m_got.all().second) - m_man->m_got += i; -} diff --git a/libethereum/DownloadMan.h b/libethereum/DownloadMan.h index b697d87ae..b6ca58845 100644 --- a/libethereum/DownloadMan.h +++ b/libethereum/DownloadMan.h @@ -170,110 +170,6 @@ private: std::unordered_set m_subs; }; - -class HashDownloadMan; - -class HashDownloadSub -{ - friend class HashDownloadMan; - -public: - HashDownloadSub(HashDownloadMan& _man); - ~HashDownloadSub(); - - /// Finished last fetch - grab the next hash index to download - unsigned nextFetch(unsigned _n); - - /// Note that we've received a particular hash range. - void noteHash(unsigned _index, unsigned count); - - /// Nothing doing here. - void doneFetch() { resetFetch(); } - - bool askedContains(unsigned _i) const { Guard l(m_fetch); return m_asked.contains(_i); } - RangeMask const& asked() const { return m_asked; } - -private: - void resetFetch(); // Called by DownloadMan when we need to reset the download. - - HashDownloadMan* m_man = nullptr; - mutable Mutex m_fetch; - unsigned m_remaining; - RangeMask m_asked; -}; - -class HashDownloadMan -{ - friend class HashDownloadSub; - -public: - ~HashDownloadMan() - { - for (auto i: m_subs) - i->m_man = nullptr; - } - - void resetToRange(unsigned _start, unsigned _count) - { - { - ReadGuard l(x_subs); - for (auto i: m_subs) - i->resetFetch(); - } - WriteGuard l(m_lock); - m_chainStart = _start; - m_chainCount = _count; - m_got += RangeMask(_start, _start + _count); - { - ReadGuard l(x_subs); - for (auto i: m_subs) - i->resetFetch(); - } - } - - void reset(unsigned _start) - { - WriteGuard l(m_lock); - m_chainStart = _start; - m_chainCount = 0; - m_got = RangeMask(_start, _start); - } - - RangeMask taken(bool _desperate = false) const - { - ReadGuard l(m_lock); - auto ret = m_got; - if (!_desperate) - { - ReadGuard l(x_subs); - for (auto i: m_subs) - ret += i->m_asked; - } - return ret; - } - - bool isComplete() const - { - ReadGuard l(m_lock); - return m_got.full(); - } - - size_t chainSize() const { ReadGuard l(m_lock); return m_chainCount; } - size_t chainEmpty() const { ReadGuard l(m_lock); return m_chainCount == 0; } - void foreachSub(std::function const& _f) const { ReadGuard l(x_subs); for(auto i: m_subs) _f(*i); } - unsigned subCount() const { ReadGuard l(x_subs); return m_subs.size(); } - RangeMask hashesGot() const { ReadGuard l(m_lock); return m_got; } - -private: - mutable SharedMutex m_lock; - unsigned m_chainStart = 0; - unsigned m_chainCount = 0; - RangeMask m_got; - - mutable SharedMutex x_subs; - std::unordered_set m_subs; -}; - } } diff --git a/libethereum/TransactionQueue.cpp b/libethereum/TransactionQueue.cpp index f461cae87..5de86c818 100644 --- a/libethereum/TransactionQueue.cpp +++ b/libethereum/TransactionQueue.cpp @@ -107,6 +107,7 @@ ImportResult TransactionQueue::import(Transaction const& _transaction, IfDropped return ir; { + _transaction.safeSender(); // Perform EC recovery outside of the write lock UpgradeGuard ul(l); ret = manageImport_WITH_LOCK(h, _transaction); } From 26ff87a0bfc58078027f4d2b245c492d444019ff Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 16 Jul 2015 09:52:04 +0200 Subject: [PATCH 07/10] enabled libsecp256k1 on windows --- libdevcrypto/CMakeLists.txt | 6 ++---- test/CMakeLists.txt | 4 +--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/libdevcrypto/CMakeLists.txt b/libdevcrypto/CMakeLists.txt index 4244d95ca..4eb06485f 100644 --- a/libdevcrypto/CMakeLists.txt +++ b/libdevcrypto/CMakeLists.txt @@ -24,10 +24,8 @@ target_link_libraries(${EXECUTABLE} ${DB_LIBRARIES}) target_link_libraries(${EXECUTABLE} ${CRYPTOPP_LIBRARIES}) target_link_libraries(${EXECUTABLE} scrypt) target_link_libraries(${EXECUTABLE} devcore) -if (NOT WIN32) - add_definitions(-DETH_HAVE_SECP256K1) - target_link_libraries(${EXECUTABLE} secp256k1) -endif () +add_definitions(-DETH_HAVE_SECP256K1) +target_link_libraries(${EXECUTABLE} secp256k1) install( TARGETS ${EXECUTABLE} RUNTIME DESTINATION bin ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) install( FILES ${HEADERS} DESTINATION include/${EXECUTABLE} ) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index cbf184808..6bdefd65e 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -75,9 +75,7 @@ target_link_libraries(testeth ${CURL_LIBRARIES}) target_link_libraries(testeth ${CRYPTOPP_LIBRARIES}) target_link_libraries(testeth ethereum) target_link_libraries(testeth ethcore) -if (NOT WIN32) - target_link_libraries(testeth secp256k1) -endif() +target_link_libraries(testeth secp256k1) if (JSCONSOLE) target_link_libraries(testeth jsengine) From df6898538fcc2e8209a1fdd9cb2da2bf7659d911 Mon Sep 17 00:00:00 2001 From: arkpar Date: Mon, 20 Jul 2015 08:58:44 +0200 Subject: [PATCH 08/10] restored toSlice code for c++11, fixed build --- CMakeLists.txt | 6 ++---- libethereum/BlockChain.cpp | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 00e686422..0d92ee90a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -405,10 +405,8 @@ if (JSCONSOLE) add_subdirectory(ethconsole) endif () -if (NOT WIN32) - add_definitions(-DETH_HAVE_SECP256K1) - add_subdirectory(secp256k1) -endif () +add_definitions(-DETH_HAVE_SECP256K1) +add_subdirectory(secp256k1) add_subdirectory(libscrypt) add_subdirectory(libdevcrypto) diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index 00117e679..99e52d92e 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -84,22 +84,35 @@ std::ostream& dev::eth::operator<<(std::ostream& _out, BlockChain const& _bc) ldb::Slice dev::eth::toSlice(h256 const& _h, unsigned _sub) { +#if TRUE //ALL_COMPILERS_ARE_CPP11_COMPLIANT + static thread_local FixedHash<33> h = _h; + h[32] = (uint8_t)_sub; + return (ldb::Slice)h.ref(); +#else static boost::thread_specific_ptr> t_h; if (!t_h.get()) t_h.reset(new FixedHash<33>); *t_h = FixedHash<33>(_h); (*t_h)[32] = (uint8_t)_sub; - return (ldb::Slice)t_h->ref();//(char const*)t_h.get(), 32); + return (ldb::Slice)t_h->ref(); +#endif //ALL_COMPILERS_ARE_CPP11_COMPLIANT } ldb::Slice dev::eth::toSlice(uint64_t _n, unsigned _sub) { +#if TRUE //ALL_COMPILERS_ARE_CPP11_COMPLIANT + static thread_local FixedHash<33> h; + toBigEndian(_n, bytesRef(h.data() + 24, 8)); + h[32] = (uint8_t)_sub; + return (ldb::Slice)h.ref(); +#else static boost::thread_specific_ptr> t_h; if (!t_h.get()) t_h.reset(new FixedHash<33>); toBigEndian(_n, bytesRef(t_h->data() + 24, 8)); (*t_h)[32] = (uint8_t)_sub; return (ldb::Slice)t_h->ref(); +#endif } namespace dev @@ -613,7 +626,7 @@ ImportRoute BlockChain::import(VerifiedBlockRef const& _block, OverlayDB const& unsigned n = number(route.front()); DEV_WRITE_GUARDED(x_blockHashes) for (auto i = route.begin(); i != route.end() && *i != common; ++i, --n) - m_blockHashes.erase(h256(u256(n))); + m_blockHashes.erase(n); DEV_WRITE_GUARDED(x_transactionAddresses) m_transactionAddresses.clear(); // TODO: could perhaps delete them individually? From 89d9a18485c24476772baa755558c8ef369a2d27 Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 16 Jul 2015 09:52:04 +0200 Subject: [PATCH 09/10] enabled libsecp256k1 on windows --- libethereum/BlockChain.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index 99e52d92e..bf2c1cc7c 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -84,10 +84,10 @@ std::ostream& dev::eth::operator<<(std::ostream& _out, BlockChain const& _bc) ldb::Slice dev::eth::toSlice(h256 const& _h, unsigned _sub) { -#if TRUE //ALL_COMPILERS_ARE_CPP11_COMPLIANT - static thread_local FixedHash<33> h = _h; - h[32] = (uint8_t)_sub; - return (ldb::Slice)h.ref(); +#if ALL_COMPILERS_ARE_CPP11_COMPLIANT + static thread_local FixedHash<33> h = _h; + h[32] = (uint8_t)_sub; + return (ldb::Slice)h.ref(); #else static boost::thread_specific_ptr> t_h; if (!t_h.get()) @@ -100,16 +100,17 @@ ldb::Slice dev::eth::toSlice(h256 const& _h, unsigned _sub) ldb::Slice dev::eth::toSlice(uint64_t _n, unsigned _sub) { -#if TRUE //ALL_COMPILERS_ARE_CPP11_COMPLIANT - static thread_local FixedHash<33> h; - toBigEndian(_n, bytesRef(h.data() + 24, 8)); - h[32] = (uint8_t)_sub; - return (ldb::Slice)h.ref(); +#if ALL_COMPILERS_ARE_CPP11_COMPLIANT + static thread_local FixedHash<33> h; + toBigEndian(_n, bytesRef(h.data() + 24, 8)); + h[32] = (uint8_t)_sub; + return (ldb::Slice)h.ref(); #else static boost::thread_specific_ptr> t_h; if (!t_h.get()) t_h.reset(new FixedHash<33>); - toBigEndian(_n, bytesRef(t_h->data() + 24, 8)); + bytesRef ref(t_h->data() + 24, 8); + toBigEndian(_n, ref); (*t_h)[32] = (uint8_t)_sub; return (ldb::Slice)t_h->ref(); #endif @@ -377,7 +378,7 @@ tuple BlockChain::sync(BlockQueue& _bq, OverlayDB c r = import(block.verified, _stateDB, ImportRequirements::Everything & ~ImportRequirements::ValidSeal & ~ImportRequirements::CheckUncles); fresh += r.liveBlocks; dead += r.deadBlocks; - goodTransactions.reserve(goodTransactions.size() + r.goodTranactions.size()); + goodTransactions.reserve(goodTransactions.size() + r.goodTranactions.size()); std::move(std::begin(r.goodTranactions), std::end(r.goodTranactions), std::back_inserter(goodTransactions)); ++count; } From b60018713f6d17f019a1d962b6bf43bb8867cb1e Mon Sep 17 00:00:00 2001 From: arkpar Date: Mon, 20 Jul 2015 21:58:07 +0200 Subject: [PATCH 10/10] fixed build wo libcpuid --- libethcore/EthashCPUMiner.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libethcore/EthashCPUMiner.cpp b/libethcore/EthashCPUMiner.cpp index 2e8a05018..f14c7b625 100644 --- a/libethcore/EthashCPUMiner.cpp +++ b/libethcore/EthashCPUMiner.cpp @@ -35,6 +35,7 @@ using namespace eth; unsigned EthashCPUMiner::s_numInstances = 0; +#if ETH_CPUID || !ETH_TRUE static string jsonEncode(map const& _m) { string ret = "{"; @@ -50,6 +51,7 @@ static string jsonEncode(map const& _m) return ret + "}"; } +#endif void EthashCPUMiner::workLoop() {