binary_number_with_real_selector.rs 介绍
主要功能:用多个列(列的值取0和1)来表示某一类型变量的值(在State Circuit、Copy Circuit等子电路中主要表示Tag类型)
内容
列的定义
#[derive(Clone, Copy, Debug)]
pub struct BinaryNumberConfig<T, const N: usize> {
/// Must be constrained to be binary for correctness.
pub bits: [Column<Advice>; N],
_marker: PhantomData<T>,
}
pub struct BinaryNumberChip<F, T, const N: usize> {
config: BinaryNumberConfig<T, N>,
_marker: PhantomData<F>,
}
定义了N个Advice列,其中N是表示T.into()(T是所表示的类型)所需的比特数
外界使用的是BinaryNumberChip,成员变量和BinaryNumberConfig没有什么不同,只是为了层次关系更好。
所建立的约束
BinaryNumberChip含有以下几个约束(写于其configure()方法):
- "bit column is 0 or 1":每一个格子的值只能为0或1
- "binary number value”:
configure()函数包含一个参数value: Option<Column<Advice>>(可以理解为一个用于参考的列),如果value非空,这个约束使得每一行表示的值与value列的对应行相等 - "binary number value in range":所表示的值没有超出
T.into()的范围
以上约束在
selector为1时生效,其中selector也是configure()方法的参数
赋值过程
写于BinaryNumberChip()的assign()方法:
对于输入的T类型变量value,调用其as_bits()方法生成其二进制表示(由0、1构成的列表),依次把列表的各个元素填入相应的列
其他
BinaryNumberConfig还实现了一些有用的方法:
-
value():返回指定的rotation处,BinaryNumberConfig表示的类型的Expression -
value_equals():在指定的rotation处,比较某个T类型的值是否与BinaryNumberConfig所表示的值相等;若相等,则返回1.expr(),否则返回0.expr() -
value_equals_expr():比较某个T类型的值是否与一个长度为N的Expression列表(每个元素只能为0.expr()或1.expr())表示的值相等;若相等,则返回1.expr(),否则返回0.expr()
用法
以Scroll的copy_circuit.rs为例:
tag定义为BinaryNumberConfig<CopyDataType, 3>;
使用value_equals()方法判断tag是否是某一类型,生成建立约束所需的condition表达式
使用value()方法得到某个rotation处的tag对应的表达式

