1pub use solana_perf::sigverify::{
8 count_packets_in_batches, ed25519_verify_cpu, ed25519_verify_disabled, init, TxOffset,
9};
10use {
11 crate::{
12 banking_trace::BankingPacketSender,
13 sigverify_stage::{SigVerifier, SigVerifyServiceError},
14 },
15 agave_banking_stage_ingress_types::BankingPacketBatch,
16 crossbeam_channel::Sender,
17 solana_perf::{cuda_runtime::PinnedVec, packet::PacketBatch, recycler::Recycler, sigverify},
18};
19
20pub struct TransactionSigVerifier {
21 banking_stage_sender: BankingPacketSender,
22 forward_stage_sender: Option<Sender<(BankingPacketBatch, bool)>>,
23 recycler: Recycler<TxOffset>,
24 recycler_out: Recycler<PinnedVec<u8>>,
25 reject_non_vote: bool,
26}
27
28impl TransactionSigVerifier {
29 pub fn new_reject_non_vote(
30 packet_sender: BankingPacketSender,
31 forward_stage_sender: Option<Sender<(BankingPacketBatch, bool)>>,
32 ) -> Self {
33 let mut new_self = Self::new(packet_sender, forward_stage_sender);
34 new_self.reject_non_vote = true;
35 new_self
36 }
37
38 pub fn new(
39 banking_stage_sender: BankingPacketSender,
40 forward_stage_sender: Option<Sender<(BankingPacketBatch, bool)>>,
41 ) -> Self {
42 init();
43 Self {
44 banking_stage_sender,
45 forward_stage_sender,
46 recycler: Recycler::warmed(50, 4096),
47 recycler_out: Recycler::warmed(50, 4096),
48 reject_non_vote: false,
49 }
50 }
51}
52
53impl SigVerifier for TransactionSigVerifier {
54 type SendType = BankingPacketBatch;
55
56 fn send_packets(
57 &mut self,
58 packet_batches: Vec<PacketBatch>,
59 ) -> Result<(), SigVerifyServiceError<Self::SendType>> {
60 let banking_packet_batch = BankingPacketBatch::new(packet_batches);
61 if let Some(forward_stage_sender) = &self.forward_stage_sender {
62 self.banking_stage_sender
63 .send(banking_packet_batch.clone())?;
64 let _ = forward_stage_sender.try_send((banking_packet_batch, self.reject_non_vote));
65 } else {
66 self.banking_stage_sender.send(banking_packet_batch)?;
67 }
68
69 Ok(())
70 }
71
72 fn verify_batches(
73 &self,
74 mut batches: Vec<PacketBatch>,
75 valid_packets: usize,
76 ) -> Vec<PacketBatch> {
77 sigverify::ed25519_verify(
78 &mut batches,
79 &self.recycler,
80 &self.recycler_out,
81 self.reject_non_vote,
82 valid_packets,
83 );
84 batches
85 }
86}