pallet_bridge_grandpa/
benchmarking.rs1use crate::*;
44
45use bp_header_chain::justification::required_justification_precommits;
46use bp_runtime::BasicOperatingMode;
47use bp_test_utils::{
48 accounts, make_justification_for_header, JustificationGeneratorParams, TEST_GRANDPA_ROUND,
49 TEST_GRANDPA_SET_ID,
50};
51use frame_benchmarking::{benchmarks_instance_pallet, whitelisted_caller};
52use frame_system::RawOrigin;
53use sp_consensus_grandpa::AuthorityId;
54use sp_runtime::traits::{One, Zero};
55use sp_std::vec::Vec;
56
57const MAX_VOTE_ANCESTRIES: u32 = 1000;
62
63const MAX_VOTE_ANCESTRIES_RANGE_BEGIN: u32 = MAX_VOTE_ANCESTRIES / 20;
67const MAX_VOTE_ANCESTRIES_RANGE_END: u32 =
68 MAX_VOTE_ANCESTRIES_RANGE_BEGIN + MAX_VOTE_ANCESTRIES_RANGE_BEGIN;
69
70fn precommits_range_end<T: Config<I>, I: 'static>() -> u32 {
72 let max_bridged_authorities = T::BridgedChain::MAX_AUTHORITIES_COUNT;
73 let max_bridged_authorities = if max_bridged_authorities > 128 {
74 sp_std::cmp::max(128, max_bridged_authorities / 5)
75 } else {
76 max_bridged_authorities
77 };
78
79 required_justification_precommits(max_bridged_authorities)
80}
81
82fn prepare_benchmark_data<T: Config<I>, I: 'static>(
84 precommits: u32,
85 ancestors: u32,
86) -> (BridgedHeader<T, I>, GrandpaJustification<BridgedHeader<T, I>>) {
87 let total_authorities_count = (3 * precommits - 1) / 2;
89
90 let authority_list = accounts(total_authorities_count as u16)
91 .iter()
92 .map(|id| (AuthorityId::from(*id), 1))
93 .collect::<Vec<_>>();
94
95 let genesis_header: BridgedHeader<T, I> = bp_test_utils::test_header(Zero::zero());
96 let genesis_hash = genesis_header.hash();
97 let init_data = InitializationData {
98 header: Box::new(genesis_header),
99 authority_list,
100 set_id: TEST_GRANDPA_SET_ID,
101 operating_mode: BasicOperatingMode::Normal,
102 };
103
104 bootstrap_bridge::<T, I>(init_data);
105 assert!(<ImportedHeaders<T, I>>::contains_key(genesis_hash));
106
107 let header: BridgedHeader<T, I> = bp_test_utils::test_header(One::one());
108 let params = JustificationGeneratorParams {
109 header: header.clone(),
110 round: TEST_GRANDPA_ROUND,
111 set_id: TEST_GRANDPA_SET_ID,
112 authorities: accounts(precommits as u16).iter().map(|k| (*k, 1)).collect::<Vec<_>>(),
113 ancestors,
114 forks: 1,
115 };
116 let justification = make_justification_for_header(params);
117 (header, justification)
118}
119
120benchmarks_instance_pallet! {
121 submit_finality_proof {
124 let p in 1 .. precommits_range_end::<T, I>();
125 let v in MAX_VOTE_ANCESTRIES_RANGE_BEGIN..MAX_VOTE_ANCESTRIES_RANGE_END;
126 let caller: T::AccountId = whitelisted_caller();
127 let (header, justification) = prepare_benchmark_data::<T, I>(p, v);
128 }: submit_finality_proof(RawOrigin::Signed(caller), Box::new(header), justification)
129 verify {
130 let genesis_header: BridgedHeader<T, I> = bp_test_utils::test_header(Zero::zero());
131 let header: BridgedHeader<T, I> = bp_test_utils::test_header(One::one());
132 let expected_hash = header.hash();
133
134 assert_eq!(<BestFinalized<T, I>>::get().unwrap().1, expected_hash);
136 assert!(<ImportedHeaders<T, I>>::contains_key(expected_hash));
137
138 assert!(!<ImportedHeaders<T, I>>::contains_key(genesis_header.hash()));
140 }
141
142 force_set_pallet_state {
143 let set_id = 100;
144 let authorities = accounts(T::BridgedChain::MAX_AUTHORITIES_COUNT as u16)
145 .iter()
146 .map(|id| (AuthorityId::from(*id), 1))
147 .collect::<Vec<_>>();
148 let (header, _) = prepare_benchmark_data::<T, I>(1, 1);
149 let expected_hash = header.hash();
150 }: force_set_pallet_state(RawOrigin::Root, set_id, authorities, Box::new(header))
151 verify {
152 assert_eq!(<BestFinalized<T, I>>::get().unwrap().1, expected_hash);
153 assert_eq!(<CurrentAuthoritySet<T, I>>::get().set_id, set_id);
154 }
155
156 impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime)
157}