-
Notifications
You must be signed in to change notification settings - Fork 47
/
Copy pathtests.rs
315 lines (298 loc) · 30.9 KB
/
tests.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
// KILT Blockchain – <https://kilt.io>
// Copyright (C) 2025, KILT Foundation
// The KILT Blockchain is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// The KILT Blockchain is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
// If you feel like getting in touch with us, you can do so at <hello@kilt.io>
mod relay_did_dip_proof {
use frame_support::assert_err;
use hex_literal::hex;
use parity_scale_codec::Codec;
use sp_core::{H256, U256};
use sp_runtime::{
generic::Header,
traits::{AtLeast32BitUnsigned, BlakeTwo256, Hash, MaybeDisplay, Member},
Digest, DigestItem,
};
use crate::{Error, RelayDipDidProof};
impl<
RelayBlockNumber: Member
+ sp_std::hash::Hash
+ Copy
+ MaybeDisplay
+ AtLeast32BitUnsigned
+ Codec
+ Into<U256>
+ TryFrom<U256>,
RelayHasher: Hash,
KiltDidKeyId,
KiltAccountId,
KiltBlockNumber,
KiltWeb3Name,
KiltLinkableAccountId,
>
RelayDipDidProof<
RelayBlockNumber,
RelayHasher,
KiltDidKeyId,
KiltAccountId,
KiltBlockNumber,
KiltWeb3Name,
KiltLinkableAccountId,
> where
RelayBlockNumber: Default,
KiltDidKeyId: Default,
KiltBlockNumber: Default,
{
fn with_header(header: Header<RelayBlockNumber, RelayHasher>) -> Self {
Self {
relay_header: header,
dip_commitment_proof: Default::default(),
dip_proof: Default::default(),
provider_head_proof: Default::default(),
signature: Default::default(),
}
}
}
#[test]
fn verify_relay_header_with_block_hash_successful() {
// Polkadot header at block `19_663_508` with hash
// `0x6e87866fb4f412e1e691e25d294019a7695d5a756ee7bc8d012c25177b5e1e13`
let header = Header::<u32, BlakeTwo256> {
parent_hash: hex!("444340c3fdd24466307d23f2f38c4a7787b7092aa9e7e614534a4efa4a2e7e4a").into(),
number: 19_663_508,
state_root: hex!("623b36bddae282e9fefab4707697171a594fdb27e90fd4ada4ebcc356438b070").into(),
extrinsics_root: hex!("6784dc16f12dc55d585bb4d8dc0dd08682e1c5714e081821ac2de07df41bb9fb").into(),
digest: Digest { logs: [
DigestItem::PreRuntime(*b"BABE", hex!("03c00000009740fa1000000000e088288be02358a7c702eee7d31fdf4bb3f47a2e24bedf8db390405bf3cca51c09f060dd63ae5632993fbc156062635eb921b75588bab688c5d2b62dc9e13e0464ceb3835c9c9806b33718282904b0dcbf2a9ce7f7b8a20f3f4696b50473e406").into()),
DigestItem::Consensus(*b"BEEF", hex!("03ea39d1df20f8a9f2509f42dc42e9868d53c5a5581a95660ca12b74d5acfd92fa").into()),
DigestItem::Seal(*b"BABE", hex!("680c6d5888043c8a468fced27d321b3d0937a6fa4961430edb5be4ee118628698a5c3a05969668bcf229dbd63d0179c92fe2242f8fecdd203a8f5dbb584c348d").into())
].to_vec() },
};
// Only interested in the header verification part, we skip everything else.
let proof = RelayDipDidProof::<_, _, (), (), (), (), ()>::with_header(header);
let proof_verification_result = proof
.verify_relay_header_with_block_hash(
&hex!("6e87866fb4f412e1e691e25d294019a7695d5a756ee7bc8d012c25177b5e1e13").into(),
)
.unwrap();
assert_eq!(
proof_verification_result.relay_state_root,
hex!("623b36bddae282e9fefab4707697171a594fdb27e90fd4ada4ebcc356438b070").into()
);
}
#[test]
fn verify_relay_header_with_block_hash_wrong_hash() {
// Polkadot header at block `19_663_508` with hash
// `0x6e87866fb4f412e1e691e25d294019a7695d5a756ee7bc8d012c25177b5e1e13`
let header = Header::<u32, BlakeTwo256> {
parent_hash: hex!("444340c3fdd24466307d23f2f38c4a7787b7092aa9e7e614534a4efa4a2e7e4a").into(),
number: 19_663_508,
state_root: hex!("623b36bddae282e9fefab4707697171a594fdb27e90fd4ada4ebcc356438b070").into(),
extrinsics_root: hex!("6784dc16f12dc55d585bb4d8dc0dd08682e1c5714e081821ac2de07df41bb9fb").into(),
digest: Digest { logs: [
DigestItem::PreRuntime(*b"BABE", hex!("03c00000009740fa1000000000e088288be02358a7c702eee7d31fdf4bb3f47a2e24bedf8db390405bf3cca51c09f060dd63ae5632993fbc156062635eb921b75588bab688c5d2b62dc9e13e0464ceb3835c9c9806b33718282904b0dcbf2a9ce7f7b8a20f3f4696b50473e406").into()),
DigestItem::Consensus(*b"BEEF", hex!("03ea39d1df20f8a9f2509f42dc42e9868d53c5a5581a95660ca12b74d5acfd92fa").into()),
DigestItem::Seal(*b"BABE", hex!("680c6d5888043c8a468fced27d321b3d0937a6fa4961430edb5be4ee118628698a5c3a05969668bcf229dbd63d0179c92fe2242f8fecdd203a8f5dbb584c348d").into())
].to_vec() },
};
let proof = RelayDipDidProof::<_, _, (), (), (), (), ()>::with_header(header);
assert_err!(
// Using a different block hash for verification
proof.verify_relay_header_with_block_hash(&H256::default()),
Error::InvalidRelayHeader
);
}
}
mod relay_dip_did_proof_with_verified_relay_state_root {
use frame_support::assert_err;
use frame_system::pallet_prelude::HeaderFor;
use hex_literal::hex;
use sp_core::H256;
use sp_runtime::traits::{BlakeTwo256, Keccak256};
use spiritnet_runtime::Runtime as SpiritnetRuntime;
use crate::{
state_proofs::MerkleProofError, Error, ProviderHeadStateProof, RelayDipDidProofWithVerifiedRelayStateRoot,
};
impl<
StateRoot,
RelayBlockNumber,
KiltDidKeyId,
KiltAccountId,
KiltBlockNumber,
KiltWeb3Name,
KiltLinkableAccountId,
>
RelayDipDidProofWithVerifiedRelayStateRoot<
StateRoot,
RelayBlockNumber,
KiltDidKeyId,
KiltAccountId,
KiltBlockNumber,
KiltWeb3Name,
KiltLinkableAccountId,
> where
RelayBlockNumber: Default,
KiltDidKeyId: Default,
KiltBlockNumber: Default,
{
fn with_relay_state_root_and_provider_head_proof(
relay_state_root: StateRoot,
provider_head_proof: ProviderHeadStateProof<RelayBlockNumber>,
) -> Self {
Self {
relay_state_root,
provider_head_proof,
dip_commitment_proof: Default::default(),
dip_proof: Default::default(),
signature: Default::default(),
}
}
}
#[test]
fn verify_provider_head_proof_successful() {
// Storage proof generated at Polkadot block `19_663_508` with hash
// `0x6e87866fb4f412e1e691e25d294019a7695d5a756ee7bc8d012c25177b5e1e13` for
// storage key
// `0xcd710b30bd2eab0352ddcc26417aa1941b3c252fcb29d88eff4f3de5de4476c32c0cfd6c23b92a7826080000`
// (`paras::heads(2_086)`)
let relay_state_root: H256 = hex!("623b36bddae282e9fefab4707697171a594fdb27e90fd4ada4ebcc356438b070").into();
let provider_head_proof = ProviderHeadStateProof {
relay_block_number: 19_663_508,
proof: vec![
hex!("560cfd6c23b92a7826080000f102e902fb1bd938b2f4fcea70641da8e64e0e11098b92b767279227cdfdc0ae9500da99d27e5f012937179bfe939750c770f2aa6e84c6b8cf9d0aa9ab852243ceb78e3eeb93fc56eacc28c5503a155c4d8bc7ee4797c38e212428cefff0a7ad19b28ebbab793e64080661757261204a207d0800000000056175726101017cda19117c87384aaebfd2ae546771bcfbfe7011a91119932883382cc62be3050d745c9734f422228c7c43d87e6172519019829b14b2d3b64afafb1fb7d3a683").to_vec(),
hex!("80021080f0c4027f5eba380b623a2d3382ab03961b2b7e753e62d3475a6940207db367cc80fde8c5a37120e2f1d987f5302783d22f8ac1b213c580030a7f5b15e706df6262").to_vec(),
hex!("8004648019885bbc2709cbd3a89f9a8813867f322e5663c99fdea9af3ff2ba0010455d5d8091eb4873541a81f69d22ccd903b864c36c747910eec7433d947e5a61f87eb7db80ca85a51ad63cbcb7a988023f3b082492a6937f9957c029eb34d6d618279d232d8048dcb685fcf3963e7697a630c6ce64ff06f325063bb05e34e679eb01a4e2b644").to_vec(),
hex!("80ffff8003ff6c42a935aca27c743910dbb62aae8009854a21741d74080abb406c26b1f58084a7c1351a2986c948c9a111c955d0f8635e4bd305c24f9b6680405fdce955a180ed003737744c7fba94d0c2cb57f96e7bf3310d9c7a285ae789e25af8b79091b38017a0734a39f27a75f6f648bca2facca2381325b529d32bcf82e75aaf6b7d82dd8042e2e666a38ce9fdbe60164d0c3a351ce06c931931d2cd6650378c1ad691c21480d0cc4967746360ee3895a6937608d7f36674426928790cb8ca7426289ad74469804e8940ff6b30dfb0f92341c3a738f262bed9ca03de9b868eb99cfc282aa7786780acda22345d4597dfe6fd831509b944254e26a00fd56e77bc2cb780c0775a520a808c0dae720727cec94dbc853812332bfd6d5f2cc5e287bcd1e5efc530053dbd2280a16a8184b9f2e555d4991995fd479b1ee7b35653f2215f74f822436dbbb2331580984648137ae9c8ecf33f878cedffdba73fb4282ba3ec033102aa6d7442466517801132afeed824c180373b2450b32c72c84a21cdfddbe0f1bf8e76d6958963669580357f2107df0a82f2605f90e39c5665bdf69e1d6222bc425f8390bde67c1d414780c4e048c8dc0ea614a190375a1b215c8e8ff5f5098cd43a93d59be907a2258a74807ad4cd868c49acc40e389d45a1e7e7629e666972ed747c67b607b07f637c1f0b8021bbaa444a77faac92b771c0e1b19162ace64b5ce745892d3ce59f820cba2dc7").to_vec(),
hex!("9e710b30bd2eab0352ddcc26417aa1945fd3802284b6ec6d4b3138fca93d003a58421ba947ecbc14c39e76572061105bbc568b809f8b23e74053dd98b58424e102ba5ac16f028714ec16a61522011fe6e16771ff80ed3e43ac278948816e8c9e8adda2dbeefe552702cf8144fd9b50e0b8db99bfcf80694abb8b23315ab79cdb22ca6826e867a9157415a832ad38f376dd819107d3ea80b9aee043e378f8313e68a6030679ccf3880fa1e7ab19b6244b5c262b7a152f004c5f03c716fb8fff3de61a883bb76adb34a2040080f15f37adeb10597dac54c2c65393277b2ca62aa27b2d16a23a78a4cc55ef15bb8008a0c609ab4888f02c2545c002153297c2641c5a7b4f3d8e25c634e721f80bea80b6617c764df278313c426c46961ccde8ee7a03f9007b74bc8bc6c49d1583cf7d801c9a4a3457ad4a568dd4c9abe231304689c9bec78be932ef0a2d30690ca428848059ef8bbe3a06c98792f41b3e0a6cdf1f157d9be85e12a7c1daf9c30f969daba4").to_vec(),
hex!("9f0b3c252fcb29d88eff4f3de5de4476c3ffbf805254dc9131b269f3bbbb71f58a76a5034b2bc2faaab0d1cf45c3819dc6e69740804bc059c3d96f627e09a3b6c0f9851d902f84ac68006617289ac0b7d0a272b36280d97e2394406f94be4266da29b6fe7f3178059525eaf3c9b540064389af020bf180636959b43018d3ff8a55246d5874a16c93e85bd2a58c82ebfc1b54dd9b2a7d0780d3c1a10188200f31459d722f7efc693736d1a36af5644fd949b2e411d7942597800328f24d0485b9701135913a569f6ccbf261a05d055183abf3e4ecb4e4375b7c80f3229cd59de7b1e604f110cbcf814466f2d2973e9bdb6c106a662c576e0820e480b66b29cbd45f93602dbc9f1175407c6f69bd686d23dd22a8f0dfe9cff08843ad80ddb2d426c0c546068b429e77253e0a8a32e818151f5fc031e899a0f6acad157580ea7fb3cad8e128cc295194658016f4865ef37501e5759fb4f15cb2ecb689e85e80e9f3cac1b25842da7fbaf947952dc30329a1d19037ab21baed3851acbee629f6800d898e2a4a6ee9969a233c4741e4441c0fe393104b3cfc5adcf348f3ef20fc7480ac6c622536e593ae3c9d423a461faafc7abbf01ecb129e69d66f3382eaf484dc80c7ba3cadffaea5acd013dba51c96129ae93ea6cd45f3930e4302f5b100f6deae806f29f805e30029363e42381d6609ecb6837411bd6fd676c0a37621a3b5588101").to_vec()
],
};
// Only interested in the parachain head verification part, we skip everything
// else.
let proof = RelayDipDidProofWithVerifiedRelayStateRoot::<_, _, (), (), _, (), ()>::with_relay_state_root_and_provider_head_proof(relay_state_root, provider_head_proof);
let proof_verification_result = proof
.verify_provider_head_proof::<BlakeTwo256, HeaderFor<SpiritnetRuntime>>(2_086)
.unwrap();
assert_eq!(
proof_verification_result.state_root,
hex!("2937179bfe939750c770f2aa6e84c6b8cf9d0aa9ab852243ceb78e3eeb93fc56").into()
);
}
#[test]
fn verify_provider_head_proof_multi_storage() {
// Storage proof generated at Polkadot block `19_663_508` with hash
// `0x6e87866fb4f412e1e691e25d294019a7695d5a756ee7bc8d012c25177b5e1e13` for
// storage keys
// [`0xcd710b30bd2eab0352ddcc26417aa1941b3c252fcb29d88eff4f3de5de4476c32c0cfd6c23b92a7826080000`, `0xcd710b30bd2eab0352ddcc26417aa1941b3c252fcb29d88eff4f3de5de4476c3b6ff6f7d467b87a9e8030000`]
// ([`paras::heads(2_086)`, `paras::heads(1_000)]`)
let relay_state_root: H256 = hex!("623b36bddae282e9fefab4707697171a594fdb27e90fd4ada4ebcc356438b070").into();
let provider_head_proof = ProviderHeadStateProof {
relay_block_number: 19_663_508,
proof: vec![
hex!("560cfd6c23b92a7826080000f102e902fb1bd938b2f4fcea70641da8e64e0e11098b92b767279227cdfdc0ae9500da99d27e5f012937179bfe939750c770f2aa6e84c6b8cf9d0aa9ab852243ceb78e3eeb93fc56eacc28c5503a155c4d8bc7ee4797c38e212428cefff0a7ad19b28ebbab793e64080661757261204a207d0800000000056175726101017cda19117c87384aaebfd2ae546771bcfbfe7011a91119932883382cc62be3050d745c9734f422228c7c43d87e6172519019829b14b2d3b64afafb1fb7d3a683").to_vec(),
hex!("56ff6f7d467b87a9e80300009903910331d9f8f427be99ba3b36ad6f66c49b5448e16745fc3cbe08821204e2e94c9abe1ef65e01dc0f3c52d9aaef735eae1aa679e6c3020e993fb3eef8fab9c32cc7b55dfc85362c771d9a07e5b6cf9f8e30b67598c513ca087574ecce0b3e205eb4de8783a4630c0661757261204a207d08000000000452505352906ca2562dd3ddae0ecb7076465e223753e76792653f739d5dfb00ad76a6b3607d4a2ab00405617572610101dadcb6f606d8a71dc6d0d4d20ccc3bd67bae8816c86491b14fa899242cd872f3bf5fe9635d4414f4329a578a0627cf367dcaa3e86beca64a9aaef9afd124c701").to_vec(),
hex!("80021080f0c4027f5eba380b623a2d3382ab03961b2b7e753e62d3475a6940207db367cc80fde8c5a37120e2f1d987f5302783d22f8ac1b213c580030a7f5b15e706df6262").to_vec(),
hex!("8004648019885bbc2709cbd3a89f9a8813867f322e5663c99fdea9af3ff2ba0010455d5d8091eb4873541a81f69d22ccd903b864c36c747910eec7433d947e5a61f87eb7db80ca85a51ad63cbcb7a988023f3b082492a6937f9957c029eb34d6d618279d232d8048dcb685fcf3963e7697a630c6ce64ff06f325063bb05e34e679eb01a4e2b644").to_vec(),
hex!("80d510805396188100731505c3fe5f51e7d4a9c6e6e4cd2c50ff6d122f5f091a186b2f9780e69515c0c399ad09a7b5da0afb5a8bbd22c6873b69f9f2da18e26a8bd04c6e9d80d647e804958d947c20337a2ac3714b3eca41be52847542b065da3614230decab806dbb5b1913c89acb68a2e85013c4b7adf37ab010cf9b9d7346348d0ca9aafd4a80702af779edd6e8d659600cbe342947238af804d41589116a3dd7fb48905aeab18076a51b70378cbf602d939a885bbad80c94ee9325398105ec2173324bd7f59b55").to_vec(),
hex!("80ffff8003ff6c42a935aca27c743910dbb62aae8009854a21741d74080abb406c26b1f58084a7c1351a2986c948c9a111c955d0f8635e4bd305c24f9b6680405fdce955a180ed003737744c7fba94d0c2cb57f96e7bf3310d9c7a285ae789e25af8b79091b38017a0734a39f27a75f6f648bca2facca2381325b529d32bcf82e75aaf6b7d82dd8042e2e666a38ce9fdbe60164d0c3a351ce06c931931d2cd6650378c1ad691c21480d0cc4967746360ee3895a6937608d7f36674426928790cb8ca7426289ad74469804e8940ff6b30dfb0f92341c3a738f262bed9ca03de9b868eb99cfc282aa7786780acda22345d4597dfe6fd831509b944254e26a00fd56e77bc2cb780c0775a520a808c0dae720727cec94dbc853812332bfd6d5f2cc5e287bcd1e5efc530053dbd2280a16a8184b9f2e555d4991995fd479b1ee7b35653f2215f74f822436dbbb2331580984648137ae9c8ecf33f878cedffdba73fb4282ba3ec033102aa6d7442466517801132afeed824c180373b2450b32c72c84a21cdfddbe0f1bf8e76d6958963669580357f2107df0a82f2605f90e39c5665bdf69e1d6222bc425f8390bde67c1d414780c4e048c8dc0ea614a190375a1b215c8e8ff5f5098cd43a93d59be907a2258a74807ad4cd868c49acc40e389d45a1e7e7629e666972ed747c67b607b07f637c1f0b8021bbaa444a77faac92b771c0e1b19162ace64b5ce745892d3ce59f820cba2dc7").to_vec(),
hex!("9e710b30bd2eab0352ddcc26417aa1945fd3802284b6ec6d4b3138fca93d003a58421ba947ecbc14c39e76572061105bbc568b809f8b23e74053dd98b58424e102ba5ac16f028714ec16a61522011fe6e16771ff80ed3e43ac278948816e8c9e8adda2dbeefe552702cf8144fd9b50e0b8db99bfcf80694abb8b23315ab79cdb22ca6826e867a9157415a832ad38f376dd819107d3ea80b9aee043e378f8313e68a6030679ccf3880fa1e7ab19b6244b5c262b7a152f004c5f03c716fb8fff3de61a883bb76adb34a2040080f15f37adeb10597dac54c2c65393277b2ca62aa27b2d16a23a78a4cc55ef15bb8008a0c609ab4888f02c2545c002153297c2641c5a7b4f3d8e25c634e721f80bea80b6617c764df278313c426c46961ccde8ee7a03f9007b74bc8bc6c49d1583cf7d801c9a4a3457ad4a568dd4c9abe231304689c9bec78be932ef0a2d30690ca428848059ef8bbe3a06c98792f41b3e0a6cdf1f157d9be85e12a7c1daf9c30f969daba4").to_vec(),
hex!("9f0b3c252fcb29d88eff4f3de5de4476c3ffbf805254dc9131b269f3bbbb71f58a76a5034b2bc2faaab0d1cf45c3819dc6e69740804bc059c3d96f627e09a3b6c0f9851d902f84ac68006617289ac0b7d0a272b36280d97e2394406f94be4266da29b6fe7f3178059525eaf3c9b540064389af020bf180636959b43018d3ff8a55246d5874a16c93e85bd2a58c82ebfc1b54dd9b2a7d0780d3c1a10188200f31459d722f7efc693736d1a36af5644fd949b2e411d7942597800328f24d0485b9701135913a569f6ccbf261a05d055183abf3e4ecb4e4375b7c80f3229cd59de7b1e604f110cbcf814466f2d2973e9bdb6c106a662c576e0820e480b66b29cbd45f93602dbc9f1175407c6f69bd686d23dd22a8f0dfe9cff08843ad80ddb2d426c0c546068b429e77253e0a8a32e818151f5fc031e899a0f6acad157580ea7fb3cad8e128cc295194658016f4865ef37501e5759fb4f15cb2ecb689e85e80e9f3cac1b25842da7fbaf947952dc30329a1d19037ab21baed3851acbee629f6800d898e2a4a6ee9969a233c4741e4441c0fe393104b3cfc5adcf348f3ef20fc7480ac6c622536e593ae3c9d423a461faafc7abbf01ecb129e69d66f3382eaf484dc80c7ba3cadffaea5acd013dba51c96129ae93ea6cd45f3930e4302f5b100f6deae806f29f805e30029363e42381d6609ecb6837411bd6fd676c0a37621a3b5588101").to_vec()
],
};
// Only interested in the parachain head verification part, we skip everything
// else.
let proof = RelayDipDidProofWithVerifiedRelayStateRoot::<_, _, (), (), _, (), ()>::with_relay_state_root_and_provider_head_proof(relay_state_root, provider_head_proof);
let proof_verification_result = proof
.verify_provider_head_proof::<BlakeTwo256, HeaderFor<SpiritnetRuntime>>(2_086)
.unwrap();
assert_eq!(
proof_verification_result.state_root,
hex!("2937179bfe939750c770f2aa6e84c6b8cf9d0aa9ab852243ceb78e3eeb93fc56").into()
);
}
#[test]
fn verify_provider_head_proof_wrong_hasher() {
// Storage proof generated at Polkadot block `19_663_508` with hash
// `0x6e87866fb4f412e1e691e25d294019a7695d5a756ee7bc8d012c25177b5e1e13` for
// storage key
// `0xcd710b30bd2eab0352ddcc26417aa1941b3c252fcb29d88eff4f3de5de4476c32c0cfd6c23b92a7826080000`
// (`paras::heads(2_086)`)
let relay_state_root: H256 = hex!("623b36bddae282e9fefab4707697171a594fdb27e90fd4ada4ebcc356438b070").into();
let provider_head_proof = ProviderHeadStateProof {
relay_block_number: 19_663_508,
proof: vec![
hex!("560cfd6c23b92a7826080000f102e902fb1bd938b2f4fcea70641da8e64e0e11098b92b767279227cdfdc0ae9500da99d27e5f012937179bfe939750c770f2aa6e84c6b8cf9d0aa9ab852243ceb78e3eeb93fc56eacc28c5503a155c4d8bc7ee4797c38e212428cefff0a7ad19b28ebbab793e64080661757261204a207d0800000000056175726101017cda19117c87384aaebfd2ae546771bcfbfe7011a91119932883382cc62be3050d745c9734f422228c7c43d87e6172519019829b14b2d3b64afafb1fb7d3a683").to_vec(),
hex!("80021080f0c4027f5eba380b623a2d3382ab03961b2b7e753e62d3475a6940207db367cc80fde8c5a37120e2f1d987f5302783d22f8ac1b213c580030a7f5b15e706df6262").to_vec(),
hex!("8004648019885bbc2709cbd3a89f9a8813867f322e5663c99fdea9af3ff2ba0010455d5d8091eb4873541a81f69d22ccd903b864c36c747910eec7433d947e5a61f87eb7db80ca85a51ad63cbcb7a988023f3b082492a6937f9957c029eb34d6d618279d232d8048dcb685fcf3963e7697a630c6ce64ff06f325063bb05e34e679eb01a4e2b644").to_vec(),
hex!("80ffff8003ff6c42a935aca27c743910dbb62aae8009854a21741d74080abb406c26b1f58084a7c1351a2986c948c9a111c955d0f8635e4bd305c24f9b6680405fdce955a180ed003737744c7fba94d0c2cb57f96e7bf3310d9c7a285ae789e25af8b79091b38017a0734a39f27a75f6f648bca2facca2381325b529d32bcf82e75aaf6b7d82dd8042e2e666a38ce9fdbe60164d0c3a351ce06c931931d2cd6650378c1ad691c21480d0cc4967746360ee3895a6937608d7f36674426928790cb8ca7426289ad74469804e8940ff6b30dfb0f92341c3a738f262bed9ca03de9b868eb99cfc282aa7786780acda22345d4597dfe6fd831509b944254e26a00fd56e77bc2cb780c0775a520a808c0dae720727cec94dbc853812332bfd6d5f2cc5e287bcd1e5efc530053dbd2280a16a8184b9f2e555d4991995fd479b1ee7b35653f2215f74f822436dbbb2331580984648137ae9c8ecf33f878cedffdba73fb4282ba3ec033102aa6d7442466517801132afeed824c180373b2450b32c72c84a21cdfddbe0f1bf8e76d6958963669580357f2107df0a82f2605f90e39c5665bdf69e1d6222bc425f8390bde67c1d414780c4e048c8dc0ea614a190375a1b215c8e8ff5f5098cd43a93d59be907a2258a74807ad4cd868c49acc40e389d45a1e7e7629e666972ed747c67b607b07f637c1f0b8021bbaa444a77faac92b771c0e1b19162ace64b5ce745892d3ce59f820cba2dc7").to_vec(),
hex!("9e710b30bd2eab0352ddcc26417aa1945fd3802284b6ec6d4b3138fca93d003a58421ba947ecbc14c39e76572061105bbc568b809f8b23e74053dd98b58424e102ba5ac16f028714ec16a61522011fe6e16771ff80ed3e43ac278948816e8c9e8adda2dbeefe552702cf8144fd9b50e0b8db99bfcf80694abb8b23315ab79cdb22ca6826e867a9157415a832ad38f376dd819107d3ea80b9aee043e378f8313e68a6030679ccf3880fa1e7ab19b6244b5c262b7a152f004c5f03c716fb8fff3de61a883bb76adb34a2040080f15f37adeb10597dac54c2c65393277b2ca62aa27b2d16a23a78a4cc55ef15bb8008a0c609ab4888f02c2545c002153297c2641c5a7b4f3d8e25c634e721f80bea80b6617c764df278313c426c46961ccde8ee7a03f9007b74bc8bc6c49d1583cf7d801c9a4a3457ad4a568dd4c9abe231304689c9bec78be932ef0a2d30690ca428848059ef8bbe3a06c98792f41b3e0a6cdf1f157d9be85e12a7c1daf9c30f969daba4").to_vec(),
hex!("9f0b3c252fcb29d88eff4f3de5de4476c3ffbf805254dc9131b269f3bbbb71f58a76a5034b2bc2faaab0d1cf45c3819dc6e69740804bc059c3d96f627e09a3b6c0f9851d902f84ac68006617289ac0b7d0a272b36280d97e2394406f94be4266da29b6fe7f3178059525eaf3c9b540064389af020bf180636959b43018d3ff8a55246d5874a16c93e85bd2a58c82ebfc1b54dd9b2a7d0780d3c1a10188200f31459d722f7efc693736d1a36af5644fd949b2e411d7942597800328f24d0485b9701135913a569f6ccbf261a05d055183abf3e4ecb4e4375b7c80f3229cd59de7b1e604f110cbcf814466f2d2973e9bdb6c106a662c576e0820e480b66b29cbd45f93602dbc9f1175407c6f69bd686d23dd22a8f0dfe9cff08843ad80ddb2d426c0c546068b429e77253e0a8a32e818151f5fc031e899a0f6acad157580ea7fb3cad8e128cc295194658016f4865ef37501e5759fb4f15cb2ecb689e85e80e9f3cac1b25842da7fbaf947952dc30329a1d19037ab21baed3851acbee629f6800d898e2a4a6ee9969a233c4741e4441c0fe393104b3cfc5adcf348f3ef20fc7480ac6c622536e593ae3c9d423a461faafc7abbf01ecb129e69d66f3382eaf484dc80c7ba3cadffaea5acd013dba51c96129ae93ea6cd45f3930e4302f5b100f6deae806f29f805e30029363e42381d6609ecb6837411bd6fd676c0a37621a3b5588101").to_vec()
],
};
let proof = RelayDipDidProofWithVerifiedRelayStateRoot::<_, _, (), (), _, (), ()>::with_relay_state_root_and_provider_head_proof(relay_state_root, provider_head_proof);
assert_err!(
// Using a different hasher for verification
proof.verify_provider_head_proof::<Keccak256, HeaderFor<SpiritnetRuntime>>(2_086),
Error::ParaHeadMerkleProof(MerkleProofError::InvalidProof)
);
}
#[test]
fn verify_provider_head_proof_wrong_para_id() {
// Storage proof generated at Polkadot block `19_663_508` with hash
// `0x6e87866fb4f412e1e691e25d294019a7695d5a756ee7bc8d012c25177b5e1e13` for
// storage key
// `0xcd710b30bd2eab0352ddcc26417aa1941b3c252fcb29d88eff4f3de5de4476c3b6ff6f7d467b87a9e8030000`
// (`paras::heads(1_000)`)
let relay_state_root: H256 = hex!("623b36bddae282e9fefab4707697171a594fdb27e90fd4ada4ebcc356438b070").into();
let provider_head_proof = ProviderHeadStateProof {
relay_block_number: 19_663_508,
proof: vec![
hex!("56ff6f7d467b87a9e80300009903910331d9f8f427be99ba3b36ad6f66c49b5448e16745fc3cbe08821204e2e94c9abe1ef65e01dc0f3c52d9aaef735eae1aa679e6c3020e993fb3eef8fab9c32cc7b55dfc85362c771d9a07e5b6cf9f8e30b67598c513ca087574ecce0b3e205eb4de8783a4630c0661757261204a207d08000000000452505352906ca2562dd3ddae0ecb7076465e223753e76792653f739d5dfb00ad76a6b3607d4a2ab00405617572610101dadcb6f606d8a71dc6d0d4d20ccc3bd67bae8816c86491b14fa899242cd872f3bf5fe9635d4414f4329a578a0627cf367dcaa3e86beca64a9aaef9afd124c701").to_vec(),
hex!("8004648019885bbc2709cbd3a89f9a8813867f322e5663c99fdea9af3ff2ba0010455d5d8091eb4873541a81f69d22ccd903b864c36c747910eec7433d947e5a61f87eb7db80ca85a51ad63cbcb7a988023f3b082492a6937f9957c029eb34d6d618279d232d8048dcb685fcf3963e7697a630c6ce64ff06f325063bb05e34e679eb01a4e2b644").to_vec(),
hex!("80d510805396188100731505c3fe5f51e7d4a9c6e6e4cd2c50ff6d122f5f091a186b2f9780e69515c0c399ad09a7b5da0afb5a8bbd22c6873b69f9f2da18e26a8bd04c6e9d80d647e804958d947c20337a2ac3714b3eca41be52847542b065da3614230decab806dbb5b1913c89acb68a2e85013c4b7adf37ab010cf9b9d7346348d0ca9aafd4a80702af779edd6e8d659600cbe342947238af804d41589116a3dd7fb48905aeab18076a51b70378cbf602d939a885bbad80c94ee9325398105ec2173324bd7f59b55").to_vec(),
hex!("80ffff8003ff6c42a935aca27c743910dbb62aae8009854a21741d74080abb406c26b1f58084a7c1351a2986c948c9a111c955d0f8635e4bd305c24f9b6680405fdce955a180ed003737744c7fba94d0c2cb57f96e7bf3310d9c7a285ae789e25af8b79091b38017a0734a39f27a75f6f648bca2facca2381325b529d32bcf82e75aaf6b7d82dd8042e2e666a38ce9fdbe60164d0c3a351ce06c931931d2cd6650378c1ad691c21480d0cc4967746360ee3895a6937608d7f36674426928790cb8ca7426289ad74469804e8940ff6b30dfb0f92341c3a738f262bed9ca03de9b868eb99cfc282aa7786780acda22345d4597dfe6fd831509b944254e26a00fd56e77bc2cb780c0775a520a808c0dae720727cec94dbc853812332bfd6d5f2cc5e287bcd1e5efc530053dbd2280a16a8184b9f2e555d4991995fd479b1ee7b35653f2215f74f822436dbbb2331580984648137ae9c8ecf33f878cedffdba73fb4282ba3ec033102aa6d7442466517801132afeed824c180373b2450b32c72c84a21cdfddbe0f1bf8e76d6958963669580357f2107df0a82f2605f90e39c5665bdf69e1d6222bc425f8390bde67c1d414780c4e048c8dc0ea614a190375a1b215c8e8ff5f5098cd43a93d59be907a2258a74807ad4cd868c49acc40e389d45a1e7e7629e666972ed747c67b607b07f637c1f0b8021bbaa444a77faac92b771c0e1b19162ace64b5ce745892d3ce59f820cba2dc7").to_vec(),
hex!("9e710b30bd2eab0352ddcc26417aa1945fd3802284b6ec6d4b3138fca93d003a58421ba947ecbc14c39e76572061105bbc568b809f8b23e74053dd98b58424e102ba5ac16f028714ec16a61522011fe6e16771ff80ed3e43ac278948816e8c9e8adda2dbeefe552702cf8144fd9b50e0b8db99bfcf80694abb8b23315ab79cdb22ca6826e867a9157415a832ad38f376dd819107d3ea80b9aee043e378f8313e68a6030679ccf3880fa1e7ab19b6244b5c262b7a152f004c5f03c716fb8fff3de61a883bb76adb34a2040080f15f37adeb10597dac54c2c65393277b2ca62aa27b2d16a23a78a4cc55ef15bb8008a0c609ab4888f02c2545c002153297c2641c5a7b4f3d8e25c634e721f80bea80b6617c764df278313c426c46961ccde8ee7a03f9007b74bc8bc6c49d1583cf7d801c9a4a3457ad4a568dd4c9abe231304689c9bec78be932ef0a2d30690ca428848059ef8bbe3a06c98792f41b3e0a6cdf1f157d9be85e12a7c1daf9c30f969daba4").to_vec(),
hex!("9f0b3c252fcb29d88eff4f3de5de4476c3ffbf805254dc9131b269f3bbbb71f58a76a5034b2bc2faaab0d1cf45c3819dc6e69740804bc059c3d96f627e09a3b6c0f9851d902f84ac68006617289ac0b7d0a272b36280d97e2394406f94be4266da29b6fe7f3178059525eaf3c9b540064389af020bf180636959b43018d3ff8a55246d5874a16c93e85bd2a58c82ebfc1b54dd9b2a7d0780d3c1a10188200f31459d722f7efc693736d1a36af5644fd949b2e411d7942597800328f24d0485b9701135913a569f6ccbf261a05d055183abf3e4ecb4e4375b7c80f3229cd59de7b1e604f110cbcf814466f2d2973e9bdb6c106a662c576e0820e480b66b29cbd45f93602dbc9f1175407c6f69bd686d23dd22a8f0dfe9cff08843ad80ddb2d426c0c546068b429e77253e0a8a32e818151f5fc031e899a0f6acad157580ea7fb3cad8e128cc295194658016f4865ef37501e5759fb4f15cb2ecb689e85e80e9f3cac1b25842da7fbaf947952dc30329a1d19037ab21baed3851acbee629f6800d898e2a4a6ee9969a233c4741e4441c0fe393104b3cfc5adcf348f3ef20fc7480ac6c622536e593ae3c9d423a461faafc7abbf01ecb129e69d66f3382eaf484dc80c7ba3cadffaea5acd013dba51c96129ae93ea6cd45f3930e4302f5b100f6deae806f29f805e30029363e42381d6609ecb6837411bd6fd676c0a37621a3b5588101").to_vec()
],
};
let proof = RelayDipDidProofWithVerifiedRelayStateRoot::<_, _, (), (), _, (), ()>::with_relay_state_root_and_provider_head_proof(relay_state_root, provider_head_proof);
assert_err!(
proof.verify_provider_head_proof::<BlakeTwo256, HeaderFor<SpiritnetRuntime>>(2_086),
Error::ParaHeadMerkleProof(MerkleProofError::InvalidProof)
);
}
#[test]
fn verify_provider_head_proof_invalid_proof() {
// Storage proof generated at Polkadot block `19_663_508` with hash
// `0x6e87866fb4f412e1e691e25d294019a7695d5a756ee7bc8d012c25177b5e1e13` for
// storage key
// `0xcd710b30bd2eab0352ddcc26417aa1941b3c252fcb29d88eff4f3de5de4476c32c0cfd6c23b92a7826080000`
// (`paras::heads(2_086)`)
let relay_state_root: H256 = hex!("623b36bddae282e9fefab4707697171a594fdb27e90fd4ada4ebcc356438b070").into();
let provider_head_proof = ProviderHeadStateProof {
relay_block_number: 19_663_508,
// Last proof component removed
proof: vec![
hex!("560cfd6c23b92a7826080000f102e902fb1bd938b2f4fcea70641da8e64e0e11098b92b767279227cdfdc0ae9500da99d27e5f012937179bfe939750c770f2aa6e84c6b8cf9d0aa9ab852243ceb78e3eeb93fc56eacc28c5503a155c4d8bc7ee4797c38e212428cefff0a7ad19b28ebbab793e64080661757261204a207d0800000000056175726101017cda19117c87384aaebfd2ae546771bcfbfe7011a91119932883382cc62be3050d745c9734f422228c7c43d87e6172519019829b14b2d3b64afafb1fb7d3a683").to_vec(),
hex!("80021080f0c4027f5eba380b623a2d3382ab03961b2b7e753e62d3475a6940207db367cc80fde8c5a37120e2f1d987f5302783d22f8ac1b213c580030a7f5b15e706df6262").to_vec(),
hex!("8004648019885bbc2709cbd3a89f9a8813867f322e5663c99fdea9af3ff2ba0010455d5d8091eb4873541a81f69d22ccd903b864c36c747910eec7433d947e5a61f87eb7db80ca85a51ad63cbcb7a988023f3b082492a6937f9957c029eb34d6d618279d232d8048dcb685fcf3963e7697a630c6ce64ff06f325063bb05e34e679eb01a4e2b644").to_vec(),
hex!("80ffff8003ff6c42a935aca27c743910dbb62aae8009854a21741d74080abb406c26b1f58084a7c1351a2986c948c9a111c955d0f8635e4bd305c24f9b6680405fdce955a180ed003737744c7fba94d0c2cb57f96e7bf3310d9c7a285ae789e25af8b79091b38017a0734a39f27a75f6f648bca2facca2381325b529d32bcf82e75aaf6b7d82dd8042e2e666a38ce9fdbe60164d0c3a351ce06c931931d2cd6650378c1ad691c21480d0cc4967746360ee3895a6937608d7f36674426928790cb8ca7426289ad74469804e8940ff6b30dfb0f92341c3a738f262bed9ca03de9b868eb99cfc282aa7786780acda22345d4597dfe6fd831509b944254e26a00fd56e77bc2cb780c0775a520a808c0dae720727cec94dbc853812332bfd6d5f2cc5e287bcd1e5efc530053dbd2280a16a8184b9f2e555d4991995fd479b1ee7b35653f2215f74f822436dbbb2331580984648137ae9c8ecf33f878cedffdba73fb4282ba3ec033102aa6d7442466517801132afeed824c180373b2450b32c72c84a21cdfddbe0f1bf8e76d6958963669580357f2107df0a82f2605f90e39c5665bdf69e1d6222bc425f8390bde67c1d414780c4e048c8dc0ea614a190375a1b215c8e8ff5f5098cd43a93d59be907a2258a74807ad4cd868c49acc40e389d45a1e7e7629e666972ed747c67b607b07f637c1f0b8021bbaa444a77faac92b771c0e1b19162ace64b5ce745892d3ce59f820cba2dc7").to_vec(),
hex!("9e710b30bd2eab0352ddcc26417aa1945fd3802284b6ec6d4b3138fca93d003a58421ba947ecbc14c39e76572061105bbc568b809f8b23e74053dd98b58424e102ba5ac16f028714ec16a61522011fe6e16771ff80ed3e43ac278948816e8c9e8adda2dbeefe552702cf8144fd9b50e0b8db99bfcf80694abb8b23315ab79cdb22ca6826e867a9157415a832ad38f376dd819107d3ea80b9aee043e378f8313e68a6030679ccf3880fa1e7ab19b6244b5c262b7a152f004c5f03c716fb8fff3de61a883bb76adb34a2040080f15f37adeb10597dac54c2c65393277b2ca62aa27b2d16a23a78a4cc55ef15bb8008a0c609ab4888f02c2545c002153297c2641c5a7b4f3d8e25c634e721f80bea80b6617c764df278313c426c46961ccde8ee7a03f9007b74bc8bc6c49d1583cf7d801c9a4a3457ad4a568dd4c9abe231304689c9bec78be932ef0a2d30690ca428848059ef8bbe3a06c98792f41b3e0a6cdf1f157d9be85e12a7c1daf9c30f969daba4").to_vec(),
// hex!("9f0b3c252fcb29d88eff4f3de5de4476c3ffbf805254dc9131b269f3bbbb71f58a76a5034b2bc2faaab0d1cf45c3819dc6e69740804bc059c3d96f627e09a3b6c0f9851d902f84ac68006617289ac0b7d0a272b36280d97e2394406f94be4266da29b6fe7f3178059525eaf3c9b540064389af020bf180636959b43018d3ff8a55246d5874a16c93e85bd2a58c82ebfc1b54dd9b2a7d0780d3c1a10188200f31459d722f7efc693736d1a36af5644fd949b2e411d7942597800328f24d0485b9701135913a569f6ccbf261a05d055183abf3e4ecb4e4375b7c80f3229cd59de7b1e604f110cbcf814466f2d2973e9bdb6c106a662c576e0820e480b66b29cbd45f93602dbc9f1175407c6f69bd686d23dd22a8f0dfe9cff08843ad80ddb2d426c0c546068b429e77253e0a8a32e818151f5fc031e899a0f6acad157580ea7fb3cad8e128cc295194658016f4865ef37501e5759fb4f15cb2ecb689e85e80e9f3cac1b25842da7fbaf947952dc30329a1d19037ab21baed3851acbee629f6800d898e2a4a6ee9969a233c4741e4441c0fe393104b3cfc5adcf348f3ef20fc7480ac6c622536e593ae3c9d423a461faafc7abbf01ecb129e69d66f3382eaf484dc80c7ba3cadffaea5acd013dba51c96129ae93ea6cd45f3930e4302f5b100f6deae806f29f805e30029363e42381d6609ecb6837411bd6fd676c0a37621a3b5588101").to_vec()
],
};
let proof = RelayDipDidProofWithVerifiedRelayStateRoot::<_, _, (), (), _, (), ()>::with_relay_state_root_and_provider_head_proof(relay_state_root, provider_head_proof);
assert_err!(
proof.verify_provider_head_proof::<BlakeTwo256, HeaderFor<SpiritnetRuntime>>(2_086),
Error::ParaHeadMerkleProof(MerkleProofError::InvalidProof)
);
}
}