Unified Address (ZIP-316) التحقق
هذا دليل تعليمي، وليس أداة فك ترميز جاهزة أو مكتبة مدفوعات للنسخ واللصق. يشرح كيفية تنظيم Unified Address لكي تتمكن من فهم ما تفعله المكتبات المُصانة خلف الكواليس. لكل ما يتعامل مع أموال حقيقية، ارجع إلى مواصفة ZIP-316 والتنفيذات الرسمية المرتبطة أدناه.
الصورة العامة
يمثل Unified Address (UA) سلسلة عنوان واحدة تضم عدة أنواع من المستلمين: Transparent أو Sapling أو Orchard أو مزيجًا منها. تختار المحفظة الدافعة تلقائيًا أفضل مجمّع مستلمين تدعمه.
تخيّل UA على أنه ظرف مختوم يحتوي على عدة بطاقات معنونة. تمثل كل بطاقة طريقة مختلفة للوصول إليك. للتحقق من عنوان، يجب على التطبيق:
- فتح الظرف: فك ترميز السلسلة النصية.
- إلغاء خلط المحتويات: عكس الخلط الوقائي (F4Jumble).
- قراءة كل بطاقة: استخراج المستلمين الفرديين.
- فرض قواعد البروتوكول: تجاهل الإدخالات أو رفضها وفقًا لنطاق typecode الخاص بها.
لماذا لا يكفي "فك ترميز Bech32m فقط"
يستخدم UA ترميز النص Bech32m، لكن فك ترميز Bech32m وحده لا يكشف المستلمين القابلين للاستخدام.
يتعمد ZIP-316 خلط الحمولة باستخدام F4Jumble قبل الترميز. يضمن F4Jumble أن تغيير حرف واحد فقط في العنوان يبدّل ناتج فك الترميز بالكامل. يمنع ذلك هجمات قابلية تكييف العنوان، حيث يستبدل مهاجم بايتات في منتصف العنوان مع إبقاء البادئة واللاحقة بمظهر صالح.
قاعدة أساسية: لا تعمل الحماية من قابلية التكييف إلا إذا نفّذ تطبيقك مسار فك الترميز والتحقق كاملًا. فك الترميز الجزئي يزيل الأمان مع الإبقاء على جميع المخاطر.
مسار فك الترميز، خطوة بخطوة
الخطوة 1: فك ترميز Bech32m والتحقق من الشبكة
- الجزء المقروء بشريًا (HRP): يحدد
u الشبكة الرئيسية؛ ويحدد utest شبكة الاختبار. (تبدأ عناوين UA للشبكة الرئيسية بـ u1، حيث إن 1 هو فاصل Bech32.)
- حد الطول: يفرض Bech32m القياسي حدًا قدره 90 حرفًا. تتجاوز عناوين UA هذا الحد عادةً، لذا يجب تعطيل عمليات التحقق القياسية من الطول في أداة فك الترميز.
- حوّل كلمات Bech32m ذات 5 بتات مجددًا إلى بايتات قياسية ذات 8 بتات.
الخطوة 2: عكس F4Jumble
F4Jumble هو شبكة Feistel من 4 جولات مبنية على BLAKE2b:
- طول النصف الأيسر:
min(64, floor(length / 2)) بايت. يتوافق الحد الأقصى البالغ 64 بايت مع أكبر حجم ناتج لـ BLAKE2b. يحتوي النصف الأيمن على بقية الحمولة.
- دوال التجزئة: تتناوب G وH باستخدام تسميات تخصيص ثابتة (
UA_F4Jumble_G وUA_F4Jumble_H).
- ترتيب الجولات: يعمل الترميز الأمامي بالترتيب G(0) → H(0) → G(1) → H(1). ويعمل العكس (إلغاء الخلط) بالترتيب H(1) → G(1) → H(0) → G(0).
- فحص النطاق: ارفض المدخلات الواقعة خارج حدود حجم حمولة ZIP-316.
الخطوة 3: إزالة الحشو والتحقق من HRP
قبل الخلط، يضيف المُرمِّز 16 بايتًا تحتوي على HRP، مع حشوها بأصفار.
- أزل آخر 16 بايتًا بعد إلغاء الخلط.
- أكد أن HRP المضمّن يطابق الشبكة المتوقعة (
u أو utest). يمنع ذلك قبول عناوين شبكة الاختبار عن طريق الخطأ على الشبكة الرئيسية.
الخطوة 4: استخراج المستلمين
تتكون الحمولة المتبقية من إدخالات (typecode, length, content)، حيث يُخزَّن typecode والطول كأعداد صحيحة ذات حجم مدمج (بايت واحد للقيم الصغيرة). رموز أنواع المستلمين المعروفة:
| رمز النوع | نوع المستلم | طول المحتوى |
|---|
0x00 | Transparent (P2PKH) | 20 بايتًا |
0x01 | Transparent (P2SH) | 20 بايتًا |
0x02 | Sapling | 43 بايتًا |
0x03 | Orchard | 43 بايتًا |
إضافة إلى ذلك، يحجز ZIP-316 نطاقين إضافيين للتوافق المستقبلي:
0xC0–0xDF (بيانات وصفية لا يجب فهمها): يجب على المستهلكين تجاهل عناصر البيانات الوصفية التي لا يتعرفون عليها ضمن هذا النطاق.
0xE0 و0xE1 (بيانات وصفية مُعيّنة يجب فهمها): يخصص سجل ZIP-316 الحالي هذه القيم لارتفاع ووقت انتهاء صلاحية العنوان. يجب على المستهلكين فهم هذه العناصر أو رفض العنوان.
0xE2–0xFC (بيانات وصفية غير معيّنة يجب فهمها): يجب على المستهلكين رفض العنوان إذا واجهوا عنصرًا غير معروف ضمن هذا النطاق.
بالنسبة لأنواع المستلمين المعروفة، تحقق من أن الطول المُرمَّز يطابق طول المحتوى المحدد للنوع. وبالنسبة لعناصر البيانات الوصفية، استخدم طولها المُرمَّز ذي الحجم المدمج لتحديد طول المحتوى. ارفض الإدخالات المبتورة أو أي بايتات لاحقة.
ترتيب المستلم المفضل. بعد تحليل العنوان بنجاح، ينبغي للمحفظة أو أداة الدفع اختيار أفضل مستلم بهذا الترتيب: Orchard، ثم Sapling، ثم transparent.
قواعد الرفض الإلزامية في ZIP-316
نجاح فك الترميز لا يجعل العنوان صالحًا. ترفض محافظ Zcash الرسمية بشكل صارم العناوين التي تخالف القواعد التالية. ويجب أن ترفضها أدوات الويب أيضًا لمنع فشل المدفوعات:
- غياب المستلمين المحميين: يجب أن يحتوي العنوان على مستلم واحد على الأقل من Sapling أو Orchard. لا يكون UA الذي يحتوي على مستلمين transparent فقط صالحًا بموجب ZIP-316.
- رموز النوع المكررة: يجوز أن يظهر كل نوع مستلم مرة واحدة على الأكثر.
- رموز النوع غير المرتبة: يجب أن تظهر المستلمون بترتيب تصاعدي صارم لرموز النوع.
- المستلمون transparent المتعارضون: قد يحمل UA إما P2PKH أو P2SH، ولكن ليس كليهما أبدًا.
- إدخالات أو حشو مشوه: يجب أن تؤدي بادئات الشبكة غير المتطابقة أو الحمولات المبتورة أو عدم تطابق الأطوال إلى الرفض الفوري.
- رموز النوع غير المعروفة: يجب على المستهلكين تجاهل العناصر غير المعروفة، باستثناء العناصر الواقعة ضمن نطاق البيانات الوصفية التي يجب فهمها (
0xE0–0xFC)، والتي يجب رفضها إن كانت غير معروفة. في السجل الحالي، 0xE0 و0xE1 هما نوعا انتهاء صلاحية معينان، بينما 0xE2–0xFC غير معينة. وبشكل مستقل، ارفض أي عنوان يفشل في قواعد الصلاحية الإلزامية أعلاه، بما في ذلك اشتراط وجود مستلم Sapling أو Orchard.
أفضل الممارسات للمطورين
- قارن المستلمين المحللين، لا السلاسل الخام. فك ترميز العناوين أولًا قبل التحقق من المساواة.
- استخدم مكتبات مُصانة لكل ما يتعامل مع الأموال. جمّع حزم Rust الرسمية (مثل
zcash_address) إلى WebAssembly بدلًا من نشر أدوات فك ترميز JavaScript مخصصة.
- توخ الحذر مع المحللات المكتوبة يدويًا. إذا كتبت واحدة للتعلم، فاعتبرها مشروعًا دراسيًا واختبرها مقابل المتجهات الرسمية أدناه قبل الوثوق بها في أي شيء.
المواصفات الرسمية والتنفيذات المرجعية
مسرد المصطلحات
| المصطلح | المعنى |
|---|
| Unified Address (UA) | سلسلة عنوان واحدة تجمع عدة مجمّعات مستلمين. |
| Receiver | نوع محدد لوجهة الدفع (transparent أو Sapling أو Orchard). |
| Bech32m | مخطط ترميز نصي مستخدم لسلاسل UA. |
| HRP | الجزء المقروء بشريًا أو بادئة الشبكة (u أو utest). |
| F4Jumble | خوارزمية تمويه قابلة للعكس تضمن سلامة العنوان. |
| Typecode | رقم في كل إدخال يحدد نوع المستلم في الحمولة. |
| Malleability | تعديل غير مصرح به لبايتات العنوان دون اكتشافه. |
انظر أيضًا: مفاتيح العرض