referrerpolicy=no-referrer-when-downgrade

snowbridge_pallet_ethereum_client/benchmarking/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: 2023 Snowfork <hello@snowfork.com>
3use 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				&current_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}