mutableboost::shared_mutexm_lock;///< General lock.
std::set<h256>m_drainingSet;///< All blocks being imported.
std::set<h256>m_readySet;///< All blocks ready for chain-import.
std::vector<std::pair<h256,bytes>>m_ready;///< List of blocks, in correct order, ready for chain-import.
std::set<h256>m_unknownSet;///< Set of all blocks whose parents are not ready/in-chain.
std::multimap<h256,std::pair<h256,bytes>>m_unknown;///< For blocks that have an unknown parent; we map their parent hash to the block stuff, and insert once the block appears.
std::set<h256>m_knownBad;///< Set of blocks that we know will never be valid.
std::multimap<unsigned,std::pair<h256,bytes>>m_future;///< Set of blocks that are not yet valid.
Signalm_onReady;///< Called when a subsequent call to import blocks will return a non-empty container. Be nice and exit fast.
mutableboost::shared_mutexm_lock;///< General lock.
h256Hashm_drainingSet;///< All blocks being imported.
h256Hashm_readySet;///< All blocks ready for chain-import.
std::vector<std::pair<h256,bytes>>m_ready;///< List of blocks, in correct order, ready for chain-import.
h256Hashm_unknownSet;///< Set of all blocks whose parents are not ready/in-chain.
std::unordered_multimap<h256,std::pair<h256,bytes>>m_unknown;///< For blocks that have an unknown parent; we map their parent hash to the block stuff, and insert once the block appears.
h256Hashm_knownBad;///< Set of blocks that we know will never be valid.
std::multimap<unsigned,std::pair<h256,bytes>>m_future;///< Set of blocks that are not yet valid. Ordered by timestamp
Signalm_onReady;///< Called when a subsequent call to import blocks will return a non-empty container. Be nice and exit fast.
// Find great-uncles (or second-cousins or whatever they are) - children of great-grandparents, great-great-grandparents... that were not already uncles in previous generations.
/// Execute the given block, assuming it corresponds to m_currentBlock.
/// Throws on failure.
@ -355,10 +354,10 @@ private:
SecureTrieDB<Address,OverlayDB>m_state;///< Our state tree, as an OverlayDB DB.
Transactionsm_transactions;///< The current list of transactions that we've included in the state.
TransactionReceiptsm_receipts;///< The corresponding list of transaction receipts.
std::set<h256>m_transactionSet;///< The set of transaction hashes that we've included in the state.
h256Hashm_transactionSet;///< The set of transaction hashes that we've included in the state.
OverlayDBm_lastTx;
mutablestd::map<Address,Account>m_cache;///< Our address cache. This stores the states of each address that has (or at least might have) been changed.
mutablestd::unordered_map<Address,Account>m_cache;///< Our address cache. This stores the states of each address that has (or at least might have) been changed.
BlockInfom_previousBlock;///< The previous block's information.
BlockInfom_currentBlock;///< The current block's information.
std::set<h256>m_known;///< Hashes of transactions in both sets.
std::map<h256,Transaction>m_current;///< Map of SHA3(tx) to tx.
std::multimap<Address,std::pair<h256,Transaction>>m_unknown;///< For transactions that have a future nonce; we map their sender address to the tx stuff, and insert once the sender has a valid TX.
std::map<h256,std::function<void(ImportResult)>>m_callbacks;///< Called once.
std::set<h256>m_dropped;///< Transactions that have previously been dropped.
std::multimap<Address,h256>m_senders;///< Mapping from the sender address to the transaction hash; useful for determining the nonce of a given sender.
Signalm_onReady;///< Called when a subsequent call to import transactions will return a non-empty container. Be nice and exit fast.
mutableSharedMutexm_lock;///< General lock.
h256Hashm_known;///< Hashes of transactions in both sets.
std::unordered_map<h256,Transaction>m_current;///< Map of SHA3(tx) to tx.
std::unordered_multimap<Address,std::pair<h256,Transaction>>m_unknown;///< For transactions that have a future nonce; we map their sender address to the tx stuff, and insert once the sender has a valid TX.
std::unordered_map<h256,std::function<void(ImportResult)>>m_callbacks;///< Called once.
h256Hashm_dropped;///< Transactions that have previously been dropped.
std::multimap<Address,h256>m_senders;///< Mapping from the sender address to the transaction hash; useful for determining the nonce of a given sender.
Signalm_onReady;///< Called when a subsequent call to import transactions will return a non-empty container. Be nice and exit fast.
Mutexx_pubkDiscoverPings;///< LOCK x_nodes first if both x_nodes and x_pubkDiscoverPings locks are required.
std::map<bi::address,TimePoint>m_pubkDiscoverPings;///< List of pending pings where node entry wasn't created due to unkown pubk.
Mutexx_pubkDiscoverPings;///< LOCK x_nodes first if both x_nodes and x_pubkDiscoverPings locks are required.
std::unordered_map<bi::address,TimePoint>m_pubkDiscoverPings;///< List of pending pings where node entry wasn't created due to unkown pubk.
Mutexx_findNodeTimeout;
std::list<NodeIdTimePoint>m_findNodeTimeout;///< Timeouts for pending Ping and FindNode requests.
std::list<NodeIdTimePoint>m_findNodeTimeout;///< Timeouts for pending Ping and FindNode requests.
ba::io_service&m_io;///< Used by bucket refresh timer.
std::shared_ptr<NodeSocket>m_socket;///< Shared pointer for our UDPSocket; ASIO requires shared_ptr.
NodeSocket*m_socketPointer;///< Set to m_socket.get(). Socket is created in constructor and disconnected in destructor to ensure access to pointer is safe.
ba::io_service&m_io;///< Used by bucket refresh timer.
std::shared_ptr<NodeSocket>m_socket;///< Shared pointer for our UDPSocket; ASIO requires shared_ptr.
NodeSocket*m_socketPointer;///< Set to m_socket.get(). Socket is created in constructor and disconnected in destructor to ensure access to pointer is safe.
boost::asio::deadline_timerm_bucketRefreshTimer;///< Timer which schedules and enacts bucket refresh.
boost::asio::deadline_timerm_evictionCheckTimer;///< Timer for handling node evictions.
boost::asio::deadline_timerm_bucketRefreshTimer;///< Timer which schedules and enacts bucket refresh.
boost::asio::deadline_timerm_evictionCheckTimer;///< Timer for handling node evictions.
//Check the fields restored from RLP to original fields
BOOST_CHECK_MESSAGE(blockHeaderFromFields.headerHash(WithNonce)==blockFromRlp.headerHash(WithNonce),"hash in given RLP not matching the block hash!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.parentHash==blockFromRlp.parentHash,"parentHash in given RLP not matching the block parentHash!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.sha3Uncles==blockFromRlp.sha3Uncles,"sha3Uncles in given RLP not matching the block sha3Uncles!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.coinbaseAddress==blockFromRlp.coinbaseAddress,"coinbaseAddress in given RLP not matching the block coinbaseAddress!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.stateRoot==blockFromRlp.stateRoot,"stateRoot in given RLP not matching the block stateRoot!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.transactionsRoot==blockFromRlp.transactionsRoot,"transactionsRoot in given RLP not matching the block transactionsRoot!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.receiptsRoot==blockFromRlp.receiptsRoot,"receiptsRoot in given RLP not matching the block receiptsRoot!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.logBloom==blockFromRlp.logBloom,"logBloom in given RLP not matching the block logBloom!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.difficulty==blockFromRlp.difficulty,"difficulty in given RLP not matching the block difficulty!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.number==blockFromRlp.number,"number in given RLP not matching the block number!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.gasLimit==blockFromRlp.gasLimit,"gasLimit in given RLP not matching the block gasLimit!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.gasUsed==blockFromRlp.gasUsed,"gasUsed in given RLP not matching the block gasUsed!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.timestamp==blockFromRlp.timestamp,"timestamp in given RLP not matching the block timestamp!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.extraData==blockFromRlp.extraData,"extraData in given RLP not matching the block extraData!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.mixHash==blockFromRlp.mixHash,"mixHash in given RLP not matching the block mixHash!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.nonce==blockFromRlp.nonce,"nonce in given RLP not matching the block nonce!");
//Check the fields restored from RLP to original fields
BOOST_CHECK_MESSAGE(blockHeaderFromFields.headerHash(WithNonce)==blockFromRlp.headerHash(WithNonce),"hash in given RLP not matching the block hash!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.parentHash==blockFromRlp.parentHash,"parentHash in given RLP not matching the block parentHash!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.sha3Uncles==blockFromRlp.sha3Uncles,"sha3Uncles in given RLP not matching the block sha3Uncles!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.coinbaseAddress==blockFromRlp.coinbaseAddress,"coinbaseAddress in given RLP not matching the block coinbaseAddress!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.stateRoot==blockFromRlp.stateRoot,"stateRoot in given RLP not matching the block stateRoot!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.transactionsRoot==blockFromRlp.transactionsRoot,"transactionsRoot in given RLP not matching the block transactionsRoot!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.receiptsRoot==blockFromRlp.receiptsRoot,"receiptsRoot in given RLP not matching the block receiptsRoot!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.logBloom==blockFromRlp.logBloom,"logBloom in given RLP not matching the block logBloom!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.difficulty==blockFromRlp.difficulty,"difficulty in given RLP not matching the block difficulty!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.number==blockFromRlp.number,"number in given RLP not matching the block number!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.gasLimit==blockFromRlp.gasLimit,"gasLimit in given RLP not matching the block gasLimit!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.gasUsed==blockFromRlp.gasUsed,"gasUsed in given RLP not matching the block gasUsed!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.timestamp==blockFromRlp.timestamp,"timestamp in given RLP not matching the block timestamp!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.extraData==blockFromRlp.extraData,"extraData in given RLP not matching the block extraData!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.mixHash==blockFromRlp.mixHash,"mixHash in given RLP not matching the block mixHash!");
BOOST_CHECK_MESSAGE(blockHeaderFromFields.nonce==blockFromRlp.nonce,"nonce in given RLP not matching the block nonce!");