数据类型


文档摘要

数据类型 Circom 中的基本变量类型有: 域元素值:模素数 p 的整数值(见 信号)。这是所有信号和基本变量的默认类型。 数组:它们可以包含相同类型(信号、var 或相同类型的组件或数组)的有限数量元素(在编译时已知)。元素从零开始编号,可以使用其位置的相应索引进行访问。数组访问使用方括号。声明给定类型的数组通过在变量标识符旁边添加 \[\] 并在括号之间包含大小(应使用常量值和/或模板的数字参数定义)来实现。 访问和声明应与其类型一致,因此我们用 m\[i\]\[j\] 进行访问和声明,因为 m\[i\] 是一个数组。以下是带有和不带有初始化的声明示例: 不允许使用 m\[i,j\] 表示数组的数组(矩阵)。

数据类型

Circom 中的基本变量类型有:

  • 域元素值:模素数 p 的整数值(见 信号)。这是所有信号和基本变量的默认类型。
  • 数组:它们可以包含相同类型(信号、var 或相同类型的组件或数组)的有限数量元素(在编译时已知)。元素从零开始编号,可以使用其位置的相应索引进行访问。数组访问使用方括号。声明给定类型的数组通过在变量标识符旁边添加 [] 并在括号之间包含大小(应使用常量值和/或模板的数字参数定义)来实现。

访问和声明应与其类型一致,因此我们用 m[i][j] 进行访问和声明,因为 m[i] 是一个数组。以下是带有和不带有初始化的声明示例:

var x[3] = [2,8,4]; var z[n+1]; // 其中 n 是模板的参数 var dbl[16][2] = base; var y[5] = someFunction(n);

不允许使用 m[i,j] 表示数组的数组(矩阵)。

另一方面,以下情况将产生编译错误,因为数组的大小应显式给出:

var z = [2,8,4];

最后,信号的类型需要声明,因为它们不能全局分配为数组。它们按位置分配。

signal input in[3]; signal output out[2]; signal intermediate[4];

组件数组必须使用相同的模板实例化(可以选择不同的参数)。

pragma circom 2.0.0; template fun(N){ signal output out; out <== N; } template all(N){ component c[N]; for(var i = 0; i < N; i++){ c[i] = fun(i); } } component main = all(5);

因此,以下代码将产生编译错误:"c[i] = fun(i) -> Assignee and assigned types do not match"。

pragma circom 2.0.0; template fun(N){ signal output out; out <== N; } template fun2(N){ signal output out; out <== N; } template all(N){ component c[N]; for(var i = 0; i < N; i++){ if(i < N) c[i] = fun(i); else c[i] = fun2(i); } } component main = all(5);

发布者: 作者: 转发
评论区 (0)
U