
السلسلة: Zcash from First Principles . المقال 3 . التجزئة والالتزامات الجمهور: القادمون الجدد. نبني على المقال 1 (الحقول المنتهية) والمقال 2 (المنحنيات الإهليلجية)، لكن الفكرة الحدسية قائمة بذاتها. ما ستخرج به: فهم واضح لدوال التجزئة، وما الذي يعنيه حقًا كل من "الإخفاء" و"الإلزام"، وكيف يبني Zcash التزامات الملاحظات التي ترتكز عليها كل دفعة خاصة.
في المقال 0 وصفنا "ظرفًا سحريًا مختومًا": شيئًا يمكنك تثبيته على لوحة عامة بحيث يثبت وجود ظرف مع إخفاء ما بداخله، ومن دون أن تتمكن لاحقًا من استبداله. وقد وعدنا بأن نشرح كيف يمكن لشيء كهذا أن يكون ممكنًا. هذا هو ذلك المقال. نحن بحاجة إلى مكوّنين: دوال التجزئة والالتزامات.
تخيّل أنك تتنبأ بنتيجة انتخابات وتريد أن تثبت، لاحقًا، أنك توقعتها مسبقًا. لا يمكنك ببساطة إعلان توقعك (فهذا يؤثر في الناس، أو يفتح باب الاتهام بأنك غيّرته). ولا يمكنك أيضًا إبقاءه سريًا بالكامل (لأنك عندها لن تستطيع إثبات أي شيء لاحقًا).
ما تحتاجه هو وسيلة لتثبيت قيمة الآن، علنًا، بحيث:
هذه الأداة من نوع "ثبّت الآن، اكشف لاحقًا، بلا كذب" تُسمى التزامًا، وهي موجودة في كل مكان داخل Zcash. فقيمة الملاحظة ومالكها يُثبَّتان داخل التزام في اللحظة التي تُنشأ فيها الملاحظة. ولكي نبني الالتزامات، نحتاج أولًا إلى أداتها الأساسية: دالة التجزئة.
تأخذ دالة التجزئة أي بيانات على الإطلاق، حرفًا واحدًا أو مكتبة كاملة، وتضغطها إلى سلسلة قصيرة ذات حجم ثابت تُسمى خلاصة أو تجزئة. فكّر فيها على أنها بصمة للبيانات.

للبصمة التشفيرية الجيدة أربع خصائص. تعامل معها كحدسيات لا كمعادلات:
| الخاصية | المعنى المبسّط | لماذا تهم |
|---|---|---|
| حتمية | الإدخال نفسه يعطي دائمًا البصمة نفسها | يمكنك إعادة التحقق من البصمة في أي وقت |
| سريعة في الاتجاه الأمامي | حساب البصمة سريع | عملية للاستخدام في كل مكان |
| أحادية الاتجاه (مقاومة لاستخراج الصورة الأصلية) | إذا أُعطيتَ بصمة، فلا يمكنك العثور على الإدخال الذي أنشأها | تُخفي البيانات الأصلية |
| مقاومة للتصادم | لا يمكنك العثور على إدخالين مختلفين لهما البصمة نفسها | لا يستطيع أحد تزوير تطابق |
وهناك سلوك إضافي يجعل البصمات تبدو شبه سحرية:
غيّر الإدخال بأصغر قدر ممكن، فتتغير البصمة كليًا، من دون أي شبه بالبصمة القديمة. إليك بصمتين فعليتين باستخدام SHA-256 لرسالتين تختلفان بحرف واحد فقط:
H("Pay Bob 5 ZEC") = 6e2dc1a954c70cc865f18ea8cb70b7b56eeaf6ca42b380824a55d65dc342f34b
H("Pay Bob 6 ZEC") = 76abc346d8d3053f76a9ae18b617af71f02729a73ec6a51732d2d94934e4217f
من أصل 64 رقمًا سداسيًا عشريًا، 59 مختلفة. حرف واحد يدخل، فتخرج بصمة لا علاقة لها تمامًا بما قبلها. لهذا السبب لا يمكنك دفع إدخال ما تدريجيًا نحو بصمة هدف: لا توجد إشارة من نوع "أدفأ / أبرد" يمكنك تتبعها.
إليك فكرة مغرية لكنها معيبة: لكي تلتزم بقيمة سرية v، ما عليك سوى نشر بصمتها H(v).
هذا يمنحك إلزامًا جيدًا (إذ لا يمكنك لاحقًا الادعاء بقيمة v مختلفة، لأن ذلك سيتطلب تصادمًا). لكنه يفشل في الإخفاء. فإذا كانت مجموعة القيم الممكنة صغيرة، يستطيع المهاجم ببساطة أخذ بصمة كل احتمال ومقارنته. هل تلتزم بـ "نعم" أو "لا"؟ سيجزّئ الاثنين ويتعلم فورًا أيهما اخترت. الحتمية، التي كانت صديقتنا قبل قليل، أصبحت الآن تُسرّب السر.
الحل هو كلمة واحدة: العشوائية.
الالتزام هو بصمة قيمتك ممزوجة برقم عشوائي جديد:
commitment = H(v, r)حيث إنrقيمة عشوائية سرية "للتعمية".
الآن تنتج القيمة نفسها v التزامًا مختلف الشكل في كل مرة، لأن r مختلفة. والخاصيتان اللتان أردناهما تتحققان أخيرًا معًا:

لكي تفتح (تكشف) الالتزام لاحقًا، تنشر v وr؛ ويعيد أي شخص حساب H(v, r) ويتحقق من التطابق. لقد أصبحتَ مقيّدًا بما التزمت به. هذا هو الظرف السحري المختوم من المقال 0، وقد صار شيئًا واقعيًا.
خلاصتان تستحقان أن تلازماك دائمًا: يأتي الإلزام من كون دالة التجزئة مقاومة للتصادم؛ ويأتي الإخفاء من عامل التعمية العشوائي
r.
هناك وصفتان شائعتان، ويستخدم Zcash كلتيهما.
| التزام قائم على التجزئة | التزام Pedersen (من المقال 2) | |
|---|---|---|
| الوصفة | H(v, r) | v.G + r.H (نقاط على منحنى) |
| الإخفاء يأتي من | العشوائي r | العشوائي r |
| الإلزام يأتي من | مقاومة التصادم | الفخّ الإهليلجي (ECDLP) |
| القوة الخاصة | بسيط وسريع | الالتزامات تتجمع جمعًا (هومومورفية) |
هذا الصف الأخير هو سبب أهمية التزامات Pedersen الكبيرة في Zcash. لأن commit(v_1) + commit(v_2) هو commit(v_1 + v_2) صالح، يمكن للبروتوكول لاحقًا أن يثبت أن الأموال الداخلة تساوي الأموال الخارجة عبر جمع الالتزامات معًا، وكل ذلك من دون كشف أي مبلغ واحد. سنحتفظ بهذه الحقيقة للمقال 6.
إليك فكرة تغيب عن معظم المقدمات، وهي بالضبط النقطة التي تستحق الإبراز عند التقاء "الرياضيات بالهندسة".
إن SHA-256 بصمة ممتازة للحوسبة اليومية. لكن Zcash لا يكتفي بحساب التجزئات؛ بل عليه أن يثبت، داخل إثبات معرفة صفرية، أن التجزئة قد حُسبت بشكل صحيح (المقال 5 يشرح السبب). وهنا تكمن المشكلة: يعمل إثبات المعرفة الصفرية بلغة حساب الحقول المنتهية (المقال 1)، بينما تُبنى SHA-256 من عمليات تلاعب بالبتات (الإزاحات، AND، XOR). والتعبير عن كل هذا التلاعب بالبتات ضمن حساب الحقول مكلف للغاية، ما يجعل الإثباتات ضخمة وبطيئة.
لذلك صمم مشفرو Zcash دوال تجزئة تكون بنيتها الداخلية هي أصلًا حسابات حقول، مما يجعل إثباتها رخيصًا:

هذا الضغط الهندسي الواحد، "يجب أن يكون إثباته رخيصًا"، هو السبب في أن Zcash اخترع واعتمد دوال تجزئة خاصة بدلًا من اللجوء إلى SHA-256 في كل مكان.
استخدم Zcash دوال تجزئة مختلفة عبر تصاميمه، وكل واحدة اختيرت للمهمة المناسبة:
| التصميم | دوال التجزئة المستخدمة | أين |
|---|---|---|
| Sprout (الأقدم) | SHA-256 | التزامات الملاحظات والشجرة |
| Sapling | Pedersen hashes، بالإضافة إلى BLAKE2 | Pedersen لالتزامات الملاحظات وشجرة Merkle؛ وBLAKE2 لاشتقاق المفاتيح وnullifiers |
| Orchard (الحالي) | Sinsemilla، بالإضافة إلى Poseidon | Sinsemilla لالتزامات الملاحظات وشجرة Merkle؛ وPoseidon للـ nullifier، وكلها مصممة للدوائر الحسابية |
الأسماء التي ينبغي تمييزها هي Pedersen وSinsemilla (تجزئات على نمط الالتزام مبنية من نقاط المنحنى، لذا فهي ترث قوة "التجميع الجمعي" الخارقة ويكون إثباتها رخيصًا) وPoseidon (دالة تجزئة مبنية على حساب الحقول ومصممة خصيصًا لدوائر المعرفة الصفرية). عندما قال المقال 0 إن محتويات الملاحظة تُغلق داخل التزام، فـ هذه هي الآلية التي تقوم بعملية الإغلاق.
إذًا فالحلقة المفتوحة من المقال 0، "كيف يمكن لظرف مختوم أن يخفي محتوياته ومع ذلك يستحيل تزويره؟"، قد أُغلقت الآن: الإخفاء يأتي من عامل تعمية عشوائي، والإلزام يأتي من مقاومة التصادم أو من فخ المنحنى.
لقد بسّطنا الأمور للحفاظ على الوضوح. فمخططات الالتزام الحقيقية تحدد بدقة كيف تُرمَّز v وr وأي مولدات تُستخدم؛ كما أن "الإخفاء" و"الإلزام" لكل منهما أنماطًا (مثالي مقابل حسابي) مع تعريفات أمنية دقيقة؛ ولم نعرض البنية الداخلية لـ Pedersen أو Sinsemilla أو Poseidon. لا شيء من ذلك يغيّر الفكرة الحدسية: الالتزام هو بصمة مع عشوائية تُخفي الآن وتُلزم إلى الأبد. وستعود التفاصيل، مع التنبيه إليها، عندما يحتاجها مقال البروتوكول.
H(v) يحقق الإلزام لكنه لا يحقق الإخفاء. وإضافة عامل تعمية عشوائي، H(v, r)، تحل المشكلة: الإخفاء يأتي من r، والإلزام يأتي من مقاومة التصادم.| المصطلح | المعنى المبسّط |
|---|---|
| Hash function | تضغط أي بيانات إلى بصمة قصيرة ذات حجم ثابت (خلاصة) |
| Digest | البصمة الخارجة من دالة التجزئة |
| Preimage resistance | لا يمكن عكس الخلاصة للرجوع إلى إدخالها (أحادية الاتجاه) |
| Collision resistance | لا يمكن العثور على إدخالين لهما الخلاصة نفسها |
| Avalanche effect | تغيير صغير جدًا في الإدخال يغيّر الخلاصة بالكامل |
| Commitment | تثبيت قيمة الآن، كشفها لاحقًا، ولا يمكنك الكذب بشأنها |
Blinding factor (r) | الرقم العشوائي الجديد الذي يجعل الالتزام مُخفيًا |
| ZK-friendly hash | دالة تجزئة مبنية على حساب الحقول بحيث يكون إثباتها رخيصًا |
لماذا لا نكتفي بتشفير القيمة بدلًا من الالتزام بها؟ التشفير يتعلق بـ السرية التي يمكنك فكّها لاحقًا. أما الالتزام فيتعلق بـ الإلزام: الضمان بأنك لا تستطيع تغيير إجابتك لاحقًا. وظيفتان مختلفتان.
إذا كانت الالتزامات تُخفي القيمة، فكيف يستطيع أي شخص التحقق من القواعد؟ هذا هو دور إثباتات المعرفة الصفرية (المقال 5): فهي تثبت أن القيمة المخفية تلتزم بالقواعد من دون كشفها.
هل SHA-256 معطوبة، بما أن Zcash يتجنبها في بعض المواضع؟ لا. إن SHA-256 جيدة، وما يزال Zcash يستخدمها. لكنها فقط مكلفة عند إثباتها داخل دائرة، ولهذا توجد دوال تجزئة صديقة لإثباتات المعرفة الصفرية لهذه المهمة المحددة.
من أين تأتي القيمة العشوائية r، ومن الذي يحتفظ بها؟
تُولَّد حديثًا عند إنشاء الملاحظة، ويعرفها مالك الملاحظة. وهي جزء مما يجعل كل ملاحظة فريدة وخاصة.
أنت تلتزم بتوقعك الانتخابي على صورة H(v, r) وتنشره. يصرّ صديقك على أنك يجب أن تنشر فقط H(v) ليبقى الأمر أبسط. في جملة واحدة، لماذا تُعد هذه فكرة سيئة إذا لم يكن هناك سوى نتيجتين ممكنتين؟ (الإجابة بالأسفل.)
عندما لا توجد سوى نتيجتين، يستطيع صديقك ببساطة حساب H("win") وH("lose") بنفسه ومقارنتهما بالخلاصة المنشورة، فيعرف توقعك فورًا. التجزئة المجردة تحقق الإلزام لكنها لا تحقق الإخفاء؛ أما العشوائي r فهو ما يوقف هجوم التخمين والتحقق هذا.
المقال 4 . أشجار Merkle: لدينا الآن ملايين الالتزامات المتراكمة. يوضح المقال 4 كيف ينظمها Zcash في شجرة واحدة تمثل بصمة جذرها الصغيرة التاريخَ كله، وكيف يمكنك إثبات أن ملاحظتك موجودة في تلك الشجرة من دون كشف أيّها هي. هذا هو الشكل الحقيقي لـ "اللوحة العامة" في المقال 0.
جزء من سلسلة Zcash from First Principles لـ ZecHub. مرخّص بموجب CC BY-SA 4.0.