View tags
بايت واحد يجعل مسح المحفظة أسرع بكثير
منذ أغسطس 2022 (الانقسام الصلب v15) يحمل كل مخرج بايتًا واحدًا — view tag (وسم العرض) = البايت الأول من Keccak("view_tag" ‖ 8rA ‖ i). تقارن المحفظة هذا البايت أولًا، ولا تُجري الفحص المكلف إلا عند التطابق (≈1 من 256). فيصبح المسح أسرع بنحو 40%.
المشكلة
لتتحقق المحفظة مما إذا كان المخرج لنا، تُجري عمليتين مكلفتين: 8·a·R (مرة لكل معاملة) وHs(…)·G + B (مرة لـكل مخرج). والثانية — ضرب بنقطة الأساس ثم جمع — تمثل حصة ملحوظة من وقت المزامنة. وفي 99.99% من الحالات يكون الجواب "ليس لنا".
الحل
يضع المرسِل هذا البايت بجانب المخرج. والمستلم، بعد أن يحسب السر المشترك 8·a·R، يحسب التجزئة نفسها (عملية رخيصة: تجزئة وليست عملية على المنحنى) ويقارن البايت. إذا لم يتطابق — فالمخرج بالتأكيد ليس لنا، فيتوقف. وإذا تطابق — يُجري الفحص الكامل (وفي 1/256 من الحالات سيتبين أنه مجرد مصادفة).
الثمن
بايت إضافي واحد لكل مخرج. والخصوصية لا تكاد تتأثر: إذ يُحسب view tag من السر المشترك الذي لا يعرفه إلا المرسِل والمستلم، فهو بالنسبة للآخرين بايت عشوائي. التسريب الوحيد يكون لمن يعرف مفتاح العرض (مثل خادم محفظة خفيفة): تتيح له التجزئة استبعاد مخرجات الآخرين — لكنه كان يستطيع ذلك على أي حال.
في Carrot يكبر view tag إلى 3 بايتات وينتقل تبادل المفاتيح إلى X25519 — فيصبح المسح أسرع، وتصبح الإيجابيات الكاذبة أندر بنحو 65,000 مرة.