snowbridge_pallet_ethereum_client/benchmarking/
mod.rs1use super::*;
4mod util;
5
6use crate::Pallet as EthereumBeaconClient;
7use frame_benchmarking::v2::*;
8use frame_system::RawOrigin;
9use hex_literal::hex;
10use snowbridge_beacon_primitives::{
11 fast_aggregate_verify,
12 merkle_proof::{generalized_index_length, subtree_index},
13 prepare_aggregate_pubkey, prepare_aggregate_signature, verify_merkle_branch, Fork,
14};
15use snowbridge_pallet_ethereum_client_fixtures::*;
16use util::*;
17
18#[benchmarks]
19mod benchmarks {
20 use super::*;
21
22 #[benchmark]
23 fn force_checkpoint() -> Result<(), BenchmarkError> {
24 let checkpoint_update = make_checkpoint();
25 let block_root: H256 = checkpoint_update.header.hash_tree_root().unwrap();
26
27 #[extrinsic_call]
28 _(RawOrigin::Root, Box::new(*checkpoint_update));
29
30 assert!(<LatestFinalizedBlockRoot<T>>::get() == block_root);
31 assert!(<FinalizedBeaconState<T>>::get(block_root).is_some());
32
33 Ok(())
34 }
35
36 #[benchmark]
37 fn submit() -> Result<(), BenchmarkError> {
38 let caller: T::AccountId = whitelisted_caller();
39 let checkpoint_update = make_checkpoint();
40 let finalized_header_update = make_finalized_header_update();
41 let block_root: H256 = finalized_header_update.finalized_header.hash_tree_root().unwrap();
42 EthereumBeaconClient::<T>::process_checkpoint_update(&checkpoint_update)?;
43
44 #[extrinsic_call]
45 submit(RawOrigin::Signed(caller.clone()), Box::new(*finalized_header_update));
46
47 assert!(<LatestFinalizedBlockRoot<T>>::get() == block_root);
48 assert!(<FinalizedBeaconState<T>>::get(block_root).is_some());
49
50 Ok(())
51 }
52
53 #[benchmark]
54 fn submit_with_sync_committee() -> Result<(), BenchmarkError> {
55 let caller: T::AccountId = whitelisted_caller();
56 let checkpoint_update = make_checkpoint();
57 let sync_committee_update = make_sync_committee_update();
58 EthereumBeaconClient::<T>::process_checkpoint_update(&checkpoint_update)?;
59
60 #[extrinsic_call]
61 submit(RawOrigin::Signed(caller.clone()), Box::new(*sync_committee_update));
62
63 assert!(<NextSyncCommittee<T>>::exists());
64
65 Ok(())
66 }
67
68 #[benchmark(extra)]
69 fn bls_fast_aggregate_verify_pre_aggregated() -> Result<(), BenchmarkError> {
70 EthereumBeaconClient::<T>::process_checkpoint_update(&make_checkpoint())?;
71 let update = make_sync_committee_update();
72 let participant_pubkeys = participant_pubkeys::<T>(&update)?;
73 let signing_root = signing_root::<T>(&update)?;
74 let agg_sig =
75 prepare_aggregate_signature(&update.sync_aggregate.sync_committee_signature).unwrap();
76 let agg_pub_key = prepare_aggregate_pubkey(&participant_pubkeys).unwrap();
77
78 #[block]
79 {
80 agg_sig.fast_aggregate_verify_pre_aggregated(signing_root.as_bytes(), &agg_pub_key);
81 }
82
83 Ok(())
84 }
85
86 #[benchmark(extra)]
87 fn bls_fast_aggregate_verify() -> Result<(), BenchmarkError> {
88 EthereumBeaconClient::<T>::process_checkpoint_update(&make_checkpoint())?;
89 let update = make_sync_committee_update();
90 let current_sync_committee = <CurrentSyncCommittee<T>>::get();
91 let absent_pubkeys = absent_pubkeys::<T>(&update)?;
92 let signing_root = signing_root::<T>(&update)?;
93
94 #[block]
95 {
96 fast_aggregate_verify(
97 ¤t_sync_committee.aggregate_pubkey,
98 &absent_pubkeys,
99 signing_root,
100 &update.sync_aggregate.sync_committee_signature,
101 )
102 .unwrap();
103 }
104
105 Ok(())
106 }
107
108 #[benchmark(extra)]
109 fn verify_merkle_proof() -> Result<(), BenchmarkError> {
110 EthereumBeaconClient::<T>::process_checkpoint_update(&make_checkpoint())?;
111 let update = make_sync_committee_update();
112 let block_root: H256 = update.finalized_header.hash_tree_root().unwrap();
113
114 let fork_versions = ForkVersions {
115 genesis: Fork { version: hex!("00000000"), epoch: 0 },
116 altair: Fork { version: hex!("01000000"), epoch: 0 },
117 bellatrix: Fork { version: hex!("02000000"), epoch: 0 },
118 capella: Fork { version: hex!("03000000"), epoch: 0 },
119 deneb: Fork { version: hex!("04000000"), epoch: 0 },
120 electra: Fork { version: hex!("05000000"), epoch: 80000000000 },
121 };
122 let finalized_root_gindex = EthereumBeaconClient::<T>::finalized_root_gindex_at_slot(
123 update.attested_header.slot,
124 fork_versions,
125 );
126 #[block]
127 {
128 verify_merkle_branch(
129 block_root,
130 &update.finality_branch,
131 subtree_index(finalized_root_gindex),
132 generalized_index_length(finalized_root_gindex),
133 update.attested_header.state_root,
134 );
135 }
136
137 Ok(())
138 }
139
140 impl_benchmark_test_suite!(EthereumBeaconClient, crate::mock::new_tester(), crate::mock::Test);
141}