1pub mod cbor_encodings;
5pub mod serialization;
6
7use super::TransactionIndex;
8use crate::auxdata::AuxiliaryData;
9use crate::crypto::{
10 BlockBodyHash, BlockHeaderHash, Ed25519Signature, KESSignature, KESVkey, VRFCert, VRFVkey, Vkey,
11};
12use crate::transaction::{TransactionBody, TransactionWitnessSet};
13use cbor_encodings::{
14 BlockEncoding, HeaderBodyEncoding, HeaderEncoding, OperationalCertEncoding,
15 ProtocolVersionEncoding,
16};
17use cml_core::ordered_hash_map::OrderedHashMap;
18use std::collections::BTreeMap;
19
20#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
21pub struct Block {
22 pub header: Header,
23 pub transaction_bodies: Vec<TransactionBody>,
24 pub transaction_witness_sets: Vec<TransactionWitnessSet>,
25 pub auxiliary_data_set: OrderedHashMap<TransactionIndex, AuxiliaryData>,
26 pub invalid_transactions: Vec<TransactionIndex>,
27 #[serde(skip)]
28 pub encodings: Option<BlockEncoding>,
29}
30
31impl Block {
32 pub fn new(
33 header: Header,
34 transaction_bodies: Vec<TransactionBody>,
35 transaction_witness_sets: Vec<TransactionWitnessSet>,
36 auxiliary_data_set: OrderedHashMap<TransactionIndex, AuxiliaryData>,
37 invalid_transactions: Vec<TransactionIndex>,
38 ) -> Self {
39 Self {
40 header,
41 transaction_bodies,
42 transaction_witness_sets,
43 auxiliary_data_set,
44 invalid_transactions,
45 encodings: None,
46 }
47 }
48}
49
50#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
51pub struct Header {
52 pub header_body: HeaderBody,
53 pub body_signature: KESSignature,
54 #[serde(skip)]
55 pub encodings: Option<HeaderEncoding>,
56}
57
58impl Header {
59 pub fn new(header_body: HeaderBody, body_signature: KESSignature) -> Self {
60 Self {
61 header_body,
62 body_signature,
63 encodings: None,
64 }
65 }
66}
67
68#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
69pub struct HeaderBody {
70 pub block_number: u64,
71 pub slot: u64,
72 pub prev_hash: Option<BlockHeaderHash>,
73 pub issuer_vkey: Vkey,
74 pub vrf_vkey: VRFVkey,
75 pub vrf_result: VRFCert,
76 pub block_body_size: u64,
77 pub block_body_hash: BlockBodyHash,
78 pub operational_cert: OperationalCert,
79 pub protocol_version: ProtocolVersion,
80 #[serde(skip)]
81 pub encodings: Option<HeaderBodyEncoding>,
82}
83
84impl HeaderBody {
85 #[allow(clippy::too_many_arguments)]
86 pub fn new(
87 block_number: u64,
88 slot: u64,
89 prev_hash: Option<BlockHeaderHash>,
90 issuer_vkey: Vkey,
91 vrf_vkey: VRFVkey,
92 vrf_result: VRFCert,
93 block_body_size: u64,
94 block_body_hash: BlockBodyHash,
95 operational_cert: OperationalCert,
96 protocol_version: ProtocolVersion,
97 ) -> Self {
98 Self {
99 block_number,
100 slot,
101 prev_hash,
102 issuer_vkey,
103 vrf_vkey,
104 vrf_result,
105 block_body_size,
106 block_body_hash,
107 operational_cert,
108 protocol_version,
109 encodings: None,
110 }
111 }
112}
113
114#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
115pub struct OperationalCert {
116 pub hot_vkey: KESVkey,
117 pub sequence_number: u64,
118 pub kes_period: u64,
119 pub sigma: Ed25519Signature,
120 #[serde(skip)]
121 pub encodings: Option<OperationalCertEncoding>,
122}
123
124impl OperationalCert {
125 pub fn new(
126 hot_vkey: KESVkey,
127 sequence_number: u64,
128 kes_period: u64,
129 sigma: Ed25519Signature,
130 ) -> Self {
131 Self {
132 hot_vkey,
133 sequence_number,
134 kes_period,
135 sigma,
136 encodings: None,
137 }
138 }
139}
140
141#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
142pub struct ProtocolVersion {
143 pub major: u64,
144 pub minor: u64,
145 #[serde(skip)]
146 pub encodings: Option<ProtocolVersionEncoding>,
147}
148
149impl ProtocolVersion {
150 pub fn new(major: u64, minor: u64) -> Self {
151 Self {
152 major,
153 minor,
154 encodings: None,
155 }
156 }
157}