|
| 1 | +//! IncentivizedInboundChannel pallet benchmarking |
| 2 | +
|
| 3 | +#![cfg(feature = "runtime-benchmarks")] |
| 4 | + |
| 5 | +use super::*; |
| 6 | + |
| 7 | +use frame_system::{RawOrigin, self, EventRecord}; |
| 8 | +use frame_benchmarking::{benchmarks, whitelisted_caller, impl_benchmark_test_suite}; |
| 9 | +use hex_literal::hex; |
| 10 | +use sp_std::convert::TryInto; |
| 11 | + |
| 12 | +use artemis_core::{ChannelId, Message, MessageId, Proof}; |
| 13 | +use artemis_ethereum::{Log, Header}; |
| 14 | + |
| 15 | +#[allow(unused_imports)] |
| 16 | +use crate::inbound::Module as IncentivizedInboundChannel; |
| 17 | + |
| 18 | +fn assert_last_event<T: Config>(system_event: <T as frame_system::Config>::Event) { |
| 19 | + let events = frame_system::Pallet::<T>::events(); |
| 20 | + // compare to the last event record |
| 21 | + let EventRecord { event, .. } = &events[events.len() - 1]; |
| 22 | + assert_eq!(event, &system_event); |
| 23 | +} |
| 24 | + |
| 25 | +// This collection of benchmarks should include a benchmark for each |
| 26 | +// call dispatched by the channel, i.e. each "app" pallet function |
| 27 | +// that can be invoked by MessageDispatch. The most expensive call |
| 28 | +// should be used in the `submit` benchmark. |
| 29 | +// |
| 30 | +// We rely on configuration via chain spec of the app pallets because |
| 31 | +// we don't have access to their storage here. |
| 32 | +benchmarks! { |
| 33 | + // Benchmark `submit` extrinsic under worst case conditions: |
| 34 | + // * `submit` dispatches the DotApp::unlock call |
| 35 | + // * `unlock` call successfully unlocks DOT |
| 36 | + submit { |
| 37 | + let caller: T::AccountId = whitelisted_caller(); |
| 38 | + let (header, message) = dot_unlock_data(); |
| 39 | + let envelope: envelope::Envelope<T> = rlp::decode::<Log>(&message.data) |
| 40 | + .map(|log| log.try_into().unwrap()) |
| 41 | + .unwrap(); |
| 42 | + Nonce::put(envelope.nonce - 1); |
| 43 | + SourceChannel::put(envelope.channel); |
| 44 | + |
| 45 | + T::Verifier::initialize_storage( |
| 46 | + vec![header], |
| 47 | + 0.into(), |
| 48 | + 0, // forces all headers to be finalized |
| 49 | + )?; |
| 50 | + |
| 51 | + }: _(RawOrigin::Signed(caller.clone()), message) |
| 52 | + verify { |
| 53 | + assert_eq!(envelope.nonce, Nonce::get()); |
| 54 | + |
| 55 | + let message_id = MessageId::new(ChannelId::Incentivized, envelope.nonce); |
| 56 | + if let Some(event) = T::MessageDispatch::successful_dispatch_event(message_id) { |
| 57 | + assert_last_event::<T>(event); |
| 58 | + } |
| 59 | + } |
| 60 | + |
| 61 | + #[extra] |
| 62 | + submit_eth_mint { |
| 63 | + let caller: T::AccountId = whitelisted_caller(); |
| 64 | + let (header, message) = eth_mint_data(); |
| 65 | + let envelope: envelope::Envelope<T> = rlp::decode::<Log>(&message.data) |
| 66 | + .map(|log| log.try_into().unwrap()) |
| 67 | + .unwrap(); |
| 68 | + Nonce::put(envelope.nonce - 1); |
| 69 | + SourceChannel::put(envelope.channel); |
| 70 | + |
| 71 | + T::Verifier::initialize_storage( |
| 72 | + vec![header], |
| 73 | + 0.into(), |
| 74 | + 0, // forces all headers to be finalized |
| 75 | + )?; |
| 76 | + |
| 77 | + }: submit(RawOrigin::Signed(caller.clone()), message) |
| 78 | + verify { |
| 79 | + assert_eq!(envelope.nonce, Nonce::get()); |
| 80 | + |
| 81 | + let message_id = MessageId::new(ChannelId::Incentivized, envelope.nonce); |
| 82 | + if let Some(event) = T::MessageDispatch::successful_dispatch_event(message_id) { |
| 83 | + assert_last_event::<T>(event); |
| 84 | + } |
| 85 | + } |
| 86 | + |
| 87 | + // TODO: add back ECR20 mint benchmark |
| 88 | +} |
| 89 | + |
| 90 | +// ETH mint |
| 91 | +// Channel = 0xeda338e4dc46038493b885327842fd3e301cab39 |
| 92 | +// Nonce = 2 |
| 93 | +// Source = 0x774667629726ec1fabebcec0d9139bd1c8f72a23 |
| 94 | +fn eth_mint_data() -> (Header, Message) { |
| 95 | + ( |
| 96 | + Header { |
| 97 | + parent_hash: hex!("3f136282153539e5b4006c05d0c6ab033786d5793c7cc3b784ca3b274918181e").into(), |
| 98 | + timestamp: 1618295862u64.into(), |
| 99 | + number: 3584u64.into(), |
| 100 | + author: hex!("0000000000000000000000000000000000000000").into(), |
| 101 | + transactions_root: hex!("84ed6b4ad707994d7095eff6f5458d2c6e351fcab00669b084705229faa63840").into(), |
| 102 | + ommers_hash: hex!("1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347").into(), |
| 103 | + extra_data: hex!("").into(), |
| 104 | + state_root: hex!("ab5ce23d0914c05c74504cb797349fa8fca1b9b286f2f1ab11f0adb7f8c2d12c").into(), |
| 105 | + receipts_root: hex!("ac1dbc12173e495453bf5277fb1cc507a092218adcb795e7743308615ed62c89").into(), |
| 106 | + logs_bloom: (&hex!("00000000000040000000000000000200000000000000400010000000010080000000000000000000000000001000000010000000000000000000000000000080000000000000000400000008000000000000000000008000000000000000000000000000020000000000000000000800000001000400000000000010000000000000020000000000000000000400000000000000000000000000040000000000000000000004000000000000000000000220000000000001000000000200080000000002000000000000000000000000000000000000000000000000000020402000000000000000000000000000000000000000000000000000000000000000")).into(), |
| 107 | + gas_used: 97210u64.into(), |
| 108 | + gas_limit: 6721975u64.into(), |
| 109 | + difficulty: 0u64.into(), |
| 110 | + seal: vec![ |
| 111 | + hex!("a00000000000000000000000000000000000000000000000000000000000000000").to_vec(), |
| 112 | + hex!("880000000000000000").to_vec(), |
| 113 | + ], |
| 114 | + }, |
| 115 | + Message { |
| 116 | + data: hex!("f9013a94eda338e4dc46038493b885327842fd3e301cab39e1a05e9ae1d7c484f74d554a503aa825e823725531d97e784dd9b1aacdb58d1f7076b90100000000000000000000000000774667629726ec1fabebcec0d9139bd1c8f72a2300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000570c0189b4ab1ef20763630df9743acf155865600daff200d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d0000c16ff2862300000000000000000000000000000000000000000000000000000000000000000000").to_vec(), |
| 117 | + proof: Proof { |
| 118 | + block_hash: hex!("fbd6740f975d184468373c65c1278051403867361c03ab8c245c5ff42e53c9e2").into(), |
| 119 | + tx_index: 0, |
| 120 | + data: ( |
| 121 | + vec![hex!("ac1dbc12173e495453bf5277fb1cc507a092218adcb795e7743308615ed62c89").to_vec()], |
| 122 | + vec![hex!("f904a8822080b904a2f9049f0183017bbab9010000000000000040000000000000000200000000000000400010000000010080000000000000000000000000001000000010000000000000000000000000000080000000000000000400000008000000000000000000008000000000000000000000000000020000000000000000000800000001000400000000000010000000000000020000000000000000000400000000000000000000000000040000000000000000000004000000000000000000000220000000000001000000000200080000000002000000000000000000000000000000000000000000000000000020402000000000000000000000000000000000000000000000000000000000000000f90394f89994774667629726ec1fabebcec0d9139bd1c8f72a23e1a0caae0f5e72020d428da73a237d1f9bf162e158dda6d4908769b8b60c095b01f4b86000000000000000000000000089b4ab1ef20763630df9743acf155865600daff2d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d000000000000000000000000000000000000000000000000002386f26fc10000f9011c94672a95c8928c8450b594186cf7954ec269626a2df863a0a78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098a0000000000000000000000000b1185ede04202fe62d38f5db72f71e38ff3e8305a000000000000000000000000089b4ab1ef20763630df9743acf155865600daff2b8a00000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89b94672a95c8928c8450b594186cf7954ec269626a2df863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa000000000000000000000000089b4ab1ef20763630df9743acf155865600daff2a00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000de0b6b3a7640000f9013a94eda338e4dc46038493b885327842fd3e301cab39e1a05e9ae1d7c484f74d554a503aa825e823725531d97e784dd9b1aacdb58d1f7076b90100000000000000000000000000774667629726ec1fabebcec0d9139bd1c8f72a2300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000570c0189b4ab1ef20763630df9743acf155865600daff200d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d0000c16ff2862300000000000000000000000000000000000000000000000000000000000000000000").to_vec()], |
| 123 | + ), |
| 124 | + }, |
| 125 | + }, |
| 126 | + ) |
| 127 | +} |
| 128 | + |
| 129 | +// DOT unlock |
| 130 | +// Channel = 0xeda338e4dc46038493b885327842fd3e301cab39 |
| 131 | +// Nonce = 1 |
| 132 | +// Source = 0xb1185ede04202fe62d38f5db72f71e38ff3e8305 |
| 133 | +fn dot_unlock_data() -> (Header, Message) { |
| 134 | + ( |
| 135 | + Header { |
| 136 | + parent_hash: hex!("6e54738f4e58949361383e11d06cfe5b72c87410881230fae3289f1de8487927").into(), |
| 137 | + timestamp: 1618291501u64.into(), |
| 138 | + number: 2496u64.into(), |
| 139 | + author: hex!("0000000000000000000000000000000000000000").into(), |
| 140 | + transactions_root: hex!("9c53bbde6f3dfe2afd272cfd64a8639db23588d3ec63406b5225b38fa79a0490").into(), |
| 141 | + ommers_hash: hex!("1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347").into(), |
| 142 | + extra_data: hex!("").into(), |
| 143 | + state_root: hex!("b262afa00f5d920137d59f2061cb2075a9cece1d53775ba6f1b38f88423f6ff7").into(), |
| 144 | + receipts_root: hex!("f19e53a299860306c5ad8201b28f78d505ea4a46f08739f2f58def37652cd386").into(), |
| 145 | + logs_bloom: (&hex!("00000000000040000000000000000200000000000000000010000000000080000000000000000000000000001000000010000000000000000000000000000000000000000000000400000008000000000000000000008000000000000000000000000000020000000000000000000800000001000400000000000010000000000000020000000000000000000400000000000000000000000000040000000000000000000004000000000000000000000200000000000001000000000200000000000002000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000")).into(), |
| 146 | + gas_used: 107966u64.into(), |
| 147 | + gas_limit: 6721975u64.into(), |
| 148 | + difficulty: 0u64.into(), |
| 149 | + seal: vec![ |
| 150 | + hex!("a00000000000000000000000000000000000000000000000000000000000000000").to_vec(), |
| 151 | + hex!("880000000000000000").to_vec(), |
| 152 | + ], |
| 153 | + }, |
| 154 | + Message { |
| 155 | + data: hex!("f9013a94eda338e4dc46038493b885327842fd3e301cab39e1a05e9ae1d7c484f74d554a503aa825e823725531d97e784dd9b1aacdb58d1f7076b90100000000000000000000000000b1185ede04202fe62d38f5db72f71e38ff3e830500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000570e0189b4ab1ef20763630df9743acf155865600daff200d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d000064a7b3b6e00d000000000000000000000000000000000000000000000000000000000000000000").to_vec(), |
| 156 | + proof: Proof { |
| 157 | + block_hash: hex!("2e2ac53ae0dcd35d23e004d105f21a07cfb841ee7f86b5edd957067684d61f85").into(), |
| 158 | + tx_index: 0, |
| 159 | + data: ( |
| 160 | + vec![hex!("f19e53a299860306c5ad8201b28f78d505ea4a46f08739f2f58def37652cd386").to_vec()], |
| 161 | + vec![hex!("f905e9822080b905e3f905e0018301a5beb9010000000000000040000000000000000200000000000000000010000000000080000000000000000000000000001000000010000000000000000000000000000000000000000000000400000008000000000000000000008000000000000000000000000000020000000000000000000800000001000400000000000010000000000000020000000000000000000400000000000000000000000000040000000000000000000004000000000000000000000200000000000001000000000200000000000002000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000f904d5f9013c94672a95c8928c8450b594186cf7954ec269626a2df863a0a78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098a0000000000000000000000000b1185ede04202fe62d38f5db72f71e38ff3e8305a000000000000000000000000089b4ab1ef20763630df9743acf155865600daff2b8c00000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000020d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d0000000000000000000000000000000000000000000000000000000000000000f89b94672a95c8928c8450b594186cf7954ec269626a2df863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa000000000000000000000000089b4ab1ef20763630df9743acf155865600daff2a00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000de0b6b3a7640000f9011c94672a95c8928c8450b594186cf7954ec269626a2df863a0a78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098a0000000000000000000000000b1185ede04202fe62d38f5db72f71e38ff3e8305a000000000000000000000000089b4ab1ef20763630df9743acf155865600daff2b8a00000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89b94672a95c8928c8450b594186cf7954ec269626a2df863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa000000000000000000000000089b4ab1ef20763630df9743acf155865600daff2a00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000de0b6b3a7640000f9013a94eda338e4dc46038493b885327842fd3e301cab39e1a05e9ae1d7c484f74d554a503aa825e823725531d97e784dd9b1aacdb58d1f7076b90100000000000000000000000000b1185ede04202fe62d38f5db72f71e38ff3e830500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000570e0189b4ab1ef20763630df9743acf155865600daff200d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d000064a7b3b6e00d000000000000000000000000000000000000000000000000000000000000000000").to_vec()], |
| 162 | + ), |
| 163 | + }, |
| 164 | + }, |
| 165 | + ) |
| 166 | +} |
| 167 | + |
| 168 | +impl_benchmark_test_suite!( |
| 169 | + IncentivizedInboundChannel, |
| 170 | + crate::inbound::test::new_tester(Default::default()), |
| 171 | + crate::inbound::test::Test, |
| 172 | +); |
0 commit comments