use crate::relayer::{Relayer, MAX_RELAY_TXS_NUM_PER_BATCH};
use crate::{Status, StatusCode};
use ckb_network::PeerIndex;
use ckb_types::{packed, prelude::*};
pub struct TransactionHashesProcess<'a> {
message: packed::RelayTransactionHashesReader<'a>,
relayer: &'a Relayer,
peer: PeerIndex,
}
impl<'a> TransactionHashesProcess<'a> {
pub fn new(
message: packed::RelayTransactionHashesReader<'a>,
relayer: &'a Relayer,
peer: PeerIndex,
) -> Self {
TransactionHashesProcess {
message,
relayer,
peer,
}
}
pub fn execute(self) -> Status {
let state = self.relayer.shared().state();
{
let relay_transaction_hashes = self.message;
if relay_transaction_hashes.tx_hashes().len() > MAX_RELAY_TXS_NUM_PER_BATCH {
return StatusCode::ProtocolMessageIsMalformed.with_context(format!(
"TxHashes count({}) > MAX_RELAY_TXS_NUM_PER_BATCH({})",
relay_transaction_hashes.tx_hashes().len(),
MAX_RELAY_TXS_NUM_PER_BATCH,
));
}
}
let tx_hashes: Vec<_> = {
let mut tx_filter = state.tx_filter();
tx_filter.remove_expired();
self.message
.tx_hashes()
.iter()
.map(|x| x.to_entity())
.filter(|tx_hash| !tx_filter.contains(tx_hash))
.collect()
};
state.add_ask_for_txs(self.peer, tx_hashes)
}
}