فك تشفير مبادلات SCW

مع محافظ العقود الذكية (SCWs)، تسير عمليات المبادلة في مسار مختلف تمامًا عن محافظ Ethereum/EVM التقليدية. هذا الاختلاف قد يكون مربكًا، خاصة عندما يحدث خطأ. ولكن بمجرد أن تفهم الجهات الرئيسية في التدفق — وكيف تقرأ ما حدث خطوة بخطوة في التطبيق وعلى المستكشف — تبدأ الأمور في أن تكون منطقية.

دعنا نستعرضها معًا.


من نقرة واحدة إلى التنفيذ على السلسلة: ما الذي يحدث فعلاً

عندما تضغط "مبادلة" في التطبيق، يبدو الأمر كإجراء واحد. في الواقع، أنت تطلق عملية متعددة الطبقات مبنية فوق تجريد الحساب في إيثيريوم (ERC-4337). معاملتك لا تذهب مباشرة إلى البلوكشين كما في المحفظة العادية. بل تأخذ طريقًا فرعيًا:

  1. نحن نبني المسار. نطلب من محرك التوجيه (مثل 1inch) إيجاد أفضل مسار لمبادلتك، ونحاكيه للتأكد من أنه يعمل. نقوم بتقدير الغاز، نتحقق من أن لديك الرموز، ونُعبئ التعليمات في صيغة خاصة: UserOperation.

  2. A bundler يتدخل. هذا كيان خارج السلسلة مسؤول عن تقديم UserOperations إلى البلوكشين. يفحص عمليتك، ويتأكد من صحتها، ويدفع الغاز مقدمًا نيابة عنك (سيُعاد إليه لاحقًا).

  3. يدخل UserOp الخاص بك البلوكشين عبر EntryPoint العقد الذكي. فكر في EntryPoint كبوابة واحدة تمر من خلالها جميع معاملات SCW. يقوم EntryPoint بإجراء الفحوصات النهائية، وإذا بدا أن كل شيء على ما يرام…

  4. يأمر EntryPoint محفظتك الذكية (SCW) بتنفيذ المبادلة. تستدعي SCW الموجه (مثل 1inch)، يستدعي الموجه المجمعات، تتحرك الرموز، وتعود النتيجة إلى محفظتك.

للتلخيص: أنت تضغط مبادلة → نحن نحاكي → bundler يقدم → EntryPoint يتحقق → SCW الخاصة بك تنفذ.


لننظر إلى مثال حي

الآن بعد أن فهمنا التدفق على المستوى العالي، دعنا نرى كيف يظهر ذلك في مبادلة حقيقية: أولًا في التطبيق، ثم على السلسلة:

إليك ما نراه:

  • قمنا بمبادلة 1 USDC مقابل 0.765 KTA.

  • تم تنفيذ المبادلة على Base (لاحظ رمز Base على رموز العملات).

  • لقد دفعنا:

    • $0.03 رسوم غاز (بـ ETH)

    • 0.22% رسوم مبادلة إلى goodcryptoX

    • 0.05% رسوم موجه إلى 1inch

  • كان المسار بسيطًا: 100% عبر تجمع Uniswap v4.

  • Bundler: Alchemy (راجع الخطوة 2 أعلاه للمراجعة)

  • روابط المستكشف تظهر إذا كانت المعاملة قد وصلت إلى البلوكشين وسُجلت في الكتلة (حتى لو فشلت)

حتى الآن، كل شيء جيد. التالي، لننقر رابط BaseScan لنرى كيف تبدو هذه المعاملة على السلسلة:

ملاحظة حول روابط المستعرض: في أحدث إصدارات التطبيق، تفتح روابط المستعرض بالفعل عملية المعاملة AA الخاصة بك (UserOp). إذا كان هذا ما تراه (حقل "From" يعرض عنوان محفظتك)، يمكنك الانتقال مباشرة إلى الخطوة 5 – صفحة تفاصيل معاملة AA. الخطوات السابقة تنطبق فقط إذا كانت رابطك يشير إلى معاملة البندلر الخارجية (حيث أن "From" ليس عنوان محفظتك). ومع ذلك، لا يزال من المفيد قراءتها لفهم أفضل لكيفية عمل معاملات SCW

من: هذه ليست محفظتك — إنها bundler الخاصة بـ Alchemy. هذا متوقع، لأن bundler هو من قدم المعاملة.

إلى: EntryPoint (v0.6.0). مرة أخرى، متوقع — كل معاملات SCW تدخل عبر هنا.

المعاملات الداخلية: تعرض تدفقات الرموز الأصلية (ETH على Base) داخل المعاملة. إليك ما نراه:

  • محفظتنا (…0A5) أرسلت ETH إلى EntryPoint مقابل رسوم الغاز.

  • قام EntryPoint بسداد تكاليف الغاز الفعلية إلى bundler (بما أن bundler دفع الغاز مقدمًا نيابة عنك؛ راجع الخطوة 2 أعلاه). أي ETH متبقية بقيت في EntryPoint كوديعة لك للمعاملات المستقبلية.

تحويلات ERC-20: تعرض حركات الرموز الفعلية:

محفظتنا لم ترسل USDC مباشرة. بدلاً من ذلك، قام عقد رمز USDC (…2A8) بمعالجة وإرسال التحويلات. هذا طبيعي: على سلاسل EVM، يتم التعامل مع تحويلات الرموز بواسطة عقد الرمز نفسه بعد تلقي تعليمات من محفظتك الذكية.

  1. قام عقد USDC بتقسيم 1 USDC لدينا إلى ثلاث تحويلات:

    • 0.0022 USDC إلى محفظة رسوم البروتوكول الخاصة بنا (…608A)

    • 0.0005 USDC إلى محفظة رسوم 1inch (…1DE5)

    • الباقي 0.9973 USDC إلى موجه Uniswap v4 (…Universal Router)

  2. قام موجه Uniswap v4 بتمريرها إلى مدير تجمعات Uniswap v4 (عقد واحد يتعامل مع جميع تجمعات v4).

  3. قام مدير التجمع بتنفيذ المبادلة: USDC داخلة → KTA خارجة.

  4. تمت إعادة توجيه KTA عبر Aggregation Router الخاص بـ 1inch، الذي أرسله إلى محفظتنا (…0A5).


🧩 كيفية فك رموز معاملة SCW الفاشلة

الآن بعد أن فهمنا كيف تعمل مبادلات محافظ العقود الذكية (SCW) — ومررنا عبر تداول ناجح — دعونا نستخدم نفس الأدوات لتفسير صفقة فاشلة.

سنستخدم حالة حقيقية أخرى: مبادلة ETH → توكن على إيثيريوم فشلت داخل عقد EntryPoint لأن لم يكن هناك ETH كافٍ لتغطية كل من المبادلة ورسوم الغاز.

حسنًا، ترى "خطأ" كحالة لمبادلتك في التطبيق أو تتلقى إشعار دفع يفيد بفشل مبادلتك. ماذا تفعل؟


الخطوة 1 — تحقق من تفاصيل الطلب في goodcryptoX

إليك ما تراه في هذه الحالة:

باستخدام الإطار الذي طورناه سابقًا، تلاحظ بسرعة:

  • حالة المبادلة هي خطأ (فشلت؟)

  • لا يتم عرض رسالة خطأ (هذا غير عادي)

  • هناك رسوم غاز (هل وصلت إلى البلوكشين؟)

  • هناك مسار معروض (هل نجحت المحاكاة؟)

  • هناك روابط لمستكشفي البلوكشين (أستطيع فحص المعاملة على البلوكشين!).

دعنا نتحقق من حدسك:

  • الـ خطأ الحالة تعني أن المبادلة فشلت

  • يجب أن تكون هناك رسالة خطأ قابلة للقراءة من قبل الإنسان (مُترجمة من الصيغة الخام) والرسالة الخام أيضًا. غياب رسالة الخطأ بالتأكيد يعني أن شيئًا غير عادي حدث

  • رسوم الغاز بالفعل تعني أن المعاملة وصلت إلى البلوكشين وحدث نشاط على السلسلة (استُهلك غاز)

  • المسار يؤكد أن محاكاة المعاملة نجحت وأسفرت عن مسار واضح للتنفيذ

  • روابط المستكشف تؤكد أن المعاملة وصلت إلى البلوكشين — حتى لو فشلت. يجب علينا بالتأكيد فتح أحدها والتحقيق أكثر


الخطوة 2 – افتح المعاملة في مستكشف البلوكشين

ملاحظة حول روابط المستعرض: في أحدث إصدارات التطبيق، تفتح روابط المستعرض بالفعل عملية المعاملة AA الخاصة بك (UserOp). إذا كان هذا ما تراه (حقل "From" يعرض عنوان محفظتك)، يمكنك الانتقال مباشرة إلى الخطوة 5 – صفحة تفاصيل معاملة AA. الخطوات السابقة تنطبق فقط إذا كانت رابطك يشير إلى معاملة البندلر الخارجية (حيث أن "From" ليس عنوان محفظتك). ومع ذلك، لا يزال من المفيد قراءتها لفهم أفضل لكيفية عمل معاملات SCW

انقر رابط Etherscan لترى ما حدث:

من النظرة الأولى، تصبح الأمور أكثر إرباكًا:

  • الحالة تقول ✅ نجاح — انتظر، ماذا؟!

  • لكننا نعلم بالفعل أن المبادلة لم تنفذ

  • تحت حقل “إلى” (EntryPoint)، هناك رسالة صغيرة صفراء:

    على الرغم من حدوث خطأ أو أكثر [execution reverted] اكتمال تنفيذ العقد

فما الذي يحدث فعلاً هنا؟

تذكر تدفق معاملة SCW الذي غطيناه سابقًا:

  • يقوم bundler بتغليف مبادلتك داخل UserOperation (حزمة بيانات تحتوي على منطق مبادلتك)

  • ثم يرسلها إلى عقد EntryPoint الذكي

  • يقوم EntryPoint بالتحقق منها (التحقق من رصيدك، التوقيع، والـ nonce)

  • إذا تحقق كل شيء، ينفذ نيتك — يستدعي الموجهات، والتجمعات، وينقل الرموز.

من منظور البلوكشين، مع ذلك، كل هذا يبدو فقط كـ "bundler يرسل بيانات إلى EntryPoint".

في مصطلحات SCW، تُسمى هذه الخطوة الخارجية المعاملة.

وتلك المعاملة نجحت: تم تسليم البيانات، وبدأ EntryPoint في تشغيل منطقها الداخلي. ومن ثم ✅ النجاح في الأعلى.


لكن المستكشف، تحاشيًا للفظاظة، يخبرك بأن شيئًا ما فشل داخليًا داخل EntryPoint بتلك الملاحظة الصفراء الصغيرة. بالنسبة للمستكشف، ذلك الفشل الداخلي لا يكفي لتعليم المعاملة كفاشلة.

الآن، يبرز تفصيل آخر في تبويب النظرة العامة:

  • حوالي $6 قيمة من ETH تم إرسالها من محفظتك إلى EntryPoint (التمويل المسبق للغاز).

  • فقط $2.3 قيمة من ETH أعيدت إلى bundler.

  • ورسم المعاملة الظاهر في الأعلى أقل من ذلك — حوالي $2.15.

من النظرة الأولى، تبدو هذه الأرقام وكأنها لا تتطابق. دعنا نفسر ذلك أولًا قبل متابعة التحقيق


الخطوة 3 – فهم فروق الغاز

إليك التفصيل:

  • SCW → EntryPoint (~$6): هذا هو التمويل المسبق للغاز. يقوم EntryPoint دائمًا بجمع أكثر مما يلزم للتأكد من أن UserOp الخاصة بك يمكن أن تعمل.

  • EntryPoint → Bundler (~$2.3): هذا هو سداد الغاز الفعلي. إنه المبلغ الحقيقي الذي دفعته لهذا المحاولة الفاشلة.

  • رسم المعاملة (~$2.15): هذا ما أنفقه bundler لإرسال UserOp الخاصة بك إلى EntryPoint. إنه أقل لأن EntryPoint نفسها استخدمت غازًا إضافيًا أثناء التحقق وسداد bundler — تلك التكلفة الإضافية شُحنت عليك.

قاعدة عامة:

👉 التكلفة الحقيقية للغاز الخاصة بك دائمًا هي السداد من EntryPoint ➜ Bundler (وليس “رسم المعاملة” المبيّن في الأعلى)

والفرق بين ما مولته مقدمًا (~$6) وما تم سداده (~$2.3) لم يختفِ. بقي في EntryPoint كوديعة لك، والتي ستُطبق تلقائيًا على معاملتك التالية.


الخطوة 4 – تحقق من تبويب معاملات AA

في المستكشف، ترى تبويبًا معاملات AA (AA = تجريد الحساب). هنا يعيش نشاط محافظ العقود الذكية، حيث تعمل SCWs على تجريد الحساب (ERC-4337).

دعنا ننتقل إلى ذلك التبويب من النظرة العامة:

هنا ترى أخيرًا UserOperation الخاص بنا مدرجًا كإدخال منفصل داخل المعاملة الخارجية الخاصة بالـ bundler:

  • حقل "من" الآن يظهر عنوان محفظتنا، مؤكدًا أن هذه هي عمليتنا.

  • هناك تجزئة معاملة AA منفصلة، مختلفة عن تجزئة المعاملة الخارجية. لماذا؟

    • تجزئة المعاملة الخارجية تتبع معاملة Bundler->EntryPoint التي احتوت UserOp الخاصة بك (وقد تكون تضمنت عدة UserOps من مستخدمين مختلفين).

    • تجزئة معاملة AA هي المعرف الفريد لـ UserOperation الخاصة بك داخل تلك الحزمة.

هذه هي الفكرة الأساسية للتجميع:

  • يمكن للـ bundler أن يحزم العديد من UserOps معًا في معاملة واحدة.

  • كل UserOp تحصل على تجزئة معاملة AA خاصة بها، بحيث يمكن تتبعها بشكل منفصل داخل الحزمة.

  • في حالتنا، وبما أن هذه معاملة قديمة (منذ أكثر من 400 يوم)، كانت SCWs لا تزال نادرة واحتوت الحزمة على UserOp الخاص بنا فقط — ولهذا يظهر التبويب “معاملات AA (1).” في المعاملات الأحدث، ستشهد غالبًا عدة UserOps مجمعة معًا في حزمة واحدة.

في هذا العرض، ستلاحظ أيضًا رمزًا (!) بجانب تجزئة معاملة AA الخاصة بك — تأكيد أن مبادلتك لم تُنفَّذ.

الخطوة التالية هي النقر على تجزئة معاملة AA. هذا يفتح صفحة UserOperation المخصصة، حيث سترى التفاصيل الكاملة لمحاولة مبادلتنا — الرسوم، التحويلات، وأين فشلت.


الخطوة 5 – افتح صفحة تفاصيل معاملة AA

النقر على تجزئة معاملة AA يأخذك إلى صفحة التفاصيل المخصصة لـ UserOperation الخاصة بك:

هنا يمكنك أخيرًا رؤية محاولة مبادلتنا موضحة بوضوح:

  • الحالة: x فشل (لا غموض هذه المرة)

  • من: عنوان محفظتك الذكية

  • رسم معاملة AA: ~0.00231 ETH ($2.31). هذه هي تكلفة الغاز الحقيقية التي دفعتها — السداد المرسل إلى bundler.

  • المعاملة الداخلية: تحويل واحد بقيمة ~0.00145 ETH (~$6.36) من SCW الخاصة بك إلى EntryPoint (تمويل مسبق للغاز). لم تحدث تحويلات أخرى، مما يؤكد أن المبادلة نفسها لم تُنفَّذ.

  • تجزئة المعاملة الحزِمية: معروضة أيضًا، مرتبطة بالمعاملة الخارجية للـ bundler.

تطابق هذه الصفحة أخيرًا حدسك: هذه هي المعاملة الحقيقية — UserOperation التي مثلت محاولة مبادلتك.

هذا يكاد يختتم تحقيقنا. ولكن بما أننا وصلنا إلى هذا الحد، دعنا أيضًا ننقر على المعاملات الداخلية.


الخطوة 6 – تحقق من تبويب المعاملات الداخلية

انتقل إلى تبويب المعاملات الداخلية داخل عرض معاملة AA:

هنا ترى الإجراءات خطوة بخطوة التي حاول EntryPoint تنفيذها نيابة عنك:

  1. ✅ تحويل من SCW الخاصة بك → EntryPoint (~0.00145 ETH، ~$6.36) = تمويل مسبق للغاز. هذا نجح.

  2. ❌ تنفيذ من SCW الخاصة بك → Uniswap Universal Router (~0.002 ETH) = محاولة مبادلة. هذه فشلت.

هذا التفصيل يشرح الفشل:

  • لقد أرسلت ETH بنجاح إلى EntryPoint كتمويل مسبق للغاز.

  • لكن عندما حاول EntryPoint تمرير ETH إلى Uniswap للمبادلة، فشلت المحاولة.

للحصول على التفصيل الأكثر دقة، افتح تبويب السجلات.


الخطوة 7 – فحص تبويب السجلات

انقر على السجلات (3):

هنا ستجد ثلاث أحداث رئيسية:

  • Deposited → يؤكد أن تمويل الغاز المسبق الخاص بك تم استلامه بواسطة EntryPoint.

  • BeforeExecution → يظهر أن EntryPoint بدأ في معالجة UserOperation الخاصة بك.

  • UserOperationEvent success: False — السجل الرسمي على السلسلة الذي يفيد بأن UserOp الخاصة بك فشلت.


ما الذي حدث فعلاً (جمع كل شيء معًا)

نوع هذا الفشل خاص بالمبادلات مع SCWs على شبكات EVM حيث يكون المدخل هو الرمز الأصلي (ETH، BNB، MATIC…).

  • الفجوة: لا يقوم لا bundler ولا EntryPoint بالتحقق مما إذا كان لديك ما يكفي من الرمز الأصلي لتغطية كل من التمويل المسبق للغاز والمبادلة معًا. إنهما يتحققان منهما بشكل منفصل فقط — "هل يكفي للغاز؟" و"هل يكفي للمبادلة؟". لهذا السبب نجحت المحاكاة.

  • لقد وضعنا حلاً احتياطيًا في التطبيق لهذه الحالات، وحذرناك في الواجهة من أن الغاز قد يكون غير كافٍ. ولكن بما أن المحاكاة بدت جيدة، كان بإمكانك المتابعة والنقر.

  • بمجرد تأكيدك، قدم bundler UserOperation الخاصة بك إلى EntryPoint.

  • سحب EntryPoint حوالى ما يعادل $6 من ETH كتمويل مسبق.

  • عندما حاول تنفيذ المبادلة، لم يتبقَّ ETH كافٍ لتغطية كل من المبادلة و التمويل المسبق في نفس الوقت.

  • دعا استدعاء المبادلة إلى التراجع داخل EntryPoint.

  • لا تزال قد دفعت حوالي $2.3 كرسوم غاز (السداد إلى bundler).

  • المبلغ غير المستخدم حوالي $3.7 بقي في EntryPoint كوديعة لك، ليُستخدم تلقائيًا في معاملتك التالية.

Last updated