25 #include <condition_variable>
130 struct VerifiedTransaction
132 VerifiedTransaction(
Transaction const& _t): transaction(_t) {}
133 VerifiedTransaction(VerifiedTransaction&& _t): transaction(
std::move(_t.transaction)) {}
135 VerifiedTransaction(VerifiedTransaction
const&) =
delete;
136 VerifiedTransaction& operator=(VerifiedTransaction
const&) =
delete;
138 Transaction transaction;
142 struct UnverifiedTransaction
144 UnverifiedTransaction() {}
145 UnverifiedTransaction(
bytesConstRef const& _t,
h512 const& _nodeId): transaction(_t.toBytes()), nodeId(_nodeId) {}
146 UnverifiedTransaction(UnverifiedTransaction&& _t): transaction(
std::move(_t.transaction)), nodeId(
std::move(_t.nodeId)) {}
147 UnverifiedTransaction& operator=(UnverifiedTransaction&& _other)
149 assert(&_other !=
this);
151 transaction = std::move(_other.transaction);
152 nodeId = std::move(_other.nodeId);
156 UnverifiedTransaction(UnverifiedTransaction
const&) =
delete;
157 UnverifiedTransaction& operator=(UnverifiedTransaction
const&) =
delete;
163 struct PriorityCompare
167 bool operator()(VerifiedTransaction
const& _first, VerifiedTransaction
const& _second)
const
169 u256 const& height1 = _first.transaction.nonce() - queue.m_currentByAddressAndNonce[_first.transaction.sender()].begin()->first;
170 u256 const& height2 = _second.transaction.nonce() - queue.m_currentByAddressAndNonce[_second.transaction.sender()].begin()->first;
171 return height1 < height2 || (height1 == height2 && _first.transaction.gasPrice() > _second.transaction.gasPrice());
176 using PriorityQueue = std::multiset<VerifiedTransaction, PriorityCompare>;
180 ImportResult manageImport_WITH_LOCK(
h256 const& _h, Transaction
const& _transaction);
182 void insertCurrent_WITH_LOCK(std::pair<h256, Transaction>
const& _p);
183 void makeCurrent_WITH_LOCK(Transaction
const& _t);
184 bool remove_WITH_LOCK(
h256 const& _txHash);
194 PriorityQueue m_current;
195 std::unordered_map<h256, PriorityQueue::iterator> m_currentByHash;
196 std::unordered_map<Address, std::map<u256, PriorityQueue::iterator>> m_currentByAddressAndNonce;
197 std::unordered_map<Address, std::map<u256, VerifiedTransaction>> m_future;
200 Signal<ImportResult, h256 const&, h512 const&> m_onImport;
201 Signal<h256 const&> m_onReplaced;
203 unsigned m_futureLimit;
204 unsigned m_futureSize = 0;
206 std::condition_variable m_queueReady;
207 std::vector<std::thread> m_verifiers;
208 std::deque<UnverifiedTransaction> m_unverified;
209 mutable Mutex x_queue;
210 std::atomic<bool> m_aborting = {
false};