الورقة البيضاء · 08
إطار الأمان
نموذج التهديدات، والثوابت، والتحكم في الوصول، وحدّ الثقة في الخطافات، وإدارة مفاتيح الإنفاذ، وسلامة الترقية، وموقف التدقيق لتنفيذ A-REX Core المرجعي.
الموقف الأمني في فقرة واحدة
للرمز المرجعي نقطة مرور واحدة (_update)، وترتيب تقييم ثابت، وقفل إعادة دخول حول تسلسل الخطافات بأكمله، وسلطة قائمة على الأدوار لا تُشتق أبدًا من الأرصدة، وتخزين وفق ERC-7201، وسطح صغير: ثماني دوال خارجية تغيّر الحالة فيما وراء ERC-1155. وأقوى القدرات — التجميد والتحويل القسري وإدارة الخطافات والترقيات — أدوار منفصلة مخصصة للتوقيعات المتعددة والتأخيرات الزمنية، وكل استخدام لها حدث.
الثوابت
| الثابت | يُفرَض بواسطة | يُختبَر بواسطة |
|---|---|---|
تساوي totalSupply(id) مجموع الأرصدة للمعرّف id | ERC1155Supply في 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 (انظر التطورات المستقبلية). - التحقق الصوري من ثوابت المسار مدرج في خارطة الطريق؛ والثوابت صغيرة بما يكفي لصياغتها خصائص.
المخاطر المتبقية التي لا يزيلها المعيار
- الوجود المادي للدفعة وجودتها يُفاد بهما ولا يُثبتان؛ والرمز يجعل الادعاءات منسوبة إلى أصحابها، لا صحيحة.
- يعتمد توافر البيانات الوصفية خارج السلسلة على التخزين المختار؛ والتجزئة تضمن السلامة، لا التوافر.
- حوكمة الخطافات والوحدات لا تفوق في جودتها جودة المفاتيح التي تتحكم فيها.