pub mod cbor_encodings;
pub mod serialization;
use super::TransactionIndex;
use crate::auxdata::AuxiliaryData;
use crate::crypto::{
BlockBodyHash, BlockHeaderHash, Ed25519Signature, KESSignature, KESVkey, VRFCert, VRFVkey, Vkey,
};
use crate::transaction::{TransactionBody, TransactionWitnessSet};
use cbor_encodings::{
BlockEncoding, HeaderBodyEncoding, HeaderEncoding, OperationalCertEncoding,
ProtocolVersionEncoding,
};
use cml_core::ordered_hash_map::OrderedHashMap;
use std::collections::BTreeMap;
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
pub struct Block {
pub header: Header,
pub transaction_bodies: Vec<TransactionBody>,
pub transaction_witness_sets: Vec<TransactionWitnessSet>,
pub auxiliary_data_set: OrderedHashMap<TransactionIndex, AuxiliaryData>,
pub invalid_transactions: Vec<TransactionIndex>,
#[serde(skip)]
pub encodings: Option<BlockEncoding>,
}
impl Block {
pub fn new(
header: Header,
transaction_bodies: Vec<TransactionBody>,
transaction_witness_sets: Vec<TransactionWitnessSet>,
auxiliary_data_set: OrderedHashMap<TransactionIndex, AuxiliaryData>,
invalid_transactions: Vec<TransactionIndex>,
) -> Self {
Self {
header,
transaction_bodies,
transaction_witness_sets,
auxiliary_data_set,
invalid_transactions,
encodings: None,
}
}
}
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
pub struct Header {
pub header_body: HeaderBody,
pub body_signature: KESSignature,
#[serde(skip)]
pub encodings: Option<HeaderEncoding>,
}
impl Header {
pub fn new(header_body: HeaderBody, body_signature: KESSignature) -> Self {
Self {
header_body,
body_signature,
encodings: None,
}
}
}
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
pub struct HeaderBody {
pub block_number: u64,
pub slot: u64,
pub prev_hash: Option<BlockHeaderHash>,
pub issuer_vkey: Vkey,
pub vrf_vkey: VRFVkey,
pub vrf_result: VRFCert,
pub block_body_size: u64,
pub block_body_hash: BlockBodyHash,
pub operational_cert: OperationalCert,
pub protocol_version: ProtocolVersion,
#[serde(skip)]
pub encodings: Option<HeaderBodyEncoding>,
}
impl HeaderBody {
#[allow(clippy::too_many_arguments)]
pub fn new(
block_number: u64,
slot: u64,
prev_hash: Option<BlockHeaderHash>,
issuer_vkey: Vkey,
vrf_vkey: VRFVkey,
vrf_result: VRFCert,
block_body_size: u64,
block_body_hash: BlockBodyHash,
operational_cert: OperationalCert,
protocol_version: ProtocolVersion,
) -> Self {
Self {
block_number,
slot,
prev_hash,
issuer_vkey,
vrf_vkey,
vrf_result,
block_body_size,
block_body_hash,
operational_cert,
protocol_version,
encodings: None,
}
}
}
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
pub struct OperationalCert {
pub hot_vkey: KESVkey,
pub sequence_number: u64,
pub kes_period: u64,
pub sigma: Ed25519Signature,
#[serde(skip)]
pub encodings: Option<OperationalCertEncoding>,
}
impl OperationalCert {
pub fn new(
hot_vkey: KESVkey,
sequence_number: u64,
kes_period: u64,
sigma: Ed25519Signature,
) -> Self {
Self {
hot_vkey,
sequence_number,
kes_period,
sigma,
encodings: None,
}
}
}
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
pub struct ProtocolVersion {
pub major: u64,
pub minor: u64,
#[serde(skip)]
pub encodings: Option<ProtocolVersionEncoding>,
}
impl ProtocolVersion {
pub fn new(major: u64, minor: u64) -> Self {
Self {
major,
minor,
encodings: None,
}
}
}