断言

assert(bool_expression)

该声明介绍了要检查的条件。在这里,我们根据bool_expression在编译时是否未知来区分两种情况:

  • 如果断言语句依赖于仅具有已知条件的控制流(请参阅Unknowns)并且bool_expression已知(例如,如果它仅依赖于模板参数或字段常量的值),则在编译时评估断言。如果评估结果为 false,则编译失败。考虑下一段代码:
#![allow(unused)]
fn main() {
template A(n) {
  signal input in;
  assert(n>0);
  in * in === n;
}

component main = A(0);

}

这里,可以在编译期间评估断言,并且评估结果为假。因此,编译结束时会抛出错误error[T3001]: False assertreach。如果主要组件被定义为component main = A(2),则编译正确完成。

  • 否则,编译器会在最终见证生成代码中添加一个断言,该断言必须在见证生成期间得到满足。在下面的示例中,如果in作为参数传递的用于生成见证的输入不满足断言,则不会生成见证。
#![allow(unused)]
fn main() {
template Translate(n) {
  signal input in;  
  assert(in<=254);
  . . .
}
}

试想,当使用 === 引入类似 in * in === n; 这样的约束时,在见证生成代码中会自动添加一个 assert。在这种情况下类似于,assert(in * in == n)。