TransactionReceipts State::sync(BlockChain const& _bc, TransactionQueue& _tq, bool* o_transactionQueueChanged) { // TRANSACTIONS TransactionReceipts ret; auto ts = _tq.transactions(); auto lh = getLastHashes(_bc, _bc.number()); for (int goodTxs = 1; goodTxs;) { goodTxs = 0; for (auto const& i: ts) if (!m_transactionSet.count(i.first)) { // don't have it yet! Execute it now. try { uncommitToMine(); // boost::timer t; execute(lh, i.second); ret.push_back(m_receipts.back()); _tq.noteGood(i); ++goodTxs; // cnote << "TX took:" << t.elapsed() * 1000; } catch (InvalidNonce const& in) { if (in.required > in.candidate) { // too old _tq.drop(i.first); if (o_transactionQueueChanged) *o_transactionQueueChanged = true; } else _tq.setFuture(i); } catch (Exception const& _e) { // Something else went wrong - drop it. _tq.drop(i.first); if (o_transactionQueueChanged) *o_transactionQueueChanged = true; cwarn << "Sync went wrong\n" << diagnostic_information(_e); } catch (std::exception const&) { // Something else went wrong - drop it. _tq.drop(i.first); if (o_transactionQueueChanged) *o_transactionQueueChanged = true; } } } return ret; }
u256 State::execute(BlockChain const& _bc, bytesConstRef _rlp, bytes* o_output, bool _commit) { return execute(getLastHashes(_bc, _bc.number()), _rlp, o_output, _commit); }