تقني › من استلم؟

View tags

بايت واحد يجعل مسح المحفظة أسرع بكثير

باختصار

منذ أغسطس 2022 (الانقسام الصلب v15) يحمل كل مخرج بايتًا واحدًا — view tag (وسم العرض) = البايت الأول من Keccak("view_tag" ‖ 8rA ‖ i). تقارن المحفظة هذا البايت أولًا، ولا تُجري الفحص المكلف إلا عند التطابق (≈1 من 256). فيصبح المسح أسرع بنحو 40%.

المشكلة

لتتحقق المحفظة مما إذا كان المخرج لنا، تُجري عمليتين مكلفتين: 8·a·R (مرة لكل معاملة) وHs(…)·G + B (مرة لـكل مخرج). والثانية — ضرب بنقطة الأساس ثم جمع — تمثل حصة ملحوظة من وقت المزامنة. وفي 99.99% من الحالات يكون الجواب "ليس لنا".

الحل

view_tag = Keccak256( "view_tag" ‖ 8·r·A ‖ i )[0]

يضع المرسِل هذا البايت بجانب المخرج. والمستلم، بعد أن يحسب السر المشترك 8·a·R، يحسب التجزئة نفسها (عملية رخيصة: تجزئة وليست عملية على المنحنى) ويقارن البايت. إذا لم يتطابق — فالمخرج بالتأكيد ليس لنا، فيتوقف. وإذا تطابق — يُجري الفحص الكامل (وفي 1/256 من الحالات سيتبين أنه مجرد مصادفة).

10,000 مخرجفي الكتل الجديدة هل يتطابق view tag؟تجزئة واحدة لكل مخرج ~40 مرشحًافحص كامل على المنحنى ≈ 9,960 تُستبعد دون أي عملية على المنحنى

الثمن

بايت إضافي واحد لكل مخرج. والخصوصية لا تكاد تتأثر: إذ يُحسب view tag من السر المشترك الذي لا يعرفه إلا المرسِل والمستلم، فهو بالنسبة للآخرين بايت عشوائي. التسريب الوحيد يكون لمن يعرف مفتاح العرض (مثل خادم محفظة خفيفة): تتيح له التجزئة استبعاد مخرجات الآخرين — لكنه كان يستطيع ذلك على أي حال.

في Carrot

في Carrot يكبر view tag إلى 3 بايتات وينتقل تبادل المفاتيح إلى X25519 — فيصبح المسح أسرع، وتصبح الإيجابيات الكاذبة أندر بنحو 65,000 مرة.