1#[cfg(feature = "std")]
21use std::fmt;
22
23#[cfg(feature = "serde")]
24use serde::{Deserialize, Serialize};
25
26use crate::{
27 codec::{Codec, Decode, DecodeWithMemTracking, Encode, EncodeLike},
28 traits::{
29 self, Block as BlockT, Header as HeaderT, LazyExtrinsic, MaybeSerialize,
30 MaybeSerializeDeserialize, Member, NumberFor,
31 },
32 Justifications, OpaqueExtrinsic,
33};
34use alloc::vec::Vec;
35use core::marker::PhantomData;
36use sp_core::RuntimeDebug;
37
38#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)]
40pub enum BlockId<Block: BlockT> {
41 Hash(Block::Hash),
43 Number(NumberFor<Block>),
45}
46
47impl<Block: BlockT> BlockId<Block> {
48 pub const fn hash(hash: Block::Hash) -> Self {
50 BlockId::Hash(hash)
51 }
52
53 pub const fn number(number: NumberFor<Block>) -> Self {
55 BlockId::Number(number)
56 }
57
58 pub fn is_pre_genesis(&self) -> bool {
60 match self {
61 BlockId::Hash(hash) => hash == &Default::default(),
62 BlockId::Number(_) => false,
63 }
64 }
65
66 pub fn pre_genesis() -> Self {
68 BlockId::Hash(Default::default())
69 }
70}
71
72impl<Block: BlockT> Copy for BlockId<Block> {}
73
74#[cfg(feature = "std")]
75impl<Block: BlockT> fmt::Display for BlockId<Block> {
76 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
77 write!(f, "{:?}", self)
78 }
79}
80
81#[derive(RuntimeDebug, Encode, Decode, scale_info::TypeInfo)]
83pub struct LazyBlock<Header, Extrinsic> {
84 pub header: Header,
86 pub extrinsics: Vec<OpaqueExtrinsic>,
88
89 _phantom: PhantomData<Extrinsic>,
90}
91
92impl<Header, Extrinsic: Into<OpaqueExtrinsic>> LazyBlock<Header, Extrinsic> {
93 pub fn new(header: Header, extrinsics: Vec<Extrinsic>) -> Self {
95 Self {
96 header,
97 extrinsics: extrinsics.into_iter().map(|xt| xt.into()).collect(),
98 _phantom: Default::default(),
99 }
100 }
101}
102
103impl<Header, Extrinsic: Into<OpaqueExtrinsic>> From<Block<Header, Extrinsic>>
104 for LazyBlock<Header, Extrinsic>
105{
106 fn from(block: Block<Header, Extrinsic>) -> Self {
107 LazyBlock::new(block.header, block.extrinsics)
108 }
109}
110
111impl<Header, Extrinsic> EncodeLike<LazyBlock<Header, Extrinsic>> for Block<Header, Extrinsic>
112where
113 Block<Header, Extrinsic>: Encode,
114 LazyBlock<Header, Extrinsic>: Encode,
115{
116}
117
118impl<Header, Extrinsic> EncodeLike<Block<Header, Extrinsic>> for LazyBlock<Header, Extrinsic>
119where
120 Block<Header, Extrinsic>: Encode,
121 LazyBlock<Header, Extrinsic>: Encode,
122{
123}
124
125impl<Header, Extrinsic> traits::LazyBlock for LazyBlock<Header, Extrinsic>
126where
127 Header: HeaderT,
128 Extrinsic: core::fmt::Debug + LazyExtrinsic,
129{
130 type Extrinsic = Extrinsic;
131 type Header = Header;
132
133 fn header(&self) -> &Self::Header {
134 &self.header
135 }
136
137 fn header_mut(&mut self) -> &mut Self::Header {
138 &mut self.header
139 }
140
141 fn extrinsics(&self) -> impl Iterator<Item = Result<Self::Extrinsic, codec::Error>> {
142 self.extrinsics.iter().map(|xt| Self::Extrinsic::decode_unprefixed(&xt.0))
143 }
144}
145
146#[derive(
148 PartialEq, Eq, Clone, Encode, Decode, DecodeWithMemTracking, RuntimeDebug, scale_info::TypeInfo,
149)]
150#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
151#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))]
152#[cfg_attr(feature = "serde", serde(deny_unknown_fields))]
153pub struct Block<Header, Extrinsic> {
154 pub header: Header,
156 pub extrinsics: Vec<Extrinsic>,
158}
159
160impl<Header, Extrinsic> traits::HeaderProvider for Block<Header, Extrinsic>
161where
162 Header: HeaderT,
163{
164 type HeaderT = Header;
165}
166
167impl<Header, Extrinsic: MaybeSerialize> traits::Block for Block<Header, Extrinsic>
168where
169 Header: HeaderT + MaybeSerializeDeserialize,
170 Extrinsic: Member
171 + Codec
172 + DecodeWithMemTracking
173 + traits::ExtrinsicLike
174 + Into<OpaqueExtrinsic>
175 + LazyExtrinsic,
176{
177 type Extrinsic = Extrinsic;
178 type Header = Header;
179 type Hash = <Self::Header as traits::Header>::Hash;
180 type LazyBlock = LazyBlock<Header, Extrinsic>;
181
182 fn header(&self) -> &Self::Header {
183 &self.header
184 }
185 fn extrinsics(&self) -> &[Self::Extrinsic] {
186 &self.extrinsics[..]
187 }
188 fn deconstruct(self) -> (Self::Header, Vec<Self::Extrinsic>) {
189 (self.header, self.extrinsics)
190 }
191 fn new(header: Self::Header, extrinsics: Vec<Self::Extrinsic>) -> Self {
192 Block { header, extrinsics }
193 }
194}
195
196#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)]
198#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
199#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))]
200#[cfg_attr(feature = "serde", serde(deny_unknown_fields))]
201pub struct SignedBlock<Block> {
202 pub block: Block,
204 pub justifications: Option<Justifications>,
206}