fn read_from()

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,
        })
    }