in air/src/proof/context.rs [114:167]
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
// read and validate trace width
let trace_width = source.read_u8()?;
if trace_width == 0 {
return Err(DeserializationError::InvalidValue(
"trace width must be greater than zero".to_string(),
));
}
if trace_width as usize >= TraceInfo::MAX_TRACE_WIDTH {
return Err(DeserializationError::InvalidValue(format!(
"Trace width cannot be greater than {}, but had {}",
TraceInfo::MAX_TRACE_WIDTH,
trace_width
)));
}
// read and validate trace length
let trace_length = source.read_u8()?;
if 2_usize.pow(trace_length as u32) < TraceInfo::MIN_TRACE_LENGTH {
return Err(DeserializationError::InvalidValue(format!(
"Trace length cannot be smaller than {}, but had {}",
TraceInfo::MIN_TRACE_LENGTH,
2_usize.pow(trace_length as u32)
)));
}
// read trace metadata
let num_meta_bytes = source.read_u16()? as usize;
let trace_meta = if num_meta_bytes != 0 {
source.read_u8_vec(num_meta_bytes)?
} else {
vec![]
};
// read and validate field modulus bytes
let num_modulus_bytes = source.read_u8()? as usize;
if num_modulus_bytes == 0 {
return Err(DeserializationError::InvalidValue(
"field modulus cannot be an empty value".to_string(),
));
}
let field_modulus_bytes = source.read_u8_vec(num_modulus_bytes)?;
// read options
let options = ProofOptions::read_from(source)?;
Ok(Context {
trace_width,
trace_length,
trace_meta,
field_modulus_bytes,
options,
})
}