使用Circom编译NAND复合电路时遇多类错误求助
问题分析与解决办法
1. 版本指定方式错误(include指令参数未识别)
Circom 2.0要求pragma circom必须是文件的第一行语句,不能放在include之后。你的代码先写include再写pragma,导致编译器无法正确识别版本声明,进而引发后续解析混乱。
正确的代码开头顺序:
pragma circom 2.0.0; include "Nand.circom";
2. 缺失分号/非法表达式误报
这两个错误都是版本声明位置错误引发的连锁问题。编译器因为没正确识别Circom 2.0语法,会用旧版本规则解析代码,导致对正确的signal语法误判。修正pragma的位置后,这两个错误会自动消失。
额外代码问题(避免后续编译失败)
你的代码还有两处需要修正:
signal s4未被赋值或约束:Circom要求所有signal必须有明确的约束关系,比如可以添加s4 === s3;将其关联到输入s3。- 模板名称大小写:Circom对大小写敏感,若
Nand.circom中定义的模板是template Nand(),则代码里的NAND()要改为Nand()。
修正后的完整代码示例:
pragma circom 2.0.0; include "Nand.circom"; template Composite(){ signal private s1; signal input s2; signal input s3; signal output s5; signal s4; // 给s4添加约束关联到输入s3 s4 === s3; component G1 = Nand(); component G2 = Nand(); s1 ==> G1.a; s2 ==> G1.b; G1.out ==> G2.a; s4 ==> G2.b; G2.out ==> s5; } component main = Composite();
重新编译验证
执行你的编译命令即可正常编译:
circom composite.circom --r1cs --wasm --sym --c
内容的提问来源于stack exchange,提问作者Venkata Surya Sundar Vadali
相关产品推荐
相关产品推荐

