pub mod keys;
pub mod log_markers;
pub mod register;
pub mod utils;
mod address;
mod cache;
mod chunk;
mod errors;
mod peer;
use crate::messaging::data::CmdResponse;
pub use crate::messaging::{
data::{Error as DataError, RegisterCmd},
SectionSig,
};
pub use address::{ChunkAddress, DataAddress, RegisterAddress, SpentbookAddress};
pub use cache::Cache;
pub use chunk::{Chunk, MAX_CHUNK_SIZE_IN_BYTES};
pub use errors::{Error, Result};
pub use keys::{
keypair::{BlsKeypairShare, Encryption, Keypair, OwnerType, Signing},
public_key::PublicKey,
secret_key::SecretKey,
signature::{Signature, SignatureShare},
};
pub use peer::Peer;
use serde::{Deserialize, Serialize};
use xor_name::XorName;
pub const SPENTBOOK_TYPE_TAG: u64 = 0;
const REGISTER_CMD_SIZE: usize = 300;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ReplicatedRegisterLog {
pub address: RegisterAddress,
pub op_log: Vec<RegisterCmd>,
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum ReplicatedData {
Chunk(Chunk),
RegisterWrite(RegisterCmd),
RegisterLog(ReplicatedRegisterLog),
SpentbookWrite(RegisterCmd),
SpentbookLog(ReplicatedRegisterLog),
}
impl ReplicatedData {
pub fn name(&self) -> XorName {
match self {
Self::Chunk(chunk) => *chunk.name(),
Self::RegisterLog(log) => *log.address.name(),
Self::RegisterWrite(cmd) => *cmd.dst_address().name(),
Self::SpentbookLog(log) => *log.address.name(),
Self::SpentbookWrite(cmd) => *cmd.dst_address().name(),
}
}
pub fn address(&self) -> DataAddress {
match self {
Self::Chunk(chunk) => DataAddress::Bytes(*chunk.address()),
Self::RegisterLog(log) => DataAddress::Register(log.address),
Self::RegisterWrite(cmd) => DataAddress::Register(cmd.dst_address()),
Self::SpentbookLog(log) => {
DataAddress::Spentbook(SpentbookAddress::new(*log.address.name()))
}
Self::SpentbookWrite(cmd) => {
DataAddress::Spentbook(SpentbookAddress::new(*cmd.dst_address().name()))
}
}
}
pub fn size(&self) -> u64 {
let length = match self {
Self::Chunk(chunk) => chunk.payload_size(),
Self::RegisterWrite(_) | Self::SpentbookWrite(_) => REGISTER_CMD_SIZE,
Self::RegisterLog(log) | Self::SpentbookLog(log) => {
REGISTER_CMD_SIZE * log.op_log.len()
}
};
length as u64
}
pub fn error_response(&self, error: DataError) -> Result<CmdResponse> {
match self {
Self::Chunk(_) => Ok(CmdResponse::StoreChunk(Err(error))),
Self::RegisterWrite(RegisterCmd::Create { .. }) => {
Ok(CmdResponse::CreateRegister(Err(error)))
}
Self::RegisterWrite(RegisterCmd::Edit { .. }) => {
Ok(CmdResponse::EditRegister(Err(error)))
}
Self::SpentbookWrite(_) => Ok(CmdResponse::SpendKey(Err(error))),
Self::SpentbookLog(_) => Err(Error::NoCmdResponseForTheVariant), Self::RegisterLog(_) => Err(Error::NoCmdResponseForTheVariant), }
}
}