
كود إثبات المفهوم لتجاوز إثبات ZK من جوجل في تحليل التشفير الكمومي
يحتوي هذا المستودع على موارد منشور مدونة Trail of Bits، الذي يوضح بالتفصيل كيف تغلبنا على إثبات جوجل ذي المعرفة الصفرية الذي يفيد بامتلاكهم دائرة كمومية عالية الكفاءة لتحليل شيفرات المنحنيات الإهليلجية. يتضمن إثباتنا المزوّر، وتعليمات التحقق، وكودًا لتوليد الدائرة الكمومية التي تستغل ثغرات في كود محاكي zkVM غير المُصحَّح.
الملف الثنائي الكامل للإثبات متاح هنا، وفيما يلي النتائج التي تقارن إثباتات جوجل بإثباتنا.
| نوع المورد | جوجل منخفض البوابات | جوجل منخفض الكيوبتات | إثباتنا |
|---|---|---|---|
| إجمالي العمليات | 17,000,000 | 17,000,000 | 8,300,000 |
| عدد الكيوبتات | 1,425 | 1,175 | 1,164 |
| عدد Toffoli | 2,100,000 | 2,700,000 | 0 |
فيما يلي ملخص الإثبات.
تجزئة SHA-256 للدائرة: 0x7efe1f62bb14a978322ab9ed41d670fc0fe0f211331032615c910df5a540e999
بايتات إثبات Groth16: 0x0e78f4db0000000000000000000000000000000000000000000000000000000000000000008cd56e10c2fe24795cff1e1d1f40d3a324528d315674da45d26afb376e8670000000000000000000000000000000000000000000000000000000000000000024ac7f8dd6b1de6279bcce54e8840d8eb20d522bf27dedd776046f6590f33add217db465201c63724e6b460641985543d2b79c3c54daeea688581676a786aafc1dba8604a361acdd9809e268b6d8bc73943a713bb0ed0d96221f73d26def6ea4041d05b077523d9351a48b2ecd984c686b6473df69d20a24296d0a1cba3cdbe92eb13a7cc0ecd92f27f7bf23f9ac859d4293e17216dcbd85d1c7f60a52f65a9d02faef077336acd39e845d534200b575b029d6e3f0afb4f90815557233eab70b0fe88919834dd9beb90d47241f1490dc202e0dce44e4894982b07073c8d4426513732d79e9af9913b254aa29471e1a98fa1b43a1886afb5dbd36988153217aa2
مفتاح التحقق: 0x00ca4af6cb15dbd83ec3eaab3a0664023828d90a98e650d2d340712f5f3eb0d4
وفّرت جوجل نصوصًا برمجية للتحقق من إثباتاتها ذات المعرفة الصفرية في مجموعة بيانات Zenodo. يستهدف هجومنا الإصدار الأول، بينما يحتوي الإصدار الثاني على تصحيحات. توجد تعليمات تثبيت التبعيات في docs/getting_started.md. تتطلب بيئة التشغيل Rust وGo، واختياريًا Docker. تُقدَّم أوامر التحقق في نهاية ملف run_proofs.sh. توجد مصنوعات إثباتات جوجل في دليل proofs/، بينما توجد مصنوعات إثباتنا في proof_trailofbits.bin.
# Verify Google's proofs
cargo run --release -p verifier -- \
--vkey proofs/vkey.bin --proof proofs/low_toffoli/proof_9024.bin
cargo run --release -p verifier -- \
--vkey proofs/vkey.bin --proof proofs/low_qubits/proof_9024.bin
# Verify our proof
cargo run --release -p verifier -- \
--vkey proofs/vkey.bin --proof proof_trailofbits.bin
يتضمن مخرج الأمر الأخير ما يلي.
Successfully verified Groth16 SNARK proof.
Circuit hash commitment: 0x7efe1f62bb14a978322ab9ed41d670fc0fe0f211331032615c910df5a540e999
Demanded Number of tests: 9024
Demanded Qubit count: 1164
Demanded Average non-Clifford count: 0
Demanded Total ops: 8300000
تتحقق أوامر التحقق من الإثباتات ذات المعرفة الصفرية مقابل مفتاح التحقق، وهو تمثيل تشفيري موجز لبرنامج الضيف الخاص بـ zkVM. بدلاً من ذلك، يمكنك استخدام --elf proofs/zkp_ecc-program لتزويد أداة التحقق بالملف الثنائي ELF لبرنامج الضيف. وإذا حذفت هذه العلامة تمامًا، تستخدم أداة التحقق حاوية Docker لإعادة بناء الملف الثنائي لبرنامج الضيف من الكود المصدري الموجود في program/.
يؤدي تشغيل gen_secp256k1_tob.py إلى توليد سكربت kickmix بحجم 142MB باسم ec_secp256k1_add_into.kmx. وللوصول إلى إثبات 0-Toffoli، استخدم prove.rs.diff لترقيع prover/prove.rs في مستودع Zenodo. يعدّل ذلك كودًا غير موثوق يعمل خارج zkVM للتلاعب بتسلسل (serialization) دائرة kickmix.
توجد تعليمات توليد الإثبات في مستودع Zenodo. اتبعنا التعليمات الواردة في docs/sp1_cluster_deployment_guide.md على جهاز سحابي مزوّد بأربع وحدات NVIDIA H100 GPU، وقمنا بتشغيل الأمر التالي لتوليد الإثبات.
./run_proofs.sh --num-tests 9024 --kmx "ec_secp256k1_add_into.kmx" --qubit-counts 1164 --toffoli-counts 0 --total-ops 8300000 --proving-mode "multi-gpu" > proofs/ec_secp256k1_add/log_run.out 2>&1 &
استغرق توليد الإثبات المزوّر حوالي 4 ساعات.