ฉันกำลังพยายามตรวจสอบ zk-SNARK จากสัญญาที่มั่นคงแบบออฟไลน์ใน Rust
นี่คือสัญญาการตรวจสอบที่ตรวจสอบหลักฐานใน ด้านความมั่นคง.
และ นี้ เป็นธุรกรรมที่มีหลักฐานและอินพุตสาธารณะ
หลักฐานถูกต้องและฉันสามารถทำซ้ำการตรวจสอบแบบออฟไลน์ได้โดยใช้ Solidity
อย่างไรก็ตามใน Rust ฉันไม่สามารถเข้าถึงพรีคอมไพล์ Solidity ที่ตรวจสอบการจับคู่ BN254 ได้ ดังนั้นฉันจึงใช้งานนี้ตาม arkworks/curve crate:
ผับ fn check_pairings (g1s: Vec<G1Affine>, g2s: Vec<G2Affine>) -> บูล {
assert_eq!(g1s.len(), g2s.len());
ให้ mut res = Fp12::one();
สำหรับ (g1, g2) ใน g1s.iter().zip(g2s.iter()) {
ถ้า g1.is_zero() || g2.is_zero() {
ดำเนินต่อ;
}
res = res * Bn254::จับคู่(*g1, *g2);
}
res.is_one()
}
รหัสจะขึ้นอยู่กับ การใช้งาน Ethereum BN526 และโปรดทราบว่า:
อินพุต (เวกเตอร์ของจุด G1 และ G2) เทียบเท่ากับการนำความแข็งแกร่งไปใช้ ดังนั้นฉันจึงมั่นใจได้ว่าการรวมกันของอินพุต การโหลดหลักฐาน ฯลฯ ถูกต้อง
โดยพื้นฐานแล้วเป็นอัลกอริทึมที่อธิบายไว้ในต้นฉบับ Groth16 กระดาษ หน้า 18 ส่วนประกอบของจุดถูกทำให้เป็นโมฆะเพื่อให้คำศัพท์ทั้งหมดอยู่ในด้านเดียวกันของสมการ
เป็นเส้นโค้งเดียวกันในการใช้งานทั้งสองแบบ
ฉันพลาดอะไรไปรึเปล่า? มีขั้นตอนปฏิบัติเพิ่มเติมเมื่อตรวจสอบ zk-SNARK หรือไม่ จำเป็นต้องมีการปรับค่าให้เป็นมาตรฐานหรือไม่?