secp256r1_instructions.rs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #![feature(test)]
  2. extern crate test;
  3. use {
  4. agave_feature_set::FeatureSet,
  5. agave_precompiles::secp256r1::verify,
  6. openssl::{
  7. bn::BigNumContext,
  8. ec::{EcGroup, EcKey},
  9. nid::Nid,
  10. },
  11. rand0_7::{thread_rng, Rng},
  12. solana_instruction::Instruction,
  13. solana_secp256r1_program::{new_secp256r1_instruction_with_signature, sign_message},
  14. test::Bencher,
  15. };
  16. // 5k transactions should be enough for benching loop
  17. const TX_COUNT: u16 = 5120;
  18. // prepare a bunch of unique ixs
  19. fn create_test_instructions(message_length: u16) -> Vec<Instruction> {
  20. (0..TX_COUNT)
  21. .map(|_| {
  22. let mut rng = thread_rng();
  23. let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap();
  24. let secp_privkey = EcKey::generate(&group).unwrap();
  25. let message: Vec<u8> = (0..message_length).map(|_| rng.gen_range(0, 255)).collect();
  26. let signature =
  27. sign_message(&message, &secp_privkey.private_key_to_der().unwrap()).unwrap();
  28. let mut ctx = BigNumContext::new().unwrap();
  29. let pubkey = secp_privkey
  30. .public_key()
  31. .to_bytes(
  32. &group,
  33. openssl::ec::PointConversionForm::COMPRESSED,
  34. &mut ctx,
  35. )
  36. .unwrap();
  37. new_secp256r1_instruction_with_signature(
  38. &message,
  39. &signature,
  40. &pubkey.try_into().unwrap(),
  41. )
  42. })
  43. .collect()
  44. }
  45. #[bench]
  46. fn bench_secp256r1_len_032(b: &mut Bencher) {
  47. let feature_set = FeatureSet::all_enabled();
  48. let ixs = create_test_instructions(32);
  49. let mut ix_iter = ixs.iter().cycle();
  50. b.iter(|| {
  51. let instruction = ix_iter.next().unwrap();
  52. verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
  53. });
  54. }
  55. #[bench]
  56. fn bench_secp256r1_len_256(b: &mut Bencher) {
  57. let feature_set = FeatureSet::all_enabled();
  58. let ixs = create_test_instructions(256);
  59. let mut ix_iter = ixs.iter().cycle();
  60. b.iter(|| {
  61. let instruction = ix_iter.next().unwrap();
  62. verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
  63. });
  64. }
  65. #[bench]
  66. fn bench_secp256r1_len_32k(b: &mut Bencher) {
  67. let feature_set = FeatureSet::all_enabled();
  68. let ixs = create_test_instructions(32 * 1024);
  69. let mut ix_iter = ixs.iter().cycle();
  70. b.iter(|| {
  71. let instruction = ix_iter.next().unwrap();
  72. verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
  73. });
  74. }
  75. #[bench]
  76. fn bench_secp256r1_len_max(b: &mut Bencher) {
  77. let required_extra_space = 113_u16; // len for pubkey, sig, and offsets
  78. let feature_set = FeatureSet::all_enabled();
  79. let ixs = create_test_instructions(u16::MAX - required_extra_space);
  80. let mut ix_iter = ixs.iter().cycle();
  81. b.iter(|| {
  82. let instruction = ix_iter.next().unwrap();
  83. verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
  84. });
  85. }