diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index 4da7026fe..2853536b9 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -974,7 +974,7 @@ void Main::refreshBlockChain() auto b = bc.block(h); for (auto const& i: RLP(b)[1]) { - Transaction t(i[0].data()); + Transaction t(i.data()); if (bm || transactionMatch(filter, t)) { QString s = t.receiveAddress ? @@ -1235,13 +1235,13 @@ void Main::on_blocks_currentItemChanged() else s << "
Pre: Nothing is before the Gensesis"; for (auto const& i: block[1]) - s << "
" << sha3(i[0].data()).abridged() << ": " << i[1].toHash() << " [" << i[2].toInt() << " used]"; + s << "
" << sha3(i.data()).abridged();// << ": " << i[1].toHash() << " [" << i[2].toInt() << " used]"; s << "
Post: " << info.stateRoot << ""; } else { unsigned txi = item->data(Qt::UserRole + 1).toInt(); - Transaction tx(block[1][txi][0].data()); + Transaction tx(block[1][txi].data()); auto ss = tx.safeSender(); h256 th = sha3(rlpList(ss, tx.nonce)); s << "

" << th << "

"; diff --git a/astylerc b/astylerc index 0b407b9fe..d4e1188eb 100644 --- a/astylerc +++ b/astylerc @@ -6,6 +6,6 @@ min-conditional-indent=1 pad-oper pad-header unpad-paren -delete-empty-lines align-pointer=type - +keep-one-line-blocks +close-templates diff --git a/libdevcore/Common.cpp b/libdevcore/Common.cpp index a32125354..9d2ae55d7 100644 --- a/libdevcore/Common.cpp +++ b/libdevcore/Common.cpp @@ -27,7 +27,7 @@ using namespace dev; namespace dev { -char const* Version = "0.7.7"; +char const* Version = "0.7.8"; } diff --git a/libethcore/CommonEth.cpp b/libethcore/CommonEth.cpp index 44ebe19c5..e7223d896 100644 --- a/libethcore/CommonEth.cpp +++ b/libethcore/CommonEth.cpp @@ -34,7 +34,7 @@ namespace dev namespace eth { -const unsigned c_protocolVersion = 37; +const unsigned c_protocolVersion = 38; const unsigned c_databaseVersion = 3; static const vector> g_units = diff --git a/libethereum/AddressState.h b/libethereum/AddressState.h index 668e9225f..8b4505909 100644 --- a/libethereum/AddressState.h +++ b/libethereum/AddressState.h @@ -23,6 +23,7 @@ #include #include +#include #include namespace dev @@ -35,10 +36,19 @@ namespace eth class AddressState { public: - AddressState(): m_isAlive(false), m_nonce(0), m_balance(0) {} + enum NewAccountType { NormalCreation, ContractConception }; + + /// Construct a dead AddressState. + AddressState() {} + /// Construct an alive AddressState, with given endowment, for either a normal (non-contract) account or for a contract account in the + /// conception phase, where the code is not yet known. + AddressState(u256 _balance, NewAccountType _t): m_isAlive(true), m_balance(_balance), m_codeHash(_t == NormalCreation ? h256() : EmptySHA3) {} + /// Explicit constructor for wierd cases of construction of a normal account. + AddressState(u256 _nonce, u256 _balance): m_isAlive(true), m_nonce(_nonce), m_balance(_balance) {} + /// Explicit constructor for wierd cases of construction or a contract account. AddressState(u256 _nonce, u256 _balance, h256 _contractRoot, h256 _codeHash): m_isAlive(true), m_nonce(_nonce), m_balance(_balance), m_storageRoot(_contractRoot), m_codeHash(_codeHash) {} - void kill() { m_isAlive = false; m_storageOverlay.clear(); m_codeHash = EmptySHA3; m_storageRoot = h256(); m_balance = 0; m_nonce = 0; } + void kill() { m_isAlive = false; m_storageOverlay.clear(); m_codeHash = EmptySHA3; m_storageRoot = EmptyTrie; m_balance = 0; m_nonce = 0; } bool isAlive() const { return m_isAlive; } u256& balance() { return m_balance; } @@ -62,17 +72,17 @@ public: void noteCode(bytesConstRef _code) { assert(sha3(_code) == m_codeHash); m_codeCache = _code.toBytes(); } private: - bool m_isAlive; - u256 m_nonce; - u256 m_balance; + bool m_isAlive = false; + u256 m_nonce = 0; + u256 m_balance = 0; /// The base storage root. Used with the state DB to give a base to the storage. m_storageOverlay is overlaid on this and takes precedence for all values set. - h256 m_storageRoot; + h256 m_storageRoot = EmptyTrie; /// If 0 then we're in the limbo where we're running the initialisation code. We expect a setCode() at some point later. /// If EmptySHA3, then m_code, which should be empty, is valid. /// If anything else, then m_code is valid iff it's not empty, otherwise, State::ensureCached() needs to be called with the correct args. - h256 m_codeHash; + h256 m_codeHash = EmptySHA3; // TODO: change to unordered_map. std::map m_storageOverlay; diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index a9bdbf247..9672f722c 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -67,7 +67,7 @@ std::map const& dev::eth::genesisState() "6c386a4b26f73c802f34673f7248bb118f97424a", "e4157b34ea9615cfbde6b4fda419828124b70c78" })) - s_ret[Address(fromHex(i))] = AddressState(0, u256(1) << 200, h256(), EmptySHA3); + s_ret[Address(fromHex(i))] = AddressState(u256(1) << 200, AddressState::NormalCreation); return s_ret; } diff --git a/libethereum/Executive.cpp b/libethereum/Executive.cpp index 5a983b66e..8f52b4c36 100644 --- a/libethereum/Executive.cpp +++ b/libethereum/Executive.cpp @@ -138,7 +138,7 @@ bool Executive::create(Address _sender, u256 _endowment, u256 _gasPrice, u256 _g m_newAddress = right160(sha3(rlpList(_sender, m_s.transactionsFrom(_sender) - 1))); // Set up new account... - m_s.m_cache[m_newAddress] = AddressState(0, m_s.balance(m_newAddress) + _endowment, h256(), h256()); + m_s.m_cache[m_newAddress] = AddressState(0, m_s.balance(m_newAddress) + _endowment, EmptyTrie, h256()); // Execute _init. m_vm = new VM(_gas); diff --git a/libethereum/State.cpp b/libethereum/State.cpp index 11400b755..183b2b8de 100644 --- a/libethereum/State.cpp +++ b/libethereum/State.cpp @@ -324,6 +324,9 @@ StateDiff State::diff(State const& _c) const for (auto i: _c.m_cache) ads.insert(i.first); + cnote << *this; + cnote << _c; + for (auto i: ads) { auto it = m_cache.find(i); @@ -355,7 +358,7 @@ void State::ensureCached(std::map& _cache, Address _a, bo RLP state(stateBack); AddressState s; if (state.isNull()) - s = AddressState(0, 0, EmptyTrie, EmptySHA3); + s = AddressState(0, AddressState::NormalCreation); else s = AddressState(state[0].toInt(), state[1].toInt(), state[2].toHash(), state[3].toHash()); bool ok; @@ -622,8 +625,6 @@ u256 State::enact(bytesConstRef _block, BlockChain const* _bc, bool _checkNonce) RLPStream k; k << i; - RLPStream txrlp; - m_transactions[i].streamRLP(txrlp); transactionsTrie.insert(&k.out(), tr.data()); // cnote << m_state.root() << m_state; @@ -960,8 +961,12 @@ void State::noteSending(Address _id) { ensureCached(_id, false, false); auto it = m_cache.find(_id); - if (it == m_cache.end()) - m_cache[_id] = AddressState(1, 0, h256(), EmptySHA3); + if (asserts(it != m_cache.end())) + { + cwarn << "Sending from non-existant account. How did it pay!?!"; + // this is impossible. but we'll continue regardless... + m_cache[_id] = AddressState(1, 0); + } else it->second.incNonce(); } @@ -971,7 +976,7 @@ void State::addBalance(Address _id, u256 _amount) ensureCached(_id, false, false); auto it = m_cache.find(_id); if (it == m_cache.end()) - m_cache[_id] = AddressState(0, _amount, h256(), EmptySHA3); + m_cache[_id] = AddressState(_amount, AddressState::NormalCreation); else it->second.addBalance(_amount); } @@ -1084,7 +1089,7 @@ bool State::isTrieGood(bool _enforceRefs, bool _requireNoLeftOvers) const RLP r(i.second); TrieDB storageDB(const_cast(&m_db), r[2].toHash()); // promise not to alter OverlayDB. for (auto const& j: storageDB) { (void)j; } - if (!e && r[3].toHash() && m_db.lookup(r[3].toHash()).empty()) + if (!e && r[3].toHash() != EmptySHA3 && m_db.lookup(r[3].toHash()).empty()) return false; } } @@ -1262,7 +1267,7 @@ h160 State::create(Address _sender, u256 _endowment, u256 _gasPrice, u256* _gas, Address newAddress = right160(sha3(rlpList(_sender, transactionsFrom(_sender) - 1))); // Set up new account... - m_cache[newAddress] = AddressState(0, balance(newAddress) + _endowment, h256(), h256()); + m_cache[newAddress] = AddressState(balance(newAddress) + _endowment, AddressState::ContractConception); // Execute init code. VM vm(*_gas); @@ -1376,7 +1381,6 @@ std::ostream& dev::eth::operator<<(std::ostream& _out, State const& _s) stringstream contout; - /// For POC6, 3rd value of account is code and will be empty if code is not present. if ((cache && cache->codeBearing()) || (!cache && r && !r[3].isEmpty())) { std::map mem; diff --git a/libethereum/State.h b/libethereum/State.h index 40eb3bc27..1af4daffa 100644 --- a/libethereum/State.h +++ b/libethereum/State.h @@ -375,7 +375,10 @@ void commit(std::map const& _cache, DB& _db, TrieDB storageDB(&_db, i.second.baseRoot()); @@ -384,7 +387,8 @@ void commit(std::map const& _cache, DB& _db, TrieDB