الورقة البيضاء · 13
تحليل الأداء
الغاز المقيس للتنفيذ المرجعي مع عدم وجود خطافات ومع خطاف واحد ومع خطافين؛ وما الذي يحدد الكلفة؛ وإرشادات النشر.
المنهج
الأرقام أدناه ناتجة عن تشغيل scripts/gas-report-standard.js على شبكة Hardhat داخل العملية مقابل التنفيذ المرجعي المترجَم (solc 0.8.22، وviaIR، وoptimizer.runs = 1 لـ ARexToken)، في سبتمبر 2026. وتعني "دافئ" أن زوج المُرسِل/المستلم/المعرّف هو نفسه في التحويل السابق (خانات التخزين التي جرى لمسها بالفعل في الكتلة). الخطافات: EligibilityHook (CHECK + ELIGIBILITY) وExpiryHook (CHECK). ولإعادة إنتاج النتائج استخدم:
npx hardhat run scripts/gas-report-standard.js
النتائج
xychart-beta
title "غاز التحويل الدافئ بحسب عدد الخطافات (بالآلاف)"
x-axis ["بلا خطافات", "الأهلية", "الأهلية + انتهاء الصلاحية"]
y-axis "الغاز (k)" 0 --> 140
bar [66.8, 91.2, 119.6]تنمو الكلفة خطيًا مع عدد الخطافات: فكل خطاف هو استدعاء check خارجي واحد لكل معرّف، إضافةً إلى canSend وcanReceive في حالة خطاف الأهلية. ويعرض الجدول كل عملية.
| العملية | 0 خطافات | 1 خطاف | 2 خطافات |
|---|---|---|---|
createBatch (معرّف جديد، وسك 1000) | 264,096 | 283,831 | 299,396 |
safeTransferFrom (الأول، بارد) | 80,687 | 108,266 | 136,682 |
safeTransferFrom (دافئ) | 66,790 | 91,166 | 119,582 |
transform تقسيم من 1 إلى 2 (معرّفان جديدان) | 564,422 | 595,707 | 636,858 |
setFrozenTokens | 54,188 | 54,188 | 54,188 |
forcedTransfer | 80,152 | 89,909 | 99,569 |
burn | 66,621 | 83,001 | 93,395 |
تحويل دافئ بخطاف واحد بالضبط من كل نوع (الكلفة الحدّية للقاعدة):
xychart-beta horizontal
title "الغاز الحدّي لخطاف واحد في تحويل دافئ (بالآلاف)"
x-axis ["DeliveryHook", "Traceability (إصدار فقط)", "EligibilityHook", "ExpiryHook", "SeasonalHook", "PerishabilityHook"]
y-axis "الغاز المضاف (k)" 0 --> 35
bar [12.3, 17.4, 24.4, 25.2, 27.5, 31.0]يضيف TraceabilityHook في وضع الحفظ 184.5k ويُستبعد من الرسم البياني لأغراض المقياس.
| الخطاف | الغاز | Δ مقارنةً ببلا خطاف |
|---|---|---|
| EligibilityHook | 91,166 | +24,376 |
| ExpiryHook | 92,023 | +25,233 |
| SeasonalHook | 94,324 | +27,534 |
| PerishabilityHook | 97,813 | +31,023 |
| DeliveryHook (بلا تسليم نشط) | 79,076 | +12,286 |
| TraceabilityHook، الإصدار فقط | 84,152 | +17,362 |
| TraceabilityHook، مع الحفظ | 251,273 | +184,483 |
ما الذي يحدد الكلفة
- يكلّف التحويل بلا خطافات نحو 67k وهو دافئ، أي ERC-1155 إضافةً إلى تتبّع المعروض وقراءات وجود الدفعة وحالتها وتجميدها وما يلزم لإدارة المسار (تخزين بيانات التحويل مؤقتًا والقفل). وهذا هو الحد الأدنى.
- يضيف كل خطاف نحو 25–30k إلى التحويل: استدعاء
checkواحد (دالة عرض بين العقود)، إضافةً إلى استدعاءيcanSendوcanReceiveفي خطافات الأهلية. والكلفة خطية في عدد الخطافات وفي عدد المعرّفات في التحويل المجمّع. ولو جرى فحص كل عقد قواعد لكل قدرة بـsupportsInterfaceقبل استدعائه لأضاف ذلك عدة استدعاءات ثابتة لكل معرّف؛ وهذه الكلفة الإضافية غير موجودة لأن الأعلام تُخزَّن مؤقتًا عند التسجيل. - يهيمن التخزين على كلفة
createBatch: هيكلBatch(ست كلمات إضافةً إلى نص) وخانات الرصيد والمعروض في ERC-1155. وهي كلفة تُدفع مرة واحدة لكل دفعة. - تنشئ
transformمعرّفات جديدة: فالتقسيم إلى اثنتين يدفع كلفة سجلَّي دفعة وعمليتَي سك وعملية حرق واحدة، إضافةً إلى استدعاءات الخطافات في كل مرحلة (OP_TRANSFORM). والتقسيم إلى n يكلّف تقريبًاn × createBatchإضافةً إلى عملية حرق؛ ودمج n في واحدة يكلّف تقريبًاnمن عمليات الحرق إضافةً إلى createBatch واحدة. - الإنفاذ رخيص: فالتجميد خانة واحدة؛ والتحويل القسري يكلّف ما يكلّفه التحويل إضافةً إلى كتابة تخفيض التجميد والحدث.
transferCheck/canTransferدالتا عرض: مجانيتان خارج السلسلة، وتسلكان مسار الشيفرة نفسه الذي تسلكه المعاملة.
ما يتيحه التصميم
| تصميم فحص القدرات | A-REX Core (ARexToken) | |
|---|---|---|
| تحويل مع n من عقود القواعد | المعرّفات × الوحدات × (فحوص supportsInterface + استدعاء الخطاف) قبل أن يعمل أي منطق | المعرّفات × الخطافات × 1 استدعاء (+2 لخطافات الأهلية)؛ والأعلام مخزّنة مؤقتًا عند التسجيل |
| الرفض | تراجع بنص (يُنسخ إلى الذاكرة، وغير قابل للفهرسة) | خطأ مخصص مع عنوان الخطاف وكود bytes32 |
| النسب | غير متاح | نحو 280k لكل دفعة ناتجة |
| التجميد / التحويل القسري | غير متاح | 54k / 80k |
يصف عمود "تصميم فحص القدرات" التصميم الذي تحل A-REX Core محله (ADR-004، وADR-005)؛ وعمود A-REX Core وحده هو المقيس.
إرشادات النشر
- الكلفة النقدية هي
gas × gas price × token price، ويتغير العاملان الأخيران بمراتب من الحجم بين السلاسل والأيام. وعلى سبيل التوضيح فقط، عند 0.01 gwei و3,000 دولار أمريكي لكل ETH تكلّف عملية تحويل دافئة بخطافين (119,582 غازًا) نحو 0.0036 دولار أمريكي، وتكلّفcreateBatch(264,096 غازًا) نحو 0.008 دولار أمريكي؛ وعند 20 gwei على الشبكة الرئيسية لـ Ethereum تكلّف العمليتان نفسهما نحو 7.2 و15.8 دولارًا أمريكيًا. فقِس على السلسلة المستهدفة قبل الالتزام بنموذج اقتصاديات الوحدة. - التحويلات المجمّعة: توزّع
safeBatchTransferFromالتكاليف الثابتة على عدة معرّفات؛ لكن كلفة الخطافات تظل تتناسب مع عدد المعرّفات. - ترتيب الخطافات: ضع الخطافات الرخيصة ذات معدل الرفض المرتفع أولًا؛ فالرفض يوقف المسار قبل أن تعمل الخطافات الأعلى كلفة.
- عدد الخطافات: ثلاثة إلى خمسة تكفي معظم جهات الإصدار؛ وكل خطاف إضافي كلفة قابلة للقياس عن كل تحويل وسطح حوكمة.
- البيانات الوصفية: أبقِ
uriقصيرًا (CID أو Digital Link)؛ فالنص يُخزَّن على السلسلة. - القراءات خارج السلسلة: استخدم
transferCheckقبل الإرسال؛ فالمعاملة التي تتراجع تكلّف غازًا مع ذلك.
معدل المعالجة
الرمز نفسه ليس عنق الزجاجة؛ بل السلسلة. فالتحويل الواحد معاملة واحدة؛ والتحويل التصنيعي بـ n من المخرجات معاملة واحدة تتضمن n من عمليات السك. وتتطلب فهرسة النسب قراءة أحداث BatchTransformed، التي تُصدر مرة واحدة لكل عملية مع قوائم الكميات كاملة، ولذلك لا يحتاج المفهرس إلى إعادة بناء أي شيء من أحداث كل تحويل على حدة.
حجم العقد
يُنشر ARexToken بحجم 24,136 بايت (الحد 24,576)، مترجَمًا مع optimizer.runs = 1. أما العقود الأخرى فصغيرة: ARexAttestations 2,708؛ والخطافات بين 1,358 (ExpiryHook) و6,215 (DeliveryHook)، وTraceabilityHook 4,076؛ والامتدادات بين 3,716 و4,588. وإضافة وظائف إلى الرمز نفسه مقيّدة بالحجم بحكم التصميم — وهذا هو الغرض من الخطافات والعقود المرافقة.