From c5c35e62046df1d1cc20946f7a133f7506b72268 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 2 Mar 2015 17:27:10 +0100 Subject: [PATCH] Gas fixes. Trie fixes. --- libdevcrypto/MemoryDB.h | 5 +++-- libdevcrypto/OverlayDB.cpp | 17 +++++++++-------- libdevcrypto/TrieDB.h | 6 +++++- libethereum/Client.cpp | 9 +++++++-- libevm/VM.cpp | 8 +------- 5 files changed, 25 insertions(+), 20 deletions(-) diff --git a/libdevcrypto/MemoryDB.h b/libdevcrypto/MemoryDB.h index ecda3b6ec..7d39ba73b 100644 --- a/libdevcrypto/MemoryDB.h +++ b/libdevcrypto/MemoryDB.h @@ -52,7 +52,8 @@ public: void purge(); bytes lookupAux(h256 _h) const { auto h = aux(_h); return m_aux.count(h) ? m_aux.at(h) : bytes(); } - void insertAux(h256 _h, bytesConstRef _v) { m_auxKey = aux(_h); m_aux[m_auxKey] = _v.toBytes(); } + void removeAux(h256 _h) { m_auxActive.erase(aux(_h)); } + void insertAux(h256 _h, bytesConstRef _v) { auto h = aux(_h); m_auxActive.insert(h); m_aux[h] = _v.toBytes(); } std::set keys() const; @@ -61,7 +62,7 @@ protected: std::map m_over; std::map m_refCount; - h256 m_auxKey; + std::set m_auxActive; std::map m_aux; mutable bool m_enforceRefs = false; diff --git a/libdevcrypto/OverlayDB.cpp b/libdevcrypto/OverlayDB.cpp index d34dd1906..ffe996bb6 100644 --- a/libdevcrypto/OverlayDB.cpp +++ b/libdevcrypto/OverlayDB.cpp @@ -52,14 +52,15 @@ void OverlayDB::commit() if (m_refCount[i.first]) m_db->Put(m_writeOptions, ldb::Slice((char const*)i.first.data(), i.first.size), ldb::Slice(i.second.data(), i.second.size())); } - if (m_auxKey && m_aux.count(m_auxKey)) - { - m_db->Put(m_writeOptions, m_auxKey.ref(), bytesConstRef(&m_aux[m_auxKey])); - cdebug << "Committing aux: " << m_auxKey; - m_aux.erase(m_auxKey); - cdebug << "Discarding " << keysOf(m_aux); - } - m_auxKey = h256(); + for (auto const& i: m_auxActive) + if (m_aux.count(i)) + { + m_db->Put(m_writeOptions, i.ref(), bytesConstRef(&m_aux[i])); + cdebug << "Committing aux: " << i; + m_aux.erase(i); + } + cdebug << "Discarding " << keysOf(m_aux); + m_auxActive.clear(); m_aux.clear(); m_over.clear(); m_refCount.clear(); diff --git a/libdevcrypto/TrieDB.h b/libdevcrypto/TrieDB.h index e00e03f44..1abf2d8c0 100644 --- a/libdevcrypto/TrieDB.h +++ b/libdevcrypto/TrieDB.h @@ -404,8 +404,12 @@ public: void setRoot(h256 _root) { + if (!m_secure.isNull()) + Super::db()->removeAux(m_secure.root()); m_secure.setRoot(_root); - Super::setRoot(h256(Super::db()->lookupAux(m_secure.root()))); + auto rb = Super::db()->lookupAux(m_secure.root()); + auto r = h256(rb); + Super::setRoot(r); } h256 root() const { return m_secure.root(); } diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 42ff1f25d..73e1092af 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -277,9 +277,14 @@ LocalisedLogEntries Client::checkWatch(unsigned _watchId) LocalisedLogEntries ret; try { -// cdebug << "checkWatch" << _watchId; +#if ETH_DEBUG && 0 + cdebug << "checkWatch" << _watchId; +#endif + auto& w = m_watches.at(_watchId); +#if ETH_DEBUG && 0 + cdebug << "lastPoll updated to " << chrono::duration_cast(chrono::system_clock::now().time_since_epoch()).count(); +#endif auto& w = m_watches.at(_watchId); -// cdebug << "lastPoll updated to " << chrono::duration_cast(chrono::system_clock::now().time_since_epoch()).count(); std::swap(ret, w.changes); w.lastPoll = chrono::system_clock::now(); } catch (...) {} diff --git a/libevm/VM.cpp b/libevm/VM.cpp index 9f2fa6874..f4e904e3f 100644 --- a/libevm/VM.cpp +++ b/libevm/VM.cpp @@ -82,19 +82,13 @@ bytesConstRef VM::go(ExtVMFace& _ext, OnOpFunc const& _onOp, uint64_t _steps) BOOST_THROW_EXCEPTION(BadInstruction()); // FEES... - bigint runGas; + bigint runGas = c_tierStepGas[metric.gasPriceTier]; bigint newTempSize = m_temp.size(); bigint copySize = 0; // should work, but just seems to result in immediate errorless exit on initial execution. yeah. weird. //m_onFail = std::function(onOperation); - auto metric = c_metrics[(int)inst]; - int gasPriceTier = metric.gasPriceTier; - if (gasPriceTier == InvalidTier) - BOOST_THROW_EXCEPTION(BadInstruction()); - else - runGas = c_tierStepGas[metric.gasPriceTier]; require(metric.args); auto onOperation = [&]()