
يُعد إثبات المعرفة الصفرية (ZKP) أداة تشفير قوية يمكنها التحقق من صحة الحسابات مع حماية خصوصية بيانات الإدخال. باعتبارها جزءًا لا يتجزأ من هذه البنية التحتية الحيوية، تلعب اللغات الخاصة بالمجال (DSL) دورًا حيويًا، حيث تعمل على تبسيط عملية التطوير والتحقق من دوائر ZKP. إنها تلعب دورًا مهمًا في ربط المفاهيم المجردة بتمثيلات الدوائر الدقيقة المطلوبة لإثبات النظام، وتعمل كجسر مهم بين الاثنين.
أحد التحديات الرئيسية في إثبات الأنظمة هو ترجمة المفاهيم المجردة عالية المستوى إلى دوائر فعلية. ومع ذلك، فإن ظهور DSL يعالج هذا التحدي من خلال تسهيل التعبير المنظم عن هذه المفاهيم المجردة بطريقة أكثر واقعية وقابلة للتحقيق.
خلال العقد الماضي، شهدنا نموًا ملحوظًا على مستوى العدد والتنوع في DSLs. ويظهر هذا الحراك في تطور لغات دوائر متعددة، بما فيها Noir وLeo وZinc وغيرها. سواء كنت بحاجة إلى خيارات عامة مثل Circom، أو إلى حلول مُخصّصة لمنصات بعينها مثل Cairo، يمكنك اختيار واحدة من بين العديد من اللغات والأطر لكتابة دوائر ZKP.
في هذا المقال، سنستعرض أهم لغات برمجة ZK التي يستخدمها المطورون بنشاط، مع تحليل أفضل سمات كل لغة.
TLDR;

Cairo بواسطة StarkWare
تُعد Cairo اللغة الأساسية للبرامج العامة القابلة للحساب والتي تدعم إثباتات STARK، وقد لعبت دورًا محوريًا في نجاح StarkNet وStarkEx، ودفعًا لقابلية التوسع للتطبيقات على شبكة Ethereum mainnet. ومن الجدير بالذكر أن Cairo ساهمت بشكل مهم في دعم مجموعة متنوعة من التطبيقات، بما في ذلك dYdX وSorare وImmutable X وغيرها. ويعود اسم "Cairo" إلى اختصار "CPU代数中间表示" (تمثيل وسيط لجبر CPU). وفي مجال إثباتات المعرفة الصفرية، تؤدي Cairo دورًا مشابهًا للغة التجميع (assembly)، ما يجعل من السهل على المطورين الملمين بـ C أو C++ أو Solidity وغيرها من لغات البرمجة منخفضة المستوى البدء باستخدامها.
بفضل إلهامه من Rust، يمنح Cairo المطورين القدرة على إنشاء عقود ذكية في Starknet مع التركيز على الأمان وسهولة الاستخدام للمستخدمين. لدى Cairo بناء قواعدي قوي (syntax) يُبسّط إنشاء دوائر ZK، ما يتيح للمستخدمين تنفيذ مهام متنوعة داخل برامج Cairo. إضافةً إلى ذلك، تتمثل إحدى ميزاته البارزة في قابلية التوسع (scalability)، والتي تسمح بإدخال ميزات ووظائف جديدة بشكل مرن.
في أنظمة ZK، تُعد الكفاءة وقابلية التوسع عوامل حاسمة. وتلبي Cairo هذه المتطلبات من خلال التشديد على الجانبين. تتضمن اللغة استراتيجيات تحسين، مثل تقليل القيود وإزالة الحلقات، لتخفيف عبء الحساب الذي ترتبط به عادة دوائر ZK. إن تحسين Cairo لتصميم الدوائر يؤدي إلى إنتاج إثباتات أسرع والتحقق منها بشكل أسرع، ما يجعلها خيارًا مثاليًا للتطبيقات التي تتطلب إنتاجًا عاليًا للحجم (throughput) وزمن تأخير (latency) منخفضًا للغاية.
إن توسع Cairo ملحوظ جدًا؛ إذ شهد عدد المطورين بدوام كامل قفزةً غير عادية خلال العامين الماضيين. وتُبرز هذه الزيادة قابلية Cairo للتكيّف، إذ لا يقتصر استخدام Cairo على سلاسل الكتل (blockchain) فحسب، بل إنه مهم أيضًا في أي سياق تتطلب فيه عمليات التحقق من الحساب. وبناءً على ذلك، نتوقع أن يشهد اعتماد المطورين لـ Cairo نموًا أكبر بشكل ملحوظ.
في 28 سبتمبر 2023، أطلقت Starknet ترقيةً مهمةً للغة برمجة Cairo بإصدارها v2.3.0. يمثّل هذا الإصدار قفزةً كبيرة نحو مزيد من الوحدات (modularity) في العقود، من خلال إدخال ميزات جديدة وخيارات تخزين وإدارة الأحداث، بما يعزز إمكانيات العقود الذكية. يوفّر دمج هذه المكونات طريقة مرنة لتوسيع وظائف العقود، بحيث يمكن لوحدات الطرف الثالث أن تعزز قابلية العقود وفاعليتها.
Zinc بواسطة ZkSync
Zinc هي لغة برمجة مُصممة خصيصًا لإنشاء عقود ذكية ودوائر SNARK على منصة zkSync. تعتمد صياغة (syntax) مستوحاة من Rust، وتدمج عناصر من Solidity، كما توفر ميزات فريدة.
تتميز Zinc بكونها سهلة الاستخدام. ليست هناك حاجة إلى الغوص في كل التفاصيل المعقدة لنظام القيود من الدرجة الأولى (R1CS) لكتابة كود آمن. يؤكد Zinc على قابلية عدم التغيّر (immutability)، ما يجعله فطريًا ذا طابع وظيفي (functional). وهذا يعني أنه يقدّم أولوية للبيانات غير القابلة للتغيير وتقييم الدوال، بما يقلل من الآثار الجانبية ويشجع على كتابة كود عقود ذكية أنظف وأقل عرضة للأخطاء.
بالإضافة إلى ذلك، يتضمن Zinc عمليات رياضية آمنة لمنع الانسكابات/التجاوزات المحتملة، بما يضمن أمان جميع العمليات. ورغم وجود بعض القيود، مثل عدم توفر الحلقات اللانهائية والتعاقب (الاستدعاء التكراري) العودي، يسهّل Zinc عملية التصحيح عبر سجلات (console logs). تُبسّط هذه التتبعات عملية تتبع وحل المعاملات أثناء اختبارات الشبكة أو على الشبكة الرئيسية، مما يحسن تجربة التصحيح بشكل كبير.
Noir بواسطة Aztec
Noir هي DSL مفتوحة المصدر طوّرتها Aztec، مبنية على Rust، وتهدف إلى تبسيط إنشاء دوائر ZK وبرامج ZK دون الحاجة إلى فهم عميق للعمليات التشفيرية. ويُنظر إليها على أنها واحدة من أسهل اللغات لبدء التعلم، ومناسبة لكتابة تطبيقات ZK متوافقة مع أي نظام إثبات. يركز Noir على الأمان والبساطة والأداء. فهي توفر بناء جُملي متقدمًا شبيهًا بـ Rust، وتقوم بتجريد الأمان التشفيري لتبسيط استخدام البدائيات الأساسية للتشفير مع الحفاظ على الأداء العالي.
يحظى Noir بميزة واضحة في توسيع نطاق التطبيقات التي يمكنها الاستفادة من قدرات الخصوصية التي توفرها ZKP، مما يعزز كفاءة الخصوصية والتحقق. يقوم Noir بترجمة دوائر إلى تمثيل وسيط يُسمّى Abstract Circuit Intermediate Representation (Acer)، ثم يمكن تحويله لاحقًا إلى R1CS. إن فصل نظام الإثبات الخلفي (backend) عن اللغة نفسها يمكّن Noir من دعم أنظمة إثبات متنوعة، بما في ذلك Aztec Brettenberg وTurbo Plonk، وكذلك تكاملات مستقبلية محتملة مثل Groth16 وHalo2.
توفر اللغة مكتبة قياسية تشمل وظائف فعالة مثل SHA-256 (دالة تجزئة تشفيرية تنتج مخرجات ثابتة الحجم) وPedersen-Merkle checks (تقنية تحقق تشفيرية تستخدم تعهدات Pedersen وشجرة Merkle لضمان سلامة البيانات). يشبه تصميم Noir تصميم Rust، بما في ذلك ميزات مألوفة لمطوري التطبيقات مثل الدوال والوحدات الفرعية (sub-modules) وأنواع معرفة من قبل المستخدم (هياكل/structures) والجمل الشرطية والحلقات والثوابت العامة. كما يواصل Noir العمل على تطوير generics والدوال من الدرجة الأولى (one first-class functions) لتعزيز قدرته التعبيرية بشكل أكبر.
من المهم ملاحظة أن Noir ما يزال قيد التحسين المستمر، وقد توجد بعض القيود والأخطاء المحتملة. ومع ذلك، يلتزم فريق التطوير بالتحسين المستمر والمواءمة (التنقيح) والتحسين.
o1js بواسطة 0(1) Labs
o1js، التي كانت تُعرف سابقًا باسم SnarkyJS، هي مكتبة TypeScript طوّرَتْها 0(1)Labs لاستخدام لغة برمجة SNARK لإنشاء عقود ذكية. وتستفيد إلى أقصى حد من التقنيات الراسخة مثل توافق Node.js والمتصفحات، لضمان سهولة وصول المطورين إلى المنصة واستخدامها.
يمكن لـ o1js التكامل بسلاسة مع مكتبات وأدوات JavaScript وTypeScript، ما يوفّر للمطورين نظامًا بيئيًا قويًا ودعمًا مجتمعيًا واسع النطاق. يبسّط هذا التكامل سير عملية التطوير، ويقلل منحنى التعلم المرتبط باعتماد بيئات تطوير جديدة. بالإضافة إلى ذلك، فهو يدعم Visual Studio Code (VS Code) بالكامل، وهو محرر شائع لكتابة الكود؛ ما يمكّن المطورين من الاستفادة الكاملة من الميزات مثل إكمال الكود وتظليل بناء الجملة والتصحيح (debug)، وبالتالي تحسين تجربة التطوير.
يُعد o1js في جوهره إطارًا متعدد الاستخدامات للـ ZK، يزوّدك بالأدوات الأساسية لإنشاء إثباتات zk. يدعم إنشاء برامج ZK متنوعة تغطي مجموعة من عمليات يمكن إثباتها مدمجة، بما في ذلك العمليات الحسابية الأساسية والهاش والتواقيع والعمليات المنطقية (bool) والمقارنات وغيرها. وبفضل إطار o1js، يمكنك بناء zkApps على بروتوكول Mina؛ وهي عقود ذكية تُنفَّذ على جهة العميل مع مدخلات خاصة (private inputs).
تجدر الإشارة إلى أنه في أوائل سبتمبر 2023، أعلنت مجموعة 0(1)Labs انتقالها من SnarkyJS إلى o1js، مع التأكيد على التزامهم بتحسين الأداء. ومن الجدير بالذكر تحديدًا أنهم حققوا خفضًا بمقدار 3-4 أضعاف في وقت تحميل المكتبات؛ أي الوقت اللازم لاستيراد o1js، وهي عملية قد تعيق الخيط الرئيسي. وبالنسبة لتطبيقات الويب، يُعد وقت التحميل مهمًا جدًا لتوقيت تنفيذ JavaScript ولعملية عرض الصفحة كاملة. إضافةً إلى ذلك، قام الفريق بتحديث Mina zkApp CLI لتحسين تجربة بناء واجهة المستخدم، وأعلن عن المزيد من التحسينات لواجهة Archive Node API بهدف تعزيز موثوقيتها ووضوحها.
Leo بواسطة Aleo
يمتاز نظام Aleo blockchain في مجال العقود الذكية بتفرده، مع التركيز على حماية الخصوصية. جوهره هو لغة برمجة Leo، وهي لغة ذات أنماط ثابتة (static typing) مستوحاة من Rust. صُممت Leo خصيصًا لتطوير تطبيقات خاصة، لتدعم المبدعين الذين يرغبون في بناء نظام لامركزي آمن ومُحافظ على السرية. أما ما يجعل Leo فريدة حقًا، فهو دورها الرائد في تقديم مجموعة أدوات شاملة للتطبيقات العامة للمعرفة الصفرية (zero-knowledge). تتضمن هذه المجموعة أطر اختبار وإدراج/سجل حزم ومحلل استيراد (import parser) ومُصرّفًا عن بُعد (remote compiler) ومولّدًا للأدلة/الحدود (theorem generator).
تنبُّرَت فكرة ليو من قبل فريق تطوير تقوده هوارد وو؛ إذ تخيّلوا نظامًا يمكنه تمكين المطوّرين من بناء تطبيقات لامركزية تُعطي الأولوية للخصوصية والأمان. يستلهم تصميم ليو مبادئ لغة Rust، مع دمج بعض عناصر شبيهة بـ JavaScript لتعزيز الإحساس بالأنس والسهولة أثناء التطوير. علاوة على ذلك، يهدف ليو إلى تسريع عملية التطوير عبر توفير منصة اختبار مدمجة وسجل حزم ومحوّل استيراد (import converter)، بما يُبسّط سير العمل. يتيح هذا التكامل للمطوّرين التركيز على منطق التطبيقات الأساسي دون أن تعيقهم مشكلات البنية التحتية.
من أبرز ميزات Leo وجود مُصرِّف (compiler) خاص به يقوم بتحويل البرامج إلى صيغة إثبات R1CS منخفضة المستوى. يتميز مُصرِّف Leo بعملية التحقق الرسمية الصارمة التي يعتمدها. وهذا التحقق حاسم، لأن الثغرات قد تظهر في مراحل متعددة؛ من البرمجة الأولية إلى التدقيق ثم إلى عملية الترجمة (الترجمة/التجميع). من خلال إجراء فحوص رياضية صارمة لضمان توافق المُصرِّف مع نوايا المبرمج، يهدف Leo إلى تقليل مخاطر الأخطاء غير الملحوظة أو الثغرات المحتملة، خصوصًا في سياقات L2 أو ضمن ZK-rollups أو في البرامج الخاصة على منصة Leo.
Circom بواسطة iden3
Circom، وهو DSL مُصمَّم بعناية لتطوير دوائر ZK، هو نتاج تعاون بين Jordi Baylina وفريق iden3. كُتِب مُصرّف Circom بلغة Rust، ومهمته الأساسية هي ترجمة الدوائر المكتوبة باستخدام لغة Circom. ومن الجدير بالذكر أن Circom أصبح خيارًا مفضلًا في تطبيقات ZK الرائدة في العالم الحقيقي، مثل Dark Forest وTornado Cash. يعود السبب في شعبيته إلى أدائه المتميز، بما في ذلك أزمنة إثبات سريعة على المتصفح عبر إثباتات WASM مُحسّنة، وإثباتات خادمية فعّالة عبر rapidsnark، وتحقق فعّال على السلسلة.
ومع ذلك، من المهم إدراك أن وظائف Circom تركز أساسًا على تطوير دوائر ZK، ما قد يجعلها أقل ملاءمة للتعامل مع مهام حسابية أوسع نطاقًا. قد يرى المطورون الذين يبحثون عن المزيد من الميزات والقدرة على تلبية احتياجات تطوير أوسع أن إمكانيات Circom محدودة إلى حد ما. في هذه الحالة، قد يحتاج المطورون إلى دمج لغات برمجة أو أطر عمل أخرى لاستيفاء متطلبات التطوير الأوسع.
الصورة من Circom
يركّز توافق Circom أساسًا على أنظمة ZKP واسعة الاستخدام مثل snarkjs وlibsnark. ورغم أن هذا التوافق يضمن التكامل السلس مع تلك الأنظمة الشائعة، إلا أنه يعني أيضًا أن دوائر Circom ترث ميزات وحدودًا محددة مرتبطة بهذه التبعيات. قد يواجه المطورون الذين يفضّلون أو يحتاجون إلى أنظمة ZKP بديلة تحديات في التوافق، أو قد يحتاجون إلى بذل عمل إضافي لتكييف ودمج الدوائر المُنشأة بواسطة Circom داخل أنظمتهم المفضلة.
Lurk بواسطة Lurk Lab
Lurk هو لهجة Lisp ساكنة النطاق (static-scoped) متأثرة بـ Scheme وCommon Lisp، ويتميز بخصائص فريدة: فهو يتيح استخدام zk-SNARKs مباشرة لإثبات صحة تنفيذ البرنامج، وبالتالي تحقيق تحقق مُدمج وفعّال.
تتمثل الاستخدامات الرئيسية لـ Lurk في:
الحساب القابل للتحقق: يتيح Lurk لك إثبات صحة تعبيراته ضمن شروط المعرفة الصفرية، ما يعزز الثقة في نتائج الحساب.
المعرفة الصفرية: يمكن للمستخدمين إثبات المعرفة دون الكشف عن تفاصيل محددة، باستثناء المدخلات العامة، وبالتالي حماية الخصوصية.
عناوين المحتوى للبيانات (Content-addressed data): يأتي كل برنامج Lurk مع مُعرّف محتوى فريد (CID)، مما يجعله متوافقًا مع IPFS وIPLD.
تكافؤ آلة تورينغ (Turing completeness): يدعم Lurk إنشاء وإثبات أي ادعاء حسابي عشوائي.
الدوال عالية المستوى: يمكن لدوال Lurk استقبال وإرجاع دوال، ما يتيح برمجة وظيفية غنية بالتعبير.
الحسابات لمعالجة البيانات الخاصة: يجعل Lurk من الممكن التعامل مع البيانات الخاصة مع ضمان مخاطر/مخرجات صحيحة يمكن إثباتها دون كشف الخصوصية.
عند بناء الدوائر العامة، يستفيد Lurk بشكل كامل من مُوزِّع الذاكرة "cons" في Lisp. يقوم هذا المُوزِّع بضم/تجميع التعبيرات وتوليد مراجع عبر التجزئة (hash). النقطة الأساسية هي إثبات أن تعبيرين فعلاً يجزئان (hash) إلى المرجع نفسه. تتيح عملية التحقق هذه لـ Lurk تنفيذ الحساب داخل دوائر snark.
وظائف Lurk غنية للغاية، حيث يدعم الاستدعاء التكراري اللانهائي (infinite recursion) والحلقات والتحكم الشرطي في تدفق التنفيذ، بالإضافة إلى أنظمة إثبات خلفية متعددة مثل Groth16 وSnarkPack+ وNova. تفتح هذه المرونة مجالات واسعة لتطبيقات متنوعة، بما في ذلك التحقق من الحساب ومعالجة البيانات الخاصة وتنفيذ برامج مكافئة لآلة تورينغ (Turing-complete) داخل دوائر snark.
الخلاصة
مع تزايد تنوع تطبيقات ZK، تبدو آفاق تطور DSL في مجال ZK واعدة للغاية. يكمن مفتاح نجاح DSL في بناء مجتمع مزدهر ومكتبات غنية لتعزيز تجربة المطورين. يمكن لـ DSL التي تضع توافقها مع المكتبات الحالية في الأولوية أن تستفيد إلى أقصى حد من معرفة وموارد مجتمع المطورين الواسع. يساعد هذا النهج على تكامل أكثر سلاسة، وتسريع التطوير، وتوفير مرونة أكبر عند تنفيذ تطبيقات ZK. إن جهود التعاون هذه ضرورية لتنشئة نظام بيئي أكثر متانة حول DSL، وتوفر فوائد ملموسة للمطورين، وستدفع المزيد نحو اعتماد تقنيات ZK وفاعليتها.
