
السلسلة: Zcash من المبادئ الأولى . المقالة 6 . البروتوكول المُدرَّع (الخاتمة) الجمهور: القادمون الجدد الذين قرؤوا المقالات من 0 إلى 5. هنا تتصل كل الأشياء ببعضها. ما الذي ستخرج به: نموذج ذهني كامل وصحيح لمعاملة Zcash مُدرَّعة، مع كل مفهوم من السلسلة في موضعه الصحيح، وإغلاق كل حلقة من المقالة 0.
بدأنا، في المقالة 0، بمفارقة وقصة عن أظرف مختومة على لوحة عامة. ثم أمضينا خمس مقالات نبني الأجزاء: الحقول المنتهية، والمنحنيات الإهليلجية، والالتزامات، وأشجار Merkle، وبراهين انعدام المعرفة. والآن سنجمعها معًا ونشاهد دفعة خاصة حقيقية تعمل من البداية إلى النهاية.
كل قطعة تعلمتها على حدة ذكية بحد ذاتها. لكن سحر Zcash يكمن في كيفية تداخلها. فـ nullifier وحده لا يمنح الخصوصية. والالتزام وحده لا يمنع التزوير. والبرهان وحده لا يثبت شيئًا مفيدًا. إن التجميع هو ما يحول خمسة مكونات إلى مال يكون خاصًا وجديرًا بالثقة في الوقت نفسه.
هذه المقالة هي عملية التجميع. وبحلول النهاية، ستبدو الجملة "تتحقق الشبكة من معاملة لا تستطيع رؤيتها" ليست مفارقة، بل نتيجة بديهية لأجزاء تفهمها بالفعل.
إليك السلسلة كاملة في صفحة واحدة، مع ربط قصة المقالة 0 بالآليات الحقيقية.
| عنصر القصة في المقالة 0 | المكوّن الحقيقي | مبني من |
|---|---|---|
| المال داخل الظرف | Note (القيمة، المستلم، العشوائية) | مُشفَّر كعناصر حقلية (المقالة 1) |
| الظرف المختوم المعتم | Note commitment | التزام Pedersen / Sinsemilla (المقالتان 2 و3) |
| اللوحة العامة | شجرة Note commitment (anchor = جذرها) | شجرة Merkle تزايدية (المقالة 4) |
| رمز الفراغ | Nullifier | تجزئة صديقة لـ ZK لـ note + المفتاح السري (المقالتان 2 و3) |
| "المال الداخل يساوي المال الخارج" | التزامات القيمة + فحص التوازن | التزامات Pedersen متجانسة الشكل (المقالتان 2 و3) |
| السحر وراء الستار | برهان انعدام المعرفة | zk-SNARK فوق دائرة حسابية (المقالة 5) |
| "أنت وحدك تستطيع قراءة ظرفك" | Note مُشفَّرة + مفاتيح العرض | التشفير + هرمية المفاتيح (هذه المقالة) |
كل ما يستطيع المستخدم فعله يتدفق من سر واحد، هو مفتاح الإنفاق، عبر هرمية أحادية الاتجاه (كل سهم هو اشتقاق غير قابل للعكس، بفضل الأبواب trapdoors في المقالتين 2 و3):

هناك أمران جديران بالملاحظة، وكلاهما نتيجة للمقالات السابقة:
لكي تنفق note بشكل خاص، يجب أن تقنع الشبكة بأربعة أمور دفعة واحدة من دون كشف note أو قيمتها أو موضعها أو هويتك. ويُلبَّى كل ادعاء بواسطة مكوّن تعرفه بالفعل.

لا يكشف البرهان أيًّا من الحقائق الأساسية (أي note، مفتاح مَن، أي قيمة). إنه يكشف فقط أن الادعاءات الأربعة كلها صحيحة. وهذه هي الحيلة الكاملة في Zcash المُدرَّع، معبَّرًا عنها في مخطط واحد.
في المقالتين 2 و3 لاحظنا أن التزامات Pedersen تُجمع: فالالتزام بـ v_1 مضافًا إلى الالتزام بـ v_2 هو التزام بـ v_1 + v_2. وهنا يظهر مردود ذلك.
كل input وoutput من نوع note يحمل التزام قيمة: التزام Pedersen من الشكل v.G + r.H يُخفي المقدار v. وبما أن هذه الالتزامات تُجمع، تستطيع الشبكة أن تحسب:
(sum of input value commitments) − (sum of output value commitments)
إذا كانت المعاملة متوازنة (لم يُنشأ مال ولم يُدمَّر)، فإن أجزاء v تُلغى تمامًا، ولا يتبقى إلا التزام بـ قيمة صفرية، مع تمويهها بعشوائية متبقية. ويُثبت المُرسِل أنه يعرف تلك العشوائية المتبقية عبر إنتاج توقيع صغير يُسمى binding signature. ولا يكون binding signature صالحًا ممكنًا إلا عندما تتوازن القيم فعلًا، ومع ذلك لم يُكشف أي مقدار واحد.
هذا أوضح تجسيد في السلسلة كلها لـ سبب حاجتنا إلى التزامات متجانسة الشكل وقائمة على المنحنيات. فقاعدة "المال الداخل يساوي المال الخارج" تُفرض عبر جمع الأظرف المختومة معًا والتحقق من أن النتيجة تُختَم إلى الصفر.
لنجمّع Alice وهي تدفع إلى Bob. سنستخدم البنية الواضحة في Sapling "جانب الإنفاق / جانب الإخراج" كنموذج تعليمي.
تجمع المعاملة المُدرَّعة نوعين من الأوصاف:
| وصف الإنفاق (يستهلك note) | وصف الإخراج (ينشئ note) |
|---|---|
| التزام قيمة الـ input | التزام قيمة الـ output |
| الـ anchor الذي يبرهن عليه (جذر شجرة) | note commitment الجديد (ورقة جديدة) |
| الـ nullifier الخاص بـ note المُنفقة | مفتاح مؤقت للتشفير |
| مفتاح عام أُعيدت عشوائيته + توقيع تفويض الإنفاق | الـ note المُشفَّرة (نص مُعمّى للمستلم) |
| الـ zk-SNARK الذي يثبت الادعاءات الأربعة | zk-SNARK يثبت أن الـ output مُشكَّل بصورة صحيحة |
بالإضافة إلى binding signature واحد على الحزمة كلها، يفرض توازن القيمة (القسم 5).

تتبّع الخصوصية: لقد تحققت الشبكة من anchor، وتحققت من أن nullifier جديد، وتحققت من البرهان، وتحققت من التوازن. لقد قبلت دفعة صالحة من دون أن تتعلم أي مقدار، أو أي عنوان، أو أي note قد أُنفقت. وفي الوقت نفسه، يجلس nullifier الخاص بـ note المُنفقة (موتها) وcommitment الجديد الخاص بـ Bob (ولادة note الخاصة به) في بنيتين عامتين مختلفتين من دون أي رابط مرئي بينهما، وهو الرابط المقطوع من المقالة 0.
المقالة 0 فتحت أسئلة عن قصد. وهنا هي كلها، وقد أُغلقت.
| الحلقة المفتوحة في المقالة 0 | أُغلقت بواسطة |
|---|---|
| كيف يمكن أن يكون الظرف مختومًا ومع ذلك غير قابل للتزوير؟ | الالتزامات: الإخفاء عبر العشوائية، والربط عبر مقاومة التصادم / المصيدة الخاصة بالمنحنى (المقالة 3) |
| من أين تأتي المفاتيح والوصفات السرية؟ | حسابيات الحقل والضرب القياسي على المنحنى الإهليلجي (المقالتان 1 و2) |
| ما هو "اللوح" بالضبط؟ | شجرة Merkle تراكمية لالتزامات الملاحظات؛ وجذرها هو الـ anchor (المقالة 4) |
| لماذا لا يمكن ربط رمز العدم بظرفه؟ | الـ nullifier هو تجزئة بمفتاح تُحفَظ في مجموعة منفصلة عن الالتزامات (المقالات 2 و3 و4) |
| كيف تُثبت الصحة مع عدم كشف أي شيء؟ | zk-SNARK فوق دائرة حسابية تُشفّر جميع الادعاءات الأربعة (المقالة 5) |
| كيف يتعلّم المستلم أنه قد دُفع له؟ | تُشفَّر الملاحظة إلى عنوانه؛ ويجري فك تشفير تجريبي باستخدام Viewing Key (هذه المقالة) |
| كيف يُفرَض "المال الداخل = المال الخارج" بشكل خاص؟ | التزامات القيمة متجانسة الخواص + توقيع الربط (القسم 5) |
المفارقة منذ الصفحة الأولى، تحقّق مما لا يمكنك رؤيته، قد زالت الآن بالكامل. الشبكة تتحقق من ادعاءات حول بيانات مخفية، وليس من البيانات نفسها أبدًا.
شرحنا باستخدام بنية Sapling لأن تقسيمها هو الأوضح. أما التصميم الحالي، Orchard، فهو يُحسّن هذه الأفكار بدلًا من استبدالها:
| Sapling | Orchard | |
|---|---|---|
| وحدة المعاملة | أوصاف Spend وOutput منفصلة | Actions موحّدة (كل واحدة تنفّذ عملية spend واحدة + output واحد) |
| نظام الإثبات | Groth16 (إعداد موثوق) | Halo 2 (من دون إعداد موثوق) |
| المنحنيات | BLS12-381 + Jubjub | Pallas / Vesta (Pasta) |
| تجزئة الالتزام | Pedersen | Sinsemilla |
كل مفهوم في هذه المقالة ينتقل مباشرة؛ Orchard يضمّ أساسًا عمليتَي spend وoutput معًا ويستبدل نظام الإثبات بآخر لا يحتاج إلى مراسم. الركائز الخمس لم تتغير.
هذه هي الصورة الأكثر اكتمالًا في السلسلة، لكنها ما تزال نموذجًا. لقد اختصرنا الترميزات الحقلية الدقيقة للملاحظة، وصيغ اشتقاق المفاتيح الدقيقة، وإعادة تعشية مفاتيح spend، والعناوين المتنوّعة، وحقول المذكرات، ومعالجة الرسوم، والفرق بين التزامات القيمة والتزامات الملاحظات بكل تفاصيله، والدور الدقيق لكل توقيع. كما عرضنا تدفقًا معياريًا واحدًا؛ أما المعاملات الحقيقية فقد تحمل العديد من عمليات spend وoutput معًا، وقد تمزج بين الأجزاء الشفافة والمحمية. المصدر المعتمد هو Zcash Protocol Specification. ما أصبح بين يديك الآن هو الشكل الصحيح؛ أما المواصفة فتملأ كل القياسات بالتفصيل.
| المصطلح | المعنى المبسّط |
|---|---|
| Spending key | السرّ الجذري الوحيد الذي تُشتق منه جميع مفاتيح المستخدم |
| Viewing Key | يكشف معاملاتك لحامله من دون أن يتيح له إنفاقها |
| Spend description | الجزء من المعاملة الذي يستهلك ملاحظة (nullifier، وanchor، والإثبات) |
| Output description | الجزء من المعاملة الذي يُنشئ ملاحظة (الالتزام، والنص المشفّر، والإثبات) |
| Action (Orchard) | وحدة موحّدة تنفّذ spend واحدًا وoutput واحدًا معًا |
| Value commitment | التزام Pedersen متجانس الخواص بمبلغ |
| Binding signature | التوقيع الذي يثبت توازن القيم من دون كشفها |
| Anchor | جذر الشجرة الذي يثبت spend العضوية بالنسبة إليه |
| Trial decryption | قيام المستلم باختبار الالتزامات الجديدة للعثور على الملاحظات المقصودة له |
هل ترى الشبكة المبلغ أو مَن دفع لمَن؟ لا. إنها تتحقق من الإثبات، وحداثة الـ nullifier، والـ anchor، وتوقيع الربط. جميع القيم الخاصة تبقى مخفية.
ما الذي يمنعني من إنفاق ملاحظة مرتين؟ الـ nullifier. فعند الإنفاق يتم نشره؛ وترفض الشبكة أي nullifier موجود مسبقًا في مجموعة الـ nullifier. والملاحظة نفسها تُنتج دائمًا الـ nullifier نفسه.
كيف يمكن التحقق من التوازن إذا كانت المبالغ مخفية؟ تلتئم التزامات القيمة بشكل متجانس؛ وتُلغِي التزامات المعاملة المتوازنة بعضها بعضًا لتصبح التزامًا بالصفر، وهو ما يثبته توقيع الربط.
هل يمكنني إثبات معاملاتي لمدقّق من دون التخلي عن السيطرة؟ نعم. سلّمه Viewing Key. فهو يكشف نشاطك المحمي لكنه لا يستطيع تخويل عمليات الإنفاق، وذلك بفضل هرمية المفاتيح أحادية الاتجاه.
هل أصبح Sapling قديمًا الآن بعد وجود Orchard؟ كلاهما وُجد على الشبكة؛ وOrchard هو التصميم الحالي. المفاهيم مشتركة، لذا فإن فهم أحدهما يمنحك فهم الآخر.
يقول صديق: "بما أن البرهان يُخفي المبلغ، يمكن للص أن يدّعي ببساطة أن قيمة مخرجاته أكبر من قيمة مدخلاته ويطبع أموالًا مجانية." باستخدام القسم 5، اشرح في جملتين لماذا يفشل هذا. (الإجابة أدناه.)
المبالغ مخفية، لكن كل مبلغ منها مُغلَّف ضمن التزام قيمة تجانسي، وتقوم الشبكة بجمع جميع التزامات المدخلات ثم تطرح جميع التزامات المخرجات؛ وإذا لم تكن القيم المخفية متوازنة، فلن تُحكَم النتيجة إلى الصفر ولن يكون بالإمكان إنتاج توقيع ربط صالح. يمكن للص أن يُخفي كمية المبلغ، لكنه لا يستطيع جعل القيم غير المتوازنة تتجاوز فحص التوازن، لذا فإن طباعة أموال مجانية مستحيلة من دون كشف أي شيء، ومع ذلك ستظل الحسابات كفيلة بكشفه.
لقد انتقلت الآن من مفارقة واحدة إلى دفعة خاصة كاملة:

من هنا، يتجه المسار الطبيعي التالي إلى مزيد من العمق: الآليات الداخلية لـ Groth16 وHalo 2، ومراسم الإعداد الموثوق، ودوائر Sapling وOrchard بالتفصيل، واشتقاق المفاتيح والعناوين المتنوعة، وتطور البروتوكول عبر ترقيات الشبكة. لكن الأساس أصبح الآن قائمًا، ولكل واحد من هذه الموضوعات موضع يمكن أن يرتبط به.
جزء من سلسلة Zcash from First Principles لصالح ZecHub. مرخّص بموجب CC BY-SA 4.0.