polkadot_parachain_primitives/
primitives.rs1use alloc::vec::Vec;
21
22use bounded_collections::{BoundedVec, ConstU32};
23use codec::{CompactAs, Decode, DecodeWithMemTracking, Encode, MaxEncodedLen};
24use scale_info::TypeInfo;
25use serde::{Deserialize, Serialize};
26use sp_core::{bytes, RuntimeDebug, TypeId};
27use sp_runtime::traits::Hash as _;
28use sp_weights::Weight;
29
30use polkadot_core_primitives::{Hash, OutboundHrmpMessage};
31
32pub use polkadot_core_primitives::BlockNumber as RelayChainBlockNumber;
34
35#[derive(
37 PartialEq,
38 Eq,
39 Clone,
40 PartialOrd,
41 Ord,
42 Encode,
43 Decode,
44 DecodeWithMemTracking,
45 derive_more::From,
46 TypeInfo,
47 Serialize,
48 Deserialize,
49)]
50#[cfg_attr(feature = "std", derive(Hash, Default))]
51pub struct HeadData(#[serde(with = "bytes")] pub Vec<u8>);
52
53impl core::fmt::Debug for HeadData {
54 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
55 write!(f, "HeadData({})", array_bytes::bytes2hex("0x", &self.0))
56 }
57}
58
59impl HeadData {
60 pub fn hash(&self) -> Hash {
62 sp_runtime::traits::BlakeTwo256::hash(&self.0)
63 }
64}
65
66impl codec::EncodeLike<HeadData> for alloc::vec::Vec<u8> {}
67
68#[derive(
70 PartialEq,
71 Eq,
72 Clone,
73 Encode,
74 Decode,
75 DecodeWithMemTracking,
76 derive_more::From,
77 TypeInfo,
78 Serialize,
79 Deserialize,
80)]
81#[cfg_attr(feature = "std", derive(Hash))]
82pub struct ValidationCode(#[serde(with = "bytes")] pub Vec<u8>);
83
84impl core::fmt::Debug for ValidationCode {
85 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
86 write!(f, "ValidationCode({})", array_bytes::bytes2hex("0x", &self.0))
87 }
88}
89
90impl ValidationCode {
91 pub fn hash(&self) -> ValidationCodeHash {
93 ValidationCodeHash(sp_runtime::traits::BlakeTwo256::hash(&self.0[..]))
94 }
95}
96
97#[derive(
104 Clone,
105 Copy,
106 Encode,
107 Decode,
108 DecodeWithMemTracking,
109 Hash,
110 Eq,
111 PartialEq,
112 PartialOrd,
113 Ord,
114 TypeInfo,
115)]
116pub struct ValidationCodeHash(Hash);
117
118impl core::fmt::Display for ValidationCodeHash {
119 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
120 self.0.fmt(f)
121 }
122}
123
124impl core::fmt::Debug for ValidationCodeHash {
125 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
126 write!(f, "{:?}", self.0)
127 }
128}
129
130impl AsRef<[u8]> for ValidationCodeHash {
131 fn as_ref(&self) -> &[u8] {
132 self.0.as_ref()
133 }
134}
135
136impl From<Hash> for ValidationCodeHash {
137 fn from(hash: Hash) -> ValidationCodeHash {
138 ValidationCodeHash(hash)
139 }
140}
141
142impl From<[u8; 32]> for ValidationCodeHash {
143 fn from(hash: [u8; 32]) -> ValidationCodeHash {
144 ValidationCodeHash(hash.into())
145 }
146}
147
148impl core::fmt::LowerHex for ValidationCodeHash {
149 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
150 core::fmt::LowerHex::fmt(&self.0, f)
151 }
152}
153
154#[derive(PartialEq, Eq, Clone, Encode, Decode, derive_more::From, TypeInfo, RuntimeDebug)]
158#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
159pub struct BlockData(#[cfg_attr(feature = "std", serde(with = "bytes"))] pub Vec<u8>);
160
161#[derive(
163 Clone,
164 CompactAs,
165 Copy,
166 Decode,
167 DecodeWithMemTracking,
168 Default,
169 Encode,
170 Eq,
171 Hash,
172 MaxEncodedLen,
173 Ord,
174 PartialEq,
175 PartialOrd,
176 Debug,
177 serde::Serialize,
178 serde::Deserialize,
179 TypeInfo,
180)]
181#[cfg_attr(feature = "std", derive(derive_more::Display))]
182pub struct Id(u32);
183
184impl codec::EncodeLike<u32> for Id {}
185impl codec::EncodeLike<Id> for u32 {}
186
187impl TypeId for Id {
188 const TYPE_ID: [u8; 4] = *b"para";
189}
190
191impl From<Id> for u32 {
192 fn from(x: Id) -> Self {
193 x.0
194 }
195}
196
197impl From<u32> for Id {
198 fn from(x: u32) -> Self {
199 Id(x)
200 }
201}
202
203#[cfg(any(feature = "std", feature = "runtime-benchmarks"))]
204impl From<usize> for Id {
205 fn from(x: usize) -> Self {
206 let x = x.try_into().unwrap_or(u32::MAX);
208 Id(x)
209 }
210}
211
212impl From<i32> for Id {
228 fn from(x: i32) -> Self {
229 Id(x as u32)
230 }
231}
232
233const SYSTEM_INDEX_END: u32 = 1999;
235const PUBLIC_INDEX_START: u32 = 2000;
236
237pub const LOWEST_PUBLIC_ID: Id = Id(PUBLIC_INDEX_START);
239
240impl Id {
241 pub const fn new(id: u32) -> Self {
243 Self(id)
244 }
245}
246
247pub trait IsSystem {
249 fn is_system(&self) -> bool;
251}
252
253impl IsSystem for Id {
254 fn is_system(&self) -> bool {
255 self.0 <= SYSTEM_INDEX_END
256 }
257}
258
259impl core::ops::Add<u32> for Id {
260 type Output = Self;
261
262 fn add(self, other: u32) -> Self {
263 Self(self.0 + other)
264 }
265}
266
267impl core::ops::Sub<u32> for Id {
268 type Output = Self;
269
270 fn sub(self, other: u32) -> Self {
271 Self(self.0 - other)
272 }
273}
274
275#[derive(
276 Clone, Copy, Default, Encode, Decode, Eq, PartialEq, Ord, PartialOrd, RuntimeDebug, TypeInfo,
277)]
278pub struct Sibling(pub Id);
279
280impl From<Id> for Sibling {
281 fn from(i: Id) -> Self {
282 Self(i)
283 }
284}
285
286impl From<Sibling> for Id {
287 fn from(i: Sibling) -> Self {
288 i.0
289 }
290}
291
292impl AsRef<Id> for Sibling {
293 fn as_ref(&self) -> &Id {
294 &self.0
295 }
296}
297
298impl TypeId for Sibling {
299 const TYPE_ID: [u8; 4] = *b"sibl";
300}
301
302impl From<Sibling> for u32 {
303 fn from(x: Sibling) -> Self {
304 x.0.into()
305 }
306}
307
308impl From<u32> for Sibling {
309 fn from(x: u32) -> Self {
310 Sibling(x.into())
311 }
312}
313
314impl IsSystem for Sibling {
315 fn is_system(&self) -> bool {
316 IsSystem::is_system(&self.0)
317 }
318}
319
320#[derive(
328 Clone,
329 PartialEq,
330 Eq,
331 PartialOrd,
332 Ord,
333 Encode,
334 Decode,
335 DecodeWithMemTracking,
336 RuntimeDebug,
337 TypeInfo,
338)]
339#[cfg_attr(feature = "std", derive(Hash))]
340pub struct HrmpChannelId {
341 pub sender: Id,
343 pub recipient: Id,
345}
346
347impl HrmpChannelId {
348 pub fn is_participant(&self, id: Id) -> bool {
350 id == self.sender || id == self.recipient
351 }
352}
353
354pub type UpwardMessage = Vec<u8>;
356
357pub trait DmpMessageHandler {
359 fn handle_dmp_messages(
363 iter: impl Iterator<Item = (RelayChainBlockNumber, Vec<u8>)>,
364 max_weight: Weight,
365 ) -> Weight;
366}
367impl DmpMessageHandler for () {
368 fn handle_dmp_messages(
369 iter: impl Iterator<Item = (RelayChainBlockNumber, Vec<u8>)>,
370 _max_weight: Weight,
371 ) -> Weight {
372 iter.for_each(drop);
373 Weight::zero()
374 }
375}
376
377#[derive(
379 Copy,
380 Clone,
381 Eq,
382 PartialEq,
383 Ord,
384 PartialOrd,
385 Encode,
386 Decode,
387 TypeInfo,
388 RuntimeDebug,
389 MaxEncodedLen,
390)]
391pub enum XcmpMessageFormat {
392 ConcatenatedVersionedXcm,
394 ConcatenatedEncodedBlob,
396 Signals,
399 ConcatenatedOpaqueVersionedXcm,
401}
402
403pub trait XcmpMessageHandler {
405 fn handle_xcmp_messages<'a, I: Iterator<Item = (Id, RelayChainBlockNumber, &'a [u8])>>(
410 iter: I,
411 max_weight: Weight,
412 ) -> Weight;
413}
414impl XcmpMessageHandler for () {
415 fn handle_xcmp_messages<'a, I: Iterator<Item = (Id, RelayChainBlockNumber, &'a [u8])>>(
416 iter: I,
417 _max_weight: Weight,
418 ) -> Weight {
419 for _ in iter {}
420 Weight::zero()
421 }
422}
423
424#[derive(PartialEq, Eq, Decode, Clone)]
427#[cfg_attr(feature = "std", derive(Debug, Encode))]
428pub struct ValidationParams {
429 pub parent_head: HeadData,
431 pub block_data: BlockData,
433 pub relay_parent_number: RelayChainBlockNumber,
435 pub relay_parent_storage_root: Hash,
437}
438
439pub const MAX_HORIZONTAL_MESSAGE_NUM: u32 = 16 * 1024;
444pub const MAX_UPWARD_MESSAGE_NUM: u32 = 16 * 1024;
449
450pub type UpwardMessages = BoundedVec<UpwardMessage, ConstU32<MAX_UPWARD_MESSAGE_NUM>>;
451
452pub type HorizontalMessages =
453 BoundedVec<OutboundHrmpMessage<Id>, ConstU32<MAX_HORIZONTAL_MESSAGE_NUM>>;
454
455#[derive(PartialEq, Eq, Clone, Encode)]
458#[cfg_attr(feature = "std", derive(Debug, Decode))]
459pub struct ValidationResult {
460 pub head_data: HeadData,
462 pub new_validation_code: Option<ValidationCode>,
464 pub upward_messages: UpwardMessages,
466 pub horizontal_messages: HorizontalMessages,
468 pub processed_downward_messages: u32,
472 pub hrmp_watermark: RelayChainBlockNumber,
475}