توفر المكتبة 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()?;
إنه ينفذ عملية تقليل واحدة فقط وهو أسرع مرتين تقريبًا من التنفيذ الأول.
تستخدم المكتبة الفكرة القياسية المتمثلة في استخدام أطراف متعددة لتمثيل عنصر من عناصر الحقل المستهدف. على سبيل المثال، قد يتم تمثيل عنصر في 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: إطار عمل لحساب فعال يمكن التحقق منه،" في وقائع الندوة التاسعة والثلاثين حول الأمن والخصوصية ، سر. ستاندرد آند بورز '18، 2018، الصفحات من 944 إلى 961.
[OWWB20]: أ. أوزديمير، ر. س. وهبي، ب. وايتهات، و د. بونيه. "قياس الحسابات التي يمكن التحقق منها باستخدام مجموعة مراكم فعالة،" في وقائع ندوة USENIX الأمنية التاسعة والعشرين ، سر. الأمن '20، 2020.