diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp
index 2a308e6c9..02e0c56de 100644
--- a/alethzero/MainWin.cpp
+++ b/alethzero/MainWin.cpp
@@ -474,7 +474,7 @@ void Main::refresh(bool _override)
int n = 0;
for (auto const& i: RLP(bc.block(h))[1])
{
- Transaction t(i.data());
+ Transaction t(i[0].data());
QString s = t.receiveAddress ?
QString(" %2 %5> %3: %1 [%4]")
.arg(formatBalance(t.value).c_str())
@@ -566,7 +566,7 @@ void Main::on_blocks_currentItemChanged()
else
{
unsigned txi = item->data(Qt::UserRole + 1).toInt();
- Transaction tx(block[1][txi].data());
+ Transaction tx(block[1][txi][0].data());
auto ss = tx.safeSender();
h256 th = sha3(rlpList(ss, tx.nonce));
s << "
" << th << "
";
diff --git a/libethereum/State.cpp b/libethereum/State.cpp
index 4506ee92a..124e02745 100644
--- a/libethereum/State.cpp
+++ b/libethereum/State.cpp
@@ -319,6 +319,7 @@ bool State::sync(TransactionQueue& _tq)
u256 State::playback(bytesConstRef _block, BlockInfo const& _bi, BlockInfo const& _parent, BlockInfo const& _grandParent, bool _fullCommit)
{
+ resetCurrent();
m_currentBlock = _bi;
m_previousBlock = _parent;
return playbackRaw(_block, _grandParent, _fullCommit);
@@ -342,6 +343,8 @@ u256 State::trustedPlayback(bytesConstRef _block, bool _fullCommit)
u256 State::playbackRaw(bytesConstRef _block, BlockInfo const& _grandParent, bool _fullCommit)
{
+ // m_currentBlock is assumed to be prepopulated.
+
if (m_currentBlock.parentHash != m_previousBlock.hash)
throw InvalidParentHash();
@@ -350,6 +353,7 @@ u256 State::playbackRaw(bytesConstRef _block, BlockInfo const& _grandParent, boo
if (_fullCommit)
m_transactionManifest.init();
+
// All ok with the block generally. Play back the transactions now...
unsigned i = 0;
for (auto const& tr: RLP(_block)[1])
@@ -357,7 +361,7 @@ u256 State::playbackRaw(bytesConstRef _block, BlockInfo const& _grandParent, boo
execute(tr[0].data());
if (tr[1].toInt() != m_state.root())
throw InvalidTransactionStateRoot();
- if (tr[2].toInt() != m_currentBlock.gasUsed)
+ if (tr[2].toInt() != gasUsed())
throw InvalidTransactionGasUsed();
if (_fullCommit)
{
@@ -414,14 +418,14 @@ u256 State::playbackRaw(bytesConstRef _block, BlockInfo const& _grandParent, boo
m_db.commit();
m_previousBlock = m_currentBlock;
- resetCurrent();
}
else
{
m_db.rollback();
- resetCurrent();
}
+ resetCurrent();
+
return tdIncrease;
}
@@ -492,6 +496,7 @@ void State::commitToMine(BlockChain const& _bc)
// cnote << m_state;
// cnote << *this;
+ m_currentBlock.gasUsed = gasUsed();
m_currentBlock.stateRoot = m_state.root();
m_currentBlock.parentHash = m_previousBlock.hash;
}
@@ -655,7 +660,8 @@ u256 State::execute(bytesConstRef _rlp)
Executive e(*this);
e.setup(_rlp);
- if (m_currentBlock.gasUsed + e.t().gas > m_currentBlock.gasLimit)
+ u256 startGasUSed = gasUsed();
+ if (startGasUSed + e.t().gas > m_currentBlock.gasLimit)
throw BlockGasLimitReached(); // TODO: make sure this is handled.
e.go();
@@ -664,8 +670,7 @@ u256 State::execute(bytesConstRef _rlp)
commit();
// Add to the user-originated transactions that we've executed.
- m_currentBlock.gasUsed += e.gasUsed();
- m_transactions.push_back(TransactionReceipt(e.t(), m_state.root(), m_currentBlock.gasUsed));
+ m_transactions.push_back(TransactionReceipt(e.t(), m_state.root(), startGasUSed + e.gasUsed()));
m_transactionSet.insert(e.t().sha3());
return e.gasUsed();
}
diff --git a/libethereum/State.h b/libethereum/State.h
index 1aa266955..eceb5fe4d 100644
--- a/libethereum/State.h
+++ b/libethereum/State.h
@@ -241,6 +241,8 @@ private:
/// Unfinalise the block, unapplying the earned rewards.
void unapplyRewards(Addresses const& _uncleAddresses);
+ u256 gasUsed() const { return m_transactions.size() ? m_transactions.back().gasUsed : 0; }
+
Overlay m_db; ///< Our overlay for the state tree.
TrieDB m_state; ///< Our state tree, as an Overlay DB.
std::vector m_transactions; ///< The current list of transactions that we've included in the state.