ไลบรารี nonnative
มีข้อจำกัด R1CS สำหรับการตรวจสอบการคำนวณในฟิลด์ที่ไม่ใช่เจ้าของภาษาในระบบพิสูจน์อักษร
ไลบรารีนี้อิงตามเฟรมเวิร์กการเขียนข้อจำกัด arkworks-rs และเผยแพร่ภายใต้ใบอนุญาต MIT และใบอนุญาต Apache v2 (ดูใบอนุญาต)
คำเตือน: นี่คือต้นแบบการพิสูจน์แนวคิดทางวิชาการ โดยเฉพาะอย่างยิ่ง ยังไม่ได้รับการตรวจสอบโค้ดอย่างรอบคอบ การใช้งานนี้ไม่พร้อมสำหรับการใช้งานจริง
ไลบรารีนี้ใช้อุปกรณ์ฟิลด์สำหรับไพรม์ฟิลด์ Fp
เหนือไพรม์ฟิลด์ Fq
อีกอัน โดยที่ p != q
เมื่อเขียนระบบข้อจำกัดสำหรับการพิสูจน์การเข้ารหัสจำนวนมาก เราถูกจำกัดให้ใช้ฟิลด์ดั้งเดิม (เช่น ฟิลด์สเกลาร์ของเส้นโค้งที่จับคู่ได้ง่าย) สิ่งนี้อาจไม่สะดวก ตัวอย่างเช่น องค์ประกอบแบบเรียกซ้ำของการพิสูจน์ผ่านวงจรของเส้นโค้งต้องการให้ผู้ตรวจสอบคำนวณผ่านสนามที่ไม่ใช่เจ้าของภาษา
ห้องสมุดทำให้สามารถเขียนการคำนวณบนฟิลด์ที่ไม่ใช่เจ้าของภาษาได้ในลักษณะเดียวกับที่เราเขียนการคำนวณบนฟิลด์ดั้งเดิม สิ่งนี้ทำให้เกิดค่าใช้จ่ายเพิ่มเติม ซึ่งเราลดให้เหลือน้อยที่สุดโดยใช้การเพิ่มประสิทธิภาพที่หลากหลาย
เนื่องจากฟิลด์ที่ไม่ใช่เนทิฟใช้คุณลักษณะ FieldVar
ใน arkworks เราจึงสามารถปฏิบัติต่อมันได้เหมือนกับตัวแปรฟิลด์เนทิฟ ( FpVar
)
เราสามารถดำเนินการฟิลด์มาตรฐานได้ เช่น +
, -
และ *
ดูตัวอย่างต่อไปนี้:
let a = NonNativeFieldVar :: < Fr , Fq > :: new_witness ( ns ! ( cs, "a" ) , || Ok ( a_value ) ) ? ;
let b = NonNativeFieldVar :: < Fr , Fq > :: new_witness ( ns ! ( cs, "b" ) , || Ok ( b_value ) ) ? ;
// add
let a_plus_b = & a + & b ;
// sub
let a_minus_b = & a - & b ;
// multiply
let a_times_b = & a * $b ;
// enforce equality
a . enforce_equal ( & b ) ? ;
หลังจากการคูณแต่ละครั้ง ไลบรารีของเราจะดำเนินการ ลด ภายใน ซึ่งจะลดประเภทสื่อกลาง NonNativeFieldMulResultVar
ให้เป็นประเภทปกติ NonNativeFieldVar
ช่วยให้ผู้ใช้สามารถดำเนินการตามลำดับขั้นตอนได้อย่างราบรื่นโดยไม่ต้องกังวลเกี่ยวกับรายละเอียดที่ซ่อนอยู่
อย่างไรก็ตาม การดำเนินการนี้มีราคาแพงและบางครั้งสามารถหลีกเลี่ยงได้ เราสามารถลดจำนวนข้อจำกัดได้โดยใช้ประเภทกลางนี้ ซึ่งรองรับเฉพาะส่วนเพิ่มเติมเท่านั้น หากต้องการคูณ จะต้องลดขนาดกลับเป็น NonNativeFieldVar
ดูตัวอย่างโครงกระดูกด้านล่าง
ในการคำนวณ a * b + c * d
การใช้งานที่ตรงไปตรงมา (แต่แพงกว่า) จะเป็นดังนี้:
let a_times_b = &a * &b;
let c_times_d = &c * &d;
let res = &a_times_b + &c_times_d;
การดำเนินการนี้ดำเนิน การลดทั้งหมด สองครั้ง โดยดำเนินการหนึ่งครั้งสำหรับการคูณแต่ละครั้ง
เราสามารถบันทึกการลดได้หนึ่งครั้งโดยใช้ NonNativeFieldMulResultGadget
ดังนี้:
let a_times_b = a.mul_without_reduce(&b)?;
let c_times_d = c.mul_without_reduce(&d)?;
let res = (&a_times_b + &c_times_d)?.reduce()?;
โดยดำเนินการ ลด การดำเนินการเพียงครั้งเดียวและเร็วกว่าการใช้งานครั้งแรกประมาณ 2 เท่า
ห้องสมุดใช้แนวคิดมาตรฐานในการใช้ แขนขา หลายแขนเพื่อแสดงองค์ประกอบของฟิลด์เป้าหมาย ตัวอย่างเช่น องค์ประกอบใน TargetField อาจแสดงด้วยองค์ประกอบ BaseField สามองค์ประกอบ (เช่น แขนขา)
TargetField -> limb 1, limb 2, and limb 3 (each is a BaseField element)
หลังจากคำนวณแล้ว แขนขาจะหนักเกินไปและจำเป็นต้อง ลดลง เพื่อที่จะมีส่วนร่วมในการคำนวณมากขึ้น
เราใช้เทคนิคการปรับให้เหมาะสมอย่างเต็มที่ใน [KPS18] และ [OWWB20] ผลงานทั้งสองมีไลบรารีโอเพ่นซอร์สของตัวเอง: xJsnark และ bellman-bignat เมื่อเปรียบเทียบกับห้องสมุดเหล่านี้ ห้องสมุดนี้จะทำงานร่วมกับสภาพแวดล้อมของ arkworks และยังได้รับการปรับให้เหมาะสมสำหรับความหนาแน่นแทนจำนวนข้อจำกัด ซึ่งมีประโยชน์สำหรับการพิสูจน์ความรู้เป็นศูนย์แบบโฮโลแกรมเช่น Marlin
ห้องสมุดได้รับอนุญาตภายใต้ใบอนุญาตอย่างใดอย่างหนึ่งต่อไปนี้ ขึ้นอยู่กับดุลยพินิจของคุณ
เว้นแต่คุณจะระบุไว้เป็นอย่างอื่นอย่างชัดเจน การสนับสนุนใดๆ ที่ส่งเพื่อรวมไว้ในไลบรารีนี้โดยคุณจะต้องได้รับใบอนุญาตแบบคู่ตามข้างต้น (ตามที่กำหนดไว้ในใบอนุญาต Apache v2) โดยไม่มีข้อกำหนดหรือเงื่อนไขเพิ่มเติมใดๆ
[KPS18]: เออี คอสบา, ซี. ปาปามันโธ และ อี. ชิ "xJsnark: กรอบการทำงานสำหรับการคำนวณที่มีประสิทธิภาพที่ตรวจสอบได้" ใน การประชุมสัมมนาเรื่องความปลอดภัยและความเป็นส่วนตัวครั้งที่ 39 เอสแอนด์พี '18, 2018, หน้า 944–961.
[OWWB20]: เอ. ออซเดเมียร์, อาร์เอส วาห์บี้, บี. ไวท์แฮท และดี. โบเนห์ "การปรับขนาดการคำนวณที่ตรวจสอบได้โดยใช้ชุดสะสมที่มีประสิทธิภาพ" ใน การประชุมสัมมนา USENIX Security Symposium ครั้งที่ 29 ความปลอดภัย '20, 2020.