Skip to main contentA-REX Foundation

الورقة البيضاء · 08

إطار الأمان

نموذج التهديدات، والثوابت، والتحكم في الوصول، وحدّ الثقة في الخطافات، وإدارة مفاتيح الإنفاذ، وسلامة الترقية، وموقف التدقيق لتنفيذ A-REX Core المرجعي.

الموقف الأمني في فقرة واحدة

للرمز المرجعي نقطة مرور واحدة (_update)، وترتيب تقييم ثابت، وقفل إعادة دخول حول تسلسل الخطافات بأكمله، وسلطة قائمة على الأدوار لا تُشتق أبدًا من الأرصدة، وتخزين وفق ERC-7201، وسطح صغير: ثماني دوال خارجية تغيّر الحالة فيما وراء ERC-1155. وأقوى القدرات — التجميد والتحويل القسري وإدارة الخطافات والترقيات — أدوار منفصلة مخصصة للتوقيعات المتعددة والتأخيرات الزمنية، وكل استخدام لها حدث.

الثوابت

الثابتيُفرَض بواسطةيُختبَر بواسطة
تساوي totalSupply(id) مجموع الأرصدة للمعرّف idERC1155Supply في OpenZeppelin؛ وtransform تحرق ثم تسك عبر _updateاختبارات النسب (التقسيم والدمج والمعالجة)
الحالة status == 255 نهائيةتتراجع setBatchStatus بالخطأ ARexInvalidStatusTransitionاختبارات الحالة
لا يجوز السك ولا التحويل على دفعة مسحوبة من التداول، ويجوز الحرق فقط_updateاختبار الدفعة المسحوبة من التداول
amount ≤ balance − frozen في التحركات التي يبدؤها الحامل_update؛ وforcedTransfer تخفض frozen إلى balance − amountاختبارات التجميد/القسري
لا يستطيع أي خطاف إعادة دخول دالة تغيّر الأرصدةقفل تخزين يُضبط قبل الفحوص ويُزال بعد الإشعاراتاختبار ReentrantHook
تُقيَّم الخطافات بترتيب التسجيل؛ والإزالة تحفظ الترتيبإزاحة المصفوفة في removeHookاختبار الترتيب
العملية المرفوضة لا تغيّر أي رصيد ولا تُصدر أي تحويلتعمل الفحوص قبل super._updateاختبار الرفض (عدد استدعاءات التنفيذ دون تغيير)
لا تُشتق السلطة من الرصيد أبدًاكل دالة تغيّر الحالة مقيّدة بدور أو بتفويض ERC-1155اختبارات "حيازة الرموز لا تمنح شيئًا"
canTransfer == (transferCheck == 0)تُعرَّف canTransfer على هذا النحواختبارات المطابقة

نموذج التهديدات

الجهات الفاعلة وقدراتها

الفاعليستطيعلا يستطيع
الحاملتحويل الكميات غير المجمّدة إلى مستلمين مؤهلين؛ والحرق؛ وإعادة تكوين الدفعة بالسلعة ووحدة القياس نفسيهما مع حفظ الكميةتغيير الحالة، والسك، والمعالجة إلى سلعة أخرى، وتحريك الكميات المجمّدة
المشغّل المعتمدمثل الحامل بالنسبة إلى الحساب المانح للتفويضأي شيء لا يستطيعه الحامل
ISSUER_ROLEإنشاء الدفعاتنقل رموز الآخرين
TRANSFORMER_ROLEعمليات التحويل التصنيعي للمعالجة على الرموز التي يحوزها أو المفوَّض بشأنهاالتحويل التصنيعي للرموز دون تفويض
STATUS_ROLEتغيير الحالة (بما في ذلك السحب من التداول)، وتحديث البيانات الوصفيةنقل الرموز
ENFORCER_ROLEتجميد أي مقدار؛ وفرض أي تحويلتجاوز الخطافات (فهي تعمل مع OP_FORCED_TRANSFER)
HOOK_ADMIN_ROLEإضافة الخطافات/إزالتهاتغيير الأرصدة مباشرة
PAUSER_ROLEإيقاف كل شيء عدا التحويلات القسرية—
UPGRADER_ROLEاستبدال التنفيذ— (هذه سلطة كاملة؛ انظر إدارة المفاتيح)
عقد الخطافرفض العمليات؛ ومراقبتها؛ والإجابة عن الأهليةإعادة الدخول؛ وتغيير الأرصدة

السيناريوهات

خطاف خبيث أو معيب (حرمان من الخدمة). الخطاف الذي يرفض دائمًا يمنع جميع تحويلات الرمز؛ والخطاف الذي يتراجع في check يفعل الشيء نفسه. التخفيف: يستطيع HOOK_ADMIN_ROLE إزالة أي خطاف في أي وقت (مع حفظ الترتيب)؛ ويستطيع PAUSER_ROLE الإيقاف أثناء التحقيق؛ وتظل التحويلات القسرية تعمل، فلا يضيع الإنفاذ. ويتحقق التسجيل من دعم ERC-165 ومن أن الأعلام غير صفرية، ويرفض حسابات EOA. التوصية: دقّق الخطافات قبل تسجيلها؛ وأبقِ عددها صغيرًا؛ وضع المسؤول خلف تأخير زمني حتى تكون تغييرات الخطافات مرئية قبل أن تسري.

إعادة دخول الخطاف. تستدعي onExecuted في أحد الخطافات safeTransferFrom استدعاءً رجعيًا. التخفيف: القفل؛ إذ يتراجع الاستدعاء بالخطأ ARexReentrantCall. ويُلاحظ أن الاستدعاء الرجعي لمستقبِل ERC-1155 (onERC1155Received) يعمل بعد فتح القفل، كما في كل رمز ERC-1155؛ وتكون حالة الرمز نهائية عندئذ.

اختراق مفتاح الإنفاذ. من يحمل ENFORCER_ROLE يستطيع نقل أي رموز. التخفيف: توقيع متعدد بإجراء موثّق (أمر قضائي، أو اتفاقية رهن، أو إخطار عقوبات)؛ وكل إجراء يُصدر ForcedTransfer/Frozen؛ ويمكن للخطافات أن تشترط مرجع أمر في بيانات التحويل (فالعملية OP_FORCED_TRANSFER ليست معفاة من الخطافات). ويمكن النظر في استخدام تأخير زمني للإنفاذ غير العاجل.

اختراق القائم بالترقية. اختراق كامل. التخفيف: توقيع متعدد مع تأخير زمني؛ وفحوص الترقية الخاصة بـ OpenZeppelin في التكامل المستمر؛ وتخزين ERC-7201 لتجنب حوادث تخطيط التخزين.

إساءة استخدام الحالة. يستطيع STATUS_ROLE سحب دفعة يحوزها آخرون من التداول. وهذا مقصود — كأن يعلن مستودع أو مفتش أو جهة تنظيمية أن دفعة ما غير صالحة — ويجب الإفصاح عنه للحاملين. التخفيف: الإسناد إلى مؤسسة خاضعة للمساءلة؛ وكل تغيير حدث مقرون بسبب.

احتيال جهة الإصدار. يستطيع ISSUER_ROLE إنشاء دفعة لا وجود لها ماديًا. ولا يستطيع الرمز منع ذلك؛ لكنه يجعله منسوبًا إلى فاعل (issuer وoriginRef وmetadataHash) ويتيح اشتراط إفادات من أطراف مستقلة (المستودع، والمفتش، والسجل) قبل التحويل عبر AttestationHook.

استبدال البيانات الوصفية. تغيّر setBatchMetadata التجزئة وعنوان URI. التخفيف: التقييد بدور؛ وتحفظ أحداث BatchMetadataUpdated وURI التاريخ؛ وتظل المستندات السابقة قابلة للتحقق مقابل التجزئات السابقة.

الركض الأمامي على transferCheck. يمكن أن يصبح الفحص المسبق قديمًا قبل تنفيذ المعاملة (إذ تتغير حالة خطاف). وتعيد المعاملة التقييم؛ وأسوأ الحالات تراجع مع كود دقيق.

استنزاف الغاز عبر الخطافات. يضيف كل خطاف استدعاءً خارجيًا واحدًا لكل معرّف متأثر في كل مرحلة. والخطاف الذي يحتوي حلقات غير محدودة يجعل التحويلات غير ميسورة الكلفة. التخفيف: قواعد كتابة الخطافات (دالة check محدودة)، والمراجعة قبل التسجيل.

الثقة في الخطافات القابلة للترقية. يستطيع خطاف منشور خلف وكيل تغيير سياسة التحويل دون أي تغيير في الرمز. التخفيف: عامِل مفاتيح إدارة الخطافات بالعناية نفسها التي تعامل بها HOOK_ADMIN_ROLE؛ وفضّل الخطافات غير القابلة للتغيير في الإنتاج.

نموذج التحكم في الوصول

يستخدم النظام AccessControl من OpenZeppelin بثمانية أدوار على الرمز ودور واحد على سجل الإفادات؛ ويدير DEFAULT_ADMIN_ROLE جميعها. والتوزيع الموصى به في بيئة الإنتاج:

الدورالحامل
DEFAULT_ADMIN_ROLE، UPGRADER_ROLE، HOOK_ADMIN_ROLEتوقيع متعدد للحوكمة خلف تأخير زمني
ENFORCER_ROLEتوقيع متعدد للإنفاذ (الامتثال + الشؤون القانونية)
PAUSER_ROLEمفتاح الاستجابة للحوادث (سريع)
ISSUER_ROLE، STATUS_ROLE، TRANSFORMER_ROLEخدمات تشغيلية بأقل الصلاحيات، مع تدوير المفاتيح
ATTEST_ADMIN_ROLEجهة منح الشهادات أو المنصة

تمنح initialize كل شيء لمسؤول واحد للتيسير؛ وتشترط قائمة التحقق الخاصة بالنشر إعادة التوزيع قبل الإنتاج.

دلالات الإنفاذ والإيقاف المؤقت

  • يمنع الإيقاف المؤقت عمليات السك والتحويل والحرق والتحويل التصنيعي؛ لكنه لا يمنع التحويلات القسرية، ولذلك يمكن تنفيذ أمر قانوني أثناء حادث.
  • تتجاوز التحويلات القسرية canSend/canReceive وفحص الرصيد المجمّد، وتخفض المقدار المجمّد إلى ما تبقى، وتشغّل الخطافات مع OP_FORCED_TRANSFER. وتُرجع الخطافات المرجعية OK لتلك العملية؛ ويجوز لخطاف يحكم الإنفاذ أن يشترط مراجع أوامر في data.
  • يجوز أن يتجاوز التجميد الرصيد (ERC-7943)، ولذلك يمكن لحق امتياز أن يشمل الإيداعات المستقبلية.

سلامة الترقية

  • UUPS؛ و_authorizeUpgrade مقيّدة بـ UPGRADER_ROLE.
  • هيكل تخزين بفضاء أسماء وفق ERC-7201؛ بالإلحاق فقط.
  • تعمل فحوص إضافة الترقيات الخاصة بـ OpenZeppelin في الاختبارات، وينبغي أن تعمل في التكامل المستمر قبل أي معاملة ترقية.
  • يُبقي إعداد optimizer.runs = 1 الخاص بالملف التنفيذ تحت حد EIP-170؛ وأي تغيير يدفعه فوق الحد يفشل وقت الترجمة بتحذير وعند النشر بتراجع.

أمان الاعتماديات والبناء

  • تثبيت OpenZeppelin Contracts وContracts-Upgradeable عند 5.3.0؛ وإيداع ملف القفل؛ ويستخدم التكامل المستمر npm ci.
  • Solidity 0.8.22، وviaIR، وEVM paris (دون اعتماد على التخزين العابر، وقابل للنشر على سلاسل لم تعتمد Cancun).
  • لا مكتبات خارجية مرتبطة؛ ولا delegatecall خارج وكيل UUPS.

موقف التدقيق

  • 46 اختبارًا على التنفيذ المرجعي والخطافات والامتدادات تغطي كل ثابت أعلاه، بما في ذلك تشغيل عشوائي للثوابت ببذرة محددة.
  • يُقاس الغاز والحجم بسكربتات في المستودع.
  • يُعد تدقيق من طرف ثالث لـ ARexToken وARexAttestations والخطافات المرجعية شرطًا مسبقًا معلنًا لوجود مشارك محوري في الإنتاج ولتقديم ERC (انظر التطورات المستقبلية).
  • التحقق الصوري من ثوابت المسار مدرج في خارطة الطريق؛ والثوابت صغيرة بما يكفي لصياغتها خصائص.

المخاطر المتبقية التي لا يزيلها المعيار

  • الوجود المادي للدفعة وجودتها يُفاد بهما ولا يُثبتان؛ والرمز يجعل الادعاءات منسوبة إلى أصحابها، لا صحيحة.
  • يعتمد توافر البيانات الوصفية خارج السلسلة على التخزين المختار؛ والتجزئة تضمن السلامة، لا التوافر.
  • حوكمة الخطافات والوحدات لا تفوق في جودتها جودة المفاتيح التي تتحكم فيها.