secp256k1_instructions.rs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #![feature(test)]
  2. extern crate test;
  3. use {
  4. agave_feature_set::FeatureSet,
  5. agave_precompiles::secp256k1::verify,
  6. rand0_7::{thread_rng, Rng},
  7. solana_instruction::Instruction,
  8. solana_secp256k1_program::{
  9. eth_address_from_pubkey, new_secp256k1_instruction_with_signature, sign_message,
  10. },
  11. test::Bencher,
  12. };
  13. // 5K transactions should be enough for benching loop
  14. const TX_COUNT: u16 = 5120;
  15. // prepare a bunch of unique ixs
  16. fn create_test_instructions(message_length: u16) -> Vec<Instruction> {
  17. (0..TX_COUNT)
  18. .map(|_| {
  19. let mut rng = thread_rng();
  20. let secp_privkey = libsecp256k1::SecretKey::random(&mut thread_rng());
  21. let message: Vec<u8> = (0..message_length).map(|_| rng.gen_range(0, 255)).collect();
  22. let secp_pubkey = libsecp256k1::PublicKey::from_secret_key(&secp_privkey);
  23. let eth_address =
  24. eth_address_from_pubkey(&secp_pubkey.serialize()[1..].try_into().unwrap());
  25. let (signature, recovery_id) =
  26. sign_message(&secp_privkey.serialize(), &message).unwrap();
  27. new_secp256k1_instruction_with_signature(
  28. &message,
  29. &signature,
  30. recovery_id,
  31. &eth_address,
  32. )
  33. })
  34. .collect()
  35. }
  36. #[bench]
  37. fn bench_secp256k1_len_032(b: &mut Bencher) {
  38. let feature_set = FeatureSet::all_enabled();
  39. let ixs = create_test_instructions(32);
  40. let mut ix_iter = ixs.iter().cycle();
  41. b.iter(|| {
  42. let instruction = ix_iter.next().unwrap();
  43. verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
  44. });
  45. }
  46. #[bench]
  47. fn bench_secp256k1_len_256(b: &mut Bencher) {
  48. let feature_set = FeatureSet::all_enabled();
  49. let ixs = create_test_instructions(256);
  50. let mut ix_iter = ixs.iter().cycle();
  51. b.iter(|| {
  52. let instruction = ix_iter.next().unwrap();
  53. verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
  54. });
  55. }
  56. #[bench]
  57. fn bench_secp256k1_len_32k(b: &mut Bencher) {
  58. let feature_set = FeatureSet::all_enabled();
  59. let ixs = create_test_instructions(32 * 1024);
  60. let mut ix_iter = ixs.iter().cycle();
  61. b.iter(|| {
  62. let instruction = ix_iter.next().unwrap();
  63. verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
  64. });
  65. }
  66. #[bench]
  67. fn bench_secp256k1_len_max(b: &mut Bencher) {
  68. let required_extra_space = 113_u16; // len for pubkey, sig, and offsets
  69. let feature_set = FeatureSet::all_enabled();
  70. let ixs = create_test_instructions(u16::MAX - required_extra_space);
  71. let mut ix_iter = ixs.iter().cycle();
  72. b.iter(|| {
  73. let instruction = ix_iter.next().unwrap();
  74. verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
  75. });
  76. }