Browse Source

Gas fixes.

Trie fixes.
cl-refactor
Gav Wood 10 years ago
parent
commit
1c73db8695
  1. 5
      libdevcrypto/MemoryDB.h
  2. 17
      libdevcrypto/OverlayDB.cpp
  3. 6
      libdevcrypto/TrieDB.h
  4. 9
      libethereum/Client.cpp
  5. 8
      libevm/VM.cpp

5
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<h256> keys() const;
@ -61,7 +62,7 @@ protected:
std::map<h256, std::string> m_over;
std::map<h256, unsigned> m_refCount;
h256 m_auxKey;
std::set<h256> m_auxActive;
std::map<h256, bytes> m_aux;
mutable bool m_enforceRefs = false;

17
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();

6
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(); }

9
libethereum/Client.cpp

@ -278,9 +278,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::seconds>(chrono::system_clock::now().time_since_epoch()).count();
#endif
auto& w = m_watches.at(_watchId);
// cdebug << "lastPoll updated to " << chrono::duration_cast<chrono::seconds>(chrono::system_clock::now().time_since_epoch()).count();
std::swap(ret, w.changes);
w.lastPoll = chrono::system_clock::now();
} catch (...) {}

8
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<void()>(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 = [&]()

Loading…
Cancel
Save