diff --git a/libethereum/State.cpp b/libethereum/State.cpp index 7d27520dd..e9e21d9fe 100644 --- a/libethereum/State.cpp +++ b/libethereum/State.cpp @@ -103,7 +103,10 @@ void State::ensureCached(Address _a, bool _requireMemory, bool _forceCreate) con TrieDB memdb(const_cast(&m_db), it->second.oldRoot()); // promise we won't alter the overlay! :) map& mem = it->second.takeMemory(); for (auto const& i: memdb) - mem[i.first] = RLP(i.second).toInt(); + if(mem.find(i.first)==mem.end()) + mem.insert(std::pair(i.first,RLP(i.second).toInt())); + else + mem.at(i.first) = RLP(i.second).toInt(); } } @@ -565,7 +568,11 @@ void State::executeBare(Transaction const& _t, Address _sender) m_cache[newAddress] = AddressState(0, 0, sha3(RLPNull)); auto& mem = m_cache[newAddress].takeMemory(); for (uint i = 0; i < _t.data.size(); ++i) - mem[i] = _t.data[i]; + if(mem.find(i)==mem.end()) + mem.insert(std::pair(i,_t.data[i])); + else + mem.at(i) = _t.data[i]; + subBalance(_sender, _t.value + _t.fee); addBalance(newAddress, _t.value); addBalance(m_currentBlock.coinbaseAddress, _t.fee); @@ -600,10 +607,14 @@ void State::execute(Address _myAddress, Address _txSender, u256 _txValue, u256 _ }; auto setMem = [&](u256 _n, u256 _v) { - if (_v) - myMemory[_n] = _v; - else - myMemory.erase(_n); + if (_v) { + if(myMemory.find(_n)==myMemory.end()) + myMemory.insert(std::pair(_n,_v)); + else + myMemory.at(_n) = _v; + } else { + myMemory.erase(_n); + } }; u256 curPC = 0;