zkevm-circuits
zkevm-circuits copied to clipboard
LtChip is missing byte range checks
The LtChip defined in gadgets/src/less_than.rs uses this constrain:
lhs - rhs = diff - lt * 2.pow(8*N)
where diff = from_bytes(diff_bytes) and diff_bytes: [Column<Advice>; N],
This constrain is only useful if diff is constrained to be between 0 and 2^{8*N}. This can be achieved by constraining each element in diff_bytes to be between 0 and 2^8. Nevertheless this is not constrained. There's a note in the struct field documentation saying this:
https://github.com/privacy-scaling-explorations/zkevm-circuits/blob/4cfccfa6c3b251284ff61eeb907d548d59206753/gadgets/src/less_than.rs#L33-L35
But I believe this is quite dangerous, because it's very easy to forget!
I've searched for usages of LtChip and I found it's used only in the CopyCircuit: https://github.com/privacy-scaling-explorations/zkevm-circuits/blob/4cfccfa6c3b251284ff61eeb907d548d59206753/zkevm-circuits/src/copy_circuit.rs#L69
And I didn't see any byte range constraint on the elements in addr_lt_addr_end.diff, which is a bug.
I think we must avoid leaving gadgets with missing constraints and expecting the chip that uses the gadgets to add them (unless we had a way to automatically check that we didn't miss these constraints)