Skip to main content

axiom_eth/rlc/
types.rs

1use halo2_base::{safe_types::VarLenBytesVec, utils::ScalarField, AssignedValue, Context};
2
3#[derive(Clone, Copy, Debug)]
4/// RLC of a vector of `F` values of variable length but known maximum length
5pub struct RlcTrace<F: ScalarField> {
6    pub rlc_val: AssignedValue<F>, // in SecondPhase
7    pub len: AssignedValue<F>,     // in FirstPhase
8    pub max_len: usize,
9    // We no longer store the input values as they should be exposed elsewhere
10    // pub values: Vec<AssignedValue<F>>,
11}
12
13impl<F: ScalarField> RlcTrace<F> {
14    pub fn new(rlc_val: AssignedValue<F>, len: AssignedValue<F>, max_len: usize) -> Self {
15        Self { rlc_val, len, max_len }
16    }
17
18    pub fn from_fixed(ctx: &mut Context<F>, trace: RlcFixedTrace<F>) -> Self {
19        let len = ctx.load_constant(F::from(trace.len as u64));
20        Self { rlc_val: trace.rlc_val, len, max_len: trace.len }
21    }
22}
23
24#[derive(Clone, Copy, Debug)]
25/// RLC of a trace of known fixed length
26pub struct RlcFixedTrace<F: ScalarField> {
27    pub rlc_val: AssignedValue<F>, // SecondPhase
28    // pub values: Vec<AssignedValue<'v, F>>, // FirstPhase
29    pub len: usize,
30}
31
32// to deal with selecting / comparing RLC of variable length strings
33
34#[derive(Clone, Copy, Debug)]
35pub struct RlcVar<F: ScalarField> {
36    pub rlc_val: AssignedValue<F>,
37    pub len: AssignedValue<F>,
38}
39
40impl<F: ScalarField> From<RlcTrace<F>> for RlcVar<F> {
41    fn from(trace: RlcTrace<F>) -> Self {
42        RlcVar { rlc_val: trace.rlc_val, len: trace.len }
43    }
44}
45
46#[derive(Clone, Copy, Debug)]
47pub struct RlcVarPtr<'a, F: ScalarField> {
48    pub rlc_val: &'a AssignedValue<F>,
49    pub len: &'a AssignedValue<F>,
50}
51
52impl<'a, F: ScalarField> From<&'a RlcTrace<F>> for RlcVarPtr<'a, F> {
53    fn from(trace: &'a RlcTrace<F>) -> Self {
54        RlcVarPtr { rlc_val: &trace.rlc_val, len: &trace.len }
55    }
56}
57
58impl<'a, F: ScalarField> From<&'a RlcVar<F>> for RlcVarPtr<'a, F> {
59    fn from(trace: &'a RlcVar<F>) -> RlcVarPtr<'a, F> {
60        RlcVarPtr { rlc_val: &trace.rlc_val, len: &trace.len }
61    }
62}
63
64/// Length of `values` known at compile time.
65/// Represents a variable length array with length given by `len`.
66///
67/// Construction of this struct assumes you have checked `len < values.len()`.
68#[derive(Clone, Debug)]
69pub struct AssignedVarLenVec<F: ScalarField> {
70    pub values: Vec<AssignedValue<F>>,
71    pub len: AssignedValue<F>,
72}
73
74impl<F: ScalarField> AssignedVarLenVec<F> {
75    pub fn max_len(&self) -> usize {
76        self.values.len()
77    }
78}
79
80impl<F: ScalarField> From<VarLenBytesVec<F>> for AssignedVarLenVec<F> {
81    fn from(array: VarLenBytesVec<F>) -> Self {
82        let values = array.bytes().iter().map(|b| *b.as_ref()).collect();
83        let len = *array.len();
84        Self { values, len }
85    }
86}
87
88#[derive(Clone, Debug)]
89pub struct ConcatVarFixedArrayWitness<F: ScalarField> {
90    pub prefix: AssignedVarLenVec<F>,
91    pub suffix: Vec<AssignedValue<F>>,
92    pub concat: AssignedVarLenVec<F>,
93}
94
95/// Rlc traces of the rlc concatenation used to constrain the concatenation
96/// of variable length `prefix` and fixed length `suffix` arrays.
97#[derive(Debug, Clone)]
98pub struct ConcatVarFixedArrayTrace<F: ScalarField> {
99    pub prefix_rlc: RlcTrace<F>,
100    pub suffix_rlc: RlcFixedTrace<F>,
101    pub concat_rlc: RlcTrace<F>,
102}