-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathcasino1.rs
More file actions
119 lines (99 loc) · 3.62 KB
/
Copy pathcasino1.rs
File metadata and controls
119 lines (99 loc) · 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
use halo2_proofs::{
circuit::{Layouter, SimpleFloorPlanner, Value},
halo2curves::bn256::Fr as Fp,
plonk::{Advice, Circuit, Column, ConstraintSystem, ErrorFront, Instance, Selector},
poly::Rotation,
};
#[derive(Debug, Default, Clone)]
pub struct CasinoCircuit {
pub deposits: Vec<Value<Fp>>,
}
#[derive(Clone, Debug)]
pub struct CasinoConfig {
deposits: Column<Advice>,
sum: Column<Advice>,
public: Column<Instance>,
selector_running_sum: Selector,
selector_first_row: Selector,
}
impl Circuit<Fp> for CasinoCircuit {
type Config = CasinoConfig;
type FloorPlanner = SimpleFloorPlanner;
fn without_witnesses(&self) -> Self {
Self::default()
}
fn configure(meta: &mut ConstraintSystem<Fp>) -> Self::Config {
let deposits = meta.advice_column();
let sum = meta.advice_column();
let public = meta.instance_column();
meta.enable_equality(deposits);
meta.enable_equality(sum);
meta.enable_equality(public);
let selector_running_sum = meta.selector();
let selector_first_row = meta.selector();
meta.create_gate("first row", |meta| {
let s = meta.query_selector(selector_first_row);
let deposit = meta.query_advice(deposits, Rotation::cur());
let sum = meta.query_advice(sum, Rotation::cur());
vec![s.clone() * deposit, s * sum]
});
meta.create_gate("running sum", |meta| {
let s = meta.query_selector(selector_running_sum);
let dcur = meta.query_advice(deposits, Rotation::cur());
let sumprev = meta.query_advice(sum, Rotation::prev());
let sumcur = meta.query_advice(sum, Rotation::cur());
vec![s * (sumprev + dcur - sumcur)]
});
CasinoConfig {
deposits,
sum,
public,
selector_running_sum,
selector_first_row,
}
}
fn synthesize(
&self,
config: Self::Config,
mut layouter: impl Layouter<Fp>,
) -> Result<(), ErrorFront> {
let out = layouter.assign_region(
|| "main region",
|mut region| {
// We enable the first row selector
// values should be 0 on the first row
config.selector_first_row.enable(&mut region, 0)?;
region.assign_advice(
|| "deposit0",
config.deposits,
0,
|| Value::known(Fp::zero()),
)?;
let mut total =
region.assign_advice(|| "sum0", config.sum, 0, || Value::known(Fp::zero()))?;
// then we loop over deposits, starting from row 1
let mut deposits = vec![];
let mut i = 1;
let mut sum = Value::known(Fp::zero());
for deposit in self.deposits.iter() {
// we enable the running sum selector
if i > 1 {
config.selector_running_sum.enable(&mut region, i)?;
}
deposits.push(region.assign_advice(
|| "deposit",
config.deposits,
i,
|| *deposit,
)?);
sum = sum + *deposit;
total = region.assign_advice(|| "sum", config.sum, i, || sum)?;
i += 1;
}
Ok(total)
},
)?;
layouter.constrain_instance(out.cell(), config.public, 0)?;
Ok(())
}
}