# binary_number_with_real_selector.rs 介绍 主要功能:用多个列(列的值取0和1)来表示某一类型变量的值(在`State Circuit`、`Copy Circuit`等子电路中主要表示`Tag`类型) ## 内容 #### 列的定义 ```rust #[derive(Clone, Copy, Debug)] pub struct BinaryNumberConfig { /// Must be constrained to be binary for correctness. pub bits: [Column; N], _marker: PhantomData, } pub struct BinaryNumberChip { config: BinaryNumberConfig, _marker: PhantomData, } ``` 定义了`N`个`Advice`列,其中`N`是表示`T.into()`(`T`是所表示的类型)所需的比特数 外界使用的是`BinaryNumberChip`,成员变量和`BinaryNumberConfig`没有什么不同,只是为了层次关系更好。 #### 所建立的约束 `BinaryNumberChip`含有以下几个约束(写于其`configure()`方法): * "bit column is 0 or 1":每一个格子的值只能为0或1 * "binary number value”:`configure()`函数包含一个参数` value: Option>`(可以理解为一个用于参考的列),如果`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`; ![image-20231109143852776](../image/binary_number-1.png) 使用`value_equals()`方法判断`tag`是否是某一类型,生成建立约束所需的`condition`表达式 ![image-20231109144057941](../image/binary_number-2.png) 使用`value()`方法得到某个`rotation`处的`tag`对应的表达式