المعاملة بايتًا بايتًا
تفكيك كامل للصيغة الست عشرية لمعاملة RingCT: كل حقل وكل دالة — على بيانات حقيقية وعشوائية
معاملة Monero ثلاث كتل متتالية من البايتات: البادئة (المدخلات، المخرجات، extra)، وقاعدة RingCT (الرسم، المبالغ المشفّرة، الالتزامات)، والجزء القابل للتقليم (Bulletproofs+، CLSAG، المخرجات الزائفة). أدناه أداة تحلل أي معاملة من الإصدار v2 بايتًا بايتًا، وتحسب txid، وتتحقق من التوازن، و— إذا أُعطيت مفتاح عرض — تعثر على مخرجاتك وتفك تشفير مبالغها. وفي المعاملة العشوائية تُظهر جميع الأسرار، لترى كيف تُطبَّق كل دالة على أعداد فعلية.
كيف تُقرأ البايتات
التسلسل (serialization) في Monero بسيط — لا ترويسات ولا أسماء حقول، بل قيم متتالية فحسب. وهناك نوعان من وحدات البناء:
- varint — عدد صحيح متغير الطول: 7 بتات لكل بايت، والبت الأعلى يعني "يتبعه بايت آخر".
0x02= 2،0x80 0x01= 128،0x80 0xb5 0x18= 400000. - المفتاح / النقطة / العدد القياسي — 32 بايتًا بالضبط، بلا طول. ومصفوفات النقاط التي يُعرف طولها من السياق (مثل
sفي CLSAG، بحسب حجم الحلقة) تأتي أيضًا بلا طول.
لذا يجب أن يعرف المحلل الصيغة مسبقًا: فنوع RingCT، الذي يُقرأ في المنتصف، يحدد كيفية قراءة كل ما يليه.
أي الدوال تُطبَّق وأين
| الحقل | من يحسبه | الصيغة | المزيد |
|---|---|---|---|
| extra: R | المرسِل | R = r·G | العناوين الخفية |
| المخرج: P | المرسِل | P = Hs(8·r·A ‖ i)·G + B | العناوين الخفية |
| view tag | المرسِل | Keccak("view_tag" ‖ 8rA ‖ i)[0] | view tags |
| ecdhInfo | المرسِل | v ⊕ Keccak("amount" ‖ Hs(8rA ‖ i))[0..8] | Pedersen |
| outPk | المرسِل | C = y·G + v·H، y = Hs("commitment_mask" ‖ Hs(8rA ‖ i)) | Pedersen |
| الحلقة | محفظة المرسِل | 16 فهرسًا عامًا، توزيع غاما على العمر | المدخلات الوهمية |
| key image | مالك المدخل | I = x·Hp(P) | key image |
| pseudoOuts | المرسِل | C̃ = y'·G + v·H، والأقنعة مختارة بحيث Σ C̃ = Σ C + fee·H | RingCT |
| CLSAG | مالك المدخل | حلقة من التحديات على P_i وC_i − C̃ | التواقيع الحلقية |
| Bulletproofs+ | المرسِل | برهان على أن 0 ≤ v < 2⁶⁴ لجميع المخرجات | براهين النطاق |
ما الذي تفعله العقدة بهذه البايتات
- تحللها؛ وأي بايت زائد أو ناقص يعني الرفض.
- تتحقق من أن key images جديدة وفي الزمرة الجزئية الصحيحة.
- تعيد بناء الفهارس العامة الـ16 من الإزاحات وتحمّل مفاتيح تلك المخرجات والتزاماتها من قاعدة بياناتها.
- تتحقق من التوازن
Σ C̃ = Σ outPk + fee·H— والأداة أدناه تفعل ذلك أيضًا. - تتحقق من Bulletproofs+ ومن CLSAG لكل مدخل.
ما الذي تفعله محفظة المستلم
- تأخذ
Rمن extra وتحسب السر المشترك8·a·R(عملية واحدة لكل معاملة). - لكل مخرج: تجزئة ← مقارنة view tag؛ إن لم يتطابق — توقف.
- إن تطابق — قارن
Hs(8aR ‖ i)·G + Bبمفتاح المخرج. - المخرج لنا — فك تشفير المبلغ، وأعد بناء القناع، وتحقق من
y·G + v·HمقابلoutPk.
تُظهر الأداة كل هذه الخطوات بأعداد ملموسة.
جرى التحقق من المحلل مقابل فك ترميز JSON الذي يجريه monerod لمعاملات حقيقية من النوعين 5 و6 ولمعاملة coinbase: كل حقل وtxid متطابقة. يحمّل زر "معاملة حقيقية من الشبكة الرئيسية" إحداها — قارن txid بأي مستكشف كتل.
كيف ستبدو معاملة FCMP++؟
قد تتغير صيغة معاملات FCMP++ قبل الانقسام الصلب، لذا لا يوجد هنا محلل بايتات لها. لكن البنية العامة واضحة من التنفيذ الحالي — وهي شبيهة على نحو مفاجئ ببنية اليوم:
| في RingCT | في FCMP++ | الدوال |
|---|---|---|
| 16 إزاحة لكل مدخل | إشارة إلى الكتلة التي بُني البرهان على شجرتها | جذر Curve Tree على جميع المخرجات |
key image I = x·Hp(P) | نفسها L = x·Hp(O) | يُكشف الإنفاق المزدوج كما من قبل |
المخرج الزائف C̃ | C̃ = C + r_c·G — جزء من الثلاثية المعاد تعشيتها | إعادة التعشية |
| CLSAG لكل مدخل | SA+L لكل مدخل (بضع نقاط وأعداد قياسية) | Schnorr المعمَّم |
| — | برهان عضوية واحد للمعاملة كلها | Generalized Bulletproofs + القواسم |
| view tag من بايت واحد، ECDH على Ed25519 | view tag من 3 بايتات، X25519، مرساة Janus | Carrot |
شاهد إعادة التعشية بأعداد فعلية في الأداة. وحين تصبح الصيغة نهائية، سيُضاف هنا أيضًا تفكيك بايتي لمعاملات FCMP++.