| 827 | } |
| 828 | |
| 829 | void BlockChainState::remove_from_pool(Hash tid) { |
| 830 | auto tit = m_memory_state_tx.find(tid); |
| 831 | if (tit == m_memory_state_tx.end()) |
| 832 | return; |
| 833 | bool all_erased = true; |
| 834 | const Transaction &tx = tit->second.tx; |
| 835 | for (const auto &input : tx.inputs) { |
| 836 | if (const auto *in = boost::get<InputKey>(&input)) { |
| 837 | if (m_memory_state_ki_tx.erase(in->key_image) != 1) |
| 838 | all_erased = false; |
| 839 | } |
| 840 | } |
| 841 | const size_t my_size = tit->second.binary_tx.size(); |
| 842 | const Amount my_fee_per_byte = tit->second.fee_per_byte(); |
| 843 | if (m_memory_state_fee_tx.erase(std::make_pair(my_fee_per_byte, tid)) != 1) |
| 844 | all_erased = false; |
| 845 | // if (m_memory_state_fee_tx[my_fee_per_byte].empty()) |
| 846 | // m_memory_state_fee_tx.erase(my_fee_per_byte); |
| 847 | m_memory_state_total_size -= my_size; |
| 848 | m_memory_state_tx.erase(tit); |
| 849 | invariant(all_erased, "remove_memory_pool failed to erase everything"); |
| 850 | // We do not increment m_tx_pool_version, because removing tx from pool is |
| 851 | // always followed by reset or increment |
| 852 | auto min_size = m_memory_state_fee_tx.empty() |
| 853 | ? 0 |
| 854 | : m_memory_state_tx.at(m_memory_state_fee_tx.begin()->second).binary_tx.size(); |
| 855 | auto min_fee_per_byte = m_memory_state_fee_tx.empty() ? 0 : m_memory_state_fee_tx.begin()->first; |
| 856 | m_log(logging::INFO) << "Removed transaction with hash=" << tid << " size=" << my_size << " current_pool_size=(" |
| 857 | << m_memory_state_total_size - min_size << "+" << min_size << ")=" << m_memory_state_total_size |
| 858 | << " count=" << m_memory_state_tx.size() << " min fee/byte=" << min_fee_per_byte; |
| 859 | } |
| 860 | |
| 861 | // Called only on transactions which passed validate_tx_semantic() |
| 862 | // if double spend, conflict_height is set to actual conflict height |