2018-06-07 14:51:29 -06:00
|
|
|
//! The `sigverify` module provides digital signature verification functions.
|
|
|
|
//! By default, signatures are verified in parallel using all available CPU
|
2019-09-26 13:36:51 -07:00
|
|
|
//! cores. When perf-libs are available signature verification is offloaded
|
|
|
|
//! to the GPU.
|
2018-06-07 14:51:29 -06:00
|
|
|
//!
|
|
|
|
|
2019-11-01 14:23:03 -07:00
|
|
|
use crate::sigverify_stage::SigVerifier;
|
2019-11-04 20:13:43 -08:00
|
|
|
use solana_perf::cuda_runtime::PinnedVec;
|
2019-11-06 10:52:30 -08:00
|
|
|
use solana_perf::packet::Packets;
|
2019-11-04 20:13:43 -08:00
|
|
|
use solana_perf::recycler::Recycler;
|
2019-11-06 10:52:30 -08:00
|
|
|
use solana_perf::sigverify;
|
|
|
|
pub use solana_perf::sigverify::{
|
|
|
|
batch_size, ed25519_verify_cpu, ed25519_verify_disabled, init, TxOffset,
|
|
|
|
};
|
2018-03-26 21:07:11 -07:00
|
|
|
|
2019-10-28 16:07:51 -07:00
|
|
|
#[derive(Clone)]
|
|
|
|
pub struct TransactionSigVerifier {
|
|
|
|
recycler: Recycler<TxOffset>,
|
|
|
|
recycler_out: Recycler<PinnedVec<u8>>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for TransactionSigVerifier {
|
|
|
|
fn default() -> Self {
|
|
|
|
init();
|
|
|
|
Self {
|
2021-02-24 00:15:58 -08:00
|
|
|
recycler: Recycler::warmed(50, 4096, None, ""),
|
|
|
|
recycler_out: Recycler::warmed(50, 4096, None, ""),
|
2019-10-28 16:07:51 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl SigVerifier for TransactionSigVerifier {
|
2019-11-01 14:23:03 -07:00
|
|
|
fn verify_batch(&self, mut batch: Vec<Packets>) -> Vec<Packets> {
|
2019-11-06 10:52:30 -08:00
|
|
|
let r = sigverify::ed25519_verify(&batch, &self.recycler, &self.recycler_out);
|
2019-11-01 14:23:03 -07:00
|
|
|
mark_disabled(&mut batch, &r);
|
|
|
|
batch
|
2019-10-28 16:07:51 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-01 14:23:03 -07:00
|
|
|
pub fn mark_disabled(batches: &mut Vec<Packets>, r: &[Vec<u8>]) {
|
|
|
|
batches.iter_mut().zip(r).for_each(|(b, v)| {
|
|
|
|
b.packets
|
|
|
|
.iter_mut()
|
|
|
|
.zip(v)
|
|
|
|
.for_each(|(p, f)| p.meta.discard = *f == 0)
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2018-04-11 12:18:00 -07:00
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
2019-11-04 20:13:43 -08:00
|
|
|
use super::*;
|
2019-11-06 10:52:30 -08:00
|
|
|
use solana_perf::packet::Packet;
|
2018-10-26 14:43:34 -07:00
|
|
|
|
2018-04-11 12:18:00 -07:00
|
|
|
#[test]
|
2019-11-06 10:52:30 -08:00
|
|
|
fn test_mark_disabled() {
|
|
|
|
let mut batch = Packets::default();
|
|
|
|
batch.packets.push(Packet::default());
|
|
|
|
let mut batches: Vec<Packets> = vec![batch];
|
|
|
|
mark_disabled(&mut batches, &[vec![0]]);
|
|
|
|
assert_eq!(batches[0].packets[0].meta.discard, true);
|
|
|
|
mark_disabled(&mut batches, &[vec![1]]);
|
|
|
|
assert_eq!(batches[0].packets[0].meta.discard, false);
|
2018-04-11 12:18:00 -07:00
|
|
|
}
|
|
|
|
}
|