# Proposal to modify chiquito step definition ## Current state Currently a step is defined the following way: ```rust= ctx.step_type_def(step1, |ctx| { // define internal signals let c = ctx.internal("c") // ... // define internal constraints ctx.constr(eq(a + b, c)); // ... // define transition constraints ctx.transition(eq(b, a.next())); // ... // witness generation or assignation ctx.wg(move |ctx, (a_value, b_value)| { ctx.assign(a, a_value.field()); // ... }); }); ``` Note that in this example "a" and "b" are forward signals declared outside the step type. ## Problem We have observed that new developers have problems differentiation the assignation from the setup in Chiquito, and some times try to use the setup expressions for the assignation. ## Proposed solution We would make setup inside a new lambda, that is at the same level of witness assignation, so it is clear due to scope that one cannot access the constraints from the assignation. Also, perhaps, rename "wg" to assign, that is more clear. Example: ```rust= ctx.step_type_def(step1, |ctx| { // define internal signals let c = ctx.internal("c") // ... ctx.setup(move |ctx| { // define internal constraints ctx.constr(eq(a + b, c)); // ... // define transition constraints ctx.transition(eq(b, a.next())); // ... }); // witness generation or assignation ctx.assign(move |ctx, (a_value, b_value)| { ctx.assign(a, a_value.field()); // ... }); }); ``` ## Alternatives Perhaps there are better keywords than "setup" and "assign"? Perhaps it is better to separate the setup in internal and transition? Like here: ```rust= ctx.step_type_def(step1, |ctx| { // define internal signals let c = ctx.internal("c") // ... ctx.setup_internal(move |ctx| { // define internal constraints ctx.constr(eq(a + b, c)); // ... }); ctx.setup_transition(move |ctx| { // define transition constraints ctx.constr(eq(b, a.next())); // ... }); // witness generation or assignation ctx.assign(move |ctx, (a_value, b_value)| { ctx.assign(a, a_value.field()); // ... }); }); ```